import { NextResponse } from "next/server"; import { getDatabase } from "@/lib/db/mongodb"; export async function GET() { try { const db = await getDatabase(); // Récupérer toutes les données nécessaires en parallèle const [users, conversations, transactions, balances] = await Promise.all([ db.collection("users").find({}).toArray(), db.collection("conversations").find({}).toArray(), db.collection("transactions").find({}).toArray(), db.collection("balances").find({}).toArray(), ]); // Calculer les utilisateurs actifs (dernière semaine) const oneWeekAgo = new Date(); oneWeekAgo.setDate(oneWeekAgo.getDate() - 7); const activeUsers = users.filter((user) => { const lastActivity = new Date(user.updatedAt || user.createdAt); return lastActivity >= oneWeekAgo; }).length; // Calculer les administrateurs const totalAdmins = users.filter(user => user.role === 'ADMIN').length; // Calculer les conversations actives (dernière semaine) const activeConversations = conversations.filter((conv) => { const lastActivity = new Date(conv.updatedAt || conv.createdAt); return lastActivity >= oneWeekAgo; }).length; // Calculer le total des messages const totalMessages = conversations.reduce( (sum, conv) => sum + (Array.isArray(conv.messages) ? conv.messages.length : 0), 0 ); // Calculer le total des tokens depuis les transactions const totalTokensConsumed = transactions.reduce((sum, transaction) => { return sum + Math.abs(Number(transaction.rawAmount) || 0); }, 0); // Calculer le total des crédits depuis balances const totalCredits = balances.reduce((sum, balance) => { return sum + (Number(balance.tokenCredits) || 0); }, 0); // Récupérer les transactions récentes (dernières 10) const recentTransactions = transactions .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()) .slice(0, 10) .map(transaction => ({ _id: transaction._id, description: `Transaction ${transaction.tokenType} - ${transaction.model}`, amount: transaction.rawAmount, type: transaction.rawAmount > 0 ? 'credit' : 'debit', createdAt: transaction.createdAt })); return NextResponse.json({ totalUsers: users.length, activeUsers, totalAdmins, totalCredits, activeConversations, totalMessages: totalMessages, totalTokensConsumed, recentTransactions }); } catch (error) { console.error("Erreur lors du calcul des métriques:", error); return NextResponse.json({ error: "Erreur serveur" }, { status: 500 }); } }