UNPKG

arrow-admin

Version:
165 lines (140 loc) 4.23 kB
// 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; }