93 lines
2.3 KiB
TypeScript
93 lines
2.3 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { auth } from "@/lib/auth";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { Role } from "@/prisma/generated/prisma/client";
|
|
|
|
export async function GET() {
|
|
try {
|
|
const session = await auth();
|
|
if (!session?.user?.id) {
|
|
return NextResponse.json({ error: "Non authentifié" }, { status: 401 });
|
|
}
|
|
|
|
if (session.user.role !== Role.ADMIN) {
|
|
return NextResponse.json({ error: "Accès refusé" }, { status: 403 });
|
|
}
|
|
|
|
// Récupérer tous les feedbacks avec les détails de l'événement et de l'utilisateur
|
|
const feedbacks = await prisma.eventFeedback.findMany({
|
|
include: {
|
|
event: {
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
date: true,
|
|
type: true,
|
|
},
|
|
},
|
|
user: {
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
email: true,
|
|
},
|
|
},
|
|
},
|
|
orderBy: {
|
|
createdAt: "desc",
|
|
},
|
|
});
|
|
|
|
// Calculer les statistiques par événement
|
|
const eventStats = await prisma.eventFeedback.groupBy({
|
|
by: ["eventId"],
|
|
_avg: {
|
|
rating: true,
|
|
},
|
|
_count: {
|
|
id: true,
|
|
},
|
|
});
|
|
|
|
// Récupérer les détails des événements pour les stats
|
|
const eventIds = eventStats.map((stat) => stat.eventId);
|
|
const events = await prisma.event.findMany({
|
|
where: {
|
|
id: {
|
|
in: eventIds,
|
|
},
|
|
},
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
date: true,
|
|
type: true,
|
|
},
|
|
});
|
|
|
|
// Combiner les stats avec les détails des événements
|
|
const statsWithDetails = eventStats.map((stat) => {
|
|
const event = events.find((e) => e.id === stat.eventId);
|
|
return {
|
|
eventId: stat.eventId,
|
|
eventName: event?.name || "Événement supprimé",
|
|
eventDate: event?.date || null,
|
|
eventType: event?.type || null,
|
|
averageRating: stat._avg.rating || 0,
|
|
feedbackCount: stat._count.id,
|
|
};
|
|
});
|
|
|
|
return NextResponse.json({
|
|
feedbacks,
|
|
statistics: statsWithDetails,
|
|
});
|
|
} catch (error) {
|
|
console.error("Error fetching feedbacks:", error);
|
|
return NextResponse.json(
|
|
{ error: "Erreur lors de la récupération des feedbacks" },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|