Files
Dashboard/app/api/cleanup/balances/route.ts
nBiqoz 0f2adca44a new
2025-10-06 19:16:20 +02:00

104 lines
3.2 KiB
TypeScript

import { NextResponse } from "next/server";
import { getDatabase } from "@/lib/db/mongodb";
export async function POST() {
try {
const db = await getDatabase();
// Récupérer tous les utilisateurs existants
const users = await db.collection("users").find({}).toArray();
const userIds = new Set(users.map(user => user._id.toString()));
// Récupérer toutes les balances
const balances = await db.collection("balances").find({}).toArray();
// Identifier les balances fantômes
const phantomBalances = balances.filter(balance =>
!userIds.has(balance.user.toString())
);
// Calculer les statistiques avant nettoyage
const totalBalances = balances.length;
const phantomCount = phantomBalances.length;
const phantomCredits = phantomBalances.reduce(
(sum, balance) => sum + (balance.tokenCredits || 0),
0
);
console.log(`🗑️ SUPPRESSION: ${phantomCount} balances fantômes détectées`);
console.log(`💰 CRÉDITS FANTÔMES: ${phantomCredits}`);
// SUPPRESSION DÉFINITIVE des balances fantômes
const deleteResult = await db.collection("balances").deleteMany({
user: { $nin: Array.from(userIds) }
});
console.log(`✅ SUPPRIMÉES: ${deleteResult.deletedCount} balances`);
return NextResponse.json({
success: true,
statistics: {
totalBalances,
phantomCount,
phantomCredits,
cleanedCount: deleteResult.deletedCount
},
message: `${deleteResult.deletedCount} balances fantômes supprimées définitivement`
});
} catch (error) {
console.error("Erreur lors du nettoyage des balances:", error);
return NextResponse.json({ error: "Erreur serveur" }, { status: 500 });
}
}
// Endpoint pour analyser sans nettoyer
export async function GET() {
try {
const db = await getDatabase();
const users = await db.collection("users").find({}).toArray();
const userIds = new Set(users.map(user => user._id.toString()));
const balances = await db.collection("balances").find({}).toArray();
const phantomBalances = balances.filter(balance =>
!userIds.has(balance.user.toString())
);
const phantomCredits = phantomBalances.reduce(
(sum, balance) => sum + (balance.tokenCredits || 0),
0
);
// Analyser les doublons aussi
const userCounts = new Map<string, number>();
balances.forEach(balance => {
const userId = balance.user.toString();
userCounts.set(userId, (userCounts.get(userId) || 0) + 1);
});
const duplicates = Array.from(userCounts.entries())
.filter(([, count]) => count > 1)
.map(([userId, count]) => ({
userId,
count,
isPhantom: !userIds.has(userId)
}));
return NextResponse.json({
analysis: {
totalBalances: balances.length,
totalUsers: users.length,
phantomBalances: phantomBalances.length,
phantomCredits,
duplicateUsers: duplicates.length,
duplicates: duplicates.slice(0, 10) // Premiers 10 exemples
}
});
} catch (error) {
console.error("Erreur lors de l'analyse des balances:", error);
return NextResponse.json({ error: "Erreur serveur" }, { status: 500 });
}
}