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..35741ee9f 100644 --- a/services/mailer.js +++ b/services/mailer.js @@ -17,16 +17,41 @@ 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 = { + data: {} +}; + +// load the temlates per request during development +templates.render = (name, format = 'txt', context) => new Promise((resolve, reject) => { + + // If we are in production mode, check the view cache. + if (process.env.NODE_ENV === 'production') { + if (name in templates.data && format in templates.data[name]) { + let view = templates.data[name][format]; + + return resolve(view(context)); + } } - files.forEach(file => { - fs.readFile(path.join(__dirname, 'email', file), 'utf8', (err, data) => { - templateStrings[file] = _.template(data); - }); + const filename = path.join(__dirname, 'email', [name, format, 'ejs'].join('.')); + + fs.readFile(filename, (err, file) => { + if (err) { + return reject(err); + } + + let view = _.template(file); + + // If we are in production mode, fill the view cache. + if (process.env.NODE_ENV === 'production') { + if (!(name in templates.data)) { + templates.data[name] = {}; + } + + templates.data[name][format] = view; + } + + return resolve(view(context)); }); }); @@ -70,10 +95,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]) => {