diff --git a/package.json b/package.json index 7058b6d..cc363b7 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ }, "dependencies": { "amqplib": "^0.5.2", + "archiver": "^5.3.1", "auth-adapter": "1.1.0", "axios": "^0.18.0", "bcryptjs": "^2.4.3", @@ -88,6 +89,7 @@ "xlsx": "^0.16.9" }, "devDependencies": { + "@types/archiver": "^5.3.2", "babel-cli": "^6.26.0", "babel-plugin-istanbul": "^4.1.6", "babel-preset-env": "^1.6.1", diff --git a/src/api/controllers/v1/path.controller.js b/src/api/controllers/v1/path.controller.js index 9170aa6..7de1364 100644 --- a/src/api/controllers/v1/path.controller.js +++ b/src/api/controllers/v1/path.controller.js @@ -1,5 +1,7 @@ +/* eslint-disable import/no-extraneous-dependencies */ // import httpStatus from 'http-status'; import fs from 'fs'; +import archiver from 'archiver'; import multer from 'multer'; import { handler as ErrorHandel } from '../../middlewares/errors'; // import ApiException from '../../../common/utils/APIException'; @@ -102,7 +104,6 @@ exports.delete = (req, res, next) => { multer({ dest: `${dir}` }); const path = req.body.path.replace(cdnConfig.uri, storageConfig.uri); const newpath = req.body.path.replace(cdnConfig.uri, storageConfig.uri_backup); - console.log(path, newpath); // fs.rm(path, { recursive: true }, err => { // if (err) { // return res.status(400).json({ code: 400, message: 'lỗi', detail: err }); @@ -118,3 +119,77 @@ exports.delete = (req, res, next) => { return ErrorHandel(ex, req, res, next); } }; +exports.download = (req, res, next) => { + try { + const user = req.user; + const namefile = `${user.name}-${Date.now()}.zip`; + const dir = `${storageConfig.uri}/${user.id}/${namefile}`; + const output = fs.createWriteStream(dir); + const archive = archiver('zip', { + zlib: { level: 9 } // Sets the compression level. + }); + + archive.pipe(output); + if (req.body.data) { + req.body.data.forEach((e) => { + const path = e.path.replace(cdnConfig.uri, storageConfig.uri); + if (e.isFolder) { + archive.directory(path, e.name); + } else { + archive.file(path, { name: e.name }); + } + }); + } + archive.finalize(); + + return res.json({ + code: 0, + data: { + name: namefile, + path: `${cdnConfig.uri}/${user.id}/${namefile}`, + } + }); + } catch (ex) { + return ErrorHandel(ex, req, res, next); + } +}; + + +exports.forceDelete = (req, res, next) => { + try { + const path = req.body.path.replace(cdnConfig.uri, storageConfig.uri); + // const newpath = req.body.path.replace(cdnConfig.uri, storageConfig.uri_backup); + fs.rm(path, { recursive: true }, err => { + if (err) { + return res.status(400).json({ code: 400, message: 'lỗi', detail: err }); + } + return res.json({ code: 0, message: 'success' }); + }); + + return null; + } catch (ex) { + return ErrorHandel(ex, req, res, next); + } +}; + +exports.deleteMultiple = (req, res, next) => { + try { + const user = req.user; + const dir = `${storageConfig.uri_backup}/${user.id}`; + multer({ dest: `${dir}` }); + if (req.body.data) { + req.body.data.forEach((e) => { + const path = e.path.replace(cdnConfig.uri, storageConfig.uri); + const newpath = e.path.replace(cdnConfig.uri, storageConfig.uri_backup); + console.log(path, newpath); + fs.rename(path, newpath, (err) => { + if (err) throw err; + return { code: 0, message: 'success' }; + }); + }); + } + return res.json({ code: 0, message: 'success' }); + } catch (ex) { + return ErrorHandel(ex, req, res, next); + } +}; diff --git a/src/api/routes/v1/path.route.js b/src/api/routes/v1/path.route.js index c154e26..6d28384 100644 --- a/src/api/routes/v1/path.route.js +++ b/src/api/routes/v1/path.route.js @@ -29,4 +29,23 @@ router authorize([Permissions.USER]), controller.delete ); + +router + .route('/download') + .put( + authorize([Permissions.USER]), + controller.download + ); +router + .route('/force-delete') + .patch( + authorize([Permissions.USER]), + controller.forceDelete + ); +router + .route('/delete-multiple') + .patch( + authorize([Permissions.USER]), + controller.deleteMultiple + ); export default router;