UNPKG

mailchimp-app

Version:

A Mailchimp express sub-app to mount on any project, for easy integration

203 lines (140 loc) 3.92 kB
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" }); }