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
JavaScript
(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();
}
}
});
});
});
}());