From a20b2ac3060961d160db959f9c099a5fcc9717d1 Mon Sep 17 00:00:00 2001 From: Mateo Date: Mon, 1 Jun 2026 12:14:30 -0500 Subject: [PATCH] C12 --- server/api/users/request-email-change.post.ts | 16 +++------------- server/utils/auth.ts | 16 +++------------- server/utils/email.ts | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 26 deletions(-) create mode 100644 server/utils/email.ts diff --git a/server/api/users/request-email-change.post.ts b/server/api/users/request-email-change.post.ts index 48cdef4..74811dd 100644 --- a/server/api/users/request-email-change.post.ts +++ b/server/api/users/request-email-change.post.ts @@ -1,19 +1,9 @@ import { prisma } from '../../utils/prisma' import { auth } from '../../utils/auth' import { emailSchema } from '~~/server/utils/schemas' -import nodemailer from 'nodemailer' +import { mailer, fromAddress } from '../../utils/email' import crypto from 'node:crypto' -const transporter = nodemailer.createTransport({ - host: process.env.EMAIL_SERVER_HOST, - port: Number(process.env.EMAIL_SERVER_PORT), - secure: process.env.EMAIL_SERVER_SECURE === 'true', - auth: { - user: process.env.EMAIL_SERVER_USER, - pass: process.env.EMAIL_SERVER_PASSWORD, - }, -}) - export default defineEventHandler(async (event) => { const session = await auth.api.getSession({ headers: event.headers, @@ -69,8 +59,8 @@ export default defineEventHandler(async (event) => { const confirmUrl = `${process.env.BETTER_AUTH_URL}/api/users/confirm-email-change?token=${token}` - await transporter.sendMail({ - from: process.env.EMAIL_FROM || process.env.EMAIL_SERVER_USER, + await mailer.sendMail({ + from: fromAddress(), to: newEmail.data, subject: 'Confirm your new Reading Huddle email', html: ` diff --git a/server/utils/auth.ts b/server/utils/auth.ts index 1028be7..d5dc994 100644 --- a/server/utils/auth.ts +++ b/server/utils/auth.ts @@ -2,17 +2,7 @@ import { betterAuth } from 'better-auth' import { prismaAdapter } from 'better-auth/adapters/prisma' import { prisma } from './prisma' import { magicLink } from 'better-auth/plugins' -import nodemailer from 'nodemailer' - -const transporter = nodemailer.createTransport({ - host: process.env.EMAIL_SERVER_HOST, - port: Number(process.env.EMAIL_SERVER_PORT), - secure: process.env.EMAIL_SERVER_SECURE === 'true', - auth: { - user: process.env.EMAIL_SERVER_USER, - pass: process.env.EMAIL_SERVER_PASSWORD, - }, -}) +import { mailer, fromAddress } from './email' export const auth = betterAuth({ database: prismaAdapter(prisma, { @@ -34,8 +24,8 @@ export const auth = betterAuth({ plugins: [ magicLink({ async sendMagicLink({ email, url }) { - await transporter.sendMail({ - from: process.env.EMAIL_FROM || process.env.EMAIL_SERVER_USER, + await mailer.sendMail({ + from: fromAddress(), to: email, subject: 'Sign in to Reading Huddle', html: ` diff --git a/server/utils/email.ts b/server/utils/email.ts new file mode 100644 index 0000000..5efa984 --- /dev/null +++ b/server/utils/email.ts @@ -0,0 +1,14 @@ +import nodemailer from 'nodemailer' + +export const mailer = nodemailer.createTransport({ + host: process.env.EMAIL_SERVER_HOST, + port: Number(process.env.EMAIL_SERVER_PORT), + secure: process.env.EMAIL_SERVER_SECURE === 'true', + auth: { + user: process.env.EMAIL_SERVER_USER, + pass: process.env.EMAIL_SERVER_PASSWORD, + }, +}) + +export const fromAddress = () => + process.env.EMAIL_FROM || process.env.EMAIL_SERVER_USER