76 lines
2.7 KiB
TypeScript
76 lines
2.7 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 (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 });
|
|
}
|
|
}
|