mailtrain/server/lib/template-sender.js

72 lines
1.9 KiB
JavaScript
Raw Normal View History

'use strict';
const mailers = require('./mailers');
const tools = require('./tools');
const templates = require('../models/templates');
class TemplateSender {
constructor({ templateId, maxMails = 100 } = {}) {
if (!templateId) {
throw new Error('Cannot create template sender without templateId');
}
this.templateId = templateId;
this.maxMails = maxMails;
}
async send(options) {
this._validateMailOptions(options);
const [mailer, template] = await Promise.all([
2019-03-31 12:50:40 +00:00
mailers.getOrCreateMailer(options.sendConfigurationId),
templates.getById(options.context, this.templateId, false)
]);
const html = tools.formatTemplate(
template.html,
null,
options.variables,
true
);
const subject = tools.formatTemplate(
options.subject || template.description || template.name,
options.variables
);
return mailer.sendTransactionalMail(
{
to: options.email,
subject
},
{
html: { template: html },
data: options.data,
locale: options.locale
}
);
}
_validateMailOptions(options) {
2019-03-31 12:50:40 +00:00
let { context, email, locale } = options;
2019-03-31 12:50:40 +00:00
if (!context) {
throw new Error('Missing context');
}
if (!email || email.length === 0) {
throw new Error('Missing email');
}
if (typeof email === 'string') {
email = email.split(',');
}
if (email.length > this.maxMails) {
throw new Error(
`Cannot send more than ${this.maxMails} emails at once`
);
}
if (!locale) {
throw new Error('Missing locale');
}
}
}
module.exports = TemplateSender;