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, newEmail, code } = await request.json(); if (!userId || !newEmail || !code) { return NextResponse.json({ error: "User ID, new email, and verification code are required" }, { status: 400 }); } const emailLower = newEmail.toLowerCase(); const supabaseAdmin = createClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.SUPABASE_SERVICE_ROLE_KEY! ); const { data: codeData, error: codeError } = await supabase .from("email_change_verification_codes") .select("*") .eq("email", emailLower) .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: "No verification code found for this email. 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("email_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 Aut const { data: authData, error: authError } = await supabaseAdmin.auth.admin.updateUserById(authUserId, { email: emailLower }); if (authError) console.error("Auth update failed:", authError); else console.log("Auth email updated:", authData); // Update users table await supabase.from("users").update({ email: emailLower }).eq("user_id", userId); return NextResponse.json({ success: true, message: "Email verified and updated successfully!" }); } catch (error: any) { console.error("Verify email change code error:", error); return NextResponse.json({ error: error.message || "Internal server error" }, { status: 500 }); } }