app.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. const cookieParser = require('cookie-parser');
  2. const cors = require("cors");
  3. const fs = require("fs");
  4. const path = require("path");
  5. const express = require("express");
  6. const axios = require("axios");
  7. const SERVER_PORT = process.env.port || process.env.PORT || 53000;
  8. const authProvider = require('./auth/AuthProvider');
  9. const {fetch, updateFetch} = require('./fetch');
  10. const bodyParser = require('body-parser');
  11. const https = require('https');
  12. require('dotenv').config({ path: './env/.env.test' });
  13. const session = require('express-session');
  14. const messages = require('dote/src/messages');
  15. const serverApp = express();
  16. serverApp.use(session({
  17. secret: process.env.EXPRESS_SESSION_SECRET,
  18. resave: false,
  19. saveUninitialized: true,
  20. cookie: {
  21. httpOnly: true,
  22. secure: true, // set this to true on production
  23. sameSite: 'none',
  24. maxAge: 60 * 60 * 24 * 1000
  25. }
  26. }));
  27. serverApp.set(express.json());
  28. serverApp.use(cookieParser());
  29. serverApp.use(express.urlencoded({ extended: false }));
  30. serverApp.use("/static",express.static(path.join(__dirname, 'static')));
  31. serverApp.use("/node_modules",express.static(path.join(__dirname, 'node_modules')));
  32. const options = {
  33. key: process.env.SSL_KEY_FILE ? fs.readFileSync(process.env.SSL_KEY_FILE) : undefined,
  34. cert: process.env.SSL_CRT_FILE ? fs.readFileSync(process.env.SSL_CRT_FILE) : undefined,
  35. };
  36. const server = https.createServer(options, serverApp);
  37. const corsOption = {
  38. origin: "*",
  39. }
  40. serverApp.use(cors(corsOption));
  41. serverApp.use(bodyParser.json());
  42. server.listen(SERVER_PORT, function () {
  43. console.log(`\n${serverApp.name} listening to ${SERVER_PORT}`);
  44. });
  45. serverApp.get("/tab",
  46. isAuthenticated,
  47. async function (req, res, next) {
  48. res.sendFile(path.join(__dirname, "/views/hello.html"),
  49. { idTokenClaims: req.session.account.idTokenClaims }
  50. );
  51. }
  52. );
  53. function isAuthenticated(req, res, next) {
  54. if (!req.session.isAuthenticated) {
  55. return res.redirect('/auth/signin'); // redirect to sign-in route
  56. }
  57. next();
  58. };
  59. function isAccessToken(req, res, next) {
  60. if (!req.session.accessToken) {
  61. return authProvider.acquireToken({
  62. scopes: ['.default'],
  63. redirectUri: 'https://localhost:53000/redirect',
  64. successRedirect: '/api-redirect'
  65. })(req, res, next);
  66. }
  67. next();
  68. }
  69. serverApp.get("/auth/signin", authProvider.login({
  70. scopes: ['.default'],
  71. redirectUri: 'https://localhost:53000/redirect',
  72. successRedirect: '/tab'
  73. }))
  74. serverApp.post("/redirect", authProvider.handleRedirect());
  75. serverApp.post("/api-get",
  76. isAuthenticated,
  77. isAccessToken,
  78. async (req, res, next) => {
  79. const uri = req.body.api_uri || req.session.apiUri;
  80. let param = {};
  81. if (req.session.param) {
  82. param = req.session.param;
  83. }
  84. try {
  85. const graphResponse = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0" + uri, req.session.accessToken, param);
  86. res.json(graphResponse);
  87. } catch (error) {
  88. next(error);
  89. }
  90. });
  91. serverApp.get("/api-redirect",
  92. isAuthenticated,
  93. async function (req, res, next) {
  94. const uri = req.session.apiUri;
  95. let param = {};
  96. if (req.session.param) {
  97. param = req.session.param;
  98. }
  99. try {
  100. const graphResponse = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0" + uri, req.session.accessToken, param);
  101. res.json(graphResponse);
  102. } catch (error) {
  103. next(error);
  104. }
  105. })
  106. serverApp.get("/post-redirect",
  107. isAuthenticated,
  108. async function (req, res, next) {
  109. const uri = req.session.apiUri;
  110. let param = {};
  111. if (req.session.param) {
  112. param = req.session.param;
  113. }
  114. try {
  115. const graphResponse = await updateFetch(process.env.GRAPH_API_ENDPOINT + "v1.0" + uri, req.session.accessToken, param);
  116. res.json(graphResponse);
  117. } catch (error) {
  118. next(error);
  119. }
  120. }
  121. )
  122. serverApp.post("/api-update", authProvider.acquireToken({
  123. scopes: [],
  124. redirectUri: 'https://localhost:53000/redirect',
  125. successRedirect: '/post-redirect'
  126. }));
  127. serverApp.post("/api-post", authProvider.acquireToken({
  128. scopes: ['.default'],
  129. redirectUri: 'https://localhost:53000/redirect',
  130. successRedirect: '/post-redirect'
  131. }));
  132. serverApp.post("/getGroupList", authProvider.acquireToken({
  133. scopes: ['.default'],
  134. redirectUri: 'https://localhost:53000/redirect',
  135. successRedirect: '/group-redirect'
  136. }));
  137. serverApp.get("/group-redirect",
  138. isAuthenticated,
  139. async function (req, res, next) {
  140. // return;
  141. try {
  142. const oneDrive = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/me/drive/root", req.session.accessToken);
  143. const sharePointIds = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/me/drive/SharePointIds", req.session.accessToken);
  144. // const oneDriveItems = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/me/drive/root/children", req.session.accessToken);
  145. const graphResponse = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/me/joinedTeams", req.session.accessToken);
  146. const sites = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/sites/root", req.session.accessToken);
  147. const sitesSharePoint = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/sites/root/SharePointIds", req.session.accessToken);
  148. const teams = graphResponse.value;
  149. oneDrive.sharePoint = sharePointIds;
  150. sites.sharePoint = sitesSharePoint;
  151. const resultObj = {
  152. oneDrive : {
  153. teams: oneDrive,
  154. // items: oneDriveItems.value,
  155. },
  156. joinedTeams : {
  157. teams : teams,
  158. items : {},
  159. },
  160. sites : {
  161. teams : sites,
  162. // items : {},
  163. },
  164. }
  165. // if (sites) {
  166. // if (Array.isArray(sites)) {
  167. // for(let site of sites) {
  168. // const siteObj = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/sites/"+site.id+"/drive/items/root/children", req.session.accessToken);
  169. // resultObj.sites.items[site.id] = siteObj.value;
  170. // }
  171. // }
  172. // else if (sites.id) {
  173. // const sitesObj = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/sites/"+sites.id+"/drive/items/root/children", req.session.accessToken);
  174. // if (sitesObj) {
  175. // resultObj.sites.items[sites.id] = sitesObj.value;
  176. // }
  177. // }
  178. // }
  179. if (teams && teams.length) {
  180. const options = {
  181. responseType: 'arraybuffer',
  182. headers: {
  183. Authorization: `Bearer ${req.session.accessToken}`,
  184. ConsistencyLevel: 'eventual',
  185. },
  186. };
  187. for (let team of teams) {
  188. const item = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/groups/"+team.id+"/drive/items/root/children", req.session.accessToken);
  189. const sharePoint = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/groups/"+team.id+"/drive/SharePointIds", req.session.accessToken);
  190. if (sharePoint) {
  191. team.sharePoint = sharePoint;
  192. }
  193. if (item && item.value) {
  194. resultObj.joinedTeams.items[team.id] = item.value;
  195. }
  196. }
  197. }
  198. res.json(resultObj);
  199. } catch (error) {
  200. next(error);
  201. }
  202. }
  203. )
  204. serverApp.post('/makeFolder',
  205. isAuthenticated,
  206. (req, res, next)=>{
  207. if (!req.session.accessToken) {
  208. return authProvider.acquireToken({
  209. scopes: ['.default'],
  210. redirectUri: 'https://localhost:53000/redirect',
  211. successRedirect: '/makeFolder'
  212. })(req, res, next);
  213. }
  214. next();
  215. },
  216. async (req, res, next)=>{
  217. const options = {
  218. headers: {
  219. Authorization: `Bearer ${req.session.accessToken}`,
  220. },
  221. };
  222. const {siteId, path, param} = req.body;
  223. try{
  224. const sitesInfo = await axios.get(process.env.GRAPH_API_ENDPOINT + "v1.0/sites/"+ siteId + path, options);
  225. if (sitesInfo.data) {
  226. const itemId = sitesInfo.data.id;
  227. const result = await axios.post(process.env.GRAPH_API_ENDPOINT + "v1.0/sites/"+ siteId +"/drive/items/" + itemId +"/children", JSON.parse(param), options);
  228. res.json(result.data)
  229. }
  230. }
  231. catch(error) {
  232. console.log(error.response.data.error);
  233. // resultObj.success = 'F';
  234. // resultObj.message = '선택하신 파일 정보 삭제중 오류가 발생하였습니다.\n' + error.response.data.error.message;
  235. // return res.json(resultObj);
  236. }
  237. })
  238. serverApp.post('/uploadItems',
  239. isAuthenticated,
  240. (req, res, next)=>{
  241. if (!req.session.accessToken) {
  242. return authProvider.acquireToken({
  243. scopes: ['.default'],
  244. redirectUri: 'https://localhost:53000/redirect',
  245. successRedirect: '/uploadItems'
  246. })(req, res, next);
  247. }
  248. next();
  249. },
  250. async (req, res, next)=>{
  251. if (req.body) {
  252. const {siteId, path, param} = req.body;
  253. if (siteId && param) {
  254. const options = {
  255. headers: {
  256. Authorization: `Bearer ${req.session.accessToken}`,
  257. },
  258. };
  259. const sitesInfo = await axios.get(process.env.GRAPH_API_ENDPOINT + "v1.0/sites/"+ siteId + path, options);
  260. if (sitesInfo.data) {
  261. const itemId = sitesInfo.data.id;
  262. const fileInfo = JSON.parse(param);
  263. const result = await axios.post(process.env.GRAPH_API_ENDPOINT + "v1.0/sites/"+ siteId +"/drive/items/"+itemId+':/'+fileInfo.name+':/content', fileInfo, options);
  264. res.json(result.data);
  265. }
  266. }
  267. }
  268. })
  269. serverApp.post('/deleteItems',
  270. isAuthenticated,
  271. (req, res, next)=>{
  272. if (!req.session.accessToken) {
  273. return authProvider.acquireToken({
  274. scopes: ['.default'],
  275. redirectUri: 'https://localhost:53000/redirect',
  276. successRedirect: '/deleteItems'
  277. })(req, res, next);
  278. }
  279. next();
  280. },
  281. async (req, res, next)=>{
  282. if (req.body) {
  283. const {siteId, itemIds} = req.body;
  284. const resultObj = {success: '', message:''};
  285. if (siteId && itemIds) {
  286. const itemIdArr = JSON.parse(itemIds);
  287. if (itemIdArr.length > 0) {
  288. const options = {
  289. headers: {
  290. Authorization: `Bearer ${req.session.accessToken}`,
  291. },
  292. };
  293. for (let itemId of itemIdArr) {
  294. try{
  295. await axios.delete(process.env.GRAPH_API_ENDPOINT + "v1.0/sites/"+ siteId + "/drive/items/" + itemId, options);
  296. }
  297. catch(error) {
  298. console.log(error.response.data.error);
  299. resultObj.success = 'F';
  300. resultObj.message = '선택하신 파일 정보 삭제중 오류가 발생하였습니다.\n' + error.response.data.error.message;
  301. return res.json(resultObj);
  302. }
  303. }
  304. resultObj.success = 'S';
  305. resultObj.message = '파일 정보가 삭제되었습니다.';
  306. res.json(resultObj);
  307. }
  308. }
  309. else {
  310. resultObj.success = 'F';
  311. resultObj.message = '파라미터 정보를 확인해주세요.';
  312. res.json(resultObj);
  313. }
  314. }
  315. })