arrow-admin
Version:
Arrow Admin Website
157 lines (132 loc) • 3.9 kB
JavaScript
var crypto = require('crypto'),
fs = require('fs'),
path = require('path'),
_ = require('lodash');
function md5(value) {
return crypto.createHash('md5').update(value).digest('hex');
}
function redirect(res, url) {
res.redirect(url);
}
function html(res, content) {
res.set('Content-Type','text/html');
res.send(content || '<html></html>');
}
function javascript(res, content) {
res.set('Content-Type','text/javascript');
res.send(content || '/* */');
}
function css(res, content) {
res.set('Content-Type','text/css');
res.send(content || '/* */');
}
function json(res, content) {
res.json(content);
}
function nocontent(res) {
res.sendStatus(204);
}
function gravatar(email) {
return 'http://www.gravatar.com/avatar/'+md5(email)+'.png';
}
function home() {
return process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
}
function preferences () {
var _home = home(),
cfg = {};
['.appcelerator/appc-cli.json','.acs','.titanium/config.json'].forEach(function(name){
var p = path.join(_home, name);
if (fs.existsSync(p)) {
_.defaults(cfg, JSON.parse(fs.readFileSync(p).toString()));
}
});
if (!cfg.username) {
cfg.username = process.env.APPC_SESSION_USERNAME || cfg.user && cfg.user.email;
}
return cfg;
}
function etag(stats) {
if (typeof stats === 'string') {
return md5(stats);
}
return md5(stats.ino + stats.mtime);
}
const VERBMAP = {
'GET': 'read',
'PUT': 'update',
'POST': 'create',
'DELETE': 'delete'
};
function safeName(name) {
return name.replace(/^\//,'').split('/')[0].replace(/\s+/g,'-');
}
function generateAPIName(def) {
if (def.filename && fs.existsSync(def.filename)) {
return def.filename;
}
var name = safeName(def.group) + '-' + safeName(def.path) + '-' + VERBMAP[def.method] + '.js';
return path.join(process.cwd(), 'apis', name);
}
function generateModelName(config, name) {
return path.join(config.dir || process.cwd(), 'models', safeName(name)+'.js');
}
function generateAPI(def) {
var path = (def.path || '').substring(1).split('/'),
parameters = {};
path.forEach(function(token){
if (token.charAt(0)===':') {
var name = token.substring(1);
if (/\?$/.test(name)) {
name = name.substring(0,name.length-1);
parameters[name] = {description:name+' parameter', optional: true};
}
else {
parameters[name] = {description:name+' parameter'};
}
}
});
var count = Object.keys(parameters).length;
var code = "var Arrow = require('arrow');\n\n";
code+="var API = Arrow.API.extend({\n";
code+="\tgroup: '"+def.group+"',\n";
code+="\tpath: '"+def.path+"',\n";
code+="\tmethod: '"+def.method+"',\n";
code+="\tdescription: '"+def.description+"',\n";
code+="\tmodel: "+JSON.stringify(def.model)+",\n";
code+="\tbefore: "+JSON.stringify(def.before||[])+",\n";
code+="\tafter: "+JSON.stringify(def.after||[])+",\n";
code+="\tparameters: {\n";
Object.keys(parameters).forEach(function(key, index){
code+="\t\t'"+key+"': "+JSON.stringify(parameters[key]);
code+=((index+1<count) ? ',' : '')+"\n";
});
code+="\t},\n";
if (def.action) {
code+='\t'+def.action.name+': function '+def.action.name+'('+def.action.args.join(', ')+') {\n';
code+=def.action.body.split(/\n/).map(function(line){return '\t\t'+line;}).join('\n')+'\n';
code+='\t}\n';
}
else {
code+="\taction: function action (req, resp, next) {\n";
code+="\t\t//TODO implement\n";
code+="\t\tresp.nocontent(next);\n";
code+="\t}\n";
}
code+="});\n\n";
code+="module.exports = API;";
return code;
}
exports.md5 = md5;
exports.redirect = redirect;
exports.html = html;
exports.css = css;
exports.json = json;
exports.nocontent = nocontent;
exports.javascript = javascript;
exports.gravatar = gravatar;
exports.preferences = preferences;
exports.etag = etag;
exports.generateAPI = generateAPI;
exports.generateAPIName = generateAPIName;
exports.generateModelName = generateModelName;