|
@@ -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: {
|