@srsl/tools
Version:
JavaScript tools for common interfaces
160 lines (136 loc) • 4.99 kB
JavaScript
const mjml2html = require('mjml')
const handlebars = require('handlebars')
const path = require('path')
const { promisify } = require('bluebird')
// const { ses } = require('../../constructors/aws-sdk')
const { createVerificationCode } = require('../')
const readFile = promisify(require('fs').readFile)
const readEmailTemplate = (filepath) => {
try {
return readFile(path.resolve(__dirname, filepath), 'utf8')
} catch (e) {
console.log('Failed to read template from directory. ', e)
return null
}
}
const readHTMLEmailTemplate = filename => readEmailTemplate(`./templates/dist/${filename}.html`)
const readTextEmailTemplate = filename => readEmailTemplate(`./templates/dist/${filename}.txt`)
const defaultEmailParams = {
Destination: { /* required */
CcAddresses: [
'noreply@trustedlife.com', // TODO - defaults
/* more CC email addresses */
],
ToAddresses: [
'noreply@gmail.com', // TODO - defaults
/* more To email addresses */
],
},
Source: 'noreply@trustedlife.com', /* required */ // TODO - defaults
ReplyToAddresses: [
'noreply@trustedlife.com', // TODO - defaults
],
}
const defaultTemplatedEmailParams = Object.assign({}, defaultEmailParams, {
Template: 'TEMPLATE_NAME', /* required */
TemplateData: '{ "REPLACEMENT_TAG_NAME":"REPLACEMENT_VALUE" }',
})
const defaultStaticEmailParams = Object.assign({}, defaultEmailParams, {
Message: {
Body: {
Html: {
Charset: 'UTF-8',
Data: 'HTML_FORMAT_BODY',
},
Text: {
Charset: 'UTF-8',
Data: 'TEXT_FORMAT_BODY',
},
},
Subject: {
Charset: 'UTF-8',
Data: 'Message from TrustedLife',
},
},
})
/*
* sendStaticEmailWithName()
* {param} templateName<String>
* {param} subjectLine<String>
*
* Usage:
* - ex: sendStaticEmailWithName('purchaseProcessing', { ToAddresses: ['user1@gmail.com'] }, 'noreply@trustedlife.com')
*
*/
module.exports.sendStaticEmailWithName = async function sendStaticEmailWithName(templateName, Destination, Source, subjectLine = 'Message from TrustedLife') {
const params = Object.assign({}, defaultStaticEmailParams, { Destination }, { Source })
params.Message.Body.Html.Data = await readHTMLEmailTemplate(templateName)
params.Message.Body.Text.Data = await readTextEmailTemplate(templateName)
params.Message.Subject.Data = subjectLine
console.log(params)
// ses.sendEmail(params).promise().then((data) => {
// console.log(data.MessageId)
// }).catch((err) => {
// console.error(err, err.stack)
// })
}
module.exports.send = async function send(template, dest, src, data = {}, subject = 'Message from TrustedLife') {
const params = Object.assign(
{},
defaultStaticEmailParams,
{ Destination: dest },
{ Source: src },
)
const mjmlTemplate = handlebars.compile(await readHTMLEmailTemplate(template))
const textTemplate = handlebars.compile(await readTextEmailTemplate(template))
const mjml = mjmlTemplate(data)
const { html } = mjml2html(mjml)
const text = textTemplate(data)
params.Message.Body.Html.Data = html
params.Message.Body.Text.Data = text
params.Message.Subject.Data = subject
console.log(params)
// ses.sendEmail(params).promise().then((resp) => {
// console.log(resp.MessageId)
// }).catch((err) => {
// console.error(err, err.stack)
// })
}
/*
* sendTemplatedEmailWithNameAndData()
* {param} templateName<String>
* {param} subjectLine<String>
*
* Usage:
* * ex: sendTemplatedEmailWithNameAndData('purchaseConfirmed', { order: "Pioneer's Something or Other", price: 60000 }, { ToAddresses: ['user1@gmail.com'] }, 'noreply@trustedlife.com')
*
*/
async function sendTemplatedEmailWithNameAndData(templateName, templateData, Destination, Source) {
if (!templateData) {
console.error('Parameter "templateData" must be provided.')
return
}
const params = Object.assign({}, defaultTemplatedEmailParams, { Destination }, { Source })
params.Template = templateName
params.TemplateData = JSON.stringify(templateData)
console.log(params)
// ses.sendTemplatedEmail(params).promise().then((data) => {
// console.log(data)
// console.log(data.MessageId)
// }).catch((err) => {
// console.error(err, err.stack)
// })
}
const generateEmailVerificationCode = () => uuidv1()
const sendEmailVerificationCode = (toEmails, fromEmail = 'trustedlifeapp@gmail.com') => {
let ToAddresses = toEmails
if (typeof toEmails === 'string') ToAddresses = [toEmails]
const CODE_LENGTH = 6
const code = createVerificationCode(CODE_LENGTH)
sendTemplatedEmailWithNameAndData('validateEmail', { code }, { ToAddresses }, fromEmail)
return code
}
module.exports.sendTemplatedEmailWithNameAndData = sendTemplatedEmailWithNameAndData
module.exports.readHTMLEmailTemplate = readHTMLEmailTemplate
module.exports.readTextEmailTemplate = readTextEmailTemplate
module.exports.sendEmailVerificationCode = sendEmailVerificationCode