From b2634304be63ff622a850e114687b0154e3392b1 Mon Sep 17 00:00:00 2001 From: Rohan Sunar Date: Wed, 19 Nov 2025 18:13:52 +0545 Subject: [PATCH] fix: fix the verification link for accounts with slug --- .../sendEmailVerificationEmail.ts | 116 ++++++++++++------ 1 file changed, 79 insertions(+), 37 deletions(-) diff --git a/packages/fastify/src/supertokens/recipes/email-verification/sendEmailVerificationEmail.ts b/packages/fastify/src/supertokens/recipes/email-verification/sendEmailVerificationEmail.ts index f05283fb..c242881a 100644 --- a/packages/fastify/src/supertokens/recipes/email-verification/sendEmailVerificationEmail.ts +++ b/packages/fastify/src/supertokens/recipes/email-verification/sendEmailVerificationEmail.ts @@ -5,62 +5,104 @@ import { } from "@prefabs.tech/fastify-user"; import emailVerification from "supertokens-node/recipe/emailverification"; +import getSaasConfig from "../../../config"; import Email from "../../utils/email"; +import type { Account } from "../../../types"; import type { FastifyInstance, FastifyRequest } from "fastify"; import type { EmailDeliveryInterface } from "supertokens-node/lib/build/ingredients/emaildelivery/types"; import type { TypeEmailVerificationEmailDeliveryInput } from "supertokens-node/recipe/emailverification/types"; +const getProtocol = ( + request: FastifyRequest | undefined, + fallback: string, + configuredProtocol?: string, +) => { + if (request?.protocol) { + return request.protocol; + } + + if (configuredProtocol) { + return configuredProtocol; + } + + try { + return new URL(fallback).protocol.replace(":", ""); + } catch { + return "https"; + } +}; + const sendEmailVerificationEmail = ( originalImplementation: EmailDeliveryInterface, fastify: FastifyInstance, ): typeof emailVerification.sendEmail => { const websiteDomain = fastify.config.appOrigin[0] as string; + const saasConfig = getSaasConfig(fastify.config); return async (input) => { let origin: string; + let request: FastifyRequest | undefined; try { - const request: FastifyRequest = - input.userContext._default.request.request; - try { - const url = - request.headers.referer || request.headers.origin || request.hostname; - - origin = getOrigin(url) || websiteDomain; - } catch { - origin = websiteDomain; - } - - const emailVerifyLink = input.emailVerifyLink.replace( - websiteDomain + "/auth/verify-email", - origin + - (fastify.config.user.supertokens.emailVerificationPath || - EMAIL_VERIFICATION_PATH), - ); - - let email = input.user.email; + request = input.userContext._default.request.request; + } catch { + request = undefined; + } - email = Email.removePrefix(email, request.authEmailPrefix); + try { + const url = + (request?.headers?.referer as string | undefined) || + (request?.headers?.origin as string | undefined) || + request?.hostname || + ""; + + origin = getOrigin(url) || websiteDomain; + } catch { + origin = websiteDomain; + } + + const requestAccount = + (request?.account as Account | undefined) || + (input.userContext?.account as Account | undefined); + const protocol = getProtocol( + request, + websiteDomain, + fastify.config.protocol as string | undefined, + ); + + if (requestAccount?.domain) { + origin = `${protocol}://${requestAccount.domain}`; + } else if (requestAccount?.slug && saasConfig.rootDomain) { + origin = `${protocol}://${requestAccount.slug}.${saasConfig.rootDomain}`; + } - sendEmail({ - fastify, - subject: - fastify.config.user.emailOverrides?.emailVerification?.subject || - "Email Verification", - templateName: - fastify.config.user.emailOverrides?.emailVerification?.templateName || - "email-verification", - to: email, - templateData: { - emailVerifyLink, - }, - }); - } catch (error: unknown) { - if (error instanceof Error) { - fastify.log.error(error.message); - } + const emailVerifyLink = input.emailVerifyLink.replace( + websiteDomain + "/auth/verify-email", + origin + + (fastify.config.user.supertokens.emailVerificationPath || + EMAIL_VERIFICATION_PATH), + ); + + let email = input.user.email; + + if (request) { + email = Email.removePrefix(email, request.authEmailPrefix); } + + sendEmail({ + fastify, + subject: + fastify.config.user.emailOverrides?.emailVerification?.subject || + "Email Verification", + templateName: + fastify.config.user.emailOverrides?.emailVerification?.templateName || + "email-verification", + to: email, + templateData: { + emailVerifyLink, + }, + }); }; };