Commit b1d712e8 authored by Vadym Gidulian's avatar Vadym Gidulian

Merge branch 'dev'

parents e5abb7d4 2861b96f
FROM node:10-alpine
MAINTAINER Vadym Gidulian <vadym.gidulian@gvia.group>
COPY package.json yarn.lock /app/
......
......@@ -3,10 +3,14 @@
"version": "0.3.0",
"dependencies": {
"ejs": "^2.6.1",
"express": "^4.16.3",
"glob": "^7.1.3",
"handlebars": "^4.0.12",
"nodemailer": "^4.6.8",
"@gviagroup/jsvv": "~0.6.0"
"pug": "^2.0.3",
"response-time": "^2.3.2",
"@gviagroup/jsvv": "~0.11.0"
},
"devDependencies": {
"nodemon": "^1.18.4"
......
'use strict';
const express = require('express');
const jsvv = require('@gviagroup/jsvv');
const mailerModel = require('./models/mailer');
const express = require('express');
const responseTime = require('response-time');
const jsvv = require('@gviagroup/jsvv');
const mailerModel = require('./models/mailer');
const templatesModel = require('./models/templates');
const requestSchema = require('./schemas/request');
const templateNameSchema = require('./schemas/template-name');
......@@ -20,17 +22,22 @@ app.use((req, res, next) => {
res.header('Access-Control-Allow-Methods', 'OPTIONS, POST');
next();
});
app.use(responseTime());
app.post('/:template', async (req, res) => {
app.post('/*', async (req, res) => {
let templateName = req.url.slice(1);
try {
req.params.template = jsvv(req.params.template, templateNameSchema);
req.body = jsvv(req.body, requestSchema);
templateName = jsvv(templateName, templateNameSchema, {root: 'Template name'});
req.body = jsvv(req.body, requestSchema, {root: 'requestBody'});
} catch (e) {
return res.status(400).send(e.message);
}
if (!templatesModel.isTemplateExists(templateName)) return res.status(404).send();
try {
res.status(200).send(await mailerModel.sendMessage(req.params.template, req.body));
res.status(200).send(await mailerModel.sendMessage(templateName, req.body));
} catch (e) {
console.error(e);
res.status(500).send();
......
......@@ -8,7 +8,6 @@
});
const {promisify} = require('util');
const handlebars = require('handlebars');
const nodemailer = require('nodemailer');
const templatesModel = require('./templates');
......@@ -43,7 +42,7 @@ const sendMail = promisify(transporter.sendMail).bind(transporter);
module.exports = {
async sendMessage(template, request) {
const text = handlebars.compile(templatesModel.getTemplate(template))(request.vars);
const text = templatesModel.render(template, request.vars);
const message = {
from: SMTP_SENDER,
......
'use strict';
const fs = require('fs');
const fs = require('fs');
const ejs = require('ejs');
const glob = require('glob');
const handlebars = require('handlebars');
const pug = require('pug');
const TEMPLATES_DIR = '/app/templates';
const templates = {};
const TEMPLATES = new Map();
module.exports = {
prepareTemplates() {
try {
if (fs.statSync(TEMPLATES_DIR)) {
const filenames = fs.readdirSync(TEMPLATES_DIR);
const filenames = glob.sync('**/*', {cwd: TEMPLATES_DIR, nodir: true});
filenames.forEach(filename => {
templates[filename] = fs.readFileSync(`${TEMPLATES_DIR}/${filename}`, {encoding: 'utf-8'});
TEMPLATES.set(filename, fs.readFileSync(`${TEMPLATES_DIR}/${filename}`, {encoding: 'utf-8'}));
});
}
console.log(`Loaded templates: ${Object.keys(templates).map(name => `"${name}"`).join(', ')}`);
console.log(`Loaded templates: ${[...TEMPLATES.keys()].map(name => `"${name}"`).join(', ')}`);
} catch (e) {
console.error(e);
process.exit(1);
}
},
getTemplate(name) {
return templates[name] || '';
isTemplateExists(name) {
return TEMPLATES.has(name);
},
render(templateName, vars) {
const [, ext] = templateName.split('.');
const template = TEMPLATES.get(templateName) || '';
const templatePath = `${TEMPLATES_DIR}/${templateName}`;
switch (ext) {
case 'ejs':
return ejs.compile(template, {filename: templatePath, root: TEMPLATES_DIR})(vars);
case 'hbs':
case 'handlebars':
return handlebars.compile(template)(vars);
case 'pug':
return pug.compile(template, {basedir: TEMPLATES_DIR, filename: templatePath})(vars);
default:
return template;
}
}
};
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment