@openinc/parse-server-opendash
Version:
Parse Server Cloud Code for open.INC Stack.
115 lines (114 loc) • 4.31 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.initEmailTransport = initEmailTransport;
exports.sendSimpleEmail = sendSimpleEmail;
exports.sendTemplateEmail = sendTemplateEmail;
exports.init = init;
const fs_1 = __importDefault(require("fs"));
const nodemailer_1 = __importDefault(require("nodemailer"));
const nunjucks_1 = __importDefault(require("nunjucks"));
const path_1 = require("path");
const __1 = require("..");
const config_1 = require("../features/config");
const types_1 = require("../types");
let emailTemplateDir = "";
let transport = undefined;
async function initEmailTransport() {
try {
if (config_1.ConfigInstance.getInstance().getBoolean("SMTP_ENABLED")) {
transport = nodemailer_1.default.createTransport({
host: config_1.ConfigInstance.getInstance().get("SMTP_HOST"),
port: config_1.ConfigInstance.getInstance().getNumber("SMTP_PORT"),
secure: config_1.ConfigInstance.getInstance().getBoolean("SMTP_SECURE"),
ignoreTLS: config_1.ConfigInstance.getInstance().getBoolean("SMTP_IGNORE_TLS"),
auth: {
user: config_1.ConfigInstance.getInstance().get("SMTP_USER"),
pass: config_1.ConfigInstance.getInstance().get("SMTP_PASS"),
},
});
await transport.verify();
emailTemplateDir = (0, path_1.resolve)(process.cwd(), config_1.ConfigInstance.getInstance().get("EMAIL_TEMPLATE_DIR"));
nunjucks_1.default.configure(emailTemplateDir, { autoescape: true });
}
}
catch (error) {
console.error(`Parse SMTP Adapter: Error when trying to establish the SMTP connection:`);
console.error(error);
process.exit(1);
}
}
async function sendSimpleEmail(to, subject, text) {
const email = new types_1.Core_Email({
payload: {
to,
subject,
text,
},
});
await email.save(null, { useMasterKey: true });
return email;
}
async function sendTemplateEmail({ to, subject, fallback, template, data, }) {
const email = new types_1.Core_Email({
payload: {
to,
subject: renderEmailTemplate("subject", template, data, subject),
text: renderEmailTemplate("txt", template, data, fallback),
html: renderEmailTemplate("html", template, data, undefined),
},
});
await email.save(null, { useMasterKey: true });
return email;
}
function validateEmailTemplate(templateDir, template) {
const templatePath = (0, path_1.join)(templateDir, template);
if (!fs_1.default.existsSync(templateDir)) {
return false;
}
if (!fs_1.default.existsSync(templatePath)) {
return false;
}
return true;
}
function renderEmailTemplate(type, template, data, fallback) {
const fullTemplate = template + "." + type;
if (validateEmailTemplate(emailTemplateDir, fullTemplate)) {
return nunjucks_1.default.render(fullTemplate, data);
}
if (type === "html") {
return renderEmailTemplate("txt", template, data, fallback);
}
return fallback || "";
}
async function init() {
(0, __1.beforeSaveHook)(types_1.Core_Email, async (request) => {
const { object } = request;
object.setACL(new Parse.ACL());
if (!transport) {
object.sent = false;
object.success = false;
object.error = false;
}
else {
try {
const response = await transport.sendMail({
...object.payload,
from: config_1.ConfigInstance.getInstance().get("SMTP_FROM"),
});
object.response = response;
object.sent = true;
object.success = true;
object.error = false;
}
catch (error) {
object.response = JSON.parse(JSON.stringify(error));
object.sent = true;
object.success = false;
object.error = true;
}
}
});
}