Commit 2ddafb83 authored by Vadym Gidulian's avatar Vadym Gidulian

Merge branch '2-ejs' into dev

parents e5abb7d4 17a82150
FROM node:10-alpine
MAINTAINER Vadym Gidulian <vadym.gidulian@gvia.group>
COPY package.json yarn.lock /app/
......
......@@ -3,10 +3,13 @@
"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"
"response-time": "^2.3.2",
"@gviagroup/jsvv": "~0.11.0"
},
"devDependencies": {
"nodemon": "^1.18.4"
......
'use strict';
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('/*', async (req, res) => {
let templateName = req.url.slice(1);
app.post('/:template', async (req, res) => {
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();
......
......@@ -43,7 +43,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.compile(template, request.vars);
const message = {
from: SMTP_SENDER,
......
'use strict';
const fs = require('fs');
const ejs = require('ejs');
const glob = require('glob');
const handlebars = require('handlebars');
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);
},
compile(templateName, vars) {
const [, ext] = templateName.split('.');
const template = TEMPLATES.get(templateName) || '';
switch (ext) {
case 'ejs':
return ejs.render(template, vars, {filename: `${TEMPLATES_DIR}/${templateName}`});
case 'hbs':
case 'handlebars':
return handlebars.compile(template)(vars);
default:
return template;
}
}
};
......@@ -2,10 +2,10 @@
# yarn lockfile v1
"@gviagroup/jsvv@~0.6.0":
version "0.6.1"
resolved "https://npm.gvia.group/@gviagroup%2fjsvv/-/jsvv-0.6.1.tgz#6e18bbc5c8d47f69f5ebbdea6681d240836fc72a"
integrity sha512-bX/jnZga0GVGiDJHI7BYMDWnQtPNi500CUzAKAt7+a6XTQIRhs/90srsTyYzXfDL9cAykvJJOX+rixnDmUokkw==
"@gviagroup/jsvv@~0.11.0":
version "0.11.0"
resolved "https://npm.gvia.group/@gviagroup%2fjsvv/-/jsvv-0.11.0.tgz#e38111a6f6686c1ce7ca79d676d37705048b117f"
integrity sha512-Vwd5pCxunHWGdzQgpPjOURoyw2PCzjT89x85WS4RfbAVcGy4mG/bF6neug5IGr/VnKy55potNN346nBvFSAPcg==
abbrev@1:
version "1.1.1"
......@@ -431,7 +431,7 @@ delegates@^1.0.0:
resolved "https://npm.gvia.group/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
depd@~1.1.2:
depd@~1.1.0, depd@~1.1.2:
version "1.1.2"
resolved "https://npm.gvia.group/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
......@@ -463,6 +463,11 @@ ee-first@1.1.1:
resolved "https://npm.gvia.group/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
ejs@^2.6.1:
version "2.6.1"
resolved "https://npm.gvia.group/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://npm.gvia.group/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
......@@ -671,7 +676,7 @@ glob-parent@^3.1.0:
is-glob "^3.1.0"
path-dirname "^1.0.0"
glob@^7.0.5:
glob@^7.0.5, glob@^7.1.3:
version "7.1.3"
resolved "https://npm.gvia.group/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
......@@ -1373,6 +1378,11 @@ on-finished@~2.3.0:
dependencies:
ee-first "1.1.1"
on-headers@~1.0.1:
version "1.0.1"
resolved "https://npm.gvia.group/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=
once@^1.3.0:
version "1.4.0"
resolved "https://npm.gvia.group/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
......@@ -1589,6 +1599,14 @@ resolve-url@^0.2.1:
resolved "https://npm.gvia.group/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
response-time@^2.3.2:
version "2.3.2"
resolved "https://npm.gvia.group/response-time/-/response-time-2.3.2.tgz#ffa71bab952d62f7c1d49b7434355fbc68dffc5a"
integrity sha1-/6cbq5UtYvfB1Jt0NDVfvGjf/Fo=
dependencies:
depd "~1.1.0"
on-headers "~1.0.1"
ret@~0.1.10:
version "0.1.15"
resolved "https://npm.gvia.group/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
......
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