junggilpark 1 год назад
Родитель
Сommit
b492b0d3f4
6 измененных файлов с 195 добавлено и 838 удалено
  1. 110 638
      src/app.js
  2. 0 2
      src/ext.js
  3. 1 0
      src/static/template/template.docx
  4. BIN
      src/static/template/template.pptx
  5. BIN
      src/static/template/template.xlsx
  6. 84 198
      src/views/hello.html

+ 110 - 638
src/app.js

@@ -14,18 +14,17 @@ const JSZIP = require('jszip');
 require('dotenv').config({ path: './env/.env.local' });
 const session = require('express-session');
 const multer  = require('multer');
-const XLSX = require('xlsx');
-const pptxgen = require('pptxgenjs');
+// const XLSX = require('xlsx');
+// const pptxgen = require('pptxgenjs');
 const msal = require('@azure/msal-node');
-const FormData = require("form-data");
-const {pool, sql} = require('./config/sql.js');
-const { v4: uuidv4 } = require('uuid');
+// const FormData = require("form-data");
+// const { v4: uuidv4 } = require('uuid');
 const {init} = require('./ext.js');
 let POSSIBLE_EXT;
 
 const apiUrl = 'http://192.168.20.99:5050';
 
-const createErrors = require('http-errors');
+// const createErrors = require('http-errors');
 
 const gateWayKey = process.env.GATE_WAY_KEY;
 
@@ -47,9 +46,9 @@ const msalConfig = {
 
 const cca = new msal.ConfidentialClientApplication(msalConfig);
 
-const {Document, Packer, Paragraph, TextRun} = require('docx');
-const messages = require('dote/src/messages.js');
-const { rejects } = require('assert');
+// const {Document, Packer, Paragraph, TextRun} = require('docx');
+// const messages = require('dote/src/messages.js');
+// const { rejects } = require('assert');
 let WebSocketServer = require('websocket').server;
 // const redirectUri = 'https://localhost:53000/redirect';
 const redirectUri = 'https://localhost:53000/redirect';
@@ -107,12 +106,10 @@ wsServer.on('request', function(req) {
           getPercentageComplete(value, connection);
         }
         catch (error) {
-          // console.log(error);
           console.log(error.message);
           console.log(error.name);
           console.log(error.errors);
           connection.sendUTF(error);
-          // return res.json(error);
         }
       }
     }
