From c96537f5b43097c734eb5e296aefdf569ec9b2d9 Mon Sep 17 00:00:00 2001 From: Stefan-5422 <32109571+Stefan-5422@users.noreply.github.com> Date: Sun, 20 Mar 2022 14:58:27 +0100 Subject: [PATCH] Add handlebars; --- package-lock.json | 81 +++++++++++++++++++++++++++++++++++++++++ package.json | 2 ++ src/lib/mail.ts | 92 ++++++++++++++++++++++++++--------------------- 3 files changed, 135 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index e586a32..59872b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "@prisma/client": "^3.3.0", + "@types/handlebars": "^4.1.0", "@types/jsonwebtoken": "^8.5.5", "@types/mjml": "^4.7.0", "@types/node": "^16.10.3", @@ -18,6 +19,7 @@ "argon2": "^0.28.2", "dotenv": "^10.0.0", "express": "^4.17.1", + "handlebars": "^4.7.7", "jsonwebtoken": "^8.5.1", "mjml": "^4.11.0", "nodemailer": "^6.7.0", @@ -226,6 +228,15 @@ "@types/range-parser": "*" } }, + "node_modules/@types/handlebars": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.1.0.tgz", + "integrity": "sha512-gq9YweFKNNB1uFK71eRqsd4niVkXrxHugqWFQkeLRJvGjnxsLr16bYtcsG4tOFwmYi0Bax+wCkbf1reUfdl4kA==", + "deprecated": "This is a stub types definition. handlebars provides its own type definitions, so you do not need this installed.", + "dependencies": { + "handlebars": "*" + } + }, "node_modules/@types/jsonwebtoken": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.6.tgz", @@ -1408,6 +1419,26 @@ "node": ">=4.x" } }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1944,6 +1975,11 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, "node_modules/minipass": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", @@ -2492,6 +2528,11 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, "node_modules/no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -3386,6 +3427,11 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, "node_modules/workerpool": { "version": "6.1.5", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", @@ -3648,6 +3694,14 @@ "@types/range-parser": "*" } }, + "@types/handlebars": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.1.0.tgz", + "integrity": "sha512-gq9YweFKNNB1uFK71eRqsd4niVkXrxHugqWFQkeLRJvGjnxsLr16bYtcsG4tOFwmYi0Bax+wCkbf1reUfdl4kA==", + "requires": { + "handlebars": "*" + } + }, "@types/jsonwebtoken": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.6.tgz", @@ -4562,6 +4616,18 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4968,6 +5034,11 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, "minipass": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", @@ -5468,6 +5539,11 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -6137,6 +6213,11 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, "workerpool": { "version": "6.1.5", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", diff --git a/package.json b/package.json index 9791421..9b40eca 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "homepage": "https://github.com/detleph/server#readme", "dependencies": { "@prisma/client": "^3.3.0", + "@types/handlebars": "^4.1.0", "@types/jsonwebtoken": "^8.5.5", "@types/mjml": "^4.7.0", "@types/node": "^16.10.3", @@ -28,6 +29,7 @@ "argon2": "^0.28.2", "dotenv": "^10.0.0", "express": "^4.17.1", + "handlebars": "^4.7.7", "jsonwebtoken": "^8.5.1", "mjml": "^4.11.0", "nodemailer": "^6.7.0", diff --git a/src/lib/mail.ts b/src/lib/mail.ts index 64ecc70..a6f9d4b 100644 --- a/src/lib/mail.ts +++ b/src/lib/mail.ts @@ -1,44 +1,51 @@ import { writeFile } from "fs"; +import Handlebars, { template } from "handlebars"; +import { emailClient } from "./redis"; import nodemailer from "nodemailer"; import SMTPTransport from "nodemailer/lib/smtp-transport"; -import mjml from "./mjml" - +import mjml from "./mjml"; +import { randomUUID } from "crypto"; export let mailAccount = { user: process.env.MAILUSER + "@mail." + process.env.DOMAIN, pass: process.env.MAILPASSWORD }; -let transporter = (process.env.DEV == "true" || process.env.DOMAIN == undefined) ? (async () => { - mailAccount = await nodemailer.createTestAccount(); - if (process.env.NODE_ENV != "test") { - console.log(mailAccount); - } - return nodemailer.createTransport({ - host: "smtp.ethereal.email", - port: 587, - secure: false, // true for 465, false for other ports - auth: { - user: mailAccount.user, // generated ethereal user - pass: mailAccount.pass, // generated ethereal password - }, - }); -})() : nodemailer.createTransport( - new SMTPTransport({ - host: "localhost", - port: 587, - secure: false, - auth: { - user: mailAccount.user, - pass: mailAccount.pass, - }, - tls: { - rejectUnauthorized: false, - secureProtocol: "TLSv1_method", - }, - }) -); +let transporter = + process.env.DEV == "true" || process.env.DOMAIN == undefined + ? (async () => { + mailAccount = await nodemailer.createTestAccount(); + if (process.env.NODE_ENV != "test") { + console.log(mailAccount); + } + return nodemailer.createTransport({ + host: "smtp.ethereal.email", + port: 587, + secure: false, // true for 465, false for other ports + auth: { + user: mailAccount.user, // generated ethereal user + pass: mailAccount.pass, // generated ethereal password + }, + }); + })() + : nodemailer.createTransport( + new SMTPTransport({ + host: "localhost", + port: 587, + secure: false, + auth: { + user: mailAccount.user, + pass: mailAccount.pass, + }, + tls: { + rejectUnauthorized: false, + secureProtocol: "TLSv1_method", + }, + }) + ); const sendMail = async (from: string, to: string, subject: string, text?: string, html?: string) => { - return await (await transporter).sendMail({ + return await ( + await transporter + ).sendMail({ from: from, to: to, subject: subject, @@ -47,14 +54,19 @@ const sendMail = async (from: string, to: string, subject: string, text?: string }); }; -export const verificationMail = async (to: string, ) => { - const message = mjml.getTemplate("emailVerification") - - //TODO: replace handlebars with code +export const verificationMail = async (to: string, eventName: string, verificationLink: string) => { + const raw = mjml.getTemplate("emailVerification"); + + //TODO: Replace other handlebars with final values + const message = Handlebars.compile(raw); + + const data = { eventName, verificationLink }; + const compiled = message(data); + + sendMail(mailAccount.user, to, "Verify Email", undefined, compiled); + //TODO: Implement verification codes //TODO: Write endpoints to verify codes +}; - sendMail(mailAccount.user,to,"Verify Email",undefined,message); -} - -export default { sendMail}; +export default { sendMail };