loopback-connector-mailjet
Version:
Loopback connector module which allow to send emails via Mailjet
302 lines (241 loc) • 6.93 kB
JavaScript
;
var assert = require('assert');
var _ = require('lodash');
var Q = require('q');
var Mailer = function Mailer() {};
var Mailjet = require('node-mailjet')
const log = require('debug')('loopback:connector:mailjet')
/* eslint-disable no-unused-vars */
var mailjetInstance = {};
var mailjetSettings = {};
/* eslint-enable no-unused-vars */
var MailjetConnector = function MailjetConnector(settings) {
assert(typeof settings === 'object', 'cannot init connector without settings');
assert(typeof settings.apiKey === 'string', 'cannot init connector without api key');
assert(typeof settings.apiSecret === 'string', 'cannot init connector without api secret');
if (settings.apiKey && settings.apiSecret) {
this.mailjet = Mailjet.connect(settings.apiKey, settings.apiSecret); //eslint-disable-line
}
this.mailjetSettings = settings;
mailjetSettings = this.mailjetSettings;
mailjetInstance = this.mailjet;
};
MailjetConnector.initialize = function (dataSource, callback) {
dataSource.connector = new MailjetConnector(dataSource.settings);
callback();
};
MailjetConnector.prototype.DataAccessObject = Mailer;
/**
* Send transactional email with options
* Full list of options are available here: https://www.npmjs.com/package/sendgrid#available-params
*
* @param {Object} options
* {
* from: { name: "John", email: "john@cellarise.com" },
* to: "mail@cellarise.com",
* subject: "Test mail",
* text: "Plain text message",
* html: "<b>Html messages</b> here"
* }
*
* @param {Function} cb callback
* @returns {Function} deferred promise
*/
Mailer.send = function (options, cb) { // eslint-disable-line
var dataSource = this.dataSource,
connector = dataSource.connector,
deferred = Q.defer(),
emailData = {},
request;
var fn = function (err, result) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(result);
}
return cb && cb(err, result);
};
assert(connector, 'Cannot send mail without a connector!');
if (connector.mailjet) {
//email from param
if (_.isString(options.from)) {
emailData.FromEmail = options.from;
} else if (_.isObject(options.from)) {
emailData.FromName = options.from.name;
if (options.from.hasOwnProperty('address')) {
emailData.FromEmail = options.from.address;
} else if (options.from.hasOwnProperty('email')) {
emailData.FromEmail = options.from.email;
}
delete options.from;
} else {
if(mailjetSettings && mailjetSettings.default){
if (mailjetSettings.default.fromName) {
emailData.FromName = mailjetSettings.default.fromName;
}
if (mailjetSettings.default.fromEmail) {
emailData.FromEmail = mailjetSettings.default.fromEmail || '';
}
}
}
//email to param
if (_.isString(options.to)) {
options.to = _.map(options.to.split([',', ';']),
function (email) {
return {
"Email": email
};
})
}
if (_.isArray(options.to)) {
emailData.Recipients = options.to;
} else {
log('invalid format for "to"', options.to)
throw new Error('invalid format for "to"');
}
delete options.to;
if (options.html) {
emailData["Html-part"] = options.html
delete options.html;
}
if (options.text) {
emailData["Text-part"] = options.text
delete options.text;
}
if (options.subject) {
emailData["Subject"] = options.subject
delete options.subject;
}
if (_.isObject(options.headers)) {
emailData["Headers"] = options.headers;
delete options.subject;
}
//merge the rest of the options
emailData = _.merge(emailData, options)
connector.mailjet.post("send").request(emailData)
.then(result => {
log(result.body);
fn(null, result.body);
})
.catch(err => {
log("send failed with statusCode", err.statusCode);
fn(err);
})
/*attachments
if (R.is(Array, options.attachments)) {
R.forEach(function eachFile(fileConfig) {
sendgridEmail.addAttachment(fileConfig);
}, options.attachments);
}
if (options.files) {
R.forEach(function eachFile(fileConfig) {
sendgridEmail.addAttachment(fileConfig);
}, options.files);
}*/
} else {
process.nextTick(function nextTick() { // eslint-disable-line
fn(null, options);
});
}
return deferred.promise;
};
Mailer.subscribe = function (options, cb) {
var dataSource = this.dataSource,
connector = dataSource.connector,
deferred = Q.defer(),
emailData = {},
request;
var fn = function (err, result) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(result);
}
return cb && cb(err, result);
};
assert(connector, 'Cannot subscribe mail without a connector!');
if (connector.mailjet) {
if (!options.email) {
throw new Error('Email required');
}
connector.mailjet
.post("contact")
.action("managemanycontacts")
.request({
"ContactsLists": [{
"ListID": options.contactsListId,
"action": "addnoforce"
}],
"Contacts": [{
"Email": options.email
}]
}).then(result => {
fn(null, result);
})
.catch(err => {
log(err)
fn(err);
})
}
}
Mailer.unsubscribe = function (options, cb) {
var dataSource = this.dataSource,
connector = dataSource.connector,
deferred = Q.defer(),
emailData = {},
request;
var fn = function (err, result) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(result);
}
return cb && cb(err, result);
};
assert(connector, 'Cannot unsubscribe mail without a connector!');
if (connector.mailjet) {
if (!options.email) {
throw new Error('Email required');
}
connector.mailjet
.post("contact")
.action("managemanycontacts")
.request({
"ContactsLists": [{
"ListID": options.contactsListId,
"action": "remove"
}],
"Contacts": [{
"Email": options.email
}]
}).then(result => {
fn(null, result);
})
.catch(err => {
log(err)
fn(err);
})
}
}
/**
* Send an email instance using instance
*/
Mailer.prototype.subscribe = function (fn) {
return this.constructor.subscribe(this, fn);
};
/**
* Send an email instance using instance
*/
Mailer.prototype.unsubscribe = function (fn) {
return this.constructor.unsubscribe(this, fn);
};
/**
* Subscrive instance using instance
*/
Mailer.prototype.send = function protoSend(fn) {
return this.constructor.send(this, fn);
};
/**
* Export the connector class
*/
module.exports = MailjetConnector;