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

71 lines
2.4 KiB
TypeScript

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 (30 derniers jours)
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
const activeUsers = users.filter((user) => {
const lastActivity = new Date(user.updatedAt || user.createdAt);
return lastActivity >= thirtyDaysAgo;
}).length;
// Calculer les administrateurs
const totalAdmins = users.filter(user => user.role === 'ADMIN').length;
// Calculer les conversations actives (30 derniers jours)
const activeConversations = conversations.filter((conv) => {
const lastActivity = new Date(conv.updatedAt || conv.createdAt);
return lastActivity >= thirtyDaysAgo;
}).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
const totalCreditsUsed = balances.reduce(
(sum, balance) => sum + (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);
return NextResponse.json({
totalUsers: users.length,
activeUsers,
totalAdmins,
totalCredits: totalCreditsUsed,
activeConversations,
totalMessages,
totalTokensConsumed,
totalCreditsUsed,
recentTransactions,
});
} catch (error) {
console.error("Erreur lors du calcul des métriques:", error);
return NextResponse.json({ error: "Erreur serveur" }, { status: 500 });
}
}