import { NextRequest, NextResponse } from "next/server"; import { supabase } from "@/lib/supabase"; import { createClient } from "@supabase/supabase-js"; export const dynamic = "force-dynamic"; export const runtime = "nodejs"; export async function POST(request: NextRequest) { try { const { userId, code, newPassword, confirmNewPassword } = await request.json(); if (!userId || !code || !newPassword || !confirmNewPassword) { return NextResponse.json({ error: "User ID, verification code, and passwords are required" }, { status: 400 }); } if (newPassword !== confirmNewPassword) { return NextResponse.json({ error: "Passwords do not match" }, { status: 400 }); } const supabaseAdmin = createClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.SUPABASE_SERVICE_ROLE_KEY! ); const { data: codeData, error: codeError } = await supabase .from("password_change_verification_codes") .select("*") .eq("user_id", userId) .eq("code", code) .maybeSingle(); if (codeError) { console.error("Supabase error fetching code:", codeError); return NextResponse.json({ error: "Database error" }, { status: 500 }); } if (!codeData) { return NextResponse.json({ error: "Invalid verification code. Please request a new code." }, { status: 404 }); } if (new Date(codeData.expires_at) < new Date()) { return NextResponse.json({ error: "Verification code has expired. Please request a new code." }, { status: 400 }); } // Mark as verified await supabase .from("password_change_verification_codes") .update({ verified: true }) .eq("id", codeData.id); const { data: userData, error: userError } = await supabase .from("users") .select("supabase_id") .eq("user_id", userId) .maybeSingle(); if (userError || !userData?.supabase_id) { return NextResponse.json({ error: "Cannot find user's Auth ID" }, { status: 404 }); } const authUserId = userData.supabase_id; // Update Supabase Auth password const { data: authData, error: authError } = await supabaseAdmin.auth.admin.updateUserById(authUserId, { password: newPassword }); if (authError) { console.error("Auth update failed:", authError); return NextResponse.json({ error: authError.message || "Failed to update password" }, { status: 500 }); } console.log("Auth password updated:", authData); return NextResponse.json({ success: true, message: "Password updated successfully!" }); } catch (error: any) { console.error("Verify password change code error:", error); return NextResponse.json({ error: error.message || "Internal server error" }, { status: 500 }); } }