webhook-receive
Version:
Pluggable webhook receiver used to trigger selected deployment script
133 lines (114 loc) • 3.89 kB
JavaScript
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);
}
}