My-Weekly-ToDo-List/src/app/api/auth/verify-email/route.ts

126 lines
3.1 KiB
TypeScript

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)
);
}
}