mailchimp-app
Version:
A Mailchimp express sub-app to mount on any project, for easy integration
203 lines (140 loc) • 3.92 kB
JavaScript
var MC = require('./mc-api');
var Mailchimp;
module.exports = function( config, opts ){
opts = opts || {};
if( opts.logger ){
config = Object.assign( {}, config, { logger: opts.logger });
}
Mailchimp = new MC( config );
return {
handle: handle,
authorize: authorize,
prepareRequest: prepareRequest
};
}
function prepareRequest( req, res, next ){
req.sent = Object.assign( {}, req.query, req.body );
next();
}
function authorize( config ){
return function( req, res, next ){
var action = [ req.method, req.url ].join(' ');
var private_routes = [ /GET \/users?/ ];
var err;
config.private_routes.forEach(function( rgx ){
if( rgx.test( action ) && req.sent.secret != config.secret ){
err = {
err_id : 'unauthorized',
message : 'The ressource you are trying to access is protected',
status : 403 // important :)
};
}
});
err ? next( err ) : next();
}
}
function handle( method, opts ){
opts = opts || {};
if( method == "error" ){
return handleErr;
}
return function( req, res, next ){
var handleFn;
if( method == "hello" ){
handleFn = sayHello;
}
if( method == "goodbye" ){
handleFn = sayGoodbye;
}
if( method == "subscribe" ){
console.log("yeah");
handleFn = subscribeMember;
}
if( method == "get_user" ){
handleFn = getUser;
}
if( method == "list_users" ){
handleFn = listUsers;
}
if( method == "update" ){
handleFn = updateMember;
}
if( method == "delete" ){
handleFn = deleteMember;
}
if( method == "end" ){
handleFn = endRequest;
}
Mailchimp.log.info("Handling method " + method);
handleFn( req, res, next );
}
}
function sayHello( req, res, next ){
res.json({ "hello": "mailchimp" });
}
function sayGoodbye( req, res, next ){
next({
err_id: "goodbye_mc",
message: "Cant parse the request ! (test error)"
});
}
function subscribeMember( req, res, next ){
var email_address = req.sent.email_address;
Mailchimp.log.info("Subscribing user with email address : " + email_address );
if( !Mailchimp.isEmail( email_address ) ){
Mailchimp.log.warn("The email seems wrong !");
return next({
message : "The email address provided doesnt look like one",
err_id : "bad_address_email",
meta: {
email_address: email_address
}
});
}
Mailchimp.createMember( req.sent )
.then(function( member ){
Mailchimp.log.success(`New member ${member.email_address} successfully created with id ${member.id}`);
res.json( member );
}).catch( next );
}
function updateMember( req, res, next ){
var mcid = req.params.mailchimp_id;
Mailchimp.log.info(`Updating member with id ${mcid}`);
Mailchimp.updateMember( mcid, req.sent )
.then(function( member ){
Mailchimp.log.success(`Member ${member.id} (${member.email_address}) successfully updated`);
res.json( member );
}).catch( next );
}
function getUser( req, res, next ){
Mailchimp.getMember( req.params.mailchimp_id )
.then(function( member ){
res.json( member );
}).catch( next );
}
function listUsers( req, res, next ){
var fields = req.sent.fields;
if( typeof fields == "string" ){
fields = fields.split(',');
}
Mailchimp.getMembers( fields )
.then(function( members ){
res.json( members );
}).catch( next );
}
function deleteMember( req, res, next ){
}
function handleErr( err, req, res, next ){
if( !err.err_id ){
res.status( 500 ).json({ message: "Internal error | service unavailable" });
return next( err );
}
Mailchimp.log.error( err );
res.status( err.status || 400 )
.json( err );
}
function endRequest( req, res, next ){
res.status('404').json({
message: "The request didnt match any existing route"
});
}