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