12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676 |
- const cookieParser = require('cookie-parser');
- const cors = require("cors");
- const fs = require("fs");
- const globalPath = require("path");
- const express = require("express");
- const axios = require("axios");
- // const SERVER_PORT = process.env.port || process.env.PORT || 53000;
- const SERVER_PORT = process.env.port || process.env.PORT || 53000;
- // const authProvider = require('./auth/AuthProvider');
- const {getFetch, updateFetch} = require('./fetch');
- const bodyParser = require('body-parser');
- const https = require('https');
- 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 msal = require('@azure/msal-node');
- const FormData = require("form-data");
- const {pool, sql} = require('./config/sql.js');
- 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 gateWayKey = process.env.GATE_WAY_KEY;
- const msalConfig = {
- auth: {
- clientId: process.env.TEAMS_APP_ID,
- authority: "https://login.microsoftonline.com/"+process.env.TEAMS_APP_TENANT_ID,
- clientSecret: process.env.TEAMS_APP_SECRET,
- knownAuthorities: [],
- },
- cache: {
- // your implementation of caching
- },
- system: {
- loggerOptions: { /** logging related options */ }
- }
- }
- 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';
- const storage = multer.diskStorage({
- destination: function (req, file, cb) {
- cb(null, 'uploads/')
- },
- filename: function (req, file, cb) {
- cb(null, file.originalname) // 원래 파일이름으로 저장
- }
- })
- const upload = multer(storage);
- const serverApp = express();
- const endPoint = process.env.GRAPH_API_ENDPOINT + 'v1.0';
- serverApp.use(session({
- secret: process.env.EXPRESS_SESSION_SECRET,
- resave: false,
- saveUninitialized: true,
- cookie: {
- httpOnly: true,
- secure: true, // set this to true on production
- sameSite: 'none',
- maxAge: 60 * 60 * 24 * 1000
- }
- }));
- serverApp.set(express.json());
- serverApp.use(cookieParser());
- serverApp.use(express.urlencoded({ extended: false }));
- serverApp.use("/static", express.static(globalPath.join(__dirname, 'static')));
- const options = {
- key: process.env.SSL_KEY_FILE ? fs.readFileSync(process.env.SSL_KEY_FILE) : undefined,
- cert: process.env.SSL_CRT_FILE ? fs.readFileSync(process.env.SSL_CRT_FILE) : undefined,
- };
- const server = https.createServer(options, serverApp);
- let wsServer = new WebSocketServer({
- httpServer: server,
- ssl : true,
- key : process.env.SSL_KEY_FILE ? fs.readFileSync(process.env.SSL_KEY_FILE) : undefined,
- cert: process.env.SSL_CRT_FILE ? fs.readFileSync(process.env.SSL_CRT_FILE) : undefined,
- });
- wsServer.on('request', function(req) {
- var connection = req.accept();
- connection.on('message', function(message) {
- if (message && message.type === 'utf8') {
- const { value } = JSON.parse(message.utf8Data);
- if (value) {
- try {
- 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);
- }
- }
- }
- })
- });
- 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);
- connection.sendUTF(Number(percent.toFixed(2)));
- if (result.data.percentageComplete !== 100) {
- setTimeout(()=>getPercentageComplete(url, connection), 1000);
- }
- }
- }
- const corsOption = {
- origin: "*",
- }
- 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 }
- );
- }
- );
- serverApp.post("/getProfileOnBehalfOf", async (req, res, next) => {
- result = await cca.acquireTokenOnBehalfOf({
- oboAssertion: req.body.token,
- scopes: [".default"]
- });
- req.session.tokenCache = result.tokenCache;
- req.session.accessToken = result.accessToken;
- req.session.idToken = result.idToken;
- req.session.account = result.account;
- 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);
- });
- serverApp.get("/redirect", (req, res, next)=>{
- console.log(req);
- });
- serverApp.post("/api-get",
- // isAuthenticated,
- // isAccessToken,
- async (req, res, next) => {
- const uri = req.body.api_uri || req.session.apiUri;
- let param = {};
- if (req.session.param) {
- param = req.session.param;
- }
- try {
- const graphResponse = await getFetch(endPoint + uri, req.session.accessToken, param);
- res.json(graphResponse);
- } catch (error) {
- next(error);
- }
- });
- serverApp.get("/api-redirect",
- // isAuthenticated,
- async function (req, res, next) {
- const uri = req.session.apiUri;
- let param = {};
- if (req.session.param) {
- param = req.session.param;
- }
- try {
- const graphResponse = await getFetch(endPoint + uri, req.session.accessToken, param);
- res.json(graphResponse);
- } catch (error) {
- next(error);
- }
- })
- serverApp.get("/post-redirect",
- // isAuthenticated,
- async function (req, res, next) {
- const uri = req.session.apiUri;
- let param = {};
- if (req.session.param) {
- param = req.session.param;
- }
- try {
- const graphResponse = await updateFetch(endPoint + uri, req.session.accessToken, param);
- res.json(graphResponse);
- } catch (error) {
- next(error);
- }
- }
- )
- // 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');
- // const oneDrive = await getFetch(endPoint + "/me/drive/root", req.session.accessToken);
- // const sharePointIds = await getFetch(endPoint + "/me/drive/SharePointIds", req.session.accessToken);
- // // const publicTeam = await getFetch(endPoint + "/groups?$filter=groupTypes/any(c:c+eq+'Unified')", req.session.accessToken);
- // const graphResponse = await getFetch(endPoint + "/me/joinedTeams", req.session.accessToken);
- // const sites = await getFetch(endPoint + "/sites/root", req.session.accessToken);
- // const sitesSharePoint = await getFetch(endPoint + "/sites/root/SharePointIds", req.session.accessToken);
- const options = getOptions(req.session.accessToken);
- const uriArr = [
- axios.get(endPoint + "/me/drive/root", options),
- axios.get(endPoint + "/me/drive/SharePointIds", options),
- axios.get(endPoint + "/me/joinedTeams", options),
- axios.get(endPoint + "/sites/root", options),
- axios.get(endPoint + "/sites/root/SharePointIds", options),
- ]
- const result = await Promise.all(uriArr);
- const oneDrive = result[0].data;
- const sharePointIds = result[1].data;
- const graphResponse = result[2].data;
- const sites = result[3].data;
- const sitesSharePoint = result[4].data;
- const teams = graphResponse.value;
- oneDrive.sharePoint = sharePointIds;
- sites.sharePoint = sitesSharePoint;
- const resultObj = {
- oneDrive : {
- teams: oneDrive,
- },
- joinedTeams : {
- teams : teams,
- // teams : public,
- items : {},
- },
- sites : {
- teams : sites,
- },
- }
- 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);
- const sharePoint = await getFetch(endPoint + "/groups/"+team.id+"/drive/SharePointIds", req.session.accessToken);
- // const image = await axios.get(endPoint + "/groups/" + team.id + "/photo/$value", options);
- // if (image && image.data) {
- // team.image = image.data;
- // }
- if (sharePoint) {
- team.sharePoint = sharePoint;
- }
- if (item && item.value) {
- resultObj.joinedTeams.items[team.id] = item.value;
- }
- }
- }
- res.json(resultObj);
- } catch (error) {
- 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);
- const {siteId, path, name} = req.body;
- const resultObj = {message:"", success: 'F'};
- const param ={
- name: name,
- folder: { },
- '@microsoft.graph.conflictBehavior': 'rename'
- }
- try{
- const sitesInfo = await axios.get(endPoint + "/sites/"+ siteId + path, options);
- if (sitesInfo.data && sitesInfo.data.id) {
- const itemId = sitesInfo.data.id;
- const result = await axios.post(endPoint + "/sites/"+ siteId +"/drive/items/" + itemId +"/children",param, options);
-
- if (result.data) {
- resultObj.message = "폴더가 생성되었습니다.<br>폴더명 : "+ name;
- resultObj.success = 'S';
- }
- else {
- resultObj.message = "폴더가 생성되지 않았습니다.";
- }
- }
- else {
- resultObj.message = "생성할 폴더 경로를 찾을 수 없습니다.";
- }
- }
- catch(error) {
- resultObj.message = "폴더 생성 중 오류가 발생하였습니다.<br>" + getErrorMessage(error);
- }
- res.json(resultObj);
- });
- 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);
- console.log('=============================== Axios Error ===============================')
- console.log('발생시각 : '+ new Date().toLocaleString());
- console.log(error.response);
- console.log(error.response.data.error);
- errorText = `status : ${error.response.status} - ${error.response.statusText}<br>message : ${error.response.data.error.message}`;
- }
- else {
- console.log('================================ Error =====================================')
- console.log('발생시각:'+ new Date().toLocaleString());
- console.log('에러 : '+ error);
- errorText = 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,
- 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);
- })
- 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;
- }
- }
- else {
- resultObj.message = errorMessage + '수신 데이터 없음';
- }
- }
- catch (error) {
- console.log(error);
- resultObj.message = errorMessage + JSON.stringify(error);
- }
- return resultObj;
- }
- async function setLabel(apiKey, email, dispFileName, aipGuid, fileData, comment) {
- const param = {
- apiKey: apiKey,
- email: email,
- 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);
- if (result && result.data) {
- if (result.data.statusCode === 200 && !result.data.result.errorCode && result.data.result.fileData) {
- resultObj.data = Buffer.from(result.data.result.fileData, "base64");
- resultObj.success = 'S';
- }
- else {
- resultObj.message = errorMessage + result.data.result.errorMessage;
- }
- }
- else {
- resultObj.message = errorMessage + '수신 데이터 없음';
- }
- }
- catch (error) {
- resultObj.message = errorMessage + JSON.stringify(error);
- }
- 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);
- const {siteId, path, name} = req.body;
- try{
- const sitesInfo = await axios.get(endPoint + "/sites/"+ siteId + path, options);
- if (sitesInfo.data) {
- const itemId = sitesInfo.data.id;
- const result = await axios.get(endPoint + "/sites/"+ siteId +"/drive/items/" + itemId +"/children", options);
- if (result && result.data && result.data.value) {
- let idx = result.data.value.findIndex(obj=>obj.name === name);
- // console.log(name);
- // console.log(idx);
- // console.log((idx > -1));
- // console.log(result.data.value);
- res.json({hasName: (idx > -1)});
- }
- }
- }
- catch(error) {
- if (error.response) {
- console.log("error.response", error.response);
- const statusCode = err.response.status; // 400
- const statusText = err.response.statusText; // Bad Request
- const message = err.response.data.message[0]; // id should not be empty
- console.log(`${statusCode} - ${statusText} - ${message}`);
- res.json(error.response);
- }
- else {
- console.log(error);
- res.json(error);
- }
- }
- });
- async function uploadDrive(options, folder, siteId, path) {
- const startTime = new Date();
- const resultObj = {
- success : 'S',
- message : '',
- }
- 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;
- 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)};
- });
- 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'),
- async (req, res, next)=>{
- const startTime = new Date();
- const files = req.files;
- let {siteId, path, folder, file_path} = req.body;
- if (siteId && path) {
- const options = getOptions(req.session.accessToken);
- if (folder){
- const uploadDriveResult = await uploadDrive(options, folder, siteId, path);
- if (uploadDriveResult.success === 'F') {
- return res.json(uploadDriveResult);
- }
- }
- let fileWriteTime = new Date();
- if (files && files.length > 0) {
- const promiseArray = [];
- const labelPromiseArray = [];
- // const fileWriteArray = [];
- const possibleExt = POSSIBLE_EXT;
- const {supported_file_ext, protected_file_ext} = possibleExt;
- let supportedArr = [];
- // let protectedArr = [];
- // let protectedMap = new Map();
- if (supported_file_ext && protected_file_ext) {
- supportedArr = supported_file_ext.split(';');
- // protectedArr = protected_file_ext.split(';');
- if (!supportedArr[supportedArr.length - 1]) {
- supportedArr.splice(supportedArr.length - 1);
- }
- // if (!protectedArr[protectedArr.length - 1]) {
- // protectedArr.splice(protectedArr.length - 1);
- // }
- // if (protectedArr.length > 0) {
- // for (let array of protectedArr) {
- // array = array.split('-');
- // if (array.length === 2) {
- // protectedMap.set(array[0], array[1]);
- // }
- // }
- // }
- }
- let beforeUri = '';
- let beforeItemId = '';
- // const siteInfoArr = [];
- for (let idx in files) {
- const file = files[idx];
- //const fileName = file.originalname;
- //let filePath = req.body[ fileName + "_path"];
- file.originalname = Buffer.from(file.originalname, 'ascii').toString('utf8');
- let originName = file.originalname;
- if (originName) {
- let ext = globalPath.extname(originName);
- if (supportedArr.length > 0 && !supportedArr.includes(ext)) {
- return res.json({success:'F', message: '파일명 : ' + originName
- +'<br>해당 파일은 업로드 불가 파일입니다. 다시 시도해주세요.<br>가능 확장자 :'
- + JSON.stringify(supportedArr)});
- }
- // const uuid = uuidv4();
- // const realFileName = uuid + ext;
- // fileWriteArray.push(new Promise((resolve, reject) => {
- // const data = fs.writeFileSync('Z:/Source/' + realFileName, file.buffer)
- // resolve({
- // data
- // })
- // }));
- const base64Data = Buffer.from(file.buffer).toString('base64');
- const param = {
- apiKey: gateWayKey,
- email: req.session.account.idTokenClaims.email,
- dispFileName: originName,
- aipGuid: "878173ae-cc36-4881-af57-604af868314c",
- // aipGuid: "0166b75f-6a93-47f3-8fd3-e1e7c59141ab",
- // comment: "set-protection",
- comment: "set-label",
- fileData: base64Data,
- }
- // labelPromiseArray.push(new Promise(async (resolve)=>{resolve(await axios.post(apiUrl + '/api/v1/stream/set-label', param))}));
- labelPromiseArray.push(axios.post(apiUrl + '/api/v1/stream/set-label', param));
- // labelPromiseArray.push(axios.post(apiUrl + '/api/v1/stream/set-protection', param));
-
- let formatPath = '';
-
- if (file_path[idx]) {
- // console.log(file_path[idx]);
- if (!path.includes(":")) {
- formatPath = ":" + file_path[idx];
- }
- else {
- formatPath = file_path[idx];
- }
- }
-
- let itemId = '';
- const uri = endPoint + "/sites/"+ siteId + path + formatPath;
- // siteInfoArr.push(axios.get(uri, options));
- if (beforeUri === uri) {
- itemId = beforeItemId;
- }
- else {
- try {
- const sitesInfo = await axios.get(uri, options);
- itemId = sitesInfo.data.id;
- beforeUri = uri;
- beforeItemId = itemId;
- }
- catch(error) {
- console.log(error);
- res.json({success:'F', message: '파일 업로드 작업 중 오류가 발생했습니다.<br>에러 : ' + JSON.stringify(error.message)});
- }
- }
-
- // if (protectedMap.size > 0 && protectedMap.get(ext)) {
- // let name = originName.replace(ext, '');
- // ext = protectedMap.get(ext);
- // originName = name + ext;
- // }
- promiseArray.push(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/');
- }
- }
- try {
- // const siteInfos = await Promise.all(siteInfoArr);
- // siteInfos.forEach((obj)=>{
- // promiseArray.push(endPoint + "/sites/"+ siteId +"/drive/items/"+obj.data.id+':/');
- // })
- //file write 시 사용
- //const writeArr = await Promise.all(fileWriteArray);
- let writeTime = timeCheck(fileWriteTime, new Date());
- console.log('파일 Write Time : '+ writeTime);
-
- const labelTime = new Date();
- const labelResult = await Promise.all(labelPromiseArray);
- // console.log(labelResult[0].data.result.fileData);
- console.log('label time : ', timeCheck(labelTime, new Date()));
- for (let idx in labelResult) {
- const obj = labelResult[idx];
- if (obj.data && !obj.data.result.errorCode && obj.data.result.fileData) {
- const data = Buffer.from(obj.data.result.fileData, 'base64');
- // promiseArray[idx] = new Promise(async (resolve)=> resolve(await axios.put(promiseArray[idx] + obj.data.result.dispFileName + ':/content', data, options)));
- promiseArray[idx] = axios.put(promiseArray[idx] + obj.data.result.dispFileName + ':/content', data, options);
- // promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+ siteInfos[idx].data.id + ':/' + obj.data.result.dispFileName + ':/content', data, options));
- }
- else {
- throw '파일명 : '+obj.data.result.dispFileName + '<br>에러 : ' + obj.data.result.errorMessage;
- }
- }
- // labelResult.forEach((obj, idx)=>{
- // if (obj.data && !obj.data.result.errorCode && obj.data.result.fileData) {
- // const data = Buffer.from(obj.data.result.fileData, 'base64');
- // promiseArray[idx] = axios.put(promiseArray[idx] + obj.data.result.dispFileName + ':/content', data, options);
- // // promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+ siteInfos[idx].data.id + ':/' + obj.data.result.dispFileName + ':/content', data, options));
- // }
- // else {
- // throw '파일명 : '+obj.data.result.dispFileName + '<br>에러 : ' + obj.data.result.errorMessage;
- // }
- // })
- // const readArray = [];
- // labelResult.forEach((obj)=>{
- // readArray.push(new Promise((resolve, reject)=>{
- // if (obj.data && !obj.data.result.errorCode) {
- // fs.readFile('Z:/Target/' + obj.data.result.outputFileName, (err, data)=>{
- // if (err) {
- // reject({err});
- // }
- // resolve({data});
- // //promiseArray[idx] = axios.put(promiseArray[idx], data, options);
- // });
- // }
- // else {
- // reject(obj.data.result.errorMessage);
- // }
- // }))
- // });
- // console.log('labelResult : ', labelResult);
- // let readTime = new Date();
- // const readResult = await Promise.all(readArray);
- // console.log(readResult);
- // console.log('File Read time : ', timeCheck(readTime, new Date()));
-
- let uploadTime = new Date();
- // promiseArray.forEach((obj, idx)=>{
- // // console.log(readResult[idx].data);
- // // console.log(obj[idx]);
- // promiseArray[idx] = axios.put(obj, readResult[idx].data, options);
- // });
- const uploadResult = await Promise.all(promiseArray);
-
- console.log('File uploadTime : ', timeCheck(uploadTime, new Date()));
- }
- catch(error){
- return res.json({success:'F', message: '요청하신 파일 업로드 중 오류가 발생하였습니다.<br>' + getErrorMessage(error)});
- }
- }
- const endTime = new Date();
- let betweenTime = timeCheck(startTime, endTime);
- console.log('시작 시간 :', startTime.toLocaleString(), ', 종료 시간 :', endTime.toLocaleString(), ', 소요 시간 :', betweenTime);
- res.json({success:'S', message: '요청하신 파일 업로드가 정상적으로 처리 되었습니다.'});
- }
- else {
- return res.json({success:'F', message: '업로드 요청 파라미터 정보를 확인해 주세요.'});
- }
- });
- function timeCheck(startTime, endTime) {
- let betweenTime = endTime - startTime;
- if (betweenTime > 60000) {
- betweenTime = (betweenTime/1000/60) + ' 분';
- }
- else {
- betweenTime = (betweenTime/1000) + ' 초';
- }
- return betweenTime;
- }
- serverApp.post('/api/download',
- async (req, res, next)=>{
- 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);
- const url = endPoint + "/sites/"+ siteId + "/drive/items/";
- const result = await axios(url + arr[0], options);
- // 단일 파일 다운로드
- if (arr.length === 1 && result && result.data && result.data.file) {
- const dataUrl = result.data['@microsoft.graph.downloadUrl'];
- const fileOption = {responseType: 'arraybuffer', headers: { withCredentials : true }};
- const fileData = await axios.get(dataUrl, fileOption);
- const bufferData = Buffer.from(fileData.data, 'base64');
- const param = {
- apiKey: gateWayKey,
- email : res.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})
- }
- }
- //폴더 또는 다중 파일 다운로드
- 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);
- 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 {
- 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;
- 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 ='폴더 이동 중 오류가 발생하였습니다.';
- }
- else {
- await axios.delete(endPoint + "/sites/"+ siteId + "/drive/items/" + moveItem.id, options);
- resultObj.message ='폴더 이동 되었습니다.';
- resultObj.success = 'S';
- }
- }
- }
- catch (error) {
- console.log(error.message);
- console.log(error.name);
- console.log(error.errors);
- resultObj.message = error.errors;
- // resultObj.failItems.push(moveItem);
- }
- }
- }
- }
- }
- 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) {
- 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;
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- }
- 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;
- }
- catch(error) {
- if (error) {
- throw error;
- }
- }
- // 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;
- }
- serverApp.post('/api/getPossibleExtList', async (req, res, next)=>{
- return res.json(POSSIBLE_EXT);
- })
- serverApp.post('/api/delete',
- // isAuthenticated,
- // isAccessTokens,
- async (req, res, next)=>{
- if (req.body) {
- const {siteId, itemIds} = req.body;
- const resultObj = {success: '', message:''};
- if (siteId && itemIds) {
- const itemIdArr = JSON.parse(itemIds);
- if (itemIdArr.length > 0) {
- const options = getOptions(req.session.accessToken);
- for (let itemId of itemIdArr) {
- try{
- await axios.delete(endPoint + "/sites/"+ siteId + "/drive/items/" + itemId, options);
- }
- catch(error) {
- resultObj.success = 'F';
- let message = '선택하신 파일 정보 삭제중 오류가 발생하였습니다.';
- if (error && error.response && error.response.data && error.response.data.error && error.response.data.error.message) {
- console.log(error.response.data.error.message);
- message += '<br>' + error.response.data.error.message;
- }
- resultObj.message = message;
- return res.json(resultObj);
- }
- }
- resultObj.success = 'S';
- resultObj.message = '파일 정보가 삭제되었습니다.';
- res.json(resultObj);
- }
- }
- else {
- resultObj.success = 'F';
- resultObj.message = '파라미터 정보를 확인해주세요.';
- res.json(resultObj);
- }
- }
- })
- serverApp.post('/api/update-name',
- // isAuthenticated,
- // isAccessTokens,
- async (req, res, next)=>{
- if (req.body) {
- const {siteId, itemId, name} = req.body;
- const resultObj = {success: '', message:''};
- if (siteId && itemId && name) {
- const options = getOptions(req.session.accessToken);
- try{
- await axios.patch(endPoint + "/sites/"+ siteId + "/drive/items/" + itemId, {name : name}, options);
- }
- catch(error) {
- console.log(error.response.data.error);
-
- resultObj.success = 'F';
- resultObj.message = '선택하신 파일의 이름 변경 중 오류가 발생하였습니다.<br>' + error.response.data.error.message;
- return res.json(resultObj);
- }
- resultObj.success = 'S';
- resultObj.message = '선택하신 파일의 이름이 변경되었습니다.';
- return res.json(resultObj);
- }
- }
- else {
- resultObj.success = 'F';
- resultObj.message = '파라미터 정보를 확인해주세요.';
- return res.json(resultObj);
- }
- });
-
- serverApp.post('/api/move-item',
- // isAuthenticated,
- // isAccessTokens,
- async (req, res, next)=>{
- if (req.body) {
- const {id, name, siteId, text} = req.body;
- const resultObj = {message:'', successItems : [], failItems : [], locations: []};
- if (name && isNaN(name)) {
- const nameArray = JSON.parse(name);
- const options = getOptions(req.session.accessToken);
- if (nameArray && nameArray.length > 0) {
- for (let moveItem of nameArray) {
- if (moveItem) {
- const param = {
- parentReference: {
- id: id,
- },
- name: moveItem.name
- };
- try {
- const result = await axios.patch(`${endPoint}/sites/${siteId}/drive/items/${moveItem.id}`, param, options);
- if (result) {
- resultObj.successItems.push(moveItem);
- // resultObj.locations.push(result.headers.location);
- }
- }
- catch (error) {
- // console.log(error);
- console.log(error.message);
- console.log(error.name);
- console.log(error.errors);
- resultObj.failItems.push(moveItem);
- }
- }
- }
- resultObj.message = `요청 하신 ${nameArray.length} 개 파일 중 ${ resultObj.successItems.length} 개 파일이 ${text} 되었습니다.`;
- }
- }
- return res.json(resultObj);
- }
- });
-
- serverApp.post('/api/copy-item',
- // isAuthenticated,
- // isAccessTokens,
- async (req, res, next)=>{
- if (req.body) {
- const {id, name, siteId, driveId, text} = req.body;
- const resultObj = {message:'', successItems : [], failItems : [], locations: []};
- if (name && isNaN(name)) {
- const nameArray = JSON.parse(name);
- const options = getOptions(req.session.accessToken);
- if (nameArray && nameArray.length > 0) {
- for (let moveItem of nameArray) {
- if (moveItem) {
- const param = {
- parentReference: {
- id: id,
- driveId : driveId,
- },
- name: moveItem.name
- };
- try {
- const result = await axios.post(`${endPoint}/sites/${siteId}/drive/items/${moveItem.id}/copy`, param, options);
- if (result) {
- resultObj.successItems.push(moveItem);
- resultObj.locations.push(result.headers.location);
- }
- }
- catch (error) {
- // console.log(error);
- console.log(error.message);
- console.log(error.name);
- console.log(error.errors);
- resultObj.failItems.push(moveItem);
- }
- }
- }
- resultObj.message = `요청 하신 ${nameArray.length} 개 파일 중 ${ resultObj.successItems.length} 개 파일이 ${text} 되었습니다.`;
- }
- }
- return res.json(resultObj);
- }
- });
-
- serverApp.post('/api/loading',
- async (req, res, next)=>{
- if (req.body) {
- const {url} = req.body;
- if (url) {
- try {
- const result = await axios.get(`${url}`);
- if (result && result.data) {
- console.log(result.data);
- return res.json(result.data);
- }
- }
- catch (error) {
- // console.log(error);
- console.log(error.message);
- console.log(error.name);
- console.log(error.errors);
- return res.json(error);
- }
- }
- }
- });
- serverApp.post('/api/add-tab',
- // isAuthenticated,
- // isAccessTokens,
- async (req, res, next)=>{
- if (req.body) {
- const {name, siteId, path, teamId, teamName, bindId} = req.body;
- const resultObj = {message:'', success: 'F'};
- if (name && siteId && path && teamId && teamName) {
- const options = getOptions(req.session.accessToken);
- try {
- const teamInfo = await axios.get(`${endPoint}/teams/${teamId}/channels`, options);
- const sharePoint = await axios.get(`${endPoint}/sites/${siteId}/drive`, options);
- if (teamInfo.data && teamInfo.data.value && sharePoint.data) {
- const sharePointUrl = sharePoint.data.webUrl;
- if (path.includes('/drive/root:/') && sharePointUrl) {
- let channelName = path.replace('/drive/root:/', '');
- const contentUrl = sharePointUrl + '/' + channelName;
- channelName = channelName.substring(0, channelName.indexOf('/'));
- const idx = teamInfo.data.value.findIndex(obj => obj.displayName === channelName);
- resultObj.message = `채널명 : ${channelName}<br>파일명 : ${name}<br>요청하신 채널에 탭으로 설정 되지않았습니다.`;
- if (idx >= 0 && contentUrl) {
- const channelId = teamInfo.data.value[idx].id;
- if (channelId) {
- const param = {
- displayName: name,
- "teamsApp@odata.bind" : `https://graph.microsoft.com/v1.0/appCatalogs/teamsApps/${bindId}`,
- configuration: {
- entityId: null,
- contentUrl: contentUrl,
- websiteUrl: "",
- removeUrl: null
- }
- }
- //sites/root/lists
- const channelInfo = await axios.post(`${endPoint}/teams/${teamId}/channels/${channelId}/tabs`, param, options);
- if (channelInfo.data) {
- resultObj.success = 'S';
- resultObj.message = '채널명 : ' + channelName + '<br>파일명 : '+name+'<br>요청하신 채널에 탭으로 설정 되었습니다.';
- }
- }
- }
- }
- }
- }
- catch (error) {
- resultObj.message = `채널명 : ${channelName}<br>파일명 : ${name}<br>요청하신 채널에 탭으로 설정 중 오류가 발생하였습니다.<br>` + getErrorMessage(error);
- }
- }
- return res.json(resultObj);
- }
- });
- // // 데이터베이스 연결
- // pool.connect((err) => {
- // // 연결이 안될 경우 에러 내용 콘솔에 출력
- // if (err) {
- // console.error('Error connecting to database:', err);
- // return;
- // }
- // // 연결에 성공할 경우 연결 성공 메시지 콘솔에 출력
- // console.log('Connected to database');
- // });
- 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: {
- Authorization: `Bearer ${token}`,
- },
- };
- return options;
- }
- serverApp.use((err, req, res, next)=>{
- console.log(err.message);
- // console.log(err);
- console.log(res.statusCode);
- if (err) {
- res.status(400);
- res.json({message: err.message});
- } else {
- res.status(500);
- res.json({message: err.message});
- }
- })
- server.listen(SERVER_PORT, function () {
- console.log(`\n${serverApp.name} listening to ${SERVER_PORT}`);
- });
|