| 
					
				 | 
			
			
				@@ -19,7 +19,11 @@ const multer  = require('multer'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const msal = require('@azure/msal-node'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // const FormData = require("form-data"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // const { v4: uuidv4 } = require('uuid'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const mime = require('mime-types'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const {init} = require('./ext.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const BadRequest = require('./error/badRequest.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const LabelBadResponse = require('./error/labelBadResponse.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const NotFound = require('./error/notFound.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 let POSSIBLE_EXT; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const apiUrl = 'http://192.168.20.99:5050'; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -78,15 +82,10 @@ serverApp.use(session({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 })); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-serverApp.use(async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  POSSIBLE_EXT = await init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  next(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.set(express.json()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.use(cookieParser()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.use(express.urlencoded({ extended: false })); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.use("/static", express.static(globalPath.join(__dirname, 'static'))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const options = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   key: process.env.SSL_KEY_FILE ? fs.readFileSync(process.env.SSL_KEY_FILE) : undefined, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   cert: process.env.SSL_CRT_FILE ? fs.readFileSync(process.env.SSL_CRT_FILE) : undefined, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -121,17 +120,25 @@ wsServer.on('request', function(req) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async function getPercentageComplete(url, connection) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const result = await axios.get(url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (result && result.data && result.data.percentageComplete >= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const percent = result.data.percentageComplete; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (percent > 100) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      percent = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    connection.sendUTF(Number(percent.toFixed(2))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (result.data.percentageComplete < 100) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      setTimeout(()=>getPercentageComplete(url, connection), 1000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const result = await axios.get(url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (result && result.data && result.data.percentageComplete >= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      let percent = result.data.percentageComplete; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (percent > 100) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        percent = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      connection.sendUTF(Number(percent.toFixed(2))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (result.data.percentageComplete < 100) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        setTimeout(()=>getPercentageComplete(url, connection), 1000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    console.log(error.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    console.log(error.name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    console.log(error.errors); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    connection.sendUTF(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const corsOption = { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -143,12 +150,16 @@ serverApp.use(cors(corsOption)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.use(bodyParser.json()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.get("/tab",  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async function (req, res, next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  errorHandler( async function (req, res, next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     res.sendFile(globalPath.join(__dirname, "/views/hello.html"),  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  })  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-serverApp.post("/getProfileOnBehalfOf", async (req, res, next) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+serverApp.post("/getProfileOnBehalfOf", errorHandler(async (req, res, next) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!req.body.token) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    throw BadRequest('토큰 정보를 찾을 수 없습니다.'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   result = await cca.acquireTokenOnBehalfOf({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     oboAssertion: req.body.token, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     scopes: [".default"] 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -159,7 +170,7 @@ serverApp.post("/getProfileOnBehalfOf", async (req, res, next) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   req.session.account = result.account; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   req.session.auth = result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return res.send(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.post("/redirect", (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   console.log(req); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -169,53 +180,42 @@ serverApp.get("/redirect", (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.post("/api-get",    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async (req, res, next) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  errorHandler(async (req, res, next) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const uri = req.body.api_uri || req.session.apiUri; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let param = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (req.session.param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       param = req.session.param; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const graphResponse = await getFetch(endPoint + uri, req.session.accessToken, param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        res.json(graphResponse); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        next(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const graphResponse = await getFetch(endPoint + uri, req.session.accessToken, param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    res.json(graphResponse); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.get("/api-redirect",  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async function (req, res, next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  errorHandler(async function (req, res, next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const uri = req.session.apiUri; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       let param = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (req.session.param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         param = req.session.param; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          const graphResponse = await getFetch(endPoint + uri, req.session.accessToken, param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          res.json(graphResponse); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          next(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const graphResponse = await getFetch(endPoint + uri, req.session.accessToken, param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      res.json(graphResponse); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.get("/post-redirect",  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async function (req, res, next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  errorHandler(async function (req, res, next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const uri = req.session.apiUri; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let param = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (req.session.param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         param = req.session.param; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const graphResponse = await updateFetch(endPoint + uri, req.session.accessToken, param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        res.json(graphResponse); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        next(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const graphResponse = await updateFetch(endPoint + uri, req.session.accessToken, param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    res.json(graphResponse); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-serverApp.post("/getGroupList",  async function (req, res, next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+serverApp.post("/getGroupList",  errorHandler(async function (req, res, next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const options = getOptions(req.session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const uriArr = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         axios.get(endPoint + "/me/drive/root", options), 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -260,13 +260,10 @@ serverApp.post("/getGroupList",  async function (req, res, next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      next(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.post('/api/makeFolder',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  errorHandler(async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const options = getOptions(req.session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const {siteId, path, name} = req.body; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -276,30 +273,26 @@ serverApp.post('/api/makeFolder', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         folder: { }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         '@microsoft.graph.conflictBehavior': 'rename' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      try{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const sitesInfo = await axios.get(endPoint + "/sites/"+ siteId + path, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (sitesInfo.data && sitesInfo.data.id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          const itemId = sitesInfo.data.id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          const result = await axios.post(endPoint + "/sites/"+ siteId +"/drive/items/" + itemId +"/children",param, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (result.data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            resultObj.message = "폴더가 생성되었습니다.<br>폴더명 : "+ name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            resultObj.success = 'S'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            resultObj.message = "폴더가 생성되지 않았습니다."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const sitesInfo = await axios.get(endPoint + "/sites/"+ siteId + path, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (sitesInfo.data && sitesInfo.data.id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const itemId = sitesInfo.data.id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const result = await axios.post(endPoint + "/sites/"+ siteId +"/drive/items/" + itemId +"/children",param, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (result.data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          resultObj.message = "폴더가 생성되었습니다.<br>폴더명 : "+ name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          resultObj.success = 'S'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          resultObj.message = "생성할 폴더 경로를 찾을 수 없습니다."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      catch(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        resultObj.message = "폴더 생성 중 오류가 발생하였습니다.<br>" + getErrorMessage(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          resultObj.message = "폴더가 생성되지 않았습니다."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        resultObj.message = "생성할 폴더 경로를 찾을 수 없습니다."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function getErrorMessage(error) {    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   let errorText = ""; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -322,46 +315,45 @@ function getErrorMessage(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.post('/api/makeFile',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const result = await createNewFile(req); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return res.json(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async function createNewFile(req) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const resultObj = {message:'', success: 'F'}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const {siteId, path, name, fileName, ext} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  try{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const options = getOptions(req.session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const typeName = fileName.substring(0, fileName.indexOf(' ')); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const newFile = fs.readFileSync('./src/static/template/template' + ext); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const base64EncodeData = Buffer.from(newFile).toString('base64'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    console.log(name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const labelData = await setLabel(gateWayKey, req.session.account.idTokenClaims.email, name,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    "878173ae-cc36-4881-af57-604af868314c", base64EncodeData, "Make New " + fileName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (labelData.success === 'F') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      throw labelData.message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const parentData = await axios.get(endPoint + "/sites/"+ siteId +path, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (parentData.data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const result = await axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+parentData.data.id+':/'+name+':/content', labelData.data, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (result.data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        resultObj.message ='요청하신 ' + typeName + ' 파일이 생성 되었습니다.'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        resultObj.success = 'S'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        resultObj.message = '요청하신 ' + typeName + ' 파일이 생성 되지 않았습니다.'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  errorHandler(async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const resultObj = {message:'', success: 'F'}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const {siteId, path, name, fileName, ext} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const options = getOptions(req.session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const typeName = fileName.substring(0, fileName.indexOf(' ')); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const newFile = fs.readFileSync('./src/static/template/template' + ext); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const base64EncodeData = Buffer.from(newFile).toString('base64'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const labelData = await setLabel(gateWayKey, req.session.account.idTokenClaims.email, name,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                      "878173ae-cc36-4881-af57-604af868314c", base64EncodeData, "Make New " + fileName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (labelData.success === 'F') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        throw new Error(labelData.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  catch(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    resultObj.message = "요청하신 " + typeName + " 파일 생성 중 오류가 발생하였습니다.<br>" + getErrorMessage(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return resultObj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const parentData = await axios.get(endPoint + "/sites/"+ siteId +path, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (parentData.data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const result = await axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+parentData.data.id+':/'+name+':/content', labelData.data, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (result.data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          resultObj.message ='요청하신 ' + typeName + ' 파일이 생성 되었습니다.'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          resultObj.success = 'S'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          resultObj.message = '요청하신 ' + typeName + ' 파일이 생성 되지 않았습니다.'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 레이블 생성 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} apiKey 레이블 생성 키  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} email 로그인 ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} dispFileName 파일명 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} aipGuid AIP GUID (UUID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} fileData 파일 데이터 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} comment 메모 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @returns  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async function setLabel(apiKey, email, dispFileName, aipGuid, fileData, comment) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const param = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     apiKey: apiKey, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -377,61 +369,41 @@ async function setLabel(apiKey, email, dispFileName, aipGuid, fileData, comment) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     data : null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const errorMessage = '레이블 적용 중 오류가 발생했습니다.<br>에러 : '; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const result = await axios.post(apiUrl + '/api/v1/stream/set-label', param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (result && result.data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (result.data.statusCode === 200 && !result.data.result.errorCode && result.data.result.fileData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (result.data.success === true && !result.data.errorCode && result.data.result && result.data.result.fileData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         resultObj.data = Buffer.from(result.data.result.fileData, "base64"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         resultObj.success = 'S'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        resultObj.message = errorMessage + result.data.result.errorMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let name = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (result.data.result && result.data.result.dispFileName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          name = ' (파일명 : ' + result.data.result.dispFileName + ')'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        throw new LabelBadResponse(result.data.errorMessage + name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // resultObj.message = errorMessage + result.data.result.errorMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       resultObj.message = errorMessage + '수신 데이터 없음'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    resultObj.message = errorMessage + JSON.stringify(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //   resultObj.message = errorMessage + JSON.stringify(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return resultObj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-serverApp.post('/api/check-name',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const options = getOptions(req.session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const {siteId, path, name} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      try{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const sitesInfo = await axios.get(endPoint + "/sites/"+ siteId + path, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (sitesInfo.data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          const itemId = sitesInfo.data.id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          const result = await axios.get(endPoint + "/sites/"+ siteId +"/drive/items/" + itemId +"/children", options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (result && result.data && result.data.value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            let idx = result.data.value.findIndex(obj=>obj.name === name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            res.json({hasName: (idx > -1)}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      catch(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (error.response) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          console.log("error.response", error.response); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          const statusCode = err.response.status; // 400 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          const statusText = err.response.statusText; // Bad Request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          const message = err.response.data.message[0]; // id should not be empty 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          console.log(`${statusCode} - ${statusText} - ${message}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          res.json(error.response); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          console.log(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          res.json(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 폴더 생성 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} options TEAMS API 호출 Options  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} folder 생성 폴더 객체 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} siteId SITE ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} path SITE ROOT PATH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @returns  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async function uploadDrive(options, folder, siteId, path) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const startTime = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const resultObj = { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -452,6 +424,7 @@ async function uploadDrive(options, folder, siteId, path) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // '@microsoft.graph.conflictBehavior': 'rename' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //SITE PATH 형식 /sites/{siteId}/drive/root(루트) => /sites/{siteId}/drive/root:/{folderPath}(루트하위)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let folderPath = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (fileInfo.path) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       folderPath = fileInfo.path;  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -494,12 +467,14 @@ async function uploadDrive(options, folder, siteId, path) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return resultObj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 파일 업로드 API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.post('/api/upload', upload.array('file'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  errorHandler(async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const startTime = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const files = req.files; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let {siteId, path, folder, file_path} = req.body;  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (siteId && path) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const options = getOptions(req.session.accessToken); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -597,78 +572,82 @@ serverApp.post('/api/upload', upload.array('file'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // const siteInfos = await Promise.all(siteInfoArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // siteInfos.forEach((obj)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //   promiseArray.push(endPoint + "/sites/"+ siteId +"/drive/items/"+obj.data.id+':/'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //file write 시 사용 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //const writeArr = await Promise.all(fileWriteArray); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                let writeTime = timeCheck(fileWriteTime, new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                console.log('파일 Write Time : '+ writeTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const labelTime = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const labelResult = await Promise.all(labelPromiseArray); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // console.log(labelResult[0].data.result.fileData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                console.log('label time : ', timeCheck(labelTime, new Date())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (let idx in labelResult) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  const obj = labelResult[idx]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  if (obj.data && !obj.data.result.errorCode && obj.data.result.fileData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const data = Buffer.from(obj.data.result.fileData, 'base64'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // promiseArray[idx] = new Promise(async (resolve)=> resolve(await axios.put(promiseArray[idx] + obj.data.result.dispFileName + ':/content', data, options))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    promiseArray[idx] = axios.put(promiseArray[idx] + obj.data.result.dispFileName + ':/content', data, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+ siteInfos[idx].data.id + ':/' + obj.data.result.dispFileName + ':/content', data, options)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    throw '파일명 : '+obj.data.result.dispFileName + '<br>에러 : ' + obj.data.result.errorMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // const siteInfos = await Promise.all(siteInfoArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // siteInfos.forEach((obj)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //   promiseArray.push(endPoint + "/sites/"+ siteId +"/drive/items/"+obj.data.id+':/'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //file write 시 사용 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //const writeArr = await Promise.all(fileWriteArray); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              let writeTime = timeCheck(fileWriteTime, new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              console.log('파일 Write Time : '+ writeTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              const labelTime = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              const labelResult = await Promise.all(labelPromiseArray); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // console.log(labelResult[0].data.result.fileData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              console.log('label time : ', timeCheck(labelTime, new Date())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              for (let idx in labelResult) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const obj = labelResult[idx].data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (obj && obj.success === true && !obj.errorCode && obj.result.fileData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  const data = Buffer.from(obj.result.fileData, 'base64'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  // promiseArray[idx] = new Promise(async (resolve)=> resolve(await axios.put(promiseArray[idx] + obj.data.result.dispFileName + ':/content', data, options))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  promiseArray[idx] = axios.put(promiseArray[idx] + obj.result.dispFileName + ':/content', data, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  // promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+ siteInfos[idx].data.id + ':/' + obj.data.result.dispFileName + ':/content', data, options)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  let name = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  if (obj.result && obj.result.dispFileName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    name = ' (파일명 : ' + obj.result.dispFileName + ')'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  throw new LabelBadResponse(obj.data.errorMessage + name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // labelResult.forEach((obj, idx)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //   if (obj.data && !obj.data.result.errorCode && obj.data.result.fileData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //     const data = Buffer.from(obj.data.result.fileData, 'base64'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //     promiseArray[idx] = axios.put(promiseArray[idx] + obj.data.result.dispFileName + ':/content', data, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //     // promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+ siteInfos[idx].data.id + ':/' + obj.data.result.dispFileName + ':/content', data, options)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //   else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //     throw '파일명 : '+obj.data.result.dispFileName + '<br>에러 : ' + obj.data.result.errorMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // const readArray = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // labelResult.forEach((obj)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //   readArray.push(new Promise((resolve, reject)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //       if (obj.data && !obj.data.result.errorCode) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //         fs.readFile('Z:/Target/' + obj.data.result.outputFileName, (err, data)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //           if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //             reject({err});  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //           resolve({data}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //           //promiseArray[idx] = axios.put(promiseArray[idx], data, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //       else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //         reject(obj.data.result.errorMessage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //   })) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // console.log('labelResult : ', labelResult); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // let readTime = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // const readResult = await Promise.all(readArray); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // console.log(readResult); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // console.log('File Read time : ', timeCheck(readTime, new Date())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                let uploadTime = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // promiseArray.forEach((obj, idx)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //   // console.log(readResult[idx].data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //   // console.log(obj[idx]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //   promiseArray[idx] = axios.put(obj, readResult[idx].data, options);  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const uploadResult = await Promise.all(promiseArray); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                console.log('File uploadTime : ', timeCheck(uploadTime, new Date())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // labelResult.forEach((obj, idx)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //   if (obj.data && !obj.data.result.errorCode && obj.data.result.fileData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //     const data = Buffer.from(obj.data.result.fileData, 'base64'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //     promiseArray[idx] = axios.put(promiseArray[idx] + obj.data.result.dispFileName + ':/content', data, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //     // promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+ siteInfos[idx].data.id + ':/' + obj.data.result.dispFileName + ':/content', data, options)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //   else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //     throw '파일명 : '+obj.data.result.dispFileName + '<br>에러 : ' + obj.data.result.errorMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // const readArray = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // labelResult.forEach((obj)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //   readArray.push(new Promise((resolve, reject)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //       if (obj.data && !obj.data.result.errorCode) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //         fs.readFile('Z:/Target/' + obj.data.result.outputFileName, (err, data)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //           if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //             reject({err});  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //           resolve({data}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //           //promiseArray[idx] = axios.put(promiseArray[idx], data, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //       else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //         reject(obj.data.result.errorMessage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //   })) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // console.log('labelResult : ', labelResult); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // let readTime = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // const readResult = await Promise.all(readArray); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // console.log(readResult); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // console.log('File Read time : ', timeCheck(readTime, new Date())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              let uploadTime = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // promiseArray.forEach((obj, idx)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //   // console.log(readResult[idx].data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //   // console.log(obj[idx]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              //   promiseArray[idx] = axios.put(obj, readResult[idx].data, options);  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              const uploadResult = await Promise.all(promiseArray); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              console.log('File uploadTime : ', timeCheck(uploadTime, new Date())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           const endTime = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           let betweenTime = timeCheck(startTime, endTime); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -676,15 +655,16 @@ serverApp.post('/api/upload', upload.array('file'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           res.json({success:'S', message: '요청하신 파일 업로드가 정상적으로 처리 되었습니다.'}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return res.json({success:'F', message: '업로드 요청 파라미터 정보를 확인해 주세요.'}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        throw new NotFound(`업로드 요청 파라미터 정보를 확인해 주세요.<br>siteId : ${siteId}, path : ${path}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    catch(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      console.log(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      res.json({success:'F', message: '파일 업로드 작업 중 오류가 발생했습니다.<br>에러 : ' + JSON.stringify(error.message)}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 시간 차 계산기 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} startTime 시작 시간  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} endTime 종료 시간 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @returns  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function timeCheck(startTime, endTime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   let betweenTime = endTime - startTime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (betweenTime > 60000) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -696,10 +676,12 @@ function timeCheck(startTime, endTime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return betweenTime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-serverApp.post('/api/download', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 파일 다운로드 API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+serverApp.post('/api/download',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  errorHandler(async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       let startTime = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const {siteId, path, fileIds, zipName} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (siteId && path && fileIds) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -722,20 +704,29 @@ serverApp.post('/api/download', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               fileData: Buffer.from(bufferData).toString('base64') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const deleteLabelResult = await axios.post(apiUrl + '/api/v1/stream/delete-label', param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (deleteLabelResult && deleteLabelResult.data && !deleteLabelResult.data.result.errorCode) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              const fileData = deleteLabelResult.data.result.fileData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              return res.json({success: 'S', data: fileData, name: deleteLabelResult.data.result.dispFileName}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const data = deleteLabelResult.data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (data && data.success === true && !data.errorCode && data.result.fileData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              const fileData = data.result.fileData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              return res.json({success: 'S', data: fileData, name: data.result.dispFileName}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // return res.json({success: 'S', data: fileData, name: data.result.dispFileName}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // res.setHeader('Content-disposition', 'attachment; filename=' + data.result.dispFileName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // res.setHeader('Content-type', mime.lookup(data.result.dispFileName)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // res.pipe(fileData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              throw deleteLabelResult.data.result.dispFileName + ' : ' +deleteLabelResult.data.result.errorMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              let name = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              if (data.result && data.result.dispFileName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                name = ' (파일명 : ' + data.result.dispFileName + ')'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              throw new LabelBadResponse(data.errorMessage + name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           //폴더 또는 다중 파일 다운로드  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const zip = new JSZIP(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const timer = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            console.log('getFolderItems Start : ', timer.toLocaleString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await getFolderItems(url, arr, options, req.session, zip); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            console.log('getFolderItems Start : ', timer.toLocaleString());  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            await getFolderItems(url, arr, req.session, zip); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const timerEnd = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             console.log('getFolderItems end : ', timerEnd.toLocaleString(), ', 소요시간 : '+ timeCheck(timer,timerEnd)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const now = new Date(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -762,16 +753,25 @@ serverApp.post('/api/download', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return res.json({message:'다운로드 파일 정보를 확인 할 수 없습니다.', success:'F'}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    catch(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.<br>'+ getErrorMessage(error)}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // catch(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //   return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.<br>'+ getErrorMessage(error)}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async function getFolderItems(url, array, options, session, zip) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const fileArr       = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const fileInfoArr   = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 다운로드 할 모든 파일, 폴더를 zip 객체에 세팅  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} url 루트 주소 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} array 조회 객체 Array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} session 세션 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} zip zip 객체(zip.folder(이름).folder(이름)... 으로 폴더 구분) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async function getFolderItems(url, array, session, zip) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const fileArr     = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const fileInfoArr = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const options     = getOptions(session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const email       = session.account.idTokenClaims.email; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   await Promise.all(array.map((obj)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return axios.get(url + obj.id, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   })) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -785,8 +785,7 @@ async function getFolderItems(url, array, options, session, zip) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (data.folder.childCount) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               const itemsData = await axios.get(url + data.id + '/children', options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               if (itemsData && itemsData.data && itemsData.data.value.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  promiseArray.push(new Promise((resolve)=>resolve(getFolderItems(url, itemsData.data.value, options, session, zip.folder(data.name))))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  // promiseArray.push(getFolderItems(url, itemsData.data.value, options, session, zip.folder(data.name))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  promiseArray.push(getFolderItems(url, itemsData.data.value, session, zip.folder(data.name))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -798,7 +797,7 @@ async function getFolderItems(url, array, options, session, zip) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               fileInfoArr.push(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              throw '파일 명 : ' + data.name + '<br>파일 데이터 정보가 없습니다.'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              throw new NotFound('파일 데이터 정보가 없습니다. (' + data.name + ')'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -819,7 +818,7 @@ async function getFolderItems(url, array, options, session, zip) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const data = result[idx]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const param = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           apiKey: gateWayKey, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          email : session.account.idTokenClaims.email, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          email : email, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           dispFileName: fileInfoArr[idx].name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           comment: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           fileData: Buffer.from(data.data).toString('base64') 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -834,24 +833,33 @@ async function getFolderItems(url, array, options, session, zip) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         deleteLabelFiles.map((item)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const data = item.data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (data.success && !data.result.errorCode) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (data.success && !data.errorCode && data.result && data.result.fileData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               zip.file(data.result.dispFileName, data.result.fileData, {base64: true}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              throw data.result.dispFileName + ' : ' + data.result.errorMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              let name = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              if (data.result && data.result.dispFileName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                name = ' (파일명 : ' + data.result.dispFileName + ')'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              throw new LabelBadResponse(data.errorMessage + name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         })) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 업로드 가능 파일 확장자 API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.post('/api/getPossibleExtList', async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return res.json(POSSIBLE_EXT); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 파일 삭제 API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.post('/api/delete',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  errorHandler(async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (req.body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const {siteId, itemIds} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const resultObj = {success: '', message:''}; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -859,21 +867,23 @@ serverApp.post('/api/delete', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const itemIdArr = JSON.parse(itemIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (itemIdArr.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           const options = getOptions(req.session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          const deleteArr = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           for (let itemId of itemIdArr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              await axios.delete(endPoint + "/sites/"+ siteId + "/drive/items/" + itemId, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            catch(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              resultObj.success = 'F'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              let message = '선택하신 파일 정보 삭제중 오류가 발생하였습니다.'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              if (error && error.response && error.response.data && error.response.data.error && error.response.data.error.message) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                console.log(error.response.data.error.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                message += '<br>' + error.response.data.error.message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              resultObj.message = message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              return res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // try{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              deleteArr.push(axios.delete(endPoint + "/sites/"+ siteId + "/drive/items/" + itemId, options)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // catch(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //   resultObj.success = 'F'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //   let message = '선택하신 파일 정보 삭제중 오류가 발생하였습니다.'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //   if (error && error.response && error.response.data && error.response.data.error && error.response.data.error.message) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //     console.log(error.response.data.error.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //     message += '<br>' + error.response.data.error.message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //   resultObj.message = message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //   return res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          await Promise.all(deleteArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           resultObj.success = 'S'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           resultObj.message = '파일 정보가 삭제되었습니다.'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           res.json(resultObj); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -885,27 +895,27 @@ serverApp.post('/api/delete', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  })); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-serverApp.post('/api/update-name',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // isAuthenticated, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // isAccessTokens, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 파일명 변경 API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+serverApp.post('/api/update-name', errorHandler(async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (req.body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const {siteId, itemId, name} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const resultObj = {success: '', message:''}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (siteId && itemId && name) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const options = getOptions(req.session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          try{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await axios.patch(endPoint + "/sites/"+ siteId + "/drive/items/" + itemId, {name : name}, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          catch(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            console.log(error.response.data.error);  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          // try{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          await axios.patch(endPoint + "/sites/"+ siteId + "/drive/items/" + itemId, {name : name}, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          // catch(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          //   console.log(error.response.data.error);  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            resultObj.success = 'F'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            resultObj.message = '선택하신 파일의 이름 변경 중 오류가 발생하였습니다.<br>' + error.response.data.error.message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          //   resultObj.success = 'F'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          //   resultObj.message = '선택하신 파일의 이름 변경 중 오류가 발생하였습니다.<br>' + error.response.data.error.message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          //   return res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           resultObj.success = 'S'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           resultObj.message = '선택하신 파일의 이름이 변경되었습니다.'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           return res.json(resultObj); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -916,12 +926,12 @@ serverApp.post('/api/update-name', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         resultObj.message = '파라미터 정보를 확인해주세요.'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  })); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-serverApp.post('/api/move-item',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // isAuthenticated, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // isAccessTokens, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 파일 이동 API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+serverApp.post('/api/move-item', errorHandler(async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (req.body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const {id, name, siteId, text} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const resultObj = {message:'', successItems : [], failItems : [], locations: []}; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -959,88 +969,63 @@ serverApp.post('/api/move-item', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-serverApp.post('/api/copy-item',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// isAuthenticated, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// isAccessTokens, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (req.body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const {id, name, siteId, driveId, text} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const resultObj = {message:'', successItems : [], failItems : [], locations: []}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (name && isNaN(name)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const nameArray = JSON.parse(name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const options = getOptions(req.session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 파일 복사 API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+serverApp.post('/api/copy-item', errorHandler(async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (req.body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const {id, name, siteId, driveId, text} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const resultObj = {message:'', successItems : [], failItems : [], locations: []}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (name && isNaN(name)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const nameArray = JSON.parse(name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const options = getOptions(req.session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (nameArray && nameArray.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (let moveItem of nameArray) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (moveItem) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const param = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              parentReference: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                id: id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                driveId : driveId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              name: moveItem.name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              const result = await axios.post(`${endPoint}/sites/${siteId}/drive/items/${moveItem.id}/copy`, param, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              if (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                resultObj.successItems.push(moveItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                resultObj.locations.push(result.headers.location); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (nameArray && nameArray.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          for (let moveItem of nameArray) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (moveItem) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              const param = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                parentReference: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  id: id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  driveId : driveId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                name: moveItem.name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const result = await axios.post(`${endPoint}/sites/${siteId}/drive/items/${moveItem.id}/copy`, param, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  resultObj.successItems.push(moveItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  resultObj.locations.push(result.headers.location); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // console.log(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                console.log(error.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                console.log(error.name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                console.log(error.errors); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                resultObj.failItems.push(moveItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              // console.log(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              console.log(error.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              console.log(error.name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              console.log(error.errors); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              resultObj.failItems.push(moveItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          resultObj.message = `요청 하신 ${nameArray.length} 개 파일 중 ${ resultObj.successItems.length} 개 파일이 ${text} 되었습니다.`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        resultObj.message = `요청 하신 ${nameArray.length} 개 파일 중 ${ resultObj.successItems.length} 개 파일이 ${text} 되었습니다.`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-serverApp.post('/api/loading',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (req.body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const {url} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (url) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          const result = await axios.get(`${url}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (result && result.data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            console.log(result.data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return res.json(result.data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // console.log(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          console.log(error.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          console.log(error.name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          console.log(error.errors); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          return res.json(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-serverApp.post('/api/add-tab',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// isAuthenticated, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// isAccessTokens, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (req.body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 탭추가 API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+serverApp.post('/api/add-tab', errorHandler(async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (req.body) {   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const {name, siteId, path, teamId, teamName, bindId} = req.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const resultObj = {message:'', success: 'F'}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (name && siteId && path && teamId && teamName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const options = getOptions(req.session.accessToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const teamInfo = await axios.get(`${endPoint}/teams/${teamId}/channels`, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const sharePoint = await axios.get(`${endPoint}/sites/${siteId}/drive`, options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (teamInfo.data && teamInfo.data.value && sharePoint.data) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1074,25 +1059,10 @@ async (req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        resultObj.message = `채널명 : ${channelName}<br>파일명 : ${name}<br>요청하신 채널에 탭으로 설정 중 오류가 발생하였습니다.<br>` + getErrorMessage(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return res.json(resultObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// // 데이터베이스 연결 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// pool.connect((err) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//   // 연결이 안될 경우 에러 내용 콘솔에 출력 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//   if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//       console.error('Error connecting to database:', err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//       return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//   // 연결에 성공할 경우 연결 성공 메시지 콘솔에 출력 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//   console.log('Connected to database'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function getOptions(token) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const options = { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1103,19 +1073,32 @@ function getOptions(token) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return options; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 에러 Handling 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param {*} fn 함수  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @returns  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function errorHandler(fn) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return function (req, res, next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn(req, res, next).catch(next) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 serverApp.use((err, req, res, next)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  console.log(err.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // console.log(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  console.log(res.statusCode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    res.status(400); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    res.json({message: err.message}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    res.status(500); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    res.json({message: err.message}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    console.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return res.status(err.status || 500).json({  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      name: err.name || 'Internal Server Error', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      message: err.message || '서버 내부에서 오류가 발생했습니다.' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-server.listen(SERVER_PORT, function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+server.listen(SERVER_PORT, async function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   console.log(`\n${serverApp.name} listening to ${SERVER_PORT}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  POSSIBLE_EXT = await init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  setInterval(async ()=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    POSSIBLE_EXT = await init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // console.log('POSSIBLE EXT UPDATE'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }, 60 * 3 * 1000);  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 });  
			 |