in src/app/api/v1/user/email/route.ts [29:122]
export async function POST(req: NextRequest) {
const token = await getToken({ req });
const l10n = getL10n(await getAcceptLangHeaderInServerComponents());
if (typeof token?.subscriber?.fxa_uid === "string") {
try {
const body: EmailAddRequest = await req.json();
const subscriber = await getSubscriberByFxaUid(token.subscriber?.fxa_uid);
if (!subscriber) {
throw new Error("No subscriber found for current session.");
}
const emailCount = 1 + (subscriber.email_addresses?.length ?? 0); // primary + verified + unverified emails
const validatedEmail = validateEmailAddress(body.email);
if (validatedEmail === null) {
return NextResponse.json(
{
success: false,
message: l10n.getString("user-add-invalid-email"),
},
{ status: 400 },
);
}
const maxNumEmailAddresses = hasPremium(subscriber)
? CONST_MAX_NUM_ADDRESSES_PLUS
: CONST_MAX_NUM_ADDRESSES;
if (emailCount >= maxNumEmailAddresses) {
return NextResponse.json(
{
success: false,
message: l10n.getString("user-add-too-many-emails"),
},
{ status: 400 },
);
}
// checkForDuplicateEmail
const emailLowerCase = validatedEmail.email.toLowerCase();
if (emailLowerCase === subscriber.primary_email.toLowerCase()) {
return NextResponse.json(
{
success: false,
message: l10n.getString("user-add-duplicate-email"),
},
{ status: 400 },
);
}
for (const secondaryEmail of subscriber.email_addresses) {
if (emailLowerCase === secondaryEmail.email.toLowerCase()) {
return NextResponse.json(
{
success: false,
message: l10n.getString("user-add-duplicate-email"),
},
{ status: 400 },
);
}
}
const unverifiedSubscriber = await addSubscriberUnverifiedEmailHash(
subscriber,
validatedEmail.email,
);
await initEmail();
await sendVerificationEmail(subscriber, unverifiedSubscriber.id);
return NextResponse.json({
success: true,
newEmailCount: emailCount + 1,
message: "Sent the verification email",
});
} catch (e: unknown) {
if (
e instanceof Error &&
e.message === "error-email-validation-pending"
) {
return NextResponse.json(
{
success: false,
message: "Verification email recently sent, try again later",
},
{ status: 429 },
);
}
return NextResponse.json({ success: false }, { status: 500 });
}
} else {
// Not Signed in, redirect to home
return NextResponse.redirect(process.env.SERVER_URL ?? "/", 301);
}
}