From 8948aadc45635d1dc50bb9d26db651dc83c41ba5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Estev=C3=A3o?= Date: Wed, 4 Dec 2024 17:30:08 -0300 Subject: [PATCH] feat: wrap mailer on global --- constants/mail.ts | 42 ++++++++++++++++++++++++-------------- services/triggerService.ts | 4 ++-- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/constants/mail.ts b/constants/mail.ts index 990514bb8..2af7b4e63 100644 --- a/constants/mail.ts +++ b/constants/mail.ts @@ -2,26 +2,38 @@ import { Prisma } from '@prisma/client' import config from 'config/index' import { XEC_TX_EXPLORER_URL, BCH_TX_EXPLORER_URL } from 'constants/index' import nodemailer from 'nodemailer' +import SMTPTransport from 'nodemailer/lib/smtp-transport' import { getAddressPrefix } from 'utils' import { OpReturnData } from 'utils/validators' -export const MAIL_TRANSPORTER = nodemailer.createTransport({ - host: config.smtpHost, - secure: config.smtpPort === 465, - logger: true, - auth: { - user: process.env.SMTP_USER, - pass: process.env.SMTP_PASSWORD - } -}) +export interface MailerGlobal extends NodeJS.Global { + mailerTransporter?: nodemailer.Transporter +} -MAIL_TRANSPORTER.verify((error, _success) => { - if (error != null) { - console.error('ERROR SETTING UP MAILER:', error) - } else { - console.log('Mailer ready to send messages') +declare const global: MailerGlobal + +export const getMailerTransporter = (): nodemailer.Transporter => { + if (global.mailerTransporter === undefined) { + global.mailerTransporter = nodemailer.createTransport({ + host: config.smtpHost, + secure: config.smtpPort === 465, + logger: true, + auth: { + user: process.env.SMTP_USER, + pass: process.env.SMTP_PASSWORD + } + }) + global.mailerTransporter.verify((error, _success) => { + if (error != null) { + console.error('ERROR SETTING UP MAILER:', error) + global.mailerTransporter = undefined + } else { + console.log('Mailer ready to send messages') + } + }) } -}) + return global.mailerTransporter +} export const MAIL_FROM = 'no-reply@paybutton.org' export const MAIL_SUBJECT = 'New Payment Received' diff --git a/services/triggerService.ts b/services/triggerService.ts index 54796780b..349e93ec7 100644 --- a/services/triggerService.ts +++ b/services/triggerService.ts @@ -6,7 +6,7 @@ import { EMPTY_OP_RETURN, OpReturnData, parseTriggerPostData } from 'utils/valid import { BroadcastTxData } from 'ws-service/types' import { fetchPaybuttonById, fetchPaybuttonWithTriggers } from './paybuttonService' import config from 'config' -import { MAIL_FROM, MAIL_HTML_REPLACER, MAIL_SUBJECT, MAIL_TRANSPORTER, SendEmailParameters } from 'constants/mail' +import { MAIL_FROM, MAIL_HTML_REPLACER, MAIL_SUBJECT, getMailerTransporter, SendEmailParameters } from 'constants/mail' const triggerWithPaybutton = Prisma.validator()({ include: { paybutton: true } @@ -339,7 +339,7 @@ async function sendEmailForTrigger (trigger: TriggerWithPaybutton, sendEmailPara try { const user = await fetchUserFromTriggerId(trigger.id) if (user.emailCredits > 0) { - const response = await MAIL_TRANSPORTER.sendMail(mailOptions) + const response = await getMailerTransporter().sendMail(mailOptions) logData = { email: trigger.emails, responseData: response.response