Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<TypeEmailVerificationEmailDeliveryInput>,
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,
},
});
};
};

Expand Down