From 2ec5b243fbd57173ec64cb4444c4ea02bff9d9b1 Mon Sep 17 00:00:00 2001 From: Riley Davis Date: Mon, 27 Mar 2017 12:43:03 -0600 Subject: [PATCH] hot-load email templates during development --- ...ail-confirm.ejs => email-confirm.html.ejs} | 0 ...notification.ejs => notification.html.ejs} | 0 ...word-reset.ejs => password-reset.html.ejs} | 0 services/mailer.js | 46 ++++++++++++++----- 4 files changed, 35 insertions(+), 11 deletions(-) rename services/email/{email-confirm.ejs => email-confirm.html.ejs} (100%) rename services/email/{notification.ejs => notification.html.ejs} (100%) rename services/email/{password-reset.ejs => password-reset.html.ejs} (100%) diff --git a/services/email/email-confirm.ejs b/services/email/email-confirm.html.ejs similarity index 100% rename from services/email/email-confirm.ejs rename to services/email/email-confirm.html.ejs diff --git a/services/email/notification.ejs b/services/email/notification.html.ejs similarity index 100% rename from services/email/notification.ejs rename to services/email/notification.html.ejs diff --git a/services/email/password-reset.ejs b/services/email/password-reset.html.ejs similarity index 100% rename from services/email/password-reset.ejs rename to services/email/password-reset.html.ejs diff --git a/services/mailer.js b/services/mailer.js index 2928570ad..fe909079f 100644 --- a/services/mailer.js +++ b/services/mailer.js @@ -17,18 +17,42 @@ if (smtpRequiredProps.some(prop => !process.env[prop])) { } // load all the templates as strings -const templateStrings = {}; -fs.readdir(path.join(__dirname, 'email'), (err, files) => { - if (err) { - throw err; - } +const templates = {}; - files.forEach(file => { - fs.readFile(path.join(__dirname, 'email', file), 'utf8', (err, data) => { - templateStrings[file] = _.template(data); +// load the temlates per request during development +if (process.env.NODE_ENV !== 'production') { + templates.render = (name, format = 'txt', context) => new Promise((resolve, reject) => { + fs.readFile(path.join(__dirname, 'email', [name, format, 'ejs'].join('.')), (err, file) => { + if (err) { + return reject(err); + } + + return resolve(_.template(file)(context)); }); }); -}); +} else { + templates.data = fs.readdirSync(path.join(__dirname, 'email')).reduce((data, filename) => { + + // split the filename + let splitFileName = filename.split('.'); + + // remove the ejs extension + splitFileName.splice(-1, 1); + + const [name, format] = splitFileName; + + if (!(name in data)) { + data[name] = {}; + } + + data[name][format] = _.template(fs.readFileSync(filename, 'utf8')); + + return data; + }); + + // render a template based on the request name + templates.render = (name, format = 'txt', context) => templates.data[name][format](context); +} const options = { host: process.env.TALK_SMTP_HOST, @@ -70,10 +94,10 @@ const mailer = module.exports = { return Promise.all([ // Render the HTML version of the email. - templateStrings[`${template}.ejs`](locals), + templates.render(template, 'html', locals), // Render the TEXT version of the email. - templateStrings[`${template}.txt.ejs`](locals) + templates.render(template, 'txt', locals) ]) .then(([html, text]) => {