/* 2.7.5 - Метод отправки документов по Сделке на проверку POST /lk/document */ import fs from 'fs'; import axios from 'axios'; import { Cookies } from 'react-cookie'; import cookie from 'cookie'; import moment from 'moment'; import jwt from 'jsonwebtoken'; import { inspect } from 'util'; import FormData from 'form-data'; import multer from 'multer'; import { eachLimit, eachSeries } from 'async'; import archiver from 'archiver'; import { cors } from '../../../lib/cors'; import RedisClient from '../../../lib/RedisClient'; const uploads = `${ __dirname }/../../../../../uploads/deals/`; /* function uploadFiles() { return new Promise(() => ) } */ function createZipFile(zip_filename, files) { return new Promise(async (resolve) => { const output = fs.createWriteStream(zip_filename); const archive = archiver('zip', { zlib: { level: 9 } // Sets the compression level. }); output.on('close', function() { console.log('archive on close'); resolve(); }); output.on('end', function() { console.log('archive on end'); }); archive.on('warning', function(err) { if (err.code === 'ENOENT') { } else { throw err; } }); archive.on('error', function(err) { throw err; }); archive.pipe(output); for(let i in files) { archive.append(fs.createReadStream(files[i].path), { name: files[i].name }); } archive.finalize(); }); } function uploadFile({ deal_id, filename, name, group, crm_jwt }) { return new Promise((resolve) => { if(fs.existsSync(`${ uploads }${ filename }`)) { const path = `${ uploads }${ filename }`; const file_to_send_data = fs.readFileSync(path); console.log({ filename, len: file_to_send_data.length, path }); const data = new FormData(); data.append("file", file_to_send_data, name); const payload = new URLSearchParams({ name: deal_id, entity: "opportunity", documentTypeNumber: group, documentName: name, }); const file_upload_url = `${ process.env.CRM_API_HOST }/lk/document/upload?${ payload.toString() }`; console.log( file_upload_url ); axios.post(file_upload_url, data, { headers: { "Content-Type": `multipart/form-data; boundary=${ data._boundary }`, "Authorization": `Bearer ${ crm_jwt }`, }, withCredentials: true, }) .then(() => { console.log("FILE", filename, "SENT"); resolve(); }) .catch((error) => { console.error("FILE", filename, "ERROR"); console.error(error); resolve(); }); } else { resolve(); } }); } export default async function handler(req, res) { console.log("\n\n", "API", "DEALS", "upload"); await cors(req, res); // const { number, entity, id, filename } = req.query; const { deal_id } = req.body; return new Promise(async (resolve) => { if(req.headers.cookie !== undefined) { const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : ""); if(cookies.jwt !== undefined && cookies.jwt !== null) { var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT); var crm_jwt = jwt.sign({ acc_number: client_jwt_decoded.acc_number }, process.env.JWT_SECRET_CRM, { noTimestamp: true }); const key = `deals_${ client_jwt_decoded.acc_number }`; var deals = await RedisClient.get(key); var files = []; if(deals !== null) { deals = JSON.parse(deals); if(deals[ deal_id ] !== undefined) { //for(let i in deals[ deal_id ].uploaded.files) //{ // files.push(deals[ deal_id ].uploaded.files[i]); //} eachSeries(Object.keys(deals[ deal_id ].uploaded), (group, callback) => { const document = deals[ deal_id ].uploaded[ group ]; deals[ deal_id ].uploaded[ group ].sent = true; console.log({ group, document }); if(document.files.length === 1) { const file = document.files[0]; uploadFile({ deal_id, filename: file.filename, name: file.name, group, crm_jwt }) .then(() => { callback(); }); } else { let files_to_zip = []; for(let f in document.files) { const file = document.files[f]; const ext_regex = new RegExp("\.([0-9a-z]+)$", "i"); const ext = file.name.match(ext_regex); files_to_zip.push({ name: `${ file.name }`, path: `${ uploads }${ file.filename }`, }); } const zip_filename = `${ client_jwt_decoded.acc_number }_${ deal_id }_${ group }.zip`; console.log({ files_to_zip }); createZipFile(`${ uploads }${ zip_filename }`, files_to_zip) .then(() => { uploadFile({ deal_id, filename: zip_filename, name: zip_filename, group, crm_jwt }) .then(() => { callback(); }); }) } }, async () => { console.log("ALL FILES SENT"); await RedisClient.set(key, JSON.stringify(deals)); res.status(200).json({}); resolve(); }); } else { res.status(403).json({}); resolve(); } } else { res.status(403).json({}); resolve(); } } else { res.status(403).json({}); resolve(); } } else { res.status(403).send(); resolve(); } }); }