2017-05-30 06:06:14 +00:00
|
|
|
var fs = require('fs');
|
|
|
|
var mustache = require('mustache');
|
2017-06-07 13:28:42 +00:00
|
|
|
var locale = require('./locale.js');
|
2017-05-31 12:55:41 +00:00
|
|
|
var path = require('path');
|
2017-06-12 11:41:02 +00:00
|
|
|
var inlineCss = require('inline-css');
|
2017-05-30 06:06:14 +00:00
|
|
|
|
2017-06-07 13:28:42 +00:00
|
|
|
module.exports = {
|
2017-10-17 06:22:59 +00:00
|
|
|
/**
|
|
|
|
* Get template.
|
|
|
|
* @param {String} template - Template name
|
|
|
|
* @param {Object} countryCode - Language code
|
|
|
|
* @param {Object} params - Params
|
|
|
|
* @param {Object} cb - Callback
|
|
|
|
*/
|
2017-08-30 12:50:46 +00:00
|
|
|
get: function(template, params, cb) {
|
2017-09-27 15:44:51 +00:00
|
|
|
var templatePath = path.join(__dirname, 'template', `${template}`, `index.html`);
|
2017-06-07 13:28:42 +00:00
|
|
|
var classPath = path.join(__dirname, 'template', `${template}`, `${template}.js`);
|
2017-09-27 15:44:51 +00:00
|
|
|
var stylePath = path.join(__dirname, 'template', `default`, `style.css`);
|
2017-05-30 06:06:14 +00:00
|
|
|
|
2017-06-07 13:28:42 +00:00
|
|
|
fs.stat(templatePath, (error, stat) => {
|
|
|
|
if (error)
|
2017-10-17 06:22:59 +00:00
|
|
|
return cb(new Error('Template ' + template + ' not found'));
|
2017-05-30 06:06:14 +00:00
|
|
|
|
2017-06-07 13:28:42 +00:00
|
|
|
let TemplateClass = require(classPath);
|
|
|
|
let instance = new TemplateClass();
|
2017-05-31 12:55:41 +00:00
|
|
|
|
2017-06-12 11:41:02 +00:00
|
|
|
let getRenderedStyles = body => {
|
2017-10-17 06:22:59 +00:00
|
|
|
this.renderStyles(stylePath, body, (error, body) => {
|
2017-09-27 15:44:51 +00:00
|
|
|
params.subject = params.subject || instance.subject;
|
|
|
|
|
|
|
|
if (params.subject == undefined)
|
|
|
|
params.subject = body.match(new RegExp('<title>(.*?)</title>', 'i'))[1];
|
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
this.getAttachments(template, body, (error, attachments) => {
|
|
|
|
if (error)
|
|
|
|
return cb(error);
|
|
|
|
|
|
|
|
cb(null, {recipient: instance.recipient, subject: params.subject, body: body, attachments: attachments});
|
2017-06-07 13:28:42 +00:00
|
|
|
});
|
|
|
|
});
|
2017-06-07 17:29:16 +00:00
|
|
|
};
|
|
|
|
|
2017-06-12 11:41:02 +00:00
|
|
|
let getDataCb = () => {
|
2017-10-17 06:22:59 +00:00
|
|
|
this.render(templatePath, instance, (error, result) => getRenderedStyles(result));
|
2017-06-12 11:41:02 +00:00
|
|
|
};
|
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
instance.getData(params, (error, result) => {
|
|
|
|
if (error)
|
|
|
|
return cb(error);
|
2017-08-31 14:11:37 +00:00
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
locale.load(template, instance.countryCode, (error, result) => {
|
|
|
|
if (error)
|
|
|
|
return cb(error);
|
2017-08-31 14:11:37 +00:00
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
instance._ = result.locale;
|
|
|
|
getDataCb(null, result);
|
2017-08-30 12:50:46 +00:00
|
|
|
});
|
2017-05-31 12:55:41 +00:00
|
|
|
});
|
2017-05-30 06:06:14 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
/**
|
|
|
|
* Render template
|
|
|
|
* @param {String} path - Template path
|
|
|
|
* @param {Object} data - Params
|
|
|
|
* @param {Object} cb - Callback
|
|
|
|
*/
|
2017-06-07 13:28:42 +00:00
|
|
|
render: function(path, data, cb) {
|
2017-05-30 06:06:14 +00:00
|
|
|
fs.readFile(path, 'utf8', function(error, body) {
|
|
|
|
mustache.parse(body);
|
2017-10-17 06:22:59 +00:00
|
|
|
cb(null, mustache.render(body, data));
|
2017-06-07 13:28:42 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
/**
|
|
|
|
* Render template style.
|
|
|
|
* @param {String} path - Stylesheet path
|
|
|
|
* @param {String} body - Rendered html
|
|
|
|
* @param {Object} cb - Callback
|
|
|
|
*/
|
2017-06-12 11:41:02 +00:00
|
|
|
renderStyles: function(path, html, cb) {
|
|
|
|
fs.stat(path, error => {
|
2017-10-17 06:22:59 +00:00
|
|
|
if (error) return cb(new Error('Template stylesheet not found'));
|
2017-06-12 11:41:02 +00:00
|
|
|
fs.readFile(path, 'utf8', (error, css) => {
|
|
|
|
let style = '<style>' + css + '</style>';
|
|
|
|
let body = style + html;
|
|
|
|
let options = {url: ' '};
|
|
|
|
|
|
|
|
inlineCss(body, options)
|
|
|
|
.then(function(body) {
|
2017-10-17 06:22:59 +00:00
|
|
|
cb(null, body);
|
2017-06-12 11:41:02 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
/**
|
|
|
|
* Get template attachments
|
|
|
|
* @param {String} template - Template name
|
|
|
|
* @param {String} body - template body
|
|
|
|
* @param {Object} cb - Callback
|
|
|
|
*/
|
2017-06-07 13:28:42 +00:00
|
|
|
getAttachments: function(template, body, cb) {
|
2017-10-17 06:22:59 +00:00
|
|
|
let attachments = [];
|
|
|
|
let tplAttachments = body.match(new RegExp('src="cid:(.*?)"', 'ig'));
|
2017-06-07 13:28:42 +00:00
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
// Template default attachments
|
2017-06-07 13:28:42 +00:00
|
|
|
for (var i = 0; i < tplAttachments.length; i++) {
|
2017-10-17 06:22:59 +00:00
|
|
|
let name = tplAttachments[i].replace('src="cid:', '').replace('"', '');
|
|
|
|
let attachmentPath = path.join(__dirname, 'template/default/image', name);
|
2017-06-07 13:28:42 +00:00
|
|
|
|
|
|
|
attachments.push({filename: name, path: attachmentPath, cid: name});
|
|
|
|
}
|
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
// Template attachment files
|
|
|
|
let attachmentsPath = path.join(__dirname, 'template', `${template}`, 'attachment.json');
|
2017-06-07 13:28:42 +00:00
|
|
|
|
|
|
|
fs.stat(attachmentsPath, (error, stats) => {
|
2017-10-17 06:22:59 +00:00
|
|
|
if (error)
|
|
|
|
return cb(new Error(`Could not load attachments.js from template ${template}`));
|
2017-06-07 13:28:42 +00:00
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
let attachObj = require(attachmentsPath);
|
2017-06-07 13:28:42 +00:00
|
|
|
|
|
|
|
for (var i = 0; i < attachObj.length; i++) {
|
2017-10-17 06:22:59 +00:00
|
|
|
let filename = attachObj[i];
|
|
|
|
let attachmentPath = path.join(__dirname, 'template', `${template}`, 'attachment', filename);
|
|
|
|
|
|
|
|
attachments.push({filename: filename, path: attachmentPath, cid: filename});
|
2017-06-07 13:28:42 +00:00
|
|
|
}
|
|
|
|
|
2017-10-17 06:22:59 +00:00
|
|
|
this.checkAttachments(attachments, error => {
|
|
|
|
if (error)
|
|
|
|
return cb(error);
|
|
|
|
cb(null, attachments);
|
|
|
|
});
|
2017-05-30 06:06:14 +00:00
|
|
|
});
|
2017-10-17 06:22:59 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check all template attachments
|
|
|
|
* @param {Object} attachments - Attachments object
|
|
|
|
* @param {Object} cb - Callback
|
|
|
|
*/
|
|
|
|
checkAttachments: function(attachments, cb) {
|
|
|
|
for (var i = 0; i < attachments.length; i++) {
|
|
|
|
var attachment = attachments[i];
|
|
|
|
fs.stat(attachment.path, error => {
|
|
|
|
if (error)
|
|
|
|
return cb(new Error(`Could not load attachment file ${attachment.path}`));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
cb();
|
2017-05-30 06:06:14 +00:00
|
|
|
}
|
|
|
|
};
|