Commit b1d712e8 authored by Vadym Gidulian's avatar Vadym Gidulian

Merge branch 'dev'

parents e5abb7d4 2861b96f
FROM node:10-alpine FROM node:10-alpine
MAINTAINER Vadym Gidulian <vadym.gidulian@gvia.group> MAINTAINER Vadym Gidulian <vadym.gidulian@gvia.group>
COPY package.json yarn.lock /app/ COPY package.json yarn.lock /app/
......
...@@ -3,10 +3,14 @@ ...@@ -3,10 +3,14 @@
"version": "0.3.0", "version": "0.3.0",
"dependencies": { "dependencies": {
"ejs": "^2.6.1",
"express": "^4.16.3", "express": "^4.16.3",
"glob": "^7.1.3",
"handlebars": "^4.0.12", "handlebars": "^4.0.12",
"nodemailer": "^4.6.8", "nodemailer": "^4.6.8",
"@gviagroup/jsvv": "~0.6.0" "pug": "^2.0.3",
"response-time": "^2.3.2",
"@gviagroup/jsvv": "~0.11.0"
}, },
"devDependencies": { "devDependencies": {
"nodemon": "^1.18.4" "nodemon": "^1.18.4"
......
'use strict'; 'use strict';
const express = require('express'); const express = require('express');
const responseTime = require('response-time');
const jsvv = require('@gviagroup/jsvv'); const jsvv = require('@gviagroup/jsvv');
const mailerModel = require('./models/mailer'); const mailerModel = require('./models/mailer');
const templatesModel = require('./models/templates');
const requestSchema = require('./schemas/request'); const requestSchema = require('./schemas/request');
const templateNameSchema = require('./schemas/template-name'); const templateNameSchema = require('./schemas/template-name');
...@@ -20,17 +22,22 @@ app.use((req, res, next) => { ...@@ -20,17 +22,22 @@ app.use((req, res, next) => {
res.header('Access-Control-Allow-Methods', 'OPTIONS, POST'); res.header('Access-Control-Allow-Methods', 'OPTIONS, POST');
next(); next();
}); });
app.use(responseTime());
app.post('/*', async (req, res) => {
let templateName = req.url.slice(1);
app.post('/:template', async (req, res) => {
try { try {
req.params.template = jsvv(req.params.template, templateNameSchema); templateName = jsvv(templateName, templateNameSchema, {root: 'Template name'});
req.body = jsvv(req.body, requestSchema); req.body = jsvv(req.body, requestSchema, {root: 'requestBody'});
} catch (e) { } catch (e) {
return res.status(400).send(e.message); return res.status(400).send(e.message);
} }
if (!templatesModel.isTemplateExists(templateName)) return res.status(404).send();
try { 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) { } catch (e) {
console.error(e); console.error(e);
res.status(500).send(); res.status(500).send();
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
}); });
const {promisify} = require('util'); const {promisify} = require('util');
const handlebars = require('handlebars');
const nodemailer = require('nodemailer'); const nodemailer = require('nodemailer');
const templatesModel = require('./templates'); const templatesModel = require('./templates');
...@@ -43,7 +42,7 @@ const sendMail = promisify(transporter.sendMail).bind(transporter); ...@@ -43,7 +42,7 @@ const sendMail = promisify(transporter.sendMail).bind(transporter);
module.exports = { module.exports = {
async sendMessage(template, request) { async sendMessage(template, request) {
const text = handlebars.compile(templatesModel.getTemplate(template))(request.vars); const text = templatesModel.render(template, request.vars);
const message = { const message = {
from: SMTP_SENDER, from: SMTP_SENDER,
......
'use strict'; '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_DIR = '/app/templates';
const templates = {}; const TEMPLATES = new Map();
module.exports = { module.exports = {
prepareTemplates() { prepareTemplates() {
try { try {
if (fs.statSync(TEMPLATES_DIR)) { if (fs.statSync(TEMPLATES_DIR)) {
const filenames = fs.readdirSync(TEMPLATES_DIR); const filenames = glob.sync('**/*', {cwd: TEMPLATES_DIR, nodir: true});
filenames.forEach(filename => { 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: ${[...TEMPLATES.keys()].map(name => `"${name}"`).join(', ')}`);
console.log(`Loaded templates: ${Object.keys(templates).map(name => `"${name}"`).join(', ')}`);
} catch (e) { } catch (e) {
console.error(e); console.error(e);
process.exit(1); process.exit(1);
} }
}, },
getTemplate(name) { isTemplateExists(name) {
return templates[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