import crypto from "node:crypto"; import bcrypt from "bcryptjs"; import { type NextRequest, NextResponse } from "next/server"; import { prisma } from "../../../lib/prisma"; import { resetPasswordSchema, validateInput } from "../../../lib/validation"; export async function POST(request: NextRequest) { try { const body = await request.json(); // Validate input with strong password requirements const validation = validateInput(resetPasswordSchema, body); if (!validation.success) { return NextResponse.json( { success: false, error: "Validation failed", details: validation.errors, }, { status: 400 } ); } const { token, password } = validation.data; // Hash the token to compare with stored hash const tokenHash = crypto.createHash("sha256").update(token).digest("hex"); const user = await prisma.user.findFirst({ where: { resetToken: tokenHash, resetTokenExpiry: { gte: new Date() }, }, }); if (!user) { return NextResponse.json( { success: false, error: "Invalid or expired token. Please request a new password reset.", }, { status: 400 } ); } // Hash password with higher rounds for better security const hashedPassword = await bcrypt.hash(password, 12); await prisma.user.update({ where: { id: user.id }, data: { password: hashedPassword, resetToken: null, resetTokenExpiry: null, }, }); return NextResponse.json( { success: true, message: "Password has been reset successfully.", }, { status: 200 } ); } catch (error) { console.error("Reset password error:", error); return NextResponse.json( { success: false, error: "An internal server error occurred. Please try again later.", }, { status: 500 } ); } }