UNPKG

acha-framework

Version:

is a modular framework on both client (angular.js) and server (node.js) side, it provides security, orm, ioc, obfuscation and ...

272 lines 10 kB
(function (undefined) { Ioc.define('backend.fileManagerGenerator', [ 'backend.operationResult', 'backend.fileGeneratorEngine', 'backend.zipHelper', 'backend.fileHelper', 'backend.authentication', 'backend.uploader' ], function (provide, OperationResult, fileGeneratorEngine, zipHelper, fileHelper, authentication, uploader) { provide(function (engine, route, options) { var generator = fileGeneratorEngine(engine, route, options, { root: '', urlPrefix: '/user-files/', fileHandler: true, canUpload: true, canDownload: true, canArchive: true, canCreateFile: true, canCreateFolder: true, canCopy: true, canMove: true, canDelete: true, canRename: true }); engine.addRoute({ method: 'post', path: generator.prefixRoute('newFolder'), middlewares: (options.middlewares || []).concat([authentication.verify_jwt]), action: function (req, res) { var name = req.body.name; var path = req.body.path; path = generator.fixPath(path + '/' + name); try { var abs = generator.relativeToAbsolute(path); FS.mkdir(abs, function (err) { if (err) { if (err.message.indexOf('already exists') !== -1) { res.json(OperationResult.failed({ name: ['general.alreadyExists'] })); } else { res.json(OperationResult.failed()); } return; } var info = generator.directoryInfo(abs); info.name = name; res.json(OperationResult.success(info)); }); } catch (e) { res.json(OperationResult.failed()); } } }); engine.addRoute({ method: 'post', path: generator.prefixRoute('rename'), middlewares: (options.middlewares || []).concat([authentication.verify_jwt]), action: function (req, res) { var newName = req.body.newName; var name = req.body.name; var path = req.body.path; var oldPath = generator.fixPath(path + '/' + name); var newPath = generator.fixPath(path + '/' + newName); try { var oldAbs = generator.relativeToAbsolute(oldPath); var newAbs = generator.relativeToAbsolute(newPath); FS.access(newAbs, FS.constants.R_OK, function (err) { if (!err) { //file already exists res.json(OperationResult.failed({ name: ['general.alreadyExists'] })); return; } FS.rename(oldAbs, newAbs, function (err) { if (err) { res.json(OperationResult.failed()); return; } res.json(OperationResult.success()); }); }); } catch (e) { res.json(OperationResult.failed()); } } }); engine.addRoute({ method: 'post', path: generator.prefixRoute('delete'), middlewares: (options.middlewares || []).concat([authentication.verify_jwt]), action: function (req, res) { var items = req.body.items || []; items = items.map(function (item) { return generator.relativeToAbsolute(generator.fixPath(item)); }).filter(function (item) { return item && item !== '/'; }); try { DEL(items, { force: true }).then(function (deleted) { res.json(OperationResult.success(deleted.map(function (d) { return generator.absoluteToRelative(d); }))); }); } catch (e) { res.json(OperationResult.failed()); } } }); engine.addRoute({ method: 'post', path: generator.prefixRoute('moveCopy'), middlewares: (options.middlewares || []).concat([authentication.verify_jwt]), action: function (req, res) { var mode = req.body.mode || 'copy'; var source = (req.body.source || []).map(function (s) { return generator.relativeToAbsolute(generator.fixPath(s)); }); var dest = generator.relativeToAbsolute(generator.fixPath(req.body.destination || '/')); var promises = []; for (var i = 0; i < source.length; i++) { var defer = Q.defer(); promises.push(defer.promise); (function (s, idx, defer) { FS.stat(s, function (err, stat) { if (err) { defer.resolve(); return; } var destination; var isDirectory = stat.isDirectory(); var sourceDir = PATH.dirname(s) + PATH.sep; var name = PATH.basename(s); if (sourceDir === dest) { //it is in same folder name = 'copy - ' + name; } destination = PATH.resolve(dest, name); FS.access(destination, FS.constants.R_OK, function (err) { if (!err) { //a copy already exists name = 'copy - ' + name; destination = PATH.resolve(dest, name); } FSX[mode](s, destination, { overwrite: true }, function (err2) { defer.resolve(); }); }); }); }(source[i], i, defer)); } try { Q.all(promises).then(function () { res.json(OperationResult.success()); }); } catch (e) { res.json(OperationResult.failed()); } } }); engine.addRoute({ method: 'post', path: generator.prefixRoute('upload'), middlewares: (options.middlewares || []).concat([ authentication.verify_jwt, uploader.array('uploadedFiles') ]), action: function (req, res) { try { var path = generator.relativeToAbsolute(generator.fixPath(req.body.path)); var promises = []; for (var i = 0; i < req.files.length; i++) { var file = req.files[i]; var defer = Q.defer(); promises.push(defer.promise); var destination = PATH.resolve(path, file.originalname); (function (file, defer, destination) { FS.access(destination, FS.constants.R_OK, function (err) { if (!err) { //already exists destination = PATH.resolve(path, UUID() + '-' + file.originalname); } FSX.copy(file.path, destination, function (err) { DEL([file.path]); if (err) { defer.reject(); return; } defer.resolve(); }); }); }(file, defer, destination)); } Q.all(promises).then(function () { res.json(OperationResult.success()); }, function () { res.json(OperationResult.failed()); }); } catch (e) { res.json(OperationResult.failed()); } } }); engine.addRoute({ method: 'post', path: generator.prefixRoute('zip'), middlewares: (options.middlewares || []).concat([authentication.verify_jwt]), action: function (req, res) { var items = req.body.items || []; var path = generator.relativeToAbsolute(generator.fixPath(req.body.path)); items = items.map(function (item) { return generator.relativeToAbsolute(generator.fixPath(item)); }).filter(function (item) { return item && item !== '/'; }); try { var zipName = UUID() + '.zip'; var destination = PATH.resolve(path, zipName); zipHelper.zip(items, destination).then(function () { res.json(OperationResult.success()); }, function () { res.json(OperationResult.failed()); }); } catch (e) { res.json(OperationResult.failed()); } } }); engine.addRoute({ method: 'post', path: generator.prefixRoute('download'), middlewares: (options.middlewares || []).concat([authentication.verify_jwt]), action: function (req, res) { var folder = req.body.folder === true || req.body.folder === 'true'; var items = req.body.items || []; if (typeof items === 'string') { items = [items]; } items = items.map(function (item) { return generator.relativeToAbsolute(generator.fixPath(item)); }).filter(function (item) { return item && item !== '/'; }); try { if (items.length === 0) { res.status(404).send(); return; } if (items.length === 1) { if (!folder) { fileHelper.downloadStream(items[0], res, true); return; } } zipHelper.createZip(items).then(function (zip) { if (!zip) { res.status(404).send(); return; } zip.toBuffer(function (buffer) { res.contentType('zip'); res.write(buffer); res.end(); }, function () { res.status(404).send(); }); }); } catch (e) { res.status(404).send(); } } }); }); }); }());