studiocms
Version:
Astro Native CMS for AstroDB. Built from the ground up by the Astro community.
63 lines (62 loc) • 2.15 kB
JavaScript
import { VerifyEmail } from "studiocms:auth/lib";
import { stripLeadingAndTrailingSlashes } from "studiocms:lib";
import { apiResponseLogger } from "studiocms:logger";
import { SDKCore } from "studiocms:sdk";
import {
AllResponse,
createEffectAPIRoutes,
createJsonResponse,
Effect,
genLogger,
OptionsResponse
} from "../../../../effect.js";
const { GET, OPTIONS, ALL } = createEffectAPIRoutes(
{
GET: (ctx) => genLogger("studiocms/routes/api/dashboard/verify-email.GET")(function* () {
const [sdk, verifyEmail] = yield* Effect.all([SDKCore, VerifyEmail]);
if (!ctx.locals.StudioCMS.siteConfig.data.enableMailer) {
return apiResponseLogger(400, "Mailer is disabled, this action is disabled.");
}
const url = new URL(ctx.request.url);
const params = url.searchParams;
const token = params.get("token");
const userId = params.get("userId");
if (!token || !userId) {
return apiResponseLogger(400, "Invalid request");
}
const verificationToken = yield* verifyEmail.getEmailVerificationRequest(userId);
if (!verificationToken) {
return apiResponseLogger(404, "Verification token not found");
}
if (verificationToken.token !== token) {
return apiResponseLogger(400, "Invalid token");
}
yield* Effect.all([
sdk.AUTH.user.update(userId, {
emailVerified: true
}),
sdk.AUTH.verifyEmail.delete(userId)
]);
if (!ctx.site) {
return apiResponseLogger(400, "Site URL is not configured");
}
return ctx.redirect(
stripLeadingAndTrailingSlashes(ctx.site.toString()) + ctx.locals.StudioCMS.routeMap.mainLinks.dashboardIndex
);
}).pipe(VerifyEmail.Provide),
OPTIONS: () => Effect.try(() => OptionsResponse({ allowedMethods: ["GET"] })),
ALL: () => Effect.try(() => AllResponse())
},
{
cors: { methods: ["GET", "OPTIONS"] },
onError: (error) => {
console.error("API Error:", error);
return createJsonResponse({ error: "Internal Server Error" }, { status: 500 });
}
}
);
export {
ALL,
GET,
OPTIONS
};