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 ...

119 lines 3.74 kB
(function (undefined) { Ioc.define('backend.fileGeneratorEngine', [ 'backend.operationResult', 'backend.fileHelper' ], function (provide, OperationResult, fileHelper) { provide(function (engine, route, options, def) { var directoryInfo = function (dir) { var stat = FS.statSync(dir); return { name: stat.name, date: stat.mtime, size: stat.size, path: absoluteToRelative(dir), folder: true }; }; var relativeToAbsolute = function (_path) { _path = _path.replace(options.urlPrefix, ''); return PATH.posix.join(options.root, _path); }; var absoluteToRelative = function (_path) { return '/{0}{1}'.format([ options.urlPrefix || '', _path.replace(options.root, '') ]).replace(/\/\//g, '/'); }; var prefixRoute = function (path) { return (route + '/' + path).replace(/\/\//g, '/'); }; var fixPath = function (path) { //TODO: check for secutiry problems if (path.indexOf('..') !== -1) path = '/'; return path || ''; }; var listDirectory = function (_path) { var result = []; return Q.Promise(function (resolve, reject) { FS.readdir(_path, function (err, files) { if (err) { resolve([]); return; } files.filter(function (file) { return file.indexOf('.') !== 0; }).forEach(function (file) { var curFile = PATH.join(_path, file); var stat = FS.statSync(curFile); var obj = { name: file, date: stat.mtime, size: stat.size, path: absoluteToRelative(curFile) }; if (stat.isDirectory()) { obj.folder = true; } else if (stat.isFile()) { obj.folder = false; } else { return; } result.push(obj); }); resolve(result); }); }); }; Object.keys(def).forEach(function (key) { options[key] = options[key] === undefined ? def[key] : options[key]; }); engine.addRoute({ method: 'post', path: prefixRoute('listDirectory'), middlewares: options.middlewares || [], action: function (req, res) { var path = fixPath(req.body.path); try { var abs = relativeToAbsolute(path); listDirectory(abs).then(function (content) { res.json(OperationResult.success({ path: path, content: content })); }, function () { res.json(OperationResult.failed({ path: path, content: [] })); }); } catch (e) { res.json(OperationResult.failed({ path: path, content: [] })); } } }); if (options.fileHandler) { engine.addRoute({ method: 'get', path: options.urlPrefix + '*', middlewares: options.middlewares || [], action: function (req, res) { var fileName = relativeToAbsolute(req.url); fileHelper.downloadStream(fileName, res); } }); } return { relativeToAbsolute: relativeToAbsolute, absoluteToRelative: absoluteToRelative, prefixRoute: prefixRoute, fixPath: fixPath, listDirectory: listDirectory, directoryInfo: directoryInfo }; }); }); }());