import { NextResponse } from "next/server"; import crypto from "crypto"; import { auth } from "@/auth"; import { prisma } from "@/lib/prisma"; import { sendEmail } from "@/lib/email"; export async function POST() { const session = await auth(); if (!session?.user?.id) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const user = await prisma.user.findUnique({ where: { id: session.user.id }, }); if (!user) { return NextResponse.json({ error: "User not found" }, { status: 404 }); } if (user.emailVerified) { return NextResponse.json({ error: "Email already verified" }, { status: 400 }); } const latestToken = await prisma.emailVerificationToken.findFirst({ where: { userId: user.id }, orderBy: { createdAt: "desc" }, }); if (latestToken && Date.now() - latestToken.createdAt.getTime() < 60_000) { return NextResponse.json( { error: "Please wait 60 seconds before requesting another email" }, { status: 429 } ); } await prisma.emailVerificationToken.updateMany({ where: { userId: user.id, used: false }, data: { used: true }, }); const rawToken = crypto.randomBytes(32).toString("hex"); const tokenHash = crypto.createHash("sha256").update(rawToken).digest("hex"); await prisma.emailVerificationToken.create({ data: { userId: user.id, token: tokenHash, expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), }, }); const verifyUrl = `https://codeboard.vectry.tech/verify-email?token=${rawToken}`; await sendEmail({ to: user.email, subject: "Verify your CodeBoard email", html: `

Verify your email

Click the link below to verify your email address for CodeBoard.

Verify Email

This link expires in 24 hours.

`, }); return NextResponse.json({ success: true }); }