import { NextResponse } from "next/server"; import { getDatabase } from "@/lib/db/mongodb"; import { ObjectId } from "mongodb"; export async function POST(request: Request) { try { const { userId } = await request.json(); if (!userId) { return NextResponse.json( { success: false, error: "userId est requis" }, { status: 400 } ); } const db = await getDatabase(); const CREDITS_TO_ADD = 3000000; // 3 millions de tokens // Vérifier que l'utilisateur existe let userObjectId: ObjectId; try { userObjectId = new ObjectId(userId); } catch { return NextResponse.json( { success: false, error: "ID utilisateur invalide" }, { status: 400 } ); } const user = await db.collection("users").findOne({ _id: userObjectId }); if (!user) { return NextResponse.json( { success: false, error: "Utilisateur non trouvé" }, { status: 404 } ); } console.log( `🎯 Ajout de ${CREDITS_TO_ADD.toLocaleString()} crédits à: ${user.email || user.name}` ); // Chercher la balance existante - essayer avec ObjectId ET string let existingBalance = await db .collection("balances") .findOne({ user: userObjectId }); // Si pas trouvé avec ObjectId, essayer avec string if (!existingBalance) { existingBalance = await db .collection("balances") .findOne({ user: userId }); } console.log(`📊 Balance existante trouvée: ${existingBalance ? "OUI" : "NON"}`); if (existingBalance) { console.log(`📊 Balance ID: ${existingBalance._id}, Crédits actuels: ${existingBalance.tokenCredits}`); } let newBalance: number; if (existingBalance) { // Mettre à jour la balance existante avec $inc pour être sûr const currentCredits = existingBalance.tokenCredits || 0; newBalance = currentCredits + CREDITS_TO_ADD; const updateResult = await db.collection("balances").updateOne( { _id: existingBalance._id }, { $inc: { tokenCredits: CREDITS_TO_ADD }, $set: { lastRefill: new Date() }, } ); console.log(`✅ Update result: matchedCount=${updateResult.matchedCount}, modifiedCount=${updateResult.modifiedCount}`); console.log( `✅ Balance mise à jour: ${currentCredits.toLocaleString()} → ${newBalance.toLocaleString()}` ); } else { // Créer une nouvelle balance newBalance = CREDITS_TO_ADD; const insertResult = await db.collection("balances").insertOne({ user: userObjectId, tokenCredits: newBalance, autoRefillEnabled: false, lastRefill: new Date(), refillAmount: 0, refillIntervalUnit: "month", refillIntervalValue: 1, __v: 0, }); console.log(`🆕 Nouvelle balance créée: ${insertResult.insertedId} avec ${newBalance.toLocaleString()} crédits`); } return NextResponse.json({ success: true, message: `${CREDITS_TO_ADD.toLocaleString()} crédits ajoutés à ${user.email || user.name}`, newBalance, user: { id: user._id.toString(), name: user.name, email: user.email, }, }); } catch (error) { console.error("Erreur lors de l'ajout des crédits:", error); return NextResponse.json( { success: false, error: "Erreur serveur lors de l'ajout des crédits", }, { status: 500 } ); } }