import { NextRequest, NextResponse } from 'next/server'; import { db } from '@/lib/db'; import { csrfProtection } from '@/lib/csrf'; import bcrypt from 'bcryptjs'; export async function POST(req: NextRequest) { try { // Verify CSRF token const csrfCheck = csrfProtection(req); if (!csrfCheck.valid) { return NextResponse.json( { error: csrfCheck.error || 'Invalid CSRF token' }, { status: 403 } ); } const body = await req.json(); const { token, password } = body; if (!token || !password) { return NextResponse.json( { error: 'Token and password are required' }, { status: 400 } ); } // Validate password length if (password.length < 8) { return NextResponse.json( { error: 'Password must be at least 8 characters long' }, { status: 400 } ); } // Find user with this reset token const user = await db.user.findUnique({ where: { resetPasswordToken: token }, }); if (!user) { return NextResponse.json( { error: 'Invalid or expired reset token' }, { status: 400 } ); } // Check if token has expired if (!user.resetPasswordExpires || user.resetPasswordExpires < new Date()) { // Clear expired token await db.user.update({ where: { id: user.id }, data: { resetPasswordToken: null, resetPasswordExpires: null, }, }); return NextResponse.json( { error: 'Reset token has expired. Please request a new password reset link.' }, { status: 400 } ); } // Hash the new password const hashedPassword = await bcrypt.hash(password, 12); // Update user's password and clear reset token await db.user.update({ where: { id: user.id }, data: { password: hashedPassword, resetPasswordToken: null, resetPasswordExpires: null, }, }); console.log('Password successfully reset for user:', user.email); return NextResponse.json( { message: 'Password reset successfully' }, { status: 200 } ); } catch (error) { console.error('Error in reset-password route:', error); return NextResponse.json( { error: 'An error occurred. Please try again.' }, { status: 500 } ); } }