118 lines
3.4 KiB
TypeScript
118 lines
3.4 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|