arrow-admin
Version:
Arrow Admin Website
165 lines (140 loc) • 4.23 kB
JavaScript
// jscs:disable jsDoc
var crypto = require('crypto'),
fs = require('fs'),
path = require('path'),
_ = require('lodash');
/*
Public API.
*/
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;
/*
Implementation.
*/
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 (stats === undefined) {
throw new Error('stats is a required argument to etag!');
}
if (typeof stats === 'string') {
return md5(stats);
}
return md5(String(stats.ino) + String(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 && 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;
}