nodebb-plugin-mailchimp
Version:
A MailChimp Hook for NodeBB to auto-subscribe users into a MailChimp List
123 lines (102 loc) • 3.77 kB
JavaScript
var pluginData = require('./plugin.json'),
winston = require.main.require('winston'),
Meta = require.main.require('./src/meta'),
Plugin = {}, pluginSettings = {},
MailChimpAPI = require('mailchimp').MailChimpAPI,
mailchimpApi;
pluginData.nbbId = pluginData.id.replace(/nodebb-plugin-/, '');
var util = {
keys: function(obj, props, value) {
if(props == null || obj == null)
return undefined;
var i = props.indexOf(".");
if( i === -1 ) {
if(value !== undefined)
obj[props] = value;
return obj[props];
}
var prop = props.slice(0, i),
newProps = props.slice(i + 1);
if(typeof props !== 'undefined' && !(obj[prop] instanceof Object)) {
obj[prop] = {};
}
return util.keys(obj[prop], newProps, value);
},
toBool: function(val) {
return !!(val === true || val === 1 || val === 'on' || val === '1');
}
};
Plugin.load = function(params, callback) {
var app = params.router;
var middleware = params.middleware;
var render = function(req, res, next) {
res.render('admin/plugins/' + pluginData.nbbId, pluginData || {});
};
Meta.settings.get(pluginData.nbbId, function(err, settings) {
if (!err && settings) {
if (settings.mailchimpApiKey) {
pluginSettings = {
mailchimpApiKey: settings.mailchimpApiKey,
mailchimpListId: settings.mailchimpListId,
mailchimpEnabled: util.toBool(settings.mailchimpEnabled),
mc_double_optin: util.toBool(settings.mc_double_optin),
mc_update_existing: util.toBool(settings.mc_update_existing),
mc_send_welcome: util.toBool(settings.mc_send_welcome)
};
mailchimpApi = new MailChimpAPI(settings.mailchimpApiKey, {version: '2.0'});
} else {
winston.warn('[plugins/' + pluginData.nbbId + '] mailchimpApiKey is not set');
}
} else {
winston.warn('[plugins/' + pluginData.nbbId + '] Settings not set or could not be retrived!');
}
callback();
});
app.get('/admin/plugins/' + pluginData.nbbId, middleware.admin.buildHeader, render);
app.get('/api/admin/plugins/' + pluginData.nbbId, render);
};
Plugin.admin = {
menu: function(custom_header, callback) {
custom_header.plugins.push({
"route": '/plugins/' + pluginData.nbbId,
"icon": pluginData.faIcon,
"name": pluginData.name
});
callback(null, custom_header);
}
};
Plugin.subscribe = function(userData) {
userData = userData.user || userData;
if (mailchimpApi && pluginSettings.mailchimpEnabled && pluginSettings.mailchimpListId && userData) {
var params = {
id: pluginSettings.mailchimpListId,
email: {email: userData.email},
merge_vars: {
'nodebb:uid': userData.uid,
'nodebb:username': userData.username,
'image': userData.picture || ''
},
double_optin: pluginSettings['mc_double_optin'],
update_existing: pluginSettings['mc_update_existing'],
send_welcome: pluginSettings['mc_send_welcome']
};
mailchimpApi.lists_subscribe(params, function(err, response){
response = response || {};
if (err) {
winston.warn('[plugins/' + pluginData.nbbId + '] ' + err);
} else {
if (response.email) {
if (process.env === 'development')
winston.info('[plugins/' + pluginData.nbbId + '] Successfully subscribed ' + userData.email + ' to list: ' + pluginSettings.mailchimpListId);
} else if (response.error) {
winston.warn('[plugins/' + pluginData.nbbId + '] failed to subscribe ' + userData.email + ', you\'re on your own, here\'s the response: \n' + JSON.stringify(response || {}), undefined, 2);
}
}
});
} else {
if (pluginSettings.mailchimpEnabled) {
winston.warn('[plugins/' + pluginData.nbbId + '] did not attempt to subscribe ' + userData.email + '. make sure you have you entered both; a MailChimp API Key and a MailChimp List Id');
}
}
};
module.exports = Plugin;