|
@@ -49,6 +49,7 @@ const cca = new msal.ConfidentialClientApplication(msalConfig);
|
|
|
|
|
|
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';
|
|
@@ -372,7 +373,7 @@ serverApp.post('/api/makeFolder',
|
|
|
}
|
|
|
else {
|
|
|
resultObj.message = "생성할 폴더 경로를 찾을 수 없습니다.";
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
catch(error) {
|
|
|
resultObj.message = "폴더 생성 중 오류가 발생하였습니다.<br>" + getErrorMessage(error);
|
|
@@ -381,7 +382,7 @@ serverApp.post('/api/makeFolder',
|
|
|
res.json(resultObj);
|
|
|
});
|
|
|
|
|
|
-function getErrorMessage(error) {
|
|
|
+function getErrorMessage(error) {
|
|
|
let errorText = "";
|
|
|
if (error.response && error.response.status && error.response.statusText && error.response.data && error.response.data.error) {
|
|
|
// console.log(error.response);
|
|
@@ -393,8 +394,8 @@ function getErrorMessage(error) {
|
|
|
else {
|
|
|
console.log('================================ Error =====================================')
|
|
|
console.log(error);
|
|
|
- errorText = error;
|
|
|
- }
|
|
|
+ errorText = error;
|
|
|
+ }
|
|
|
return errorText;
|
|
|
}
|
|
|
|
|
@@ -664,153 +665,79 @@ serverApp.post('/api/check-name',
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-async function uploadDrive(options, folder, siteId, path, res) {
|
|
|
+async function uploadDrive(options, folder, siteId, path) {
|
|
|
const startTime = new Date();
|
|
|
- if (folder) {
|
|
|
- if (!Array.isArray(folder)) {
|
|
|
- folder = [folder];
|
|
|
- }
|
|
|
- for (let item of folder) {
|
|
|
- const fileInfo = JSON.parse(item);
|
|
|
+ const resultObj = {
|
|
|
+ success : 'S',
|
|
|
+ message : '',
|
|
|
+ }
|
|
|
|
|
|
- const param = {
|
|
|
- name: fileInfo.name,
|
|
|
- folder: {},
|
|
|
- '@microsoft.graph.conflictBehavior': 'rename'
|
|
|
- };
|
|
|
+ if (!Array.isArray(folder)) {
|
|
|
+ folder = [folder];
|
|
|
+ }
|
|
|
+ for (let item of folder) {
|
|
|
+ const fileInfo = JSON.parse(item);
|
|
|
|
|
|
- let folderPath = '';
|
|
|
- if (fileInfo.path) {
|
|
|
- folderPath = fileInfo.path;
|
|
|
- if (!path.includes(':')) {
|
|
|
- folderPath = ":" + folderPath;
|
|
|
- }
|
|
|
- }
|
|
|
- let uri = endPoint + "/sites/"+ siteId + path + folderPath;
|
|
|
- try {
|
|
|
- const result = await new Promise (async (resolve, reject)=>{
|
|
|
- try {
|
|
|
- const sitesInfo = await axios.get(uri, options);
|
|
|
- resolve(sitesInfo.data);
|
|
|
- }
|
|
|
- catch(error) {
|
|
|
- if (error.response) {
|
|
|
- reject(error.response);
|
|
|
- }
|
|
|
- else {
|
|
|
- reject(error);
|
|
|
- }
|
|
|
- }
|
|
|
- }).then(async (result)=>{
|
|
|
- return await new Promise(async (resolve, reject)=>{
|
|
|
- try {
|
|
|
- const uploadFolder = await axios.post(endPoint + "/sites/"+ siteId +"/drive/items/" + result.id +"/children", param, options);
|
|
|
- resolve(uploadFolder.data);
|
|
|
- }
|
|
|
- catch(error){
|
|
|
- if (error.response) {
|
|
|
- reject(error.response);
|
|
|
- }
|
|
|
- else {
|
|
|
- reject(error);
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- })
|
|
|
- }
|
|
|
- catch(error) {
|
|
|
- return res.json({success:'F', message: '요청하신 파일 업로드 중 오류가 발생하였습니다.<br>' + getErrorMessage(error)});
|
|
|
+ const param = {
|
|
|
+ name: fileInfo.name,
|
|
|
+ folder: {},
|
|
|
+ // '@microsoft.graph.conflictBehavior': 'rename'
|
|
|
+ };
|
|
|
+
|
|
|
+ let folderPath = '';
|
|
|
+ if (fileInfo.path) {
|
|
|
+ folderPath = fileInfo.path;
|
|
|
+ if (!path.includes(':')) {
|
|
|
+ folderPath = ":" + folderPath;
|
|
|
}
|
|
|
}
|
|
|
- const makeFolderTime = new Date();
|
|
|
+ let uri = endPoint + "/sites/"+ siteId + path + folderPath;
|
|
|
+ const result = await new Promise (async (resolve, reject)=>{
|
|
|
+ axios.get(uri, options).then((sitesInfo)=>{
|
|
|
+ resolve(sitesInfo.data);
|
|
|
+ })
|
|
|
+ .catch((error)=>{
|
|
|
+ reject(error);
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .then(async (result)=>{
|
|
|
+ return await new Promise(async (resolve, reject)=>{
|
|
|
+ axios.post(endPoint + "/sites/"+ siteId +"/drive/items/" + result.id +"/children", param, options)
|
|
|
+ .then((uploadFolder)=>{
|
|
|
+ resolve(uploadFolder.data);
|
|
|
+ })
|
|
|
+ .catch((error)=>{
|
|
|
+ reject(error);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .catch((error)=>{
|
|
|
+ return {success:'F', message: '요청하신 파일 업로드 중 오류가 발생하였습니다.<br>' + getErrorMessage(error)};
|
|
|
+ });
|
|
|
|
|
|
- console.log('폴더 시작 시간 :', startTime.toLocaleString(), ', 폴더 종료 시간 :', makeFolderTime.toLocaleString(), ', 소요 시간 :', timeCheck(startTime, makeFolderTime));
|
|
|
+ if (result.success === 'F') {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
}
|
|
|
+ const makeFolderTime = new Date();
|
|
|
+
|
|
|
+ console.log('폴더 시작 시간 :', startTime.toLocaleString(), ', 폴더 종료 시간 :', makeFolderTime.toLocaleString(), ', 소요 시간 :', timeCheck(startTime, makeFolderTime));
|
|
|
+ return resultObj;
|
|
|
}
|
|
|
|
|
|
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, file_path} = req.body;
|
|
|
+ let {siteId, path, folder, file_path} = req.body;
|
|
|
if (siteId && path) {
|
|
|
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];
|
|
|
- // }
|
|
|
- // for (let item of folder) {
|
|
|
- // const fileInfo = JSON.parse(item);
|
|
|
-
|
|
|
- // const param = {
|
|
|
- // name: fileInfo.name,
|
|
|
- // folder: {},
|
|
|
- // '@microsoft.graph.conflictBehavior': 'rename'
|
|
|
- // };
|
|
|
-
|
|
|
- // let folderPath = '';
|
|
|
- // if (fileInfo.path) {
|
|
|
- // folderPath = fileInfo.path;
|
|
|
- // if (!path.includes(':')) {
|
|
|
- // folderPath = ":" + folderPath;
|
|
|
- // }
|
|
|
- // }
|
|
|
- // let uri = endPoint + "/sites/"+ siteId + path + folderPath;
|
|
|
- // try {
|
|
|
- // const result = await new Promise (async (resolve, reject)=>{
|
|
|
- // try {
|
|
|
- // const sitesInfo = await axios.get(uri, options);
|
|
|
- // resolve(sitesInfo.data);
|
|
|
- // }
|
|
|
- // catch(error) {
|
|
|
- // if (error.response) {
|
|
|
- // reject(error.response);
|
|
|
- // }
|
|
|
- // else {
|
|
|
- // reject(error);
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }).then(async (result)=>{
|
|
|
- // return await new Promise(async (resolve, reject)=>{
|
|
|
- // try {
|
|
|
- // const uploadFolder = await axios.post(endPoint + "/sites/"+ siteId +"/drive/items/" + result.id +"/children", param, options);
|
|
|
- // resolve(uploadFolder.data);
|
|
|
- // }
|
|
|
- // catch(error){
|
|
|
- // if (error.response) {
|
|
|
- // reject(error.response);
|
|
|
- // }
|
|
|
- // else {
|
|
|
- // reject(error);
|
|
|
- // }
|
|
|
- // }
|
|
|
- // })
|
|
|
- // }).catch((error)=>{
|
|
|
- // console.log(error);
|
|
|
- // })
|
|
|
- // }
|
|
|
- // catch(error) {
|
|
|
- // return res.json({success:'F', message: '요청하신 파일 업로드 중 오류가 발생하였습니다.<br>' + getErrorMessage(error)});
|
|
|
- // }
|
|
|
- // }
|
|
|
- // const makeFolderTime = new Date();
|
|
|
-
|
|
|
- // let betweenTime = makeFolderTime - startTime;
|
|
|
- // if (betweenTime > 60000) {
|
|
|
- // betweenTime = (betweenTime/1000/60) + ' 분';
|
|
|
- // }
|
|
|
- // else {
|
|
|
- // betweenTime = (betweenTime/1000) + ' 초';
|
|
|
- // }
|
|
|
- // console.log('폴더 시작 시간 :', startTime.toLocaleString(), ', 폴더 종료 시간 :', makeFolderTime.toLocaleString(), ', 소요 시간 :', betweenTime);
|
|
|
- // }
|
|
|
- await uploadDrive(options, folder, siteId, path, res);
|
|
|
-
|
|
|
+ if (folder){
|
|
|
+ const uploadDriveResult = await uploadDrive(options, folder, siteId, path);
|
|
|
+ if (uploadDriveResult.success === 'F') {
|
|
|
+ return res.json(uploadDriveResult);
|
|
|
+ }
|
|
|
+ }
|
|
|
const promiseArray = [];
|
|
|
const labelPromiseArray = [];
|
|
|
const fileWriteArray = [];
|
|
@@ -1080,150 +1007,209 @@ serverApp.post('/api/download',
|
|
|
// isAuthenticated,
|
|
|
// isAccessTokens,
|
|
|
async (req, res, next)=>{
|
|
|
- let startTime = new Date();
|
|
|
- if (req.body) {
|
|
|
+ try {
|
|
|
+ let startTime = new Date();
|
|
|
const {siteId, path, fileIds, zipName} = req.body;
|
|
|
if (siteId && path && fileIds) {
|
|
|
- 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);
|
|
|
- if (sitesInfo && sitesInfo.data) {
|
|
|
- const data = sitesInfo.data;
|
|
|
- if (data.folder) {
|
|
|
- const folderObj = await getFolderItems(endPoint + "/sites/"+ siteId + "/drive/items/", arr, options, req.session);
|
|
|
- const zip = new JSZIP();
|
|
|
- if (folderObj) {
|
|
|
- createZipFile(folderObj, zip);
|
|
|
- const now = new Date();
|
|
|
- const year = now.getFullYear().toString();
|
|
|
- let month = now.getMonth() + 1;
|
|
|
- if (month < 10) month = "0" + month;
|
|
|
- let date = now.getDate();
|
|
|
- if (date < 10) date = "0" + date;
|
|
|
- zip.generateAsync({
|
|
|
- type: 'nodebuffer',
|
|
|
- mimeType: 'application/epub+zip',
|
|
|
- compression: 'DEFLATE',
|
|
|
- compressionOptions: {
|
|
|
- level: 9
|
|
|
- },
|
|
|
- }).then((resZip)=>{
|
|
|
- const endTime = new Date();
|
|
|
- let betweenTime = endTime - startTime;
|
|
|
- if (betweenTime > 60000) {
|
|
|
- betweenTime = (betweenTime/1000/60) + ' 분';
|
|
|
- }
|
|
|
- else {
|
|
|
- betweenTime = (betweenTime/1000) + ' 초';
|
|
|
- }
|
|
|
- console.log('시작 시간 :', startTime.toLocaleString(), ', 종료 시간 :', endTime.toLocaleString(), ', 소요 시간 :', betweenTime);
|
|
|
- return res.json({success: 'S', data: resZip, name: data.name + '_' + year + '-' + month + '-' + date + '.zip'});
|
|
|
- })
|
|
|
- .catch((error)=>{
|
|
|
- console.log(error);
|
|
|
- return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.', error: error});
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- const dataUrl = data['@microsoft.graph.downloadUrl'];
|
|
|
- const response = await axios.get(dataUrl, {responseType: 'arraybuffer', headers: {
|
|
|
- withCredentials:true,
|
|
|
- },});
|
|
|
-
|
|
|
- if (response.data) {
|
|
|
- const file = Buffer.from(response.data, 'arraybuffer').toString('base64');
|
|
|
- let decodeFile = null;
|
|
|
- try {
|
|
|
- const param = {
|
|
|
- apiKey: gateWayKey,
|
|
|
- email : req.session.account.idTokenClaims.email,
|
|
|
- dispFileName: data.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) {
|
|
|
- decodeFile = result.data.result.fileData;
|
|
|
- }
|
|
|
- else {
|
|
|
- return res.json({message: '파일명 : ' +data.name + '<br>에러 : ' + result.data.result.errorMessage, success: 'F'});
|
|
|
- }
|
|
|
- }
|
|
|
- catch(error) {
|
|
|
- return res.json({message: '레이블 해제 중 오류가 발생하였습니다.<br>' + JSON.stringify(error.message), success: 'F'});
|
|
|
- }
|
|
|
- const endTime = new Date();
|
|
|
- let betweenTime = endTime - startTime;
|
|
|
- if (betweenTime > 60000) {
|
|
|
- betweenTime = (betweenTime/1000/60) + ' 분';
|
|
|
- }
|
|
|
- else {
|
|
|
- betweenTime = (betweenTime/1000) + ' 초';
|
|
|
- }
|
|
|
- console.log('시작 시간 :', startTime.toLocaleString(), ', 종료 시간 :', endTime.toLocaleString(), ', 소요 시간 :', betweenTime);
|
|
|
- return res.json({success: 'S', data: decodeFile, type: data.file.mimeType, name: data.name});
|
|
|
- }
|
|
|
- else {
|
|
|
- return res.json({message:'파일 다운로드에 실패하였습니다.', success:'F'})
|
|
|
- }
|
|
|
- }
|
|
|
+ const options = getOptions(req.session.accessToken);
|
|
|
+ const arr = JSON.parse(fileIds);
|
|
|
+ const url = endPoint + "/sites/"+ siteId + "/drive/items/";
|
|
|
+ const zip = new JSZIP();
|
|
|
+ const downObj = await getFolderItems(url, arr, options, req.session);
|
|
|
+ const folderLength = downObj.folder.length;
|
|
|
+ const fileLength = downObj.files.length;
|
|
|
+
|
|
|
+ if (downObj && (folderLength > 1 || fileLength > 1 || (folderLength + fileLength) > 1)) {
|
|
|
+ createZipFile(downObj, zip);
|
|
|
+ const now = new Date();
|
|
|
+ const year = now.getFullYear().toString();
|
|
|
+ let month = now.getMonth() + 1;
|
|
|
+ if (month < 10) month = "0" + month;
|
|
|
+ let date = now.getDate();
|
|
|
+ if (date < 10) date = "0" + date;
|
|
|
+ zip.generateAsync({
|
|
|
+ type: 'nodebuffer',
|
|
|
+ mimeType: 'application/epub+zip',
|
|
|
+ compression: 'DEFLATE',
|
|
|
+ compressionOptions: {
|
|
|
+ level: 9
|
|
|
+ },
|
|
|
+ }).then((resZip)=>{
|
|
|
+ const endTime = new Date();
|
|
|
+ console.log('시작 시간 :', startTime.toLocaleString(), ', 종료 시간 :', endTime.toLocaleString(), ', 소요 시간 :', timeCheck(startTime, endTime));
|
|
|
+ return res.json({success: 'S', data: resZip, name: zipName + '_' + year + '-' + month + '-' + date + '.zip'});
|
|
|
+ })
|
|
|
+ .catch((error)=>{
|
|
|
+ console.log(error);
|
|
|
+ return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.', error: error});
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else if (downObj.folder.length > 0 && downObj.files.length === 0) {
|
|
|
+ return res.json({success:'F', messages:'폴더안에 파일이 존재하지 않습니다.'})
|
|
|
+ }
|
|
|
+ else if (downObj.files.length === 1){
|
|
|
+ const data = downObj.files[0];
|
|
|
+ console.log(data);
|
|
|
+ return res.json({success: 'S', data: data.data, name: data.name})
|
|
|
}
|
|
|
- }
|
|
|
- else {
|
|
|
- try {
|
|
|
- const url = endPoint + "/sites/"+ siteId + "/drive/items/";
|
|
|
- const zip = new JSZIP();
|
|
|
- const downObj = await getFolderItems(url, arr, options, req.session);
|
|
|
- if (downObj) {
|
|
|
- createZipFile(downObj, zip);
|
|
|
- const now = new Date();
|
|
|
- const year = now.getFullYear().toString();
|
|
|
- let month = now.getMonth() + 1;
|
|
|
- if (month < 10) month = "0" + month;
|
|
|
- let date = now.getDate();
|
|
|
- if (date < 10) date = "0" + date;
|
|
|
- zip.generateAsync({
|
|
|
- type: 'nodebuffer',
|
|
|
- mimeType: 'application/epub+zip',
|
|
|
- compression: 'DEFLATE',
|
|
|
- compressionOptions: {
|
|
|
- level: 9
|
|
|
- },
|
|
|
- }).then((resZip)=>{
|
|
|
- const endTime = new Date();
|
|
|
- let betweenTime = endTime - startTime;
|
|
|
- if (betweenTime > 60000) {
|
|
|
- betweenTime = (betweenTime/1000/60) + ' 분';
|
|
|
- }
|
|
|
- else {
|
|
|
- betweenTime = (betweenTime/1000) + ' 초';
|
|
|
- }
|
|
|
- console.log('시작 시간 :', startTime.toLocaleString(), ', 종료 시간 :', endTime.toLocaleString(), ', 소요 시간 :', betweenTime);
|
|
|
- return res.json({success: 'S', data: resZip, name: zipName + '_' + year + '-' + month + '-' + date + '.zip'});
|
|
|
- })
|
|
|
- .catch((error)=>{
|
|
|
- console.log(error);
|
|
|
- return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.', error: error});
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- catch(err) {
|
|
|
- // console.log(sitesInfo.data);
|
|
|
- console.log(err);
|
|
|
- }
|
|
|
- // }
|
|
|
- }
|
|
|
}
|
|
|
else {
|
|
|
return res.json({message:'다운로드 파일 정보를 확인 할 수 없습니다.', success:'F'})
|
|
|
}
|
|
|
}
|
|
|
+ catch(error) {
|
|
|
+ return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.<br>'+ getErrorMessage(error)});
|
|
|
+ }
|
|
|
}
|
|
|
);
|
|
|
|
|
|
+// serverApp.post('/api/download',
|
|
|
+// // isAuthenticated,
|
|
|
+// // isAccessTokens,
|
|
|
+// async (req, res, next)=>{
|
|
|
+// try {
|
|
|
+// let startTime = new Date();
|
|
|
+// if (req.body) {
|
|
|
+// const {siteId, path, fileIds, zipName} = req.body;
|
|
|
+// if (siteId && path && fileIds) {
|
|
|
+// 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);
|
|
|
+// if (sitesInfo && sitesInfo.data) {
|
|
|
+// const data = sitesInfo.data;
|
|
|
+// if (data.folder) {
|
|
|
+// const folderObj = await getFolderItems(endPoint + "/sites/"+ siteId + "/drive/items/", arr, options, req.session);
|
|
|
+// // return res.json({success: 'F', message:'test', obj : folderObj});
|
|
|
+// const zip = new JSZIP();
|
|
|
+// if (folderObj) {
|
|
|
+// createZipFile(folderObj, zip);
|
|
|
+// const now = new Date();
|
|
|
+// const year = now.getFullYear().toString();
|
|
|
+// let month = now.getMonth() + 1;
|
|
|
+// if (month < 10) month = "0" + month;
|
|
|
+// let date = now.getDate();
|
|
|
+// if (date < 10) date = "0" + date;
|
|
|
+// zip.generateAsync({
|
|
|
+// type: 'nodebuffer',
|
|
|
+// mimeType: 'application/epub+zip',
|
|
|
+// compression: 'DEFLATE',
|
|
|
+// compressionOptions: {
|
|
|
+// level: 9
|
|
|
+// },
|
|
|
+// }).then((resZip)=>{
|
|
|
+// const endTime = new Date();
|
|
|
+// let betweenTime = endTime - startTime;
|
|
|
+// if (betweenTime > 60000) {
|
|
|
+// betweenTime = (betweenTime/1000/60) + ' 분';
|
|
|
+// }
|
|
|
+// else {
|
|
|
+// betweenTime = (betweenTime/1000) + ' 초';
|
|
|
+// }
|
|
|
+// console.log('시작 시간 :', startTime.toLocaleString(), ', 종료 시간 :', endTime.toLocaleString(), ', 소요 시간 :', betweenTime);
|
|
|
+// return res.json({success: 'S', data: resZip, name: data.name + '_' + year + '-' + month + '-' + date + '.zip'});
|
|
|
+// })
|
|
|
+// .catch((error)=>{
|
|
|
+// console.log(error);
|
|
|
+// return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.', error: error});
|
|
|
+// });
|
|
|
+// }
|
|
|
+
|
|
|
+// }
|
|
|
+// else {
|
|
|
+// const dataUrl = data['@microsoft.graph.downloadUrl'];
|
|
|
+// const response = await axios.get(dataUrl, {responseType: 'arraybuffer', headers: {
|
|
|
+// withCredentials:true,
|
|
|
+// },});
|
|
|
+
|
|
|
+// if (response.data) {
|
|
|
+// const file = Buffer.from(response.data, 'arraybuffer').toString('base64');
|
|
|
+// let decodeFile = null;
|
|
|
+// try {
|
|
|
+// const param = {
|
|
|
+// apiKey: gateWayKey,
|
|
|
+// email : req.session.account.idTokenClaims.email,
|
|
|
+// dispFileName: data.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) {
|
|
|
+// decodeFile = result.data.result.fileData;
|
|
|
+// }
|
|
|
+// else {
|
|
|
+// return res.json({message: '파일명 : ' +data.name + '<br>에러 : ' + result.data.result.errorMessage, success: 'F'});
|
|
|
+// }
|
|
|
+// }
|
|
|
+// catch(error) {
|
|
|
+// return res.json({message: '레이블 해제 중 오류가 발생하였습니다.<br>' + JSON.stringify(error.message), success: 'F'});
|
|
|
+// }
|
|
|
+// const endTime = new Date();
|
|
|
+// let betweenTime = endTime - startTime;
|
|
|
+// if (betweenTime > 60000) {
|
|
|
+// betweenTime = (betweenTime/1000/60) + ' 분';
|
|
|
+// }
|
|
|
+// else {
|
|
|
+// betweenTime = (betweenTime/1000) + ' 초';
|
|
|
+// }
|
|
|
+// console.log('시작 시간 :', startTime.toLocaleString(), ', 종료 시간 :', endTime.toLocaleString(), ', 소요 시간 :', betweenTime);
|
|
|
+// return res.json({success: 'S', data: decodeFile, type: data.file.mimeType, name: data.name});
|
|
|
+// }
|
|
|
+// else {
|
|
|
+// return res.json({message:'파일 다운로드에 실패하였습니다.', success:'F'})
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else {
|
|
|
+// try {
|
|
|
+// const url = endPoint + "/sites/"+ siteId + "/drive/items/";
|
|
|
+// const zip = new JSZIP();
|
|
|
+// const downObj = await getFolderItems(url, arr, options, req.session);
|
|
|
+// if (downObj) {
|
|
|
+// createZipFile(downObj, zip);
|
|
|
+// const now = new Date();
|
|
|
+// const year = now.getFullYear().toString();
|
|
|
+// let month = now.getMonth() + 1;
|
|
|
+// if (month < 10) month = "0" + month;
|
|
|
+// let date = now.getDate();
|
|
|
+// if (date < 10) date = "0" + date;
|
|
|
+// zip.generateAsync({
|
|
|
+// type: 'nodebuffer',
|
|
|
+// mimeType: 'application/epub+zip',
|
|
|
+// compression: 'DEFLATE',
|
|
|
+// compressionOptions: {
|
|
|
+// level: 9
|
|
|
+// },
|
|
|
+// }).then((resZip)=>{
|
|
|
+// const endTime = new Date();
|
|
|
+// console.log('시작 시간 :', startTime.toLocaleString(), ', 종료 시간 :', endTime.toLocaleString(), ', 소요 시간 :', timeCheck(startTime, endTime));
|
|
|
+// return res.json({success: 'S', data: resZip, name: zipName + '_' + year + '-' + month + '-' + date + '.zip'});
|
|
|
+// })
|
|
|
+// .catch((error)=>{
|
|
|
+// console.log(error);
|
|
|
+// return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.', error: error});
|
|
|
+// });
|
|
|
+// }
|
|
|
+// }
|
|
|
+// catch(err) {
|
|
|
+// console.log(err);
|
|
|
+// return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.', error: getErrorMessage(err)});
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else {
|
|
|
+// return res.json({message:'다운로드 파일 정보를 확인 할 수 없습니다.', success:'F'})
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// catch(error) {
|
|
|
+// return res.json({success: 'F', message:'파일 다운로드 중 오류가 발생하였습니다.<br>'+ getErrorMessage(error)});
|
|
|
+// }
|
|
|
+// }
|
|
|
+// );
|
|
|
+
|
|
|
serverApp.post('/api/folderMove', async (req, res, next)=>{
|
|
|
if (req.body) {
|
|
|
const {id, name, siteId, driveId, text, moveSiteId, movePath} = req.body;
|
|
@@ -1328,13 +1314,13 @@ async function findSubFolder(data, movePath, moveSiteId, options) {
|
|
|
|
|
|
function createZipFile(obj, zip) {
|
|
|
|
|
|
- if (obj.files.length > 0) {
|
|
|
+ if (obj.files && obj.files.length > 0) {
|
|
|
for (let file of obj.files) {
|
|
|
zip.file(file.name, file.data, {base64: true});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (obj.folder.length > 0) {
|
|
|
+ if (obj.folder && obj.folder.length > 0) {
|
|
|
for (let folder of obj.folder) {
|
|
|
zip.folder(folder.name);
|
|
|
if (folder.subFolder) {
|
|
@@ -1345,46 +1331,89 @@ function createZipFile(obj, zip) {
|
|
|
}
|
|
|
|
|
|
async function getFolderItems(url, array, options, session) {
|
|
|
- const files = [];
|
|
|
- // let subFolder = [];
|
|
|
- let folder = [];
|
|
|
-
|
|
|
+ const files = [];
|
|
|
+ const folder = [];
|
|
|
+ const sitesInfoArr = [];
|
|
|
+ const fileArr = [];
|
|
|
+ const fileInfoArr = [];
|
|
|
+
|
|
|
+ const folderCheckTime = new Date();
|
|
|
for (let fileId of array) {
|
|
|
- const sitesInfo = await axios.get(url + fileId, options);
|
|
|
- const data = sitesInfo.data;
|
|
|
+ sitesInfoArr.push(axios.get(url + fileId, options));
|
|
|
+ }
|
|
|
+ const siteInfos = await Promise.all(sitesInfoArr).catch((error)=>{
|
|
|
+ console.log(error);
|
|
|
+ });
|
|
|
+
|
|
|
+ for (let site of siteInfos) {
|
|
|
+ const data = site.data;
|
|
|
if (data) {
|
|
|
if (data.folder) {
|
|
|
const folderObj = {name : data.name, subFolder : []};
|
|
|
if (data.folder.childCount) {
|
|
|
- const itemsData = await axios.get(url + fileId + '/children', options);
|
|
|
+ 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);
|
|
|
}
|
|
|
- let result = await getFolderItems(url, idArr, options, session);
|
|
|
+
|
|
|
+ try {
|
|
|
+ let result = await getFolderItems(url, idArr, options, session);
|
|
|
+ folderObj.subFolder = result;
|
|
|
+ }
|
|
|
+ catch(error) {
|
|
|
+ if (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ }
|
|
|
// subFolder.push(result);
|
|
|
- folderObj.subFolder = result;
|
|
|
}
|
|
|
}
|
|
|
folder.push(folderObj);
|
|
|
}
|
|
|
else {
|
|
|
const dataUrl = data['@microsoft.graph.downloadUrl'];
|
|
|
- const response = await axios.get(dataUrl, {responseType: 'arraybuffer', headers: {
|
|
|
- withCredentials:true,
|
|
|
- },});
|
|
|
-
|
|
|
- //암호화 해제
|
|
|
- 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 : response.data, type: data.file.mimeType});
|
|
|
+ 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);
|
|
|
+
|
|
|
+ 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(deleteLabelArr);
|
|
|
+ for (let idx in deleteLabelFiles) {
|
|
|
+ const fileObj = deleteLabelFiles[idx];
|
|
|
+ const data = fileObj.data;
|
|
|
+ if (data.success && !data.result.errorCode) {
|
|
|
+ files.push({name : fileInfoArr[idx].name, data: data.result.fileData});
|
|
|
+ }
|
|
|
+ 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,
|
|
@@ -1762,14 +1791,16 @@ async function deleteLabelFile(session, name, file) {
|
|
|
}
|
|
|
else {
|
|
|
resultObj.error = true;
|
|
|
- resultObj.errorMessage = '파일명 : ' +data.name + '<br>에러 : ' + result.data.result.errorMessage;
|
|
|
+ resultObj.errorMessage = '파일명 : ' + name + '<br>에러 : ' + result.data.result.errorMessage;
|
|
|
+ console.log(result.data.result);
|
|
|
}
|
|
|
- }
|
|
|
- catch(error) {
|
|
|
+ }
|
|
|
+ catch(error) {
|
|
|
+ console.log(error);
|
|
|
resultObj.error = true;
|
|
|
resultObj.errorMessage = '레이블 해제 중 오류가 발생하였습니다.<br>' + JSON.stringify(error.message);
|
|
|
}
|
|
|
- return resultObj;
|
|
|
+ return resultObj;
|
|
|
}
|
|
|
|
|
|
function getOptions(token) {
|
|
@@ -1783,7 +1814,7 @@ function getOptions(token) {
|
|
|
|
|
|
serverApp.use((err, req, res, next)=>{
|
|
|
console.log(err.message);
|
|
|
- console.log(err);
|
|
|
+ // console.log(err);
|
|
|
console.log(res.statusCode);
|
|
|
if (err) {
|
|
|
res.status(400);
|