import { NextRequest, NextResponse } from 'next/server'; export const dynamic = 'force-dynamic'; import { prisma } from '@/lib/prisma'; // POST: Verify via 6-digit code export async function POST(request: NextRequest) { try { const { email, code } = await request.json(); if (!email || !code) { return NextResponse.json( { error: 'Email and code are required' }, { status: 400 } ); } const user = await prisma.user.findUnique({ where: { email }, select: { id: true, emailVerified: true, emailVerificationCode: true, emailVerificationExpires: true, }, }); if (!user) { return NextResponse.json( { error: 'User not found' }, { status: 404 } ); } if (user.emailVerified) { return NextResponse.json({ message: 'Email already verified' }); } if (!user.emailVerificationCode || !user.emailVerificationExpires) { return NextResponse.json( { error: 'No verification code found. Please request a new one.' }, { status: 400 } ); } if (new Date() > user.emailVerificationExpires) { return NextResponse.json( { error: 'Verification code expired. Please request a new one.' }, { status: 400 } ); } if (user.emailVerificationCode !== code) { return NextResponse.json( { error: 'Invalid verification code' }, { status: 400 } ); } // Verify the user await prisma.user.update({ where: { id: user.id }, data: { emailVerified: new Date(), verifiedAt: new Date(), emailVerificationCode: null, emailVerificationToken: null, emailVerificationExpires: null, }, }); return NextResponse.json({ message: 'Email verified successfully' }); } catch (error) { console.error('Verification error:', error); return NextResponse.json( { error: 'Failed to verify email' }, { status: 500 } ); } } // GET: Verify via one-click link export async function GET(request: NextRequest) { try { const token = request.nextUrl.searchParams.get('token'); if (!token) { return NextResponse.redirect( new URL('/auth/verify-email?error=missing_token', request.url) ); } const user = await prisma.user.findFirst({ where: { emailVerificationToken: token, emailVerificationExpires: { gt: new Date() }, }, }); if (!user) { return NextResponse.redirect( new URL('/auth/verify-email?error=invalid_token', request.url) ); } // Verify the user await prisma.user.update({ where: { id: user.id }, data: { emailVerified: new Date(), verifiedAt: new Date(), emailVerificationCode: null, emailVerificationToken: null, emailVerificationExpires: null, }, }); return NextResponse.redirect( new URL('/auth/login?verified=true', request.url) ); } catch (error) { console.error('Token verification error:', error); return NextResponse.redirect( new URL('/auth/verify-email?error=server_error', request.url) ); } }