app.js 25 KB

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