@@ -123,9 +120,11 @@ async function getPercentageComplete(url, connection) {
   const result = await axios.get(url);
   if (result && result.data && result.data.percentageComplete >= 0) {
     const percent = result.data.percentageComplete;
-    // console.log(result.data);
+    if (percent > 100) {
+      percent = 100;
+    }
     connection.sendUTF(Number(percent.toFixed(2)));
-    if (result.data.percentageComplete !== 100) {
+    if (result.data.percentageComplete < 100) {
       setTimeout(()=>getPercentageComplete(url, connection), 1000);
     }
   }
@@ -140,11 +139,9 @@ serverApp.use(cors(corsOption));
 serverApp.use(bodyParser.json());
 
 serverApp.get("/tab", 
-  // isAuthenticated, 
   async function (req, res, next) {
     POSSIBLE_EXT = await init();
     res.sendFile(globalPath.join(__dirname, "/views/hello.html"), 
-      // { idTokenClaims: req.session.account.idTokenClaims }
     );
   }
 );
@@ -160,31 +157,7 @@ serverApp.post("/getProfileOnBehalfOf", async (req, res, next) => {
   req.session.auth = result;
   return res.send(result);
 })
-// function isAuthenticated(req, res, next) {
-//   if (!req.session.isAuthenticated) {
-//     return res.redirect('/auth/signin'); // redirect to sign-in route
-//   }
-//   next();
-// }; 
-
-// function isAccessToken(req, res, next) {
-//   if (!req.session.accessToken) { 
-//     return authProvider.acquireToken({
-//       scopes: ['.default'],
-//       redirectUri: redirectUri,
-//       successRedirect: '/api-redirect'
-//     })(req, res, next);
-//   }
-//   next();
-// }
 
-// serverApp.get("/auth/signin", authProvider.login({
-//   scopes: ['.default'],
-//   redirectUri: redirectUri,
-//   successRedirect: '/tab'
-// }))
-
-// serverApp.post("/redirect", authProvider.handleRedirect());
 serverApp.post("/redirect", (req, res, next)=>{
   console.log(req);
 });
@@ -193,8 +166,6 @@ serverApp.get("/redirect", (req, res, next)=>{
 });
 
 serverApp.post("/api-get",   
-  // isAuthenticated,
-  // isAccessToken, 
   async (req, res, next) => {
     const uri = req.body.api_uri || req.session.apiUri;
     let param = {};
@@ -210,7 +181,6 @@ serverApp.post("/api-get",
 });
 
 serverApp.get("/api-redirect", 
-  // isAuthenticated,
   async function (req, res, next) {
       const uri = req.session.apiUri;
       let param = {};
@@ -226,7 +196,6 @@ serverApp.get("/api-redirect",
 })
 
 serverApp.get("/post-redirect", 
-  // isAuthenticated,
   async function (req, res, next) {
     const uri = req.session.apiUri;
     let param = {};
@@ -242,23 +211,6 @@ serverApp.get("/post-redirect",
   }
 )
 
-// serverApp.post("/api-update", authProvider.acquireToken({
-//   scopes: [],
-//   redirectUri: redirectUri,
-//   successRedirect: '/post-redirect'
-// }));
-
-// serverApp.post("/api-post", authProvider.acquireToken({
-//   scopes: ['.default'],
-//   redirectUri: redirectUri,
-//   successRedirect: '/post-redirect'
-// }));
-
-// serverApp.post("/getGroupList", authProvider.acquireToken({
-//     scopes: ['.default'],
-//     redirectUri: redirectUri,
-//     successRedirect: '/group-redirect'
-// }));
 serverApp.post("/getGroupList",  async function (req, res, next) {
   try {
     // throw new Error('Error');
@@ -300,15 +252,6 @@ serverApp.post("/getGroupList",  async function (req, res, next) {
       }
 
       if (teams && teams.length) {
-      // if (public && public.length) {
-        // const options = {
-        //   responseType: 'arraybuffer',
-        //   headers: {
-        //     Authorization: `Bearer ${req.session.accessToken}`,
-        //     ConsistencyLevel: 'eventual',
-        //     withCredentials:true,
-        //   },
-        // };
         for (let team of teams) {
         // for (let team of public) {
           const item = await getFetch(endPoint + "/groups/"+team.id+"/drive/items/root/children", req.session.accessToken);
@@ -330,23 +273,8 @@ serverApp.post("/getGroupList",  async function (req, res, next) {
       next(error);
   } 
 });
-  
-
-
-function isAccessTokens(req, res, next) {
-  if (!req.session.accessToken) {
-    return authProvider.acquireToken({
-      scopes: ['.default'],
-      redirectUri: redirectUri,
-      successRedirect: req.url
-    })(req, res, next);
-  }
-  next();
-}
 
 serverApp.post('/api/makeFolder', 
-    // isAuthenticated,
-    // isAccessTokens,
     async (req, res, next)=>{
 
       const options = getOptions(req.session.accessToken);
@@ -401,158 +329,48 @@ function getErrorMessage(error) {
   return errorText;
 }
 
-serverApp.post('/api/makeWord', 
-    // isAuthenticated,
-    // isAccessTokens,
-    async (req, res, next)=>{
-      const options = getOptions(req.session.accessToken);
-      const {siteId, path, name} = req.body;
-      const doc = new Document({
-        sections : [
-          {
-            properties: {},
-            children : [
-              new Paragraph({
-                children: [
-                ]
-              })
-            ]
-          }
-        ]
-      });
 
-      Packer.toBuffer(doc).then(async (buffer)=>{
-        const resultObj = {message:"", success: 'F'};;
-        try{
-          const base64EncodeData = Buffer.from(buffer).toString('base64');
-          const labelData = await setLabel(gateWayKey, req.session.account.idTokenClaims.email, name, 
-                      "878173ae-cc36-4881-af57-604af868314c", base64EncodeData, "Make New Word 문서");
-          if (labelData.success === 'F') {
-            return res.json(labelData);
-          }
-          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.put(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+name+':/content', labelData.data, options);
-            if (result.data) {
-              resultObj.message = "요청하신 Word 파일이 생성되었습니다.<br>파일명 : "+ name;
-              resultObj.success = 'S';
-            }
-            else {
-              resultObj.message = "요청하신 Word 파일이 생성되지 않았습니다.";
-            }
-          }
-          else {
-            resultObj.message = "생성할 폴더 경로를 찾을 수 없습니다.";
-          }
-        }
-        catch(error) {
-          resultObj.message = "요청하신 Word 파일 생성 중 오류가 발생하였습니다.<br>" + getErrorMessage(error);
-        }
-        res.send(resultObj);
-      });
-})
-
-serverApp.post('/api/makeExcel', 
-    // isAuthenticated,
-    // isAccessTokens,
+serverApp.post('/api/makeFile', 
     async (req, res, next)=>{
-
-      const options = getOptions(req.session.accessToken);
-      const {siteId, path, name} = req.body;
-      const wb = XLSX.utils.book_new();
-      XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet([]), 'Sheet1');
-      var wbout = XLSX.write(wb, {bookType:'xlsx',  type: 'buffer'});
-      const base64EncodeData = Buffer.from(wbout).toString('base64');
-      
-      const resultObj = {message:'', success: 'F'};
-      try{
-        const labelData = await setLabel(gateWayKey, req.session.account.idTokenClaims.email, name, 
-                                        "878173ae-cc36-4881-af57-604af868314c", base64EncodeData, "Make New Excel 통합 문서");
-        if (labelData.success === 'F') {
-          return res.json(labelData);
-        }
-        
-        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 ='요청하신 Excel 파일이 생성 되었습니다.';
-            resultObj.success = 'S';
-          }
-          else{
-            resultObj.message = '요청하신 Excel 파일이 생성 되지 않았습니다.';
-          }
-        }
-      }
-      catch(error) {
-        resultObj.message = "요청하신 Excel 파일 생성 중 오류가 발생하였습니다.<br>" + getErrorMessage(error);
-      }
-      res.json(resultObj);
+      const result = await createNewFile(req);
+      return res.json(result);
 })
-async function setLabelFiles(param, headers, lengthSync, apiKey, email) {
-  console.log('======================setLabelFiles=====================================')
-  // const param = {
-  //   apiKey: apiKey,
-  //   email: email,
-  //   file : files,
-    // dispFileName: dispFileName,
-    // aipGuid: aipGuid,
-    // fileData: fileData,
-    // comment: comment,
-  // }
-  const resultObj = {
-    message : null,
-    success : 'F',
-    data : null,
-  }
-  const errorMessage = '레이블 적용 중 오류가 발생했습니다.<br>에러 : ';
-  try {
 
-    // const result = await axios.post(apiUrl + '/api/v1/stream/set-label', param);
-    // console.log('실행')
-    // console.log(param);
-    const result = await axios.post(apiUrl + '/api/v1/file/encrypt', param, {
-      headers : {
-        ...headers,
-        "Content-Length" : lengthSync,
-      }
-    });
-    // console.log(result.data);
-    if (result && result.data) {
-      if (result.data.statusCode === 200 && !result.data.result.errorCode) {
-        // resultObj.data = Buffer.from(result.data.result.fileData, "base64");
-        // console.log(param.get('apiKey'));
-        // console.log(param.get('email'));
-        const infoParam = {
-          apiKey: apiKey,
-          email: email,
-          dispFileName: result.data.result.dispFileName,
-          realFileName: result.data.result.outputFileName,
-        }
-        // console.log(infoParam);
-        const infoData = await axios.post(apiUrl + '/api/v1/file/info', infoParam);
-        // console.log('=================infoData ========================');
-        // console.log(infoData.data);
-        resultObj.data = result.data.result;
-        resultObj.success = 'S'; 
-      }
-      else {
-        resultObj.message = errorMessage + result.data.result.errorMessage;
-      }
+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;
     }
-    else {
-      resultObj.message = errorMessage + '수신 데이터 없음';
+    
+    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 + ' 파일이 생성 되지 않았습니다.';
+      }
     }
   }
-  catch (error) {
-    console.log(error);
-    resultObj.message = errorMessage + JSON.stringify(error);
+  catch(error) {
+    resultObj.message = "요청하신 " + typeName + " 파일 생성 중 오류가 발생하였습니다.<br>" + getErrorMessage(error);
   }
-
   return resultObj;
 }
 
+
 async function setLabel(apiKey, email, dispFileName, aipGuid, fileData, comment) {
   const param = {
     apiKey: apiKey,
@@ -591,48 +409,7 @@ async function setLabel(apiKey, email, dispFileName, aipGuid, fileData, comment)
   return resultObj;
 }
 
-serverApp.post('/api/makePptx', 
-    // isAuthenticated,
-    // isAccessTokens,
-    async (req, res, next)=>{
-
-      const options = getOptions(req.session.accessToken);
-      const {siteId, path, name} = req.body;
-      const pres = new pptxgen();
-      pres.addSlide();
-      const resultObj = {message:'', success: 'F'};
-      pres.stream().then(async (data)=>{
-        try{
-          const base64EncodeData = Buffer.from(data).toString('base64');
-          const labelData = await setLabel(gateWayKey, req.session.account.idTokenClaims.email, name, 
-                      "878173ae-cc36-4881-af57-604af868314c", base64EncodeData, "Make New PowerPoint 프레젠테이션");
-
-          if (labelData.success === 'F') {
-            return res.json(labelData);
-          }
-          
-          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 ='요청하신 PowerPoint 프레젠테이션 파일이 생성 되었습니다.';
-              resultObj.success = 'S';
-            }
-            else{
-              resultObj.message = '요청하신 PowerPoint 프레젠테이션 파일이 생성 되지 않았습니다.';
-            }
-          }
-        }
-        catch(error) {
-          resultObj.message = "요청하신 PowerPoint 프레젠테이션 파일 생성 중 오류가 발생하였습니다.<br>" + getErrorMessage(error);
-        }
-        res.json(resultObj);
-      })
-})
-
 serverApp.post('/api/check-name', 
-    // isAuthenticated,
-    // isAccessTokens,
     async (req, res, next)=>{
 
       const options = getOptions(req.session.accessToken);
@@ -644,10 +421,6 @@ serverApp.post('/api/check-name',
           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);
-            // console.log(name);
-            // console.log(idx);
-            // console.log((idx > -1));
-            // console.log(result.data.value);
             res.json({hasName: (idx > -1)});
           }
         }
@@ -783,7 +556,7 @@ serverApp.post('/api/upload', upload.array('file'),
                 let ext = globalPath.extname(originName);
                 if (supportedArr.length > 0 && !supportedArr.includes(ext)) {
                     return res.json({success:'F', message: '파일명 : ' + originName 
-                                      +'<br>해당 파일은 업로드 불가 파일입니다. 다시 시도해주세요.<br>가능 확장자 :' 
+                                      +'<br>업로드 불가 파일이 포함되어 있습니다.<br>가능 확장자 :' 
                                       + JSON.stringify(supportedArr)});
                 }
 
@@ -963,7 +736,7 @@ serverApp.post('/api/download',
           const options = getOptions(req.session.accessToken);
           const arr = JSON.parse(fileIds);
           const url = endPoint + "/sites/"+ siteId + "/drive/items/";
-          const result = await axios(url + arr[0], options);
+          const result = await axios(url + arr[0].id, options);
 
           // 단일 파일 다운로드
           if (arr.length === 1 && result && result.data && result.data.file) {
@@ -973,26 +746,28 @@ serverApp.post('/api/download',
             const bufferData = Buffer.from(fileData.data, 'base64');
             const param = {
               apiKey: gateWayKey,
-              email : res.session.account.idTokenClaims.email,
+              email : req.session.account.idTokenClaims.email,
               dispFileName: result.data.name,
               comment: "",
               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) {
-              return res.json({success: 'S', data: Buffer.from(data.data, 'base64'), name: deleteLabelResult.data.result.name})
+              const fileData = deleteLabelResult.data.result.fileData;
+              return res.json({success: 'S', data: fileData, name: deleteLabelResult.data.result.dispFileName})
+            }
+            else {
+              throw deleteLabelResult.data.result.dispFileName + ' : ' +deleteLabelResult.data.result.errorMessage;
             }
           }
-          //폴더 또는 다중 파일 다운로드
+          //폴더 또는 다중 파일 다운로드 
           else {
             const zip = new JSZIP();
-            // const downObj = await getFolderItems(url, arr, options, req.session, zip);
             const timer = new Date();
             console.log('getFolderItems Start : ', timer.toLocaleString());
             await getFolderItems(url, arr, options, req.session, zip);
             const timerEnd = new Date();
-            console.log('getFolderItems end : ', timerEnd.toLocaleString(), ',소요시간 : '+ timeCheck(timer,timerEnd));
-            // createZipFile(downObj, zip);
+            console.log('getFolderItems end : ', timerEnd.toLocaleString(), ', 소요시간 : '+ timeCheck(timer,timerEnd));
             const now = new Date();
             const year = now.getFullYear().toString();
             let month = now.getMonth() + 1;
@@ -1000,12 +775,7 @@ serverApp.post('/api/download',
             let date = now.getDate();
             if (date < 10) date = "0" + date;
             zip.generateAsync({
-              type: 'nodebuffer',
-              // mimeType: 'application/epub+zip',
-              // compression: 'DEFLATE',
-              // compressionOptions: {
-              //   level: 9
-              // },
+              type: 'base64',
             }).then((resZip)=>{
               const endTime = new Date();
               console.log('시작 시간 :', startTime.toLocaleString(), ', 종료 시간 :', endTime.toLocaleString(), ', 소요 시간 :', timeCheck(startTime, endTime));
@@ -1028,244 +798,78 @@ serverApp.post('/api/download',
   }
 );
 
-
-serverApp.post('/api/folderMove', async (req, res, next)=>{
-  if (req.body) {
-    const {id, name, siteId, driveId, text, moveSiteId, movePath} = req.body;
-    const resultObj = {message:'폴더 이동에 실패 하였습니다.', success: 'F'};
-    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) {
-            
-            try {
-              const copyFolderPath = `${endPoint}/sites/${siteId}/drive/items/${moveItem.id}`;
-              const result = await axios.get(copyFolderPath, options);
-              if (result && result.data) {
-                const data = result.data;
-                const moveUri = `${endPoint}/sites/${moveSiteId}/${movePath}`;
-                const moveFolderResult = await findSubFolder(data, moveUri, moveSiteId, options);
-                console.log('moveFolderResult : ',moveFolderResult);
-                if (!moveFolderResult) {
-                  resultObj.message ='폴더 이동 중 오류가 발생하였습니다.';
+async function getFolderItems(url, array, options, session, zip) {
+  const fileArr       = [];
+  const fileInfoArr   = [];
+  await Promise.all(array.map((obj)=>{
+    return axios.get(url + obj.id, options);
+  }))
+  .then(async (siteInfos)=>{
+      for (let site of siteInfos) {
+        const data = site.data;
+        if (data) {
+          if (data.folder) {
+            zip.folder(data.name);
+            if (data.folder.childCount) {
+              const itemsData = await axios.get(url + data.id + '/children', options);
+              if (itemsData && itemsData.data && itemsData.data.value.length > 0) {
+                try {
+                  await getFolderItems(url, itemsData.data.value, options, session, zip.folder(data.name));
                 }
-                else {
-                  await axios.delete(endPoint + "/sites/"+ siteId + "/drive/items/" + moveItem.id, options);
-                  resultObj.message ='폴더 이동 되었습니다.';
-                  resultObj.success = 'S';
+                catch(error) {
+                  if (error) {
+                    throw error;
+                  }
                 }
               }
             }
-            catch (error) {
-              console.log(error.message);
-              console.log(error.name);
-              console.log(error.errors);
-              resultObj.message = error.errors;
-              // resultObj.failItems.push(moveItem);
+          }
+          else {
+            const dataUrl = data['@microsoft.graph.downloadUrl'];
+            const fileOption = {responseType: 'arraybuffer', headers: { withCredentials : true }};
+            if (dataUrl) {
+              fileArr.push(axios.get(dataUrl, fileOption));
+              fileInfoArr.push(data);
+            }
+            else {
+              throw '파일 명 : ' + data.name + '<br>파일 데이터 정보가 없습니다.';
             }
           }
         }
       }
-    }
-    return res.json(resultObj);
-  }
-})
-
-async function findSubFolder(data, movePath, moveSiteId, options) {
-    let resultType = false;
-    try {
-      const moveItem = await axios.get(movePath, options);
-
-      if (moveItem.data && moveItem.data.id) {
+      if (fileArr.length) {
+        return Promise.all(fileArr);
+      }
+  })
+  .then((result)=>{
+    if (result && result.length) {
+      return Promise.all(result.map((data, idx)=>{
         const param = {
-          "name": data.name,
-          "folder": {},
-          "@microsoft.graph.conflictBehavior": "rename"
-        }
-
-        const makeFolderData = await axios.post(`${endPoint}/sites/${moveSiteId}/drive/items/${moveItem.data.id}/children`, param, options);
-        if (makeFolderData && makeFolderData.data) {
-            const makeFolderPath = `${endPoint}/sites/${moveSiteId}/${makeFolderData.data.parentReference.path}/${data.name}`;
-            
-            if (data.folder.childCount) {
-              const siteId = data.parentReference.siteId;
-              const childrenData = await axios.get(`${endPoint}/sites/${siteId}/drive/items/${data.id}/children`, options);
-              if (childrenData && childrenData.data && childrenData.data.value) {
-                const childrenValues = childrenData.data.value;
-                if (childrenValues.length > 0) {
-                  for (let ii = 0; ii < childrenValues.length; ii++) {
-                      const children = childrenValues[ii];
-                      if (children && children.folder) {
-                          const result = await findSubFolder(children, makeFolderPath, moveSiteId, options);
-                          resultType = result;
-                      }
-                      else {
-                          const dataUrl = children['@microsoft.graph.downloadUrl'];
-                          const response = await axios.get(dataUrl, {responseType: 'arraybuffer', headers: {
-                            withCredentials:true,
-                          },});
-                          if (response.data) {
-                            const file = response.data;
-                            const uploadResult = await axios.put(`${endPoint}/sites/${moveSiteId}/drive/items/${makeFolderData.data.id}:/${children.name}:/content`, 
-                                                                  file.buffer, options);
-                            if (uploadResult) {
-                              resultType = true;
-                            }
-                          }
-                      }
-                  }
-                }
-              }
-            }
+          apiKey: gateWayKey,
+          email : session.account.idTokenClaims.email,
+          dispFileName: fileInfoArr[idx].name,
+          comment: "",
+          fileData: Buffer.from(data.data).toString('base64')
         }
+        return axios.post(apiUrl + '/api/v1/stream/delete-label', param);
+      }))  
     }
-    
-  }
-  catch(error) {
-    console.log(error);
-    return resultType;
-  }
-  return resultType;
-}
-
-function createZipFile(obj, zip) {
-  
-  if (obj.files && obj.files.length > 0) {
-    for (let file of obj.files) {
-      console.log(file.name);
-      zip.file(file.name, file.data, {base64: true});
-    }
-  }
-
-  if (obj.folder && obj.folder.length > 0) {
-    for (let folder of obj.folder) {
-      console.log(folder.name);
-      zip.folder(folder.name);
-      if (folder.subFolder) {
-        createZipFile(folder.subFolder, zip.folder(folder.name));
-      }
-    }
-  }
-}
-
-async function getFolderItems(url, array, options, session, zip) {
-  // const files         = [];
-  // const folder        = [];
-  const sitesInfoArr  = [];
-  const fileArr       = [];
-  const fileInfoArr   = [];
-
-  // const folderCheckTime = new Date();
-  // for (let fileId of array) {
-  //   sitesInfoArr.push(axios.get(url + fileId, options));
-  // }
-  // const siteInfos = await Promise.all(sitesInfoArr).catch((error)=>{
-  //   console.log(error);
-  //   throw error;
-  // });
-  for (let fileId of array) {
-    sitesInfoArr.push(axios.get(url + fileId, options));
-  }
-  const siteInfos = await Promise.all(sitesInfoArr);
-  
-  for (let site of siteInfos) {
-    const data = site.data;
-    if (data) {
-      if (data.folder) {
-        // const folderObj = {name : data.name, subFolder : []};
-        zip.folder(data.name);
-        if (data.folder.childCount) {
-          const itemsData = await axios.get(url + data.id + '/children', options);
-          if (itemsData && itemsData.data && itemsData.data.value.length > 0) {
-            const idArr = [];
-            for (let children of itemsData.data.value) {
-              idArr.push(children.id);
-            }
-
-            try {
-              // let result = await getFolderItems(url, idArr, options, session, zip.folder(data.name));
-              await getFolderItems(url, idArr, options, session, zip.folder(data.name));
-              // folderObj.subFolder = result;
+  })
+  .then((deleteLabelFiles)=>{
+    if (deleteLabelFiles && deleteLabelFiles.length) {
+      return Promise.all(
+        deleteLabelFiles.map((item)=>{
+            const data = item.data;
+            if (data.success && !data.result.errorCode) {
+              zip.file(data.result.dispFileName, data.result.fileData, {base64: true});
             }
-            catch(error) {
-              if (error) {
-                throw error;
-              }
+            else {
+              throw data.result.dispFileName + ' : ' + data.result.errorMessage;
             }
-            // subFolder.push(result);
-          }
-        }
-        // folder.push(folderObj);
-      }
-      else {
-        const dataUrl = data['@microsoft.graph.downloadUrl'];
-        const fileOption = {responseType: 'arraybuffer', headers: { withCredentials : true }};
-        fileArr.push(axios.get(dataUrl, fileOption));
-        fileInfoArr.push(data);
-      }
-    }
-  }
-
-  // console.log('======================= folder check end ===============================');
-  // console.log('folder check 소요시간 : ', timeCheck(folderCheckTime, new Date()));
-
-
-  // console.log('======================= delete label start ===============================');
-  const fileDataArr = await Promise.all(fileArr).then((result)=>{
-    let deleteLabelArr = [];
-    for (let idx in result) {
-      let fileData = result[idx].data;
-      const param = {
-        apiKey: gateWayKey,
-        email : session.account.idTokenClaims.email,
-        dispFileName: fileInfoArr[idx].name,
-        comment: "",
-        fileData: Buffer.from(fileData).toString('base64')
-      }
-      deleteLabelArr.push(axios.post(apiUrl + '/api/v1/stream/delete-label', param));
+        }))
     }
-    return deleteLabelArr;
   });
-  
-  // const deleteLabelTime = new Date();
-  // const deleteLabelArr = [];
-  // for (let idx in fileDataArr) {
-  //   let fileData = fileDataArr[idx].data;
-  //   const param = {
-  //     apiKey: gateWayKey,
-  //     email : session.account.idTokenClaims.email,
-  //     dispFileName: fileInfoArr[idx].name,
-  //     comment: "",
-  //     fileData: Buffer.from(fileData).toString('base64')
-  //   }
-  //   deleteLabelArr.push(axios.post(apiUrl + '/api/v1/stream/delete-label', param));
-  // }
-
-  const deleteLabelFiles = await Promise.all(fileDataArr);
-  // const deleteLabelFiles = await Promise.all(deleteLabelArr);
-  for (let idx in deleteLabelFiles) {
-    const fileObj = deleteLabelFiles[idx];
-    const data = fileObj.data;
-    if (data.success && !data.result.errorCode) {
-      // files.push({name : data.result.dispFileName, data: data.result.fileData});
-      zip.file(data.result.dispFileName, data.result.fileData, {base64: true});
-    }
-    else {
-      throw data.result.dispFileName + ' : ' + data.result.errorMessage;
-    }
-  }
-  // console.log('======================= delete label end ===============================')
-  // console.log('delete label 소요시간 : ',timeCheck(deleteLabelTime, new Date()));
-
-  // const resultObj = {
-  //   folder : folder,
-  //   files : files,
-  // };
 
-  // return resultObj;
 }
 
 
@@ -1274,8 +878,6 @@ serverApp.post('/api/getPossibleExtList', async (req, res, next)=>{
 })
 
 serverApp.post('/api/delete', 
-  // isAuthenticated,
-  // isAccessTokens,
   async (req, res, next)=>{
     if (req.body) {
       const {siteId, itemIds} = req.body;
@@ -1519,136 +1121,6 @@ async (req, res, next)=>{
 //   console.log('Connected to database');
 // });
 
-async function getPossibleExt() {
-  const resultObj = {
-    success : 'F',
-    message : null,
-    data : null,
-  }
-  const sqlQuery = 
-    `SELECT 
-        A.ConfigValue AS supported_file_ext, 
-        B.ConfigValue AS protected_file_ext 
-      FROM (SELECT * FROM TB_AIP_CONFIG WHERE ConfigKey = 'SupportedFileExt' AND AipServerId = 0) A,  
-           (SELECT * FROM TB_AIP_CONFIG WHERE ConfigKey = 'ProtectedFileExt' AND AipServerId = 0) B`;
-    try {
-      const query = await pool;
-      const result = await query.request().query(sqlQuery);
-      
-      if (result && result.recordset.length) {
-        resultObj.success = 'S';
-        resultObj.message = 'Success';
-        resultObj.data = result.recordset[0];
-      }
-      else {
-        resultObj.success = 'F';
-        resultObj.message = "Not Found Data";
-      }
-    }
-    catch(error) {
-      // console.log(error);
-      console.log(error);
-      resultObj.success = 'F';
-      resultObj.message = JSON.stringify(error);
-    }
-
-    return resultObj;
-}
-
-async function setLabelFile(session, file, supported_file_ext) {
-  const resultObj = {
-    success : 'F',
-    message : null,
-    fileData : null,
-  }
-
-  const originName = file.originalname;
-
-  // 파일 확장자 
-  if (originName && originName.lastIndexOf('.') >= 0) {
-    const ext = originName.substring(originName.lastIndexOf('.'), originName.length);
-    if (supported_file_ext) {
-      let supportedArr = supported_file_ext.split(';');
-      
-      if (!supportedArr[supportedArr.length - 1]) {
-        supportedArr.splice(supportedArr.length - 1);
-      }
-      
-      if (!supportedArr.includes(ext)) {
-        resultObj.status = 500;
-        resultObj.error = '파일명 : ' + originName 
-                          +'<br>해당 파일은 업로드 불가 파일입니다. 다시 시도해주세요.<br>가능 확장자 :' 
-                          + JSON.stringify(supportedArr);
-        return resultObj;
-      }
-
-      const fileData = Buffer.from(file.buffer).toString('base64');
-      const param = {
-        apiKey: gateWayKey,
-        email: session.account.idTokenClaims.email,
-        dispFileName: originName, 
-        aipGuid: "878173ae-cc36-4881-af57-604af868314c",
-        comment: "",
-        fileData: fileData
-      }
-      
-      try {
-        const result = await axios.post(apiUrl + '/api/v1/stream/set-label', param);
-        if (result) {
-          if (result.data.statusCode === 200 && !result.data.result.errorCode) {
-            resultObj.fileData = Buffer.from(result.data.result.fileData, "base64");
-          }
-          else {
-            console.log(result.data);
-            resultObj.success = 'F';
-            resultObj.message = '파일명 : ' + originName + '<br>에러 : ' + result.data.result.errorMessage;
-          }
-        }
-      }
-      catch(error) {
-        console.log(error);
-        resultObj.success = 'F';
-        resultObj.message = '레이블 설정 중 오류가 발생하였습니다.<br>' + JSON.stringify(error.message);
-      }
-    }
-  }
-
-  return resultObj;
-}
-
-async function deleteLabelFile(session, name, file) {
-  const resultObj = {
-    error : false,
-    errorMessage : null,
-    fileData : null,
-  }
-  try {
-    const param = {
-      apiKey: gateWayKey,
-      email : session.account.idTokenClaims.email,
-      dispFileName: name,
-      comment: "",
-      fileData: file
-    }
-    
-    const result = await axios.post(apiUrl + '/api/v1/stream/delete-label', param);
-    if (result && result.data.statusCode === 200 && !result.data.result.errorCode) {
-        resultObj.fileData = result.data.result.fileData;
-    }
-    else {
-      resultObj.error = true;
-      resultObj.errorMessage = '파일명 : ' + name + '<br>에러 : ' + result.data.result.errorMessage;
-      console.log(result.data.result);
-    }
-  } 
-  catch(error) { 
-    console.log(error);
-    resultObj.error = true;
-    resultObj.errorMessage = '레이블 해제 중 오류가 발생하였습니다.<br>' + JSON.stringify(error.message);
-  }
-  return resultObj; 
-}
-
 function getOptions(token) {
   const options = {
     headers: {

+ 0 - 2
src/ext.js

@@ -1,5 +1,3 @@
-const axios = require("axios");
-const apiUrl = 'http://192.168.20.99:5050';
 const {pool, sql} = require('./config/sql.js');
 
 async function init() {

+ 1 - 0
src/static/template/template.docx

@@ -0,0 +1 @@
+

BIN
src/static/template/template.pptx


BIN
src/static/template/template.xlsx


+ 84 - 198
src/views/hello.html

@@ -38,10 +38,10 @@
                     <div onclick="menuOpen(event, 'mk-items')">
                       <div>새로만들기</div>
                       <div class="mk-items click-menu">
-                        <div onclick="mkdir()"><img src="/static/images/folder.png" width="20" height="20" alt="문서 이미지">&nbsp;폴더</div>
-                        <div onclick="mkWord()"><img src="/static/images/docx.svg" width="20" height="20" alt="문서 이미지">&nbsp;Word 문서</div>
-                        <div onclick="mkExcel()"><img src="/static/images/xlsx.svg" width="20" height="20" alt="문서 이미지">&nbsp;Excel 통합 문서</div>
-                        <div onclick="mkPpt()"><img src="/static/images/pptx.svg" width="20" height="20" alt="문서 이미지">&nbsp;PowerPoint 프레젠테이션</div>
+                        <div onclick="createNewFileModal('폴더 생성', '폴더', null)"><img src="/static/images/folder.png" width="20" height="20" alt="문서 이미지">&nbsp;폴더</div>
+                        <div onclick="createNewFileModal('Word 문서', 'Word 문서', '.docx')"><img src="/static/images/docx.svg" width="20" height="20" alt="문서 이미지">&nbsp;Word 문서</div>
+                        <div onclick="createNewFileModal('Excel 통합 문서', 'Excel 통합 문서', '.xlsx')"><img src="/static/images/xlsx.svg" width="20" height="20" alt="문서 이미지">&nbsp;Excel 통합 문서</div>
+                        <div onclick="createNewFileModal('PowerPoint 프레젠테이션', 'PowerPoint 프레젠테이션', '.pptx')"><img src="/static/images/pptx.svg" width="20" height="20" alt="문서 이미지">&nbsp;PowerPoint 프레젠테이션</div>
                       </div> 
                     </div>
                     <div onclick="menuOpen(event, 'upload-items')">
@@ -290,7 +290,7 @@
     $('.' + className).toggle();
   } 
 
-  function drawDriveFiles(jsonData, parentData, name) {
+  async function drawDriveFiles(jsonData, parentData, name) {
       _selectedData = [];
       const panel = $('section .panel');
       let panelStr = `<span class="panel-item on">${name}</span>`;
@@ -316,7 +316,17 @@
           panelStr = drawPath(path, selectedPref.siteId, name);
         }
         let str = "";
-          jsonData.value.forEach((obj, idx)=>{
+        let possibleExt = [];
+        try {
+          const result = await $.ajax({method: 'post', url: '/api/getPossibleExtList'});
+          possibleExt = result.supported_file_ext.split(';');
+          possibleExt.splice(possibleExt.length - 1);
+        }
+        catch(error) {
+          alertMessage('리스트 호출', '리스트 호출 중 오류가 발생했습니다.<br>' + getErrorMessage(error), null, 'red');
+        }
+
+        jsonData.value.forEach((obj, idx)=>{
             dragAndDrop();
 
             let modifyName = "";
@@ -336,9 +346,17 @@
               modifyDate = modifyDate.substring(5, 7)+ '월 '+ modifyDate.substring(8, 10)+ '일';
             }
 
-            let method = `siteDriveChildrenItems('${obj.parentReference.siteId}','${obj.parentReference.path + '/' + obj.name}','${name}', null, event)`;
+            let method = '';
             if (obj.file) {
-              method = `openWebUrl('${obj.webUrl}', '${obj.name}', event)`;
+              if (possibleExt.length > 0) {
+                const ext = obj.name.substring(obj.name.lastIndexOf('.') , obj.name.length);
+                if (possibleExt.includes(ext)) {
+                  method = `openWebUrl('${obj.webUrl}', '${obj.name}', event)`;
+                }
+              }
+            }
+            else if (obj.folder) {
+              method = `siteDriveChildrenItems('${obj.parentReference.siteId}','${obj.parentReference.path + '/' + obj.name}','${name}', null, event)`;
             }
             str += `
               <div id="row_${idx}">
@@ -488,18 +506,9 @@
     }
 
     function openWebUrl(url, name, event) {
+      event.preventDefault();
+      event.stopPropagation();
       window.open(url);
-      // $.ajax({
-      //   method: 'get', 
-      //   url : url, 
-      //   type : 'json',
-      //   success : (res)=>{
-      //     console.log(res);
-      //   },
-      //   error : (error)=>{
-      //     console.log(error);
-      //   }
-      // })
     }
 
     function addTabs(bindId) {
@@ -562,9 +571,8 @@
       else if (obj.file && obj.name) {
         imageName = "파일 이미지";
         let ext = obj.name.substring(obj.name.lastIndexOf('.') + 1);
-        let imageExt = ".svg";
-        //photo 
-        // if (obj.file.mimeType && obj.file.mimeType.includes('image')){
+        const imageExt = ".svg";
+        
         if (['psd', 'bmp', 'pbmp', 'rle', 'dib', 'jpeg', 'pjpeg', 'jpg', 'pjpg', 'gif', 'pgif', 'ppng', 'png', 
         'tif', 'ptif', 'ptiff', 'tiff', 'raw', 'ico', 'jpe', 'pjpe', 'jt', 'pjt'].includes(ext)){
           ext = 'photo';
@@ -685,8 +693,8 @@
                                                     </div>` 
                                         }
                                       }
+                                      //<div style="color: rgb(91, 95, 199); margin-left: 15px;">더 많은 장소...</div>
                                       str +=`<div>
-                                          <div style="color: rgb(91, 95, 199); margin-left: 15px;">더 많은 장소...</div>
                                       </div>
                                   </div>
                               </div>
@@ -947,6 +955,7 @@
       drawMoveItems(siteId, '/drive/root');
     }
 
+    //이동 
     function drawMoveItems(siteId, path) {
         const $panel = $('.modal .modal-move-box .right-box .panel');
         const imgSrc = $('#move_' + siteId+ ' img').attr('src');
@@ -1059,6 +1068,7 @@
         })
     }
 
+
     function getListStr(obj, idx, siteId, itemPath) {
       if (obj && !isNaN(Number(idx)) && siteId){
         let isFolder = obj.folder;
@@ -1099,6 +1109,7 @@
       }
     }
 
+    //빈폴더 표시
     function getEmptyBox() {
       return `<div class="empty-box">
                 <img src="/static/images/empty_folder_v2.svg" alt="이미지">
@@ -1207,7 +1218,7 @@
         for (let ii = 0; ii < fileArr.length; ii++) {
             const isChecked = fileArr.eq(ii).is(':checked');
             if (isChecked) {
-              fileIdArr.push(fileArr.eq(ii).val());
+              fileIdArr.push({id : fileArr.eq(ii).val()});
             }
         }
         if (fileIdArr.length === 0) return alertMessage('다운로드', '다운로드 할 파일을 선택해주세요.');
@@ -1222,11 +1233,10 @@
             zipName : $('.panel-item.on').text().trim(),
           },
           success: (res)=>{
-            console.log(res);
             if (res.success === 'S') {
               let fileData = '';
               if (res.data) {
-                if (res.type) {
+                // if (res.type) {
 
                   var sliceSize = 1024;
                   var byteCharacters = atob(res.data);
@@ -1245,10 +1255,10 @@
                       byteArrays[sliceIndex] = new Uint8Array(bytes);
                   }
                   fileData = new Blob(byteArrays, { type: res.type });
-                }
-                else {
-                  fileData = new Blob([new Uint8Array(res.data.data).buffer]);
-                }
+                // }
+                // else {
+                //   fileData = new Blob([new Uint8Array(res.data.data).buffer]);
+                // }
                 const dataUrl = window.URL.createObjectURL(fileData);
                 const link = document.createElement('a');
                 link.href = dataUrl;
@@ -1324,7 +1334,6 @@
               let method = `siteDriveChildrenItems('${siteId}','${itemPath}', '${name}', null, event)`;
               if (formatPath.length - 1 === ii) {
                 className += ' on';
-                // method = '';
               }
               
               panelStr += `<span> > </span><span class="${className}" onclick="${method}">${pathName}</span>`;
@@ -1366,9 +1375,7 @@
           $(this).css('background-color', '#f5f5f5');
           const items = transfer.items;
           _formData = new FormData($('<form enctype="multipart/form-data"></form>')[0]);
-          // console.log(items);
           const result = await getFilesDataTransferItems(items);
-          //alertMessage('파일 업로드', error, null, 'red')
           if (result && result.length) {
             for (let obj of result) {
               if (obj.success === 'F') {
@@ -1426,7 +1433,7 @@
                       let ext = file.name.substring(file.name.lastIndexOf('.'), file.name.length);
                       if (!supportedFileExtArr.includes(ext)) {
                         return alertMessage(alertTitle, '파일명 : '+ file.name 
-                        + '<br>해당 파일은 업로드 불가 파일입니다. 다시 시도해주세요.<br>가능 확장자 :' + JSON.stringify(supportedFileExtArr), null, 'red');
+                        + '<br>업로드 불가 파일이 포함되어 있습니다.<br>가능 확장자 :' + JSON.stringify(supportedFileExtArr), null, 'red');
                       }
                     }
                   }
@@ -1439,7 +1446,7 @@
           }
         }
         catch (error) {
-          return alertMessage(alertTitle, '가능 확장자 확인 중 오류가 발생했습니다. 오류 : ' + JSON.stringify(error), null, 'red');
+          return alertMessage(alertTitle, '가능 확장자 확인 중 오류가 발생했습니다. 오류 : ' + getErrorMessage(error), null, 'red');
         }
 
         let sitePath = getDrivePath();
@@ -1527,27 +1534,6 @@
         method();
     }
 
-    function getUploadItems(dataTransferItems) {
-        for (let item of dataTransferItems) {
-          if (item.isFile) {
-            item.file(file => {
-              _formData.append('file', file);
-              _formData.append(file.name + '_path', item.fullPath);
-            })
-          }
-          else if (item.isDirectory) {
-            _formData.append('folder', JSON.stringify({name : item.name, path : item.fullPath}));
-            // _formData.append('path', item.fullPath);
-            let dirReader = item.createReader();
-            dirReader.readEntries(entries => {
-              for (let entry of entries) {
-                getUploadItems(entry);
-              }
-            })
-          }
-        }
-    }
-    
     async function getFilesDataTransferItems(dataTransferItems) {
       const fileRows = $('.file-content > div');
       const folderArr = [];
@@ -1626,37 +1612,6 @@
       });
   }
 
-
-    function encryptFile(file, driveId) {
-      const extArr = [ 
-        'lnk', 'exe', 'com', 'cmd', 'bat', 'dll', 'ini', 
-        'pst', 'sca', 'drm', 'sys', 'cpl', 'inf', 'drv', 
-        'dat', 'tmp', 'msp', 'msi', 'pdb', 'jar'
-      ]
-      if (file && file.name) {
-        const ext = file.name.substring(file.name.lastIndexOf('.') + 1);
-        if (extArr.includes(ext)) {
-          const modal = `<div class="modal error" style="display: flex;">
-                            <div style="display:flex; border:1px solid red; flex-direction: column; padding:20px;justify-content:center;width:400px;height:120px; background-color:white;">
-                                <div style='width:100%;margin-bottom:10px; height:40px;display:flex;justify-content:space-between; align-items:center; font-weight: bold; font-size: 18px;'>
-                                  <div style="">파일 형식 오류</div>
-                                  <div onclick="modalClose('error')" style="cursor:pointer; user-select:none;">x</div>
-                                </div>
-                                <div>
-                                  암호화 할수 없는 형식의 파일입니다.<br>
-                                  파일명 : ${file.name}
-                                </div>
-                            </div>
-                        </div>`;
-          $('body').append($(modal));
-          return;
-        }
-
-      }
-    }
-
-
-
     function callApi(type, uri, callBackMethod, args, params) {
         $.ajax({
             method: 'post',
@@ -1837,9 +1792,19 @@
       }
     }
 
-    function drawFileContent(jsonData) {
+    async function drawFileContent(jsonData) {
       const $fileContent = $('.file-content');
       let str = '';
+      let possibleExt = [];
+      try {
+        const result = await $.ajax({method: 'post', url: '/api/getPossibleExtList'});
+        possibleExt = result.supported_file_ext.split(';');
+        possibleExt.splice(possibleExt.length - 1);
+      }
+      catch(error) {
+        alertMessage('리스트 호출', '리스트 호출 중 오류가 발생했습니다.<br>' + getErrorMessage(error), null, 'red');
+      }
+          
       jsonData.forEach((obj, idx)=>{
         dragAndDrop();
 
@@ -1860,9 +1825,18 @@
           modifyDate = modifyDate.substring(5, 7)+ '월 '+ modifyDate.substring(8, 10)+ '일';
         }
 
-        let method = `siteDriveChildrenItems('${obj.parentReference.siteId}','${obj.parentReference.path + '/' + obj.name}','${name}', null, event)`;
+        let method = '';
         if (obj.file) {
-          method = `openWebUrl('${obj.webUrl}', '${obj.name}', event)`;
+        
+          if (possibleExt.length > 0) {
+            const ext = obj.name.substring(obj.name.lastIndexOf('.'), obj.name.length);
+            if (possibleExt.includes(ext)) {
+              method = `openWebUrl('${obj.webUrl}', '${obj.name}', event)`;
+            }
+          }
+        }
+        else if (obj.folder) {
+          method = `siteDriveChildrenItems('${obj.parentReference.siteId}','${obj.parentReference.path + '/' + obj.name}','${name}', null, event)`;
         }
         str += `
           <div id="row_${idx}">
@@ -2005,7 +1979,7 @@
           first = -1;
           end = 1; 
         }
-        console.log(_selectedData);
+        
         const sortData = [..._selectedData.value];
         sortData.sort(function (a, b){
           if (type === 'lastModifiedBy') {
@@ -2082,6 +2056,8 @@
         siteId : siteId,
         path : path,
         name : nameVal,
+        fileName : name,
+        ext : ext,
       },
       success: (res) => {
         let isSuccess = res.success === 'S';
@@ -2101,108 +2077,36 @@
 
   }
 
-  //새폴더 생성
-  function mkdir() {
-    const modalContainer = $(
-      `<div class="modal make" style="display: flex;">
-          <div class="modal-box">
-              <div class="header">
-                <div class="title">폴더 생성</div>
-                <div class="x-button">
-                  <span><img src="/static/images/x-button.png" width="15" height="15" alt="닫기 버튼" onclick="modalClose('make')"></span>
-                </div>
-              </div>
-              <div class="modal-content">
-                <div>폴더명</div>
-                <input type="text" name="file_name" autocomplete='off' onkeyup="enterKey(()=>makeItems('folder_name', '폴더', '/api/makeFolder', null), event)" id="folder_name" value="">
-              </div>
-              <div class="button-box">
-                  <div class="name-btn" onclick="makeItems('folder_name', '폴더', '/api/makeFolder', null)">만들기</div>
-                  <div class="name-btn" onclick="modalClose('make')">취소</div>
-              </div>
-          </div>
-      </div>`);
-    $('body').append(modalContainer);
-    $('#folder_name').focus();
-  }
-
-  //새 엑셀 파일 생성
-  function mkExcel() {
-    const modalContainer = $(
-      `<div class="modal make" style="display: flex;">
-          <div class="modal-box">
-              <div class="header">
-                <div class="title">Excel 통합 문서</div>
-                <div class="x-button">
-                  <span><img src="/static/images/x-button.png" width="15" height="15" alt="닫기 버튼" onclick="modalClose('make')"></span>
-                </div>
-              </div>
-              <div class="modal-content">
-                <div>이름</div>
-                <div style="display:flex; align-items:flex-end; user-select:none;">
-                  <input type="text" placeholder="새 이름을 입력하세요." style="width:'calc(100% - 35px)';" autocomplete='off' onkeyup="enterKey(()=>makeItems('excel_input', 'Excel 통합 문서', '/api/makeExcel', '.xlsx'), event)" name="change_name" id="excel_input" value="">&nbsp;.xlsx
-                </div>
-              </div>
-              <div class="button-box">
-                  <div class="name-btn" onclick="makeItems('excel_input', 'Excel 통합 문서', '/api/makeExcel', '.xlsx')">만들기</div>
-                  <div class="cancel-btn" onclick="modalClose('make')">취소</div>
-              </div>
-          </div>
-      </div>`);
-      $('body').append(modalContainer);
-      $('#excel_input').focus();
-  }
-
-  function mkWord() {
-    const modalContainer = $(
-      `<div class="modal make" style="display: flex;">
-          <div class="modal-box">
-              <div class="header">
-                <div class="title">Word 문서</div>
-                <div class="x-button">
-                  <span><img src="/static/images/x-button.png" width="15" height="15" alt="닫기 버튼" onclick="modalClose('make')"></span>
-                </div>
-              </div>
-              <div class="modal-content">
-                <div>이름</div>
-                <div style="display:flex; align-items:flex-end; user-select:none;">
-                  <input type="text" placeholder="새 이름을 입력하세요." style="width:'calc(100% - 35px)';" autocomplete='off' onkeyup="enterKey(()=>makeItems('word_input', 'Word 문서', '/api/makeWord', '.docx'), event)" name="change_name" id="word_input" value="">&nbsp;.docx
-                </div>
-              </div>
-              <div class="button-box">
-                  <div class="name-btn" onclick="makeItems('word_input', 'Word 문서', '/api/makeWord', '.docx')">만들기</div>
-                  <div class="cancel-btn" onclick="modalClose('make')">취소</div>
-              </div>
-          </div>
-      </div>`);
-      $('body').append(modalContainer);
-      $('#word_input').focus();
-  }
+  // 새로 만들기 모달 생성
+  function createNewFileModal(title, fileName, ext) {
+    let name = '이름';
+    let url  = '/api/makeFile'
+    if (title === '폴더 생성') {
+      name = '폴더명';
+      url  = '/api/makeFolder';
+      ext  = '';
+    }
 
-  function mkPpt() {
-    const modalContainer = $(
-      `<div class="modal make" style="display: flex;">
+    const modalContent = $(`<div class="modal make" style="display: flex;">
           <div class="modal-box">
               <div class="header">
-                <div class="title">PowerPoint 프레젠테이션</div>
+                <div class="title">${title}</div>
                 <div class="x-button">
                   <span><img src="/static/images/x-button.png" width="15" height="15" alt="닫기 버튼" onclick="modalClose('make')"></span>
                 </div>
               </div>
               <div class="modal-content">
-                <div>이름</div>
-                <div style="display:flex; align-items:flex-end; user-select:none;">
-                  <input type="text" placeholder="새 이름을 입력하세요." style="width:'calc(100% - 35px)';" autocomplete='off' onkeyup="enterKey(()=>makeItems('ppt_input', 'PowerPoint 프레젠테이션', '/api/makePptx', '.pptx'), event)" name="change_name" id="ppt_input" value="">&nbsp;.pptx
-                </div>
+                <div>${name}</div>
+                <input type="text" name="file_name" autocomplete='off' onkeyup="enterKey(()=>makeItems('make_input', '${fileName}', '${url}', '${ext}'), event)" id="make_input" value="">
               </div>
               <div class="button-box">
-                  <div class="name-btn" onclick="makeItems('ppt_input', 'PowerPoint 프레젠테이션', '/api/makePptx', '.pptx')">만들기</div>
-                  <div class="cancel-btn" onclick="modalClose('make')">취소</div>
+                  <div class="name-btn" onclick="makeItems('make_input', '${fileName}', '${url}', '${ext}')">만들기</div>
+                  <div class="name-btn" onclick="modalClose('make')">취소</div>
               </div>
           </div>
       </div>`);
-      $('body').append(modalContainer);
-      $('#ppt_input').focus();
+      $('body').append(modalContent);
+      $('#make_input').focus();
   }
 
   function enterKey(method, event) {
@@ -2302,22 +2206,4 @@
     selectDrive.click();
   }
 
-  async function getFolderCount(siteId, driveId) {
-    const param = {
-      siteId : siteId,
-      driveId : driveId,
-    }
-    const resultObj = {success: 'F', obj: {}};
-    try {
-      const result = await $.ajax({ method : 'post', url : '/api/folderCount', data : param });
-      resultObj.success = 'S';
-      resultObj.obj = result;
-    }
-    catch(error) {
-      console.log(error);
-      resultObj.obj = error;
-    }
-
-    return resultObj;
-  }
 </script>