浏览代码

update 2024-06-04

junggilpark 1 年之前
父节点
当前提交
4558cde782
共有 3 个文件被更改,包括 236 次插入148 次删除
  1. 176 126
      src/app.js
  2. 13 4
      src/static/styles/custom.css
  3. 47 18
      src/views/hello.html

+ 176 - 126
src/app.js

@@ -325,11 +325,7 @@ serverApp.post('/api/makeFolder',
     // isAccessTokens,
     async (req, res, next)=>{
 
-      const options = {
-        headers: {
-          Authorization: `Bearer ${req.session.accessToken}`,
-        },
-      };
+      const options = getOptions(req.session.accessToken);
       const {siteId, path, name} = req.body;
       const resultObj = {message:"", success: 'F'};
       const param ={
@@ -383,11 +379,7 @@ serverApp.post('/api/makeWord',
     // isAuthenticated,
     // isAccessTokens,
     async (req, res, next)=>{
-      const options = {
-        headers: {
-          Authorization: `Bearer ${req.session.accessToken}`,
-        },
-      };
+      const options = getOptions(req.session.accessToken);
       const {siteId, path, name} = req.body;
       const doc = new Document({
         sections : [
@@ -434,13 +426,7 @@ serverApp.post('/api/makeExcel',
     // isAccessTokens,
     async (req, res, next)=>{
 
-      const fileOptions = { headers: {
-        Authorization: `Bearer ${req.session.accessToken}`,
-      }}
-
-      const options = { headers: {
-        Authorization: `Bearer ${req.session.accessToken}`,
-      }}
+      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');
@@ -470,9 +456,7 @@ serverApp.post('/api/makePptx',
     // isAccessTokens,
     async (req, res, next)=>{
 
-      const options = { headers: {
-        Authorization: `Bearer ${req.session.accessToken}`,
-      }}
+      const options = getOptions(req.session.accessToken);
       const {siteId, path, name} = req.body;
       const pres = new pptxgen();
       pres.addSlide("TITLE_SLIDE");
@@ -503,11 +487,7 @@ serverApp.post('/api/check-name',
     // isAccessTokens,
     async (req, res, next)=>{
 
-      const options = {
-        headers: {
-          Authorization: `Bearer ${req.session.accessToken}`,
-        },
-      };
+      const options = getOptions(req.session.accessToken);
       const {siteId, path, name} = req.body;
       try{
         const sitesInfo = await axios.get(endPoint + "/sites/"+ siteId + path, options);
@@ -540,21 +520,18 @@ serverApp.post('/api/check-name',
       }
 })
 
-
 serverApp.post('/api/upload', upload.array('file'),
   // isAuthenticated,
   // isAccessTokens,
   async (req, res, next)=>{
     const startTime = new Date();
     const files = req.files;
-    let {siteId, path, folder} = req.body;
+    let {siteId, path, folder, file_path} = req.body;
     if (siteId && path) {
-      const options = {
-        headers: {
-          Authorization: `Bearer ${req.session.accessToken}`,
-        },
-      };
-
+      const options = getOptions(req.session.accessToken);
+      // const folderResult = await makeFolder(options, folder, siteId, path, file_path, files, req.session);
+      // console.log(folderResult);
+      // return res.json(folderResult);
         if (folder) {
           if (!Array.isArray(folder)) {
             folder = [folder];
@@ -629,6 +606,7 @@ serverApp.post('/api/upload', upload.array('file'),
 
         const promiseArray = [];
         if (files && files.length > 0) {
+          console.log(files);
           let beforeUri = '';
           let beforeItemId = '';
           for (let file of files) {
@@ -636,33 +614,48 @@ serverApp.post('/api/upload', upload.array('file'),
             let filePath = req.body[ fileName + "_path"];
             file.originalname = Buffer.from(file.originalname, 'ascii').toString('utf8');
             let originName = file.originalname;
+            
             if (originName.lastIndexOf('.') >= 0) {
               const possibleExt = await getPossibleExt();
-              const {supported_file_ext, protected_file_ext} = possibleExt;
+              const {supported_file_ext, protected_file_ext} = possibleExt.data;
               const ext = originName.substring(originName.lastIndexOf('.'), originName.length);
+              
               if (supported_file_ext && protected_file_ext) {
-                const supportedArr = supported_file_ext.split(';');
+                
+                let supportedArr = supported_file_ext.split(';');
+                
+                if (!supportedArr[supportedArr.length - 1]) {
+                  supportedArr.splice(supportedArr.length - 1);
+                }
+                
                 if (!supportedArr.includes(ext)) {
-                    return res.json({success:'F', message: '파일명 : '+originName+'<br>해당 파일은 업로드 불가 파일입니다. 다시 시도해주세요.'});
+                    return res.json({success:'F', message: '파일명 : ' + originName 
+                                      +'<br>해당 파일은 업로드 불가 파일입니다. 다시 시도해주세요.<br>가능 확장자 :' 
+                                      + JSON.stringify(supportedArr)});
                 }
+
                 const fileData = Buffer.from(file.buffer).toString('base64');
                 const param = {
-                  apiKey: process.env.GATE_WAY_KEY,
+                  apiKey: gateWayKey,
                   email: req.session.account.idTokenClaims.email,
                   dispFileName: originName,
                   aipGuid: "878173ae-cc36-4881-af57-604af868314c",
                   comment: "",
                   fileData: fileData
                 }
-                
+                console.log(param);
                 try {
-                  // const result = await axios.post('https://115.91.94.42/api/v1/stream/set-label', param);
                   const result = await axios.post('http://192.168.20.99:5050/api/v1/stream/set-label', param);
+                  console.log(result);
                   if (result) {
-                    if (result.data.statusCode === 200) {
+                    if (result.data.statusCode === 200 && !result.data.result.errorCode) {
                       let bufferValue = Buffer.from(result.data.result.fileData, "base64");
                       file = bufferValue;
                     }
+                    else {
+                      console.log(result.data);
+                      return res.json({success:'F', message: '파일명 : ' + originName + '<br>에러 : ' + result.data.result.errorMessage});
+                    }
                   }
                 }
                 catch(error) {
@@ -700,12 +693,8 @@ serverApp.post('/api/upload', upload.array('file'),
               beforeUri = uri;
               beforeItemId = itemId; 
             }
-            const fileOptions = { headers: {
-              Authorization: `Bearer ${req.session.accessToken}`,
-              "Content-Type" : file.mimeType
-            }}
-            // await axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+file.originalname+':/content', file.buffer, fileOptions);
-            promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+originName+':/content', file, fileOptions));
+
+            promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+originName+':/content', file, options));
           }
         }
         if (promiseArray.length > 0) {
@@ -738,11 +727,7 @@ serverApp.post('/api/download',
     if (req.body) {
       const {siteId, path, fileIds, zipName} = req.body;
       if (siteId && path && fileIds) {
-        const options = {
-          headers: {
-            Authorization: `Bearer ${req.session.accessToken}`,
-          },
-        };
+        const options = getOptions(req.session.accessToken);
         const arr = JSON.parse(fileIds);
         if (arr.length === 1) {
           const sitesInfo = await axios.get(endPoint + "/sites/"+ siteId + "/drive/items/" + arr[0], options);
@@ -789,28 +774,25 @@ serverApp.post('/api/download',
               const response = await axios.get(dataUrl, {responseType: 'arraybuffer', headers: {
                 withCredentials:true,
               },});
+
               if (response.data) {
-                const file = response.data;
+                const file = Buffer.from(response.data, 'arraybuffer').toString('base64');
                 let decodeFile = null;
                 try {
                   const param = {
-                    apiKey: process.env.GATE_WAY_KEY,
+                    apiKey: gateWayKey,
                     email : req.session.account.idTokenClaims.email,
                     dispFileName: data.name,
                     comment: "",
-                    fileData: Buffer.from(file).toString("base64")
+                    fileData: file
                   }
+                  
                   const result = await axios.post('http://192.168.20.99:5050/api/v1/stream/delete-label', param);
-                  if (result && result.data.statusCode === 200) {
-                    var binaryString = atob(result.data.result.fileData);
-                    var bytes = new Uint8Array(binaryString.length);
-                    for (var i = 0; i < binaryString.length; i++) {
-                        bytes[i] = binaryString.charCodeAt(i);
-                    }
-                    decodeFile = bytes.buffer;
+                  if (result && result.data.statusCode === 200 && !result.data.result.errorCode) {
+                      decodeFile = result.data.result.fileData;
                   }
                   else {
-                    return res.json({message: '레이블 해제 중 오류가 발생하였습니다.<br>' + result.data.message, success: 'F'});
+                      return res.json({message: '파일명 : ' +data.name + '<br>에러 : ' + result.data.result.errorMessage, success: 'F'});
                   }
                 }
                 catch(error) {
@@ -891,11 +873,7 @@ serverApp.post('/api/folderMove', async (req, res, next)=>{
     const resultObj = {message:'폴더 이동에 실패 하였습니다.', success: 'F'};
     if (name && isNaN(name)) {
       const nameArray = JSON.parse(name);
-      const options = {
-        headers: {
-          Authorization: `Bearer ${req.session.accessToken}`,
-        },
-      };
+      const options = getOptions(req.session.accessToken);
 
       if (nameArray && nameArray.length > 0) {
         for (let moveItem of nameArray) {
@@ -1013,7 +991,7 @@ function createZipFile(obj, zip) {
   
   if (obj.files.length > 0) {
     for (let file of obj.files) {
-      zip.file(file.name, file.data);
+      zip.file(file.name, file.data, {base64: true});
     }
   }
 
@@ -1057,34 +1035,12 @@ async function getFolderItems(url, array, options, session) {
         const response = await axios.get(dataUrl, {responseType: 'arraybuffer', headers: {
           withCredentials:true,
         },});
+
         //암호화 해제
-        let decodeFile;
-        try {
-          const param = {
-            apiKey: process.env.GATE_WAY_KEY,
-            email : session.account.idTokenClaims.email,
-            dispFileName: data.name,
-            comment: "",
-            fileData: Buffer.from(response.data).toString("base64")
-          }
-          const result = await axios.post('http://192.168.20.99:5050/api/v1/stream/delete-label', param);
-          if (result && result.data.statusCode === 200) {
-            var binaryString = atob(result.data.result.fileData);
-            var bytes = new Uint8Array(binaryString.length);
-            for (var i = 0; i < binaryString.length; i++) {
-                bytes[i] = binaryString.charCodeAt(i);
-            }
-            decodeFile = bytes.buffer;
-          }
-          else {
-            return res.json({message: '레이블 해제 중 오류가 발생하였습니다.<br>' + result.data.message, success: 'F'});
-          }
-        }
-        catch(error) {
-          return res.json({message: '레이블 해제 중 오류가 발생하였습니다.<br>' + JSON.stringify(error.message), success: 'F'});
+        const result = await deleteLabelFile(session, data.name, response.data);
+        if (!result.error && result.fileData) {
+          files.push({name : data.name, data : result.fileData, type: data.file.mimeType});
         }
-
-        files.push({name : data.name, data : decodeFile, type: data.file.mimeType});
         // files.push({name : data.name, data : response.data, type: data.file.mimeType});
       }
     }
@@ -1123,11 +1079,7 @@ serverApp.post('/api/delete',
       if (siteId && itemIds) {
         const itemIdArr = JSON.parse(itemIds);
         if (itemIdArr.length > 0) {
-          const options = {
-            headers: {
-              Authorization: `Bearer ${req.session.accessToken}`,
-            },
-          };
+          const options = getOptions(req.session.accessToken);
           for (let itemId of itemIdArr) {
             try{
               await axios.delete(endPoint + "/sites/"+ siteId + "/drive/items/" + itemId, options);
@@ -1164,11 +1116,7 @@ serverApp.post('/api/update-name',
       const {siteId, itemId, name} = req.body;
       const resultObj = {success: '', message:''};
       if (siteId && itemId && name) {
-          const options = {
-            headers: {
-              Authorization: `Bearer ${req.session.accessToken}`,
-            },
-          };
+        const options = getOptions(req.session.accessToken);
           try{
             await axios.patch(endPoint + "/sites/"+ siteId + "/drive/items/" + itemId, {name : name}, options);
           }
@@ -1200,12 +1148,7 @@ serverApp.post('/api/move-item',
       const resultObj = {message:'', successItems : [], failItems : [], locations: []};
       if (name && isNaN(name)) {
         const nameArray = JSON.parse(name);
-        const options = {
-          headers: {
-            Authorization: `Bearer ${req.session.accessToken}`,
-            ContentType: "application/json",
-          },
-        };
+        const options = getOptions(req.session.accessToken);
 
         if (nameArray && nameArray.length > 0) {
           for (let moveItem of nameArray) {
@@ -1248,12 +1191,7 @@ async (req, res, next)=>{
     const resultObj = {message:'', successItems : [], failItems : [], locations: []};
     if (name && isNaN(name)) {
       const nameArray = JSON.parse(name);
-      const options = {
-        headers: {
-          Authorization: `Bearer ${req.session.accessToken}`,
-          ContentType: "application/json",
-        },
-      };
+      const options = getOptions(req.session.accessToken);
 
       if (nameArray && nameArray.length > 0) {
         for (let moveItem of nameArray) {
@@ -1321,12 +1259,7 @@ async (req, res, next)=>{
     const {name, siteId, path, teamId, teamName, bindId} = req.body;
     const resultObj = {message:'', success: 'F'};
     if (name && siteId && path && teamId && teamName) {
-      const options = {
-        headers: {
-          Authorization: `Bearer ${req.session.accessToken}`,
-          ContentType: "application/json",
-        },
-      };
+      const options = getOptions(req.session.accessToken);
 
       try {
         const teamInfo = await axios.get(`${endPoint}/teams/${teamId}/channels`, options);
@@ -1383,24 +1316,141 @@ async (req, res, next)=>{
 // });
 
 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') A,  
-           (SELECT * FROM TB_AIP_CONFIG WHERE ConfigKey = 'ProtectedFileExt') B`;
+      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) {
-        return result.recordset[0];
+      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);
+      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');
+      console.log('=================fileData =================================');
+      console.log(fileData);
+      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('http://192.168.20.99:5050/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('http://192.168.20.99:5050/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 = '파일명 : ' +data.name + '<br>에러 : ' + result.data.result.errorMessage;
+    }
+  }
+  catch(error) {
+    resultObj.error = true;
+    resultObj.errorMessage = '레이블 해제 중 오류가 발생하였습니다.<br>' + JSON.stringify(error.message);
+  }
+  return resultObj;
+}
+
+function getOptions(token) {
+  const options = {
+    headers: {
+      Authorization: `Bearer ${token}`,
+    },
+  };
+  return options;
+}
 
 server.listen(SERVER_PORT, function () {
   console.log(`\n${serverApp.name} listening to ${SERVER_PORT}`);

+ 13 - 4
src/static/styles/custom.css

@@ -53,6 +53,7 @@ html, body {
   width: 15%;
   background-color: #eceaea;
   overflow: auto;
+  user-select: none;
 }
 .content section {
   width: 85%;
@@ -311,11 +312,16 @@ li {
 
 .modal-box {
   /* padding: 20px; */
-  width: 400px;
-  height: 225px;
+  min-width: 400px;
+  max-width: 50%;
+  min-height: 225px;
+  max-height: 50%;
   z-index: 2;
   background-color: white;
   box-shadow: 2px 2px 2px 2px rgb(75, 75, 75);
+  display: flex;
+  flex-direction: column;
+  justify-content: space-around;
 }
 .modal .modal-box .header {
   position: relative;
@@ -338,13 +344,16 @@ li {
   color: red;
 }
 .modal .modal-box .modal-content {
-  padding: 0 30px;
-  height: calc(100% - 102px);
+  /* padding: 0 30px; */
+  padding: 30px;
+  /* height: calc(100% - 102px); */
+  /* max-height: calc(50% - 102px); */
   gap: 10px;
   display: flex;
   flex-direction: column;
   justify-content: center;
   overflow: auto;
+  overflow-wrap: break-word;
 }
 .modal.red .modal-box .modal-content {
   color:red;

+ 47 - 18
src/views/hello.html

@@ -99,10 +99,10 @@
         microsoftTeams.appInitialization.notifySuccess();  
         getGroupList();
                 // return useServerSideToken(profile);
-            })
-            .catch((error) => {
-              console.log(error);
-            })
+      })
+      .catch((error) => {
+        console.log(error);
+      })
     })
 
     function getClientSideToken() {
@@ -1210,21 +1210,50 @@
           },
           success: (res)=>{
             if (res.success === 'S') {
-              const dataUrl = window.URL.createObjectURL(new Blob([new Uint8Array(res.data.data).buffer]));
-              const link = document.createElement('a');
-              link.href = dataUrl;
-              link.download = res.name;
-              link.style.display = 'none';
-              $('body').append(link);
-              link.click();
-              link.remove();
+              let fileData = '';
+              if (res.data) {
+                if (res.type) {
+
+                  var sliceSize = 1024;
+                  var byteCharacters = atob(res.data);
+                  var bytesLength = byteCharacters.length;
+                  var slicesCount = Math.ceil(bytesLength / sliceSize);
+                  var byteArrays = new Array(slicesCount);
+
+                  for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
+                      var begin = sliceIndex * sliceSize;
+                      var end = Math.min(begin + sliceSize, bytesLength);
+
+                      var bytes = new Array(end - begin);
+                      for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
+                          bytes[i] = byteCharacters[offset].charCodeAt(0);
+                      }
+                      byteArrays[sliceIndex] = new Uint8Array(bytes);
+                  }
+                  fileData = new Blob(byteArrays, { type: res.type });
+                }
+                else {
+                  fileData = new Blob([new Uint8Array(res.data.data).buffer]);
+                }
+                const dataUrl = window.URL.createObjectURL(fileData);
+                const link = document.createElement('a');
+                link.href = dataUrl;
+                link.download = res.name;
+                link.style.display = 'none';
+                $('body').append(link);
+                link.click();
+                link.remove();
+              }
+              else {
+                alertMessage('다운로드', '파일 다운로드 중 오류가 발생하였습니다.', null, 'red');
+              }
             }
             else {
               let message = res.message;
               if (res.error) {
                 message += '<br>' + res.error;
               }
-              alertMessage('다운로드', message);
+              alertMessage('다운로드', message, null, 'red');
             }
           },
           error : (error) => {
@@ -1350,8 +1379,10 @@
             let str = res.message;
             let color = null;
             if (res.success === 'F') {
+            // if (res.error) {
               // str += '<br>오류 : ' + res.error.message;
               color = 'red';
+              // str = res.errorMessage;
             }
             alertMessage(alertTitle, str, null, color);
             refreshDrives();
@@ -1515,19 +1546,17 @@
           if (item.isFile) {
             item.file(file => {
               let fileName = file.name;
-              // if (file.name.indexOf('.') > 0) {
-              //   fileName = file.name.substring(0, file.name.lastIndexOf('.'));
-              // }
               let path = item.fullPath.substring(0, item.fullPath.lastIndexOf('/'));
               if (!path) {
                 path = '';
               }
               _formData.append('file', file);
               _formData.append(fileName + '_path', path);
-              console.log(path);
+              _formData.append('file_path', path);
               resolve(fileObj);
             });
-          } else if (item.isDirectory) {
+          } 
+          else if (item.isDirectory) {
             let dirReader = item.createReader();
             const path = item.fullPath.substring(0, item.fullPath.lastIndexOf('/'));
             _formData.append('folder', JSON.stringify({name : item.name, path : path}));