UNPKG

webhook-receive

Version:

Pluggable webhook receiver used to trigger selected deployment script

133 lines (114 loc) 3.89 kB
var fs = require("fs"); var _ = require("lodash"); var scripts = require([__dirname, "..", "scripts"].join("/")); var logger = require([__dirname, "..", "lib", "logger"].join("/")); var handlers = {}; var available_handlers = fs.readdirSync([__dirname, "..", "handlers"].join("/")); _.each(available_handlers, function(handler){ var handler_name = handler.split(".")[0]; handlers[handler_name] = require([__dirname, "..", "handlers", handler].join("/")); }); module.exports = { init_response: function(req, res, next){ res.stash = {}; return next(); }, auth: function(req, res, next){ if(_.has(process.env, "API_KEY") && _.has(req.query, "api_key")){ if(process.env.API_KEY == req.query.api_key) return next(); else{ res.stash.code = 401; module.exports.handle_response(req, res, next); } } else if(!_.has(process.env, "API_KEY")) return next(); else{ res.stash.code = 401; module.exports.handle_response(req, res, next); } }, json_request: function(req, res, next){ if(req.accepts("application/json")) return next(); res.stash.code = 406; module.exports.handle_response(req, res, next); }, has_body: function(req, res, next){ if(_.has(req, "body")) return next(); res.stash.code = 400; module.exports.handle_response(req, res, next); }, has_script: function(req, res, next){ if(_.has(req.query, "script") && _.has(scripts, req.query.script)){ res.stash.required_query_params = scripts[req.query.script].required_query_params; return next(); } else if(_.has(req.query, "script")){ res.stash = { body: { error: "invalid script provided!" }, code: 400 } module.exports.handle_response(req, res, next); } else{ res.stash = { body: { error: "script required!" }, code: 400 } module.exports.handle_response(req, res, next); } }, has_required_query_params: function(req, res, next){ var errors = []; _.each(res.stash.required_query_params, function(required_param){ if(!_.has(req.query, required_param)) errors.push([required_param, "query parameter required!"].join(" ")); }); if(_.isEmpty(errors)) return next(); else{ res.stash = { body: { error: errors.join("\n") }, code: 400 } module.exports.handle_response(req, res, next); } }, get_handler: function(handler, method){ return function(req, res, next){ if(!_.contains(_.keys(handlers), handler)) module.exports.handle_response(req, res, next); else if(!_.has(handlers[handler], method)) module.exports.handle_response(req, res, next); else handlers[handler][method](req, res, next); } }, handle_response: function(req, res, next){ res.stash = _.defaults(res.stash, { code: 404 }); if(_.has(res.stash, "body")) res.status(res.stash.code).json(res.stash.body); else res.sendStatus(res.stash.code); var log = { client_ip: req.ip, http_version: req.httpVersion, method: req.method, path: req.url, status_code: res.stash.code, body: res.stash.body } logger.verbose(log); } }