app.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  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 {getFetch, updateFetch} = require('./fetch');
  10. const bodyParser = require('body-parser');
  11. const https = require('https');
  12. const JSZIP = require('jszip');
  13. require('dotenv').config({ path: './env/.env.test' });
  14. const session = require('express-session');
  15. const multer = require('multer');
  16. const { throws } = require('assert');
  17. let _ZIP;
  18. const storage = multer.diskStorage({
  19. destination: function (req, file, cb) {
  20. cb(null, 'uploads/')
  21. },
  22. filename: function (req, file, cb) {
  23. cb(null, file.originalname) // 원래 파일이름으로 저장
  24. }
  25. })
  26. const upload = multer(storage);
  27. const serverApp = express();
  28. const endPoint = process.env.GRAPH_API_ENDPOINT + 'v1.0';
  29. Buffer.prototype.toArrayInteger = function(){
  30. if (this.length > 0) {
  31. const data = new Array(this.length);
  32. for (let i = 0; i < this.length; i=i+1)
  33. data[i] = this[i];
  34. return data;
  35. }
  36. return [];
  37. }
  38. serverApp.use(session({
  39. secret: process.env.EXPRESS_SESSION_SECRET,
  40. resave: false,
  41. saveUninitialized: true,
  42. cookie: {
  43. httpOnly: true,
  44. secure: true, // set this to true on production
  45. sameSite: 'none',
  46. maxAge: 60 * 60 * 24 * 1000
  47. }
  48. }));
  49. serverApp.set(express.json());
  50. serverApp.use(cookieParser());
  51. serverApp.use(express.urlencoded({ extended: false }));
  52. serverApp.use("/static",express.static(path.join(__dirname, 'static')));
  53. serverApp.use("/node_modules",express.static(path.join(__dirname, 'node_modules')));
  54. const options = {
  55. key: process.env.SSL_KEY_FILE ? fs.readFileSync(process.env.SSL_KEY_FILE) : undefined,
  56. cert: process.env.SSL_CRT_FILE ? fs.readFileSync(process.env.SSL_CRT_FILE) : undefined,
  57. };
  58. const server = https.createServer(options, serverApp);
  59. const corsOption = {
  60. origin: "*",
  61. }
  62. serverApp.use(cors(corsOption));
  63. serverApp.use(bodyParser.json());
  64. server.listen(SERVER_PORT, function () {
  65. console.log(`\n${serverApp.name} listening to ${SERVER_PORT}`);
  66. });
  67. serverApp.get("/tab",
  68. isAuthenticated,
  69. async function (req, res, next) {
  70. res.sendFile(path.join(__dirname, "/views/hello.html"),
  71. { idTokenClaims: req.session.account.idTokenClaims }
  72. );
  73. }
  74. );
  75. function isAuthenticated(req, res, next) {
  76. if (!req.session.isAuthenticated) {
  77. return res.redirect('/auth/signin'); // redirect to sign-in route
  78. }
  79. next();
  80. };
  81. function isAccessToken(req, res, next) {
  82. if (!req.session.accessToken) {
  83. return authProvider.acquireToken({
  84. scopes: ['.default'],
  85. redirectUri: 'https://localhost:53000/redirect',
  86. successRedirect: '/api-redirect'
  87. })(req, res, next);
  88. }
  89. next();
  90. }
  91. serverApp.get("/auth/signin", authProvider.login({
  92. scopes: ['.default'],
  93. redirectUri: 'https://localhost:53000/redirect',
  94. successRedirect: '/tab'
  95. }))
  96. serverApp.post("/redirect", authProvider.handleRedirect());
  97. serverApp.post("/api-get",
  98. isAuthenticated,
  99. isAccessToken,
  100. async (req, res, next) => {
  101. const uri = req.body.api_uri || req.session.apiUri;
  102. let param = {};
  103. if (req.session.param) {
  104. param = req.session.param;
  105. }
  106. try {
  107. const graphResponse = await getFetch(endPoint + uri, req.session.accessToken, param);
  108. res.json(graphResponse);
  109. } catch (error) {
  110. next(error);
  111. }
  112. });
  113. serverApp.get("/api-redirect",
  114. isAuthenticated,
  115. async function (req, res, next) {
  116. const uri = req.session.apiUri;
  117. let param = {};
  118. if (req.session.param) {
  119. param = req.session.param;
  120. }
  121. try {
  122. const graphResponse = await getFetch(endPoint + uri, req.session.accessToken, param);
  123. res.json(graphResponse);
  124. } catch (error) {
  125. next(error);
  126. }
  127. })
  128. serverApp.get("/post-redirect",
  129. isAuthenticated,
  130. async function (req, res, next) {
  131. const uri = req.session.apiUri;
  132. let param = {};
  133. if (req.session.param) {
  134. param = req.session.param;
  135. }
  136. try {
  137. const graphResponse = await updateFetch(endPoint + uri, req.session.accessToken, param);
  138. res.json(graphResponse);
  139. } catch (error) {
  140. next(error);
  141. }
  142. }
  143. )
  144. serverApp.post("/api-update", authProvider.acquireToken({
  145. scopes: [],
  146. redirectUri: 'https://localhost:53000/redirect',
  147. successRedirect: '/post-redirect'
  148. }));
  149. serverApp.post("/api-post", authProvider.acquireToken({
  150. scopes: ['.default'],
  151. redirectUri: 'https://localhost:53000/redirect',
  152. successRedirect: '/post-redirect'
  153. }));
  154. serverApp.post("/getGroupList", authProvider.acquireToken({
  155. scopes: ['.default'],
  156. redirectUri: 'https://localhost:53000/redirect',
  157. successRedirect: '/group-redirect'
  158. }));
  159. serverApp.get("/group-redirect",
  160. isAuthenticated,
  161. async function (req, res, next) {
  162. // return;
  163. try {
  164. const oneDrive = await getFetch(endPoint + "/me/drive/root", req.session.accessToken);
  165. const sharePointIds = await getFetch(endPoint + "/me/drive/SharePointIds", req.session.accessToken);
  166. const graphResponse = await getFetch(endPoint + "/me/joinedTeams", req.session.accessToken);
  167. const sites = await getFetch(endPoint + "/sites/root", req.session.accessToken);
  168. const sitesSharePoint = await getFetch(endPoint + "/sites/root/SharePointIds", req.session.accessToken);
  169. const teams = graphResponse.value;
  170. oneDrive.sharePoint = sharePointIds;
  171. sites.sharePoint = sitesSharePoint;
  172. const resultObj = {
  173. oneDrive : {
  174. teams: oneDrive,
  175. },
  176. joinedTeams : {
  177. teams : teams,
  178. items : {},
  179. },
  180. sites : {
  181. teams : sites,
  182. },
  183. }
  184. if (teams && teams.length) {
  185. const options = {
  186. responseType: 'arraybuffer',
  187. headers: {
  188. Authorization: `Bearer ${req.session.accessToken}`,
  189. ConsistencyLevel: 'eventual',
  190. withCredentials:true,
  191. },
  192. };
  193. for (let team of teams) {
  194. const item = await getFetch(endPoint + "/groups/"+team.id+"/drive/items/root/children", req.session.accessToken);
  195. const sharePoint = await getFetch(endPoint + "/groups/"+team.id+"/drive/SharePointIds", req.session.accessToken);
  196. // const image = await axios.get(endPoint + "/groups/" + team.id + "/photo/$value", options);
  197. // if (image && image.data) {
  198. // team.image = image.data;
  199. // }
  200. if (sharePoint) {
  201. team.sharePoint = sharePoint;
  202. }
  203. if (item && item.value) {
  204. resultObj.joinedTeams.items[team.id] = item.value;
  205. }
  206. }
  207. }
  208. res.json(resultObj);
  209. } catch (error) {
  210. next(error);
  211. }
  212. }
  213. )
  214. serverApp.post('/makeFolder',
  215. isAuthenticated,
  216. (req, res, next)=>{
  217. if (!req.session.accessToken) {
  218. return authProvider.acquireToken({
  219. scopes: ['.default'],
  220. redirectUri: 'https://localhost:53000/redirect',
  221. successRedirect: '/makeFolder'
  222. })(req, res, next);
  223. }
  224. next();
  225. },
  226. async (req, res, next)=>{
  227. const options = {
  228. headers: {
  229. Authorization: `Bearer ${req.session.accessToken}`,
  230. },
  231. };
  232. const {siteId, path, param} = req.body;
  233. try{
  234. const sitesInfo = await axios.get(endPoint + "/sites/"+ siteId + path, options);
  235. if (sitesInfo.data) {
  236. const itemId = sitesInfo.data.id;
  237. const result = await axios.post(endPoint + "/sites/"+ siteId +"/drive/items/" + itemId +"/children", JSON.parse(param), options);
  238. res.json(result.data)
  239. }
  240. }
  241. catch(error) {
  242. console.log(error.response.data.error);
  243. // resultObj.success = 'F';
  244. // resultObj.message = '선택하신 파일 정보 삭제중 오류가 발생하였습니다.\n' + error.response.data.error.message;
  245. // return res.json(resultObj);
  246. }
  247. })
  248. serverApp.post('/api/upload', upload.array('file'),
  249. isAuthenticated,
  250. (req, res, next)=>{
  251. if (!req.session.accessToken) {
  252. return authProvider.acquireToken({
  253. scopes: ['.default'],
  254. redirectUri: 'https://localhost:53000/redirect',
  255. successRedirect: '/api/upload'
  256. })(req, res, next);
  257. }
  258. next();
  259. },
  260. async (req, res, next)=>{
  261. const startTime = new Date();
  262. const folderParam = {
  263. name: '',
  264. folder: { },
  265. '@microsoft.graph.conflictBehavior': 'rename'
  266. }
  267. const files = req.files;
  268. let {siteId, path, folder} = req.body;
  269. if (siteId && path) {
  270. const options = {
  271. headers: {
  272. Authorization: `Bearer ${req.session.accessToken}`,
  273. },
  274. };
  275. if (folder) {
  276. if (!Array.isArray(folder)) {
  277. folder = [folder];
  278. }
  279. let beforeUri = '';
  280. let beforeItemId = '';
  281. for (let item of folder) {
  282. const fileInfo = JSON.parse(item);
  283. const param = {...folderParam};
  284. param.name = fileInfo.name;
  285. let folderPath = '';
  286. if (fileInfo.path) {
  287. folderPath = ':' + fileInfo.path;
  288. }
  289. let uri = endPoint + "/sites/"+ siteId + path + folderPath;
  290. try {
  291. let itemId = '';
  292. if (beforeUri === uri) {
  293. itemId = beforeItemId;
  294. }
  295. else {
  296. const sitesInfo = await axios.get(uri, options);
  297. itemId = sitesInfo.data.id;
  298. beforeItemId = itemId;
  299. beforeUri = uri;
  300. }
  301. await axios.post(endPoint + "/sites/"+ siteId +"/drive/items/" + itemId +"/children", param, options);
  302. // await axios.post(endPoint + "/sites/"+ siteId +"/drive/items/" + itemId +"/children", param, options);
  303. }
  304. catch(error) {
  305. console.log(error);
  306. // next(error);
  307. return res.json({success:'F', message: '요청하신 파일 업로드 중 오류가 발생하였습니다.', error : error});
  308. }
  309. }
  310. }
  311. if (files && files.length > 0) {
  312. const promiseArray = [];
  313. let beforeUri = '';
  314. let beforeItemId = '';
  315. for (let file of files) {
  316. // const fileName = file.originalname.substring(0, file.originalname.lastIndexOf('.'));
  317. const fileName = file.originalname;
  318. let filePath = req.body[ fileName + "_path"];
  319. file.originalname = Buffer.from(file.originalname, 'ascii').toString('utf8');
  320. try {
  321. let formatPath = '';
  322. if (filePath) {
  323. if (Array.isArray(filePath) && filePath.length > 0) {
  324. formatPath = ":" + filePath[0];
  325. if (filePath.length > 1) {
  326. req.body[ fileName + "_path"] = filePath.splice(1);
  327. }
  328. }
  329. else if (filePath.trim()){
  330. formatPath = ":" + filePath;
  331. }
  332. }
  333. let itemId = '';
  334. const uri = endPoint + "/sites/"+ siteId + path + formatPath;
  335. if (beforeUri === uri) {
  336. itemId = beforeItemId;
  337. }
  338. else {
  339. const sitesInfo = await axios.get(uri, options);
  340. itemId = sitesInfo.data.id;
  341. beforeUri = uri;
  342. beforeItemId = itemId;
  343. }
  344. // const uploadUri = endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+file.originalname+':/content';
  345. const fileOptions = { headers: {
  346. Authorization: `Bearer ${req.session.accessToken}`,
  347. "Content-Type" : file.mimeType
  348. }}
  349. await axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+file.originalname+':/content', file.buffer, fileOptions);
  350. }
  351. catch(error) {
  352. if (error) {
  353. if (error.response) {
  354. console.log(error.response.data);
  355. }
  356. else {
  357. console.log(error);
  358. }
  359. }
  360. return res.json({success:'F', message: '요청하신파일 업로드 중 오류가 발생하였습니다.', error : error});
  361. }
  362. }
  363. }
  364. const endTime = new Date();
  365. console.log('시작 시간 :', startTime, '종료 시간 :', endTime);
  366. res.json({success:'S', message: '요청하신 파일 업로드가 정상적으로 처리 되었습니다.'});
  367. }
  368. });
  369. serverApp.post('/api/download',
  370. isAuthenticated,
  371. (req, res, next)=>{
  372. if (!req.session.accessToken) {
  373. return authProvider.acquireToken({
  374. scopes: ['.default'],
  375. redirectUri: 'https://localhost:53000/redirect',
  376. successRedirect: '/api/download'
  377. })(req, res, next);
  378. }
  379. next();
  380. },
  381. async (req, res, next)=>{
  382. if (req.body) {
  383. const {siteId, path, fileIds, zipName} = req.body;
  384. if (siteId && path && fileIds) {
  385. const options = {
  386. headers: {
  387. Authorization: `Bearer ${req.session.accessToken}`,
  388. },
  389. };
  390. const arr = JSON.parse(fileIds);
  391. if (arr.length === 1) {
  392. const sitesInfo = await axios.get(endPoint + "/sites/"+ siteId + "/drive/items/" + arr[0], options);
  393. if (sitesInfo && sitesInfo.data) {
  394. const data = sitesInfo.data;
  395. if (data.folder) {
  396. const folderObj = await getFolderItems(endPoint + "/sites/"+ siteId + "/drive/items/", arr, options);
  397. const zip = new JSZIP();
  398. if (folderObj) {
  399. createZipFile(folderObj, zip);
  400. const now = new Date();
  401. const year = now.getFullYear().toString();
  402. let month = now.getMonth() + 1;
  403. if (month < 10) month = "0" + month;
  404. let date = now.getDate();
  405. if (date < 10) date = "0" + date;
  406. zip.generateAsync({
  407. type: 'nodebuffer',
  408. mimeType: 'application/epub+zip',
  409. compression: 'DEFLATE',
  410. compressionOptions: {
  411. level: 9
  412. },
  413. }).then((resZip)=>{
  414. return res.json({success: 'S', data: resZip, name: data.name + '_' + year + '-' + month + '-' + date + '.zip'});
  415. })
  416. .catch((error)=>{
  417. console.log(error);
  418. return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.', error: error});
  419. });
  420. }
  421. }
  422. else {
  423. const dataUrl = data['@microsoft.graph.downloadUrl'];
  424. const response = await axios.get(dataUrl, {responseType: 'arraybuffer', headers: {
  425. withCredentials:true,
  426. },});
  427. if (response.data) {
  428. const file = response.data;
  429. return res.json({success: 'S', data: file, type: data.file.mimeType, name: data.name});
  430. }
  431. else {
  432. return res.json({message:'파일 다운로드에 실패하였습니다.', success:'F'})
  433. }
  434. }
  435. }
  436. }
  437. else {
  438. try {
  439. const url = endPoint + "/sites/"+ siteId + "/drive/items/";
  440. const zip = new JSZIP();
  441. const downObj = await getFolderItems(url, arr, options);
  442. if (downObj) {
  443. createZipFile(downObj, zip);
  444. const now = new Date();
  445. const year = now.getFullYear().toString();
  446. let month = now.getMonth() + 1;
  447. if (month < 10) month = "0" + month;
  448. let date = now.getDate();
  449. if (date < 10) date = "0" + date;
  450. zip.generateAsync({
  451. type: 'nodebuffer',
  452. mimeType: 'application/epub+zip',
  453. compression: 'DEFLATE',
  454. compressionOptions: {
  455. level: 9
  456. },
  457. }).then((resZip)=>{
  458. return res.json({success: 'S', data: resZip, name: zipName + '_' + year + '-' + month + '-' + date + '.zip'});
  459. })
  460. .catch((error)=>{
  461. console.log(error);
  462. return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.', error: error});
  463. });
  464. }
  465. }
  466. catch(err) {
  467. // console.log(sitesInfo.data);
  468. console.log(err);
  469. }
  470. // }
  471. }
  472. }
  473. else {
  474. return res.json({message:'다운로드 파일 정보를 확인 할 수 없습니다.', success:'F'})
  475. }
  476. }
  477. }
  478. );
  479. function createZipFile(obj, zip) {
  480. if (obj.files.length > 0) {
  481. for (let file of obj.files) {
  482. zip.file(file.name, file.data);
  483. }
  484. }
  485. if (obj.folder.length > 0) {
  486. for (let folder of obj.folder) {
  487. zip.folder(folder.name);
  488. if (folder.subFolder) {
  489. createZipFile(folder.subFolder, zip.folder(folder.name));
  490. }
  491. }
  492. }
  493. }
  494. async function getFolderItems(url, array, options) {
  495. const files = [];
  496. // let subFolder = [];
  497. let folder = [];
  498. for (let fileId of array) {
  499. const sitesInfo = await axios.get(url + fileId, options);
  500. const data = sitesInfo.data;
  501. if (data) {
  502. if (data.folder) {
  503. const folderObj = {name : data.name, subFolder : []};
  504. if (data.folder.childCount) {
  505. const itemsData = await axios.get(url + fileId + '/children', options);
  506. if (itemsData && itemsData.data && itemsData.data.value.length > 0) {
  507. const idArr = [];
  508. for (let children of itemsData.data.value) {
  509. idArr.push(children.id);
  510. }
  511. let result = await getFolderItems(url, idArr, options);
  512. // subFolder.push(result);
  513. folderObj.subFolder = result;
  514. }
  515. }
  516. folder.push(folderObj);
  517. }
  518. else {
  519. const dataUrl = data['@microsoft.graph.downloadUrl'];
  520. const response = await axios.get(dataUrl, {responseType: 'arraybuffer', headers: {
  521. withCredentials:true,
  522. },});
  523. files.push({name : data.name, data : response.data, type: data.file.mimeType});
  524. }
  525. }
  526. }
  527. const resultObj = {
  528. folder : folder,
  529. files : files,
  530. };
  531. return resultObj;
  532. }
  533. serverApp.post('/api/delete',
  534. isAuthenticated,
  535. (req, res, next)=>{
  536. if (!req.session.accessToken) {
  537. return authProvider.acquireToken({
  538. scopes: ['.default'],
  539. redirectUri: 'https://localhost:53000/redirect',
  540. successRedirect: '/api/delete'
  541. })(req, res, next);
  542. }
  543. next();
  544. },
  545. async (req, res, next)=>{
  546. if (req.body) {
  547. const {siteId, itemIds} = req.body;
  548. const resultObj = {success: '', message:''};
  549. if (siteId && itemIds) {
  550. const itemIdArr = JSON.parse(itemIds);
  551. if (itemIdArr.length > 0) {
  552. const options = {
  553. headers: {
  554. Authorization: `Bearer ${req.session.accessToken}`,
  555. },
  556. };
  557. for (let itemId of itemIdArr) {
  558. try{
  559. await axios.delete(endPoint + "/sites/"+ siteId + "/drive/items/" + itemId, options);
  560. }
  561. catch(error) {
  562. console.log(error.response.data.error);
  563. resultObj.success = 'F';
  564. resultObj.message = '선택하신 파일 정보 삭제중 오류가 발생하였습니다.<br>' + error.response.data.error.message;
  565. return res.json(resultObj);
  566. }
  567. }
  568. resultObj.success = 'S';
  569. resultObj.message = '파일 정보가 삭제되었습니다.';
  570. res.json(resultObj);
  571. }
  572. }
  573. else {
  574. resultObj.success = 'F';
  575. resultObj.message = '파라미터 정보를 확인해주세요.';
  576. res.json(resultObj);
  577. }
  578. }
  579. })
  580. serverApp.post('/api/update-name',
  581. isAuthenticated,
  582. (req, res, next)=>{
  583. if (!req.session.accessToken) {
  584. return authProvider.acquireToken({
  585. scopes: ['.default'],
  586. redirectUri: 'https://localhost:53000/redirect',
  587. successRedirect: '/api/update-name'
  588. })(req, res, next);
  589. }
  590. next();
  591. },
  592. async (req, res, next)=>{
  593. if (req.body) {
  594. const {siteId, itemId, name} = req.body;
  595. const resultObj = {success: '', message:''};
  596. if (siteId && itemId && name) {
  597. const options = {
  598. headers: {
  599. Authorization: `Bearer ${req.session.accessToken}`,
  600. },
  601. };
  602. try{
  603. await axios.patch(endPoint + "/sites/"+ siteId + "/drive/items/" + itemId, {name : name}, options);
  604. }
  605. catch(error) {
  606. console.log(error.response.data.error);
  607. resultObj.success = 'F';
  608. resultObj.message = '선택하신 파일의 이름 변경 중 오류가 발생하였습니다.<br>' + error.response.data.error.message;
  609. return res.json(resultObj);
  610. }
  611. resultObj.success = 'S';
  612. resultObj.message = '선택하신 파일의 이름이 변경되었습니다.';
  613. return res.json(resultObj);
  614. }
  615. }
  616. else {
  617. resultObj.success = 'F';
  618. resultObj.message = '파라미터 정보를 확인해주세요.';
  619. return res.json(resultObj);
  620. }
  621. })
  622. serverApp.post('/api/move-item',
  623. isAuthenticated,
  624. (req, res, next)=>{
  625. if (!req.session.accessToken) {
  626. return authProvider.acquireToken({
  627. scopes: ['.default'],
  628. redirectUri: 'https://localhost:53000/redirect',
  629. successRedirect: '/api/move-item'
  630. })(req, res, next);
  631. }
  632. next();
  633. },
  634. async (req, res, next)=>{
  635. if (req.body) {
  636. const {id, name, itemId, siteId} = req.body;
  637. const resultObj = {message:'', successItems : [], failItems : []};
  638. if (name && isNaN(name)) {
  639. const nameArray = JSON.parse(name);
  640. const options = {
  641. headers: {
  642. Authorization: `Bearer ${req.session.accessToken}`,
  643. ContentType: "application/json",
  644. },
  645. };
  646. if (nameArray && nameArray.length > 0) {
  647. for (let moveItem of nameArray) {
  648. if (moveItem) {
  649. const param = {
  650. parentReference: {
  651. id: id
  652. },
  653. name: moveItem.name
  654. };
  655. try {
  656. const result = await axios.patch(`${endPoint}/sites/${siteId}/drive/items/${moveItem.id}`, param, options);
  657. // const remove = await axios.delete(`${endPoint}/sites/${siteId}/drive/items/${moveItem.id}`, options);
  658. console.log(result.data);
  659. if (result.data) {
  660. resultObj.successItems.push(moveItem.name);
  661. }
  662. }
  663. catch (error) {
  664. // console.log(error);
  665. console.log(error.message);
  666. console.log(error.name);
  667. console.log(error.errors);
  668. resultObj.failItems.push(moveName.name);
  669. }
  670. }
  671. }
  672. resultObj.message = `요청 하신 ${nameArray.length} 개 파일 중 ${ resultObj.successItems.length} 개 파일이 이동 되었습니다.`;
  673. }
  674. }
  675. return res.json(resultObj);
  676. }
  677. });