import { NextResponse } from "next/server"; import { createAdminClient } from "@/lib/supabase/server"; import { verifyAdmin, isAdminError } from "@/lib/admin"; import { stripe } from "@/lib/stripe/client"; import { getBaseUrl } from "@/lib/utils"; export const runtime = "nodejs"; // POST /api/admin/candidatures/[id]/approve - Approuver une candidature export async function POST( _request: Request, { params }: { params: Promise<{ id: string }> } ) { const auth = await verifyAdmin(); if (isAdminError(auth)) { return NextResponse.json({ error: auth.error }, { status: auth.status }); } const { id } = await params; const supabase = createAdminClient(); // Récupérer la candidature const { data: candidature, error: fetchError } = await supabase .from("candidatures") .select("*") .eq("id", id) .single(); if (fetchError || !candidature) { return NextResponse.json({ error: "Candidature introuvable." }, { status: 404 }); } // Mettre à jour le statut const { error: updateError } = await supabase .from("candidatures") .update({ status: "approved" } as never) .eq("id", id); if (updateError) { return NextResponse.json({ error: updateError.message }, { status: 500 }); } // Générer le lien de paiement Stripe let checkoutUrl: string | null = null; if (process.env.STRIPE_SECRET_KEY && process.env.STRIPE_PRICE_ID) { try { const baseUrl = getBaseUrl(); const email = (candidature as Record).email as string; const candidatureId = (candidature as Record).id as string; // Créer ou récupérer le customer Stripe const customers = await stripe.customers.list({ email, limit: 1 }); let customerId: string; if (customers.data.length > 0) { customerId = customers.data[0].id; } else { const customer = await stripe.customers.create({ email, metadata: { candidature_id: candidatureId }, }); customerId = customer.id; } const session = await stripe.checkout.sessions.create({ customer: customerId, mode: "subscription", payment_method_types: ["card"], line_items: [{ price: process.env.STRIPE_PRICE_ID, quantity: 1 }], metadata: { candidature_id: candidatureId, email }, success_url: `${baseUrl}/merci?session_id={CHECKOUT_SESSION_ID}`, cancel_url: `${baseUrl}/candidature`, allow_promotion_codes: true, billing_address_collection: "required", }); checkoutUrl = session.url; // Envoyer le lien par email si Resend est configuré if (process.env.RESEND_API_KEY && process.env.RESEND_API_KEY !== "re_your-api-key") { try { const { Resend } = await import("resend"); const resend = new Resend(process.env.RESEND_API_KEY); const firstname = (candidature as Record).firstname as string; await resend.emails.send({ from: "HookLab ", to: email, subject: "Ta candidature HookLab est acceptée !", html: `

Félicitations ${firstname} !

Ta candidature au programme HookLab a été acceptée !

Pour finaliser ton inscription et accéder au programme, clique sur le bouton ci-dessous :

Le paiement est sécurisé via Stripe. Tu peux payer en 2 mensualités de 490€.

À très vite,
L'équipe HookLab

`, }); } catch (emailError) { console.error("Erreur envoi email approbation:", emailError); } } } catch (stripeError) { console.error("Erreur Stripe:", stripeError); } } return NextResponse.json({ success: true, checkoutUrl, message: checkoutUrl ? "Candidature approuvée. Lien de paiement généré." : "Candidature approuvée. Stripe non configuré, pas de lien de paiement.", }); }