Refactor event handling and user management: Replace direct database calls with service layer methods for events, user profiles, and preferences, enhancing code organization and maintainability. Update API routes to utilize new services for event registration, feedback, and user statistics, ensuring a consistent approach across the application.

This commit is contained in:
Julien Froidefond
2025-12-12 16:19:13 +01:00
parent fd095246a3
commit 494ac3f503
34 changed files with 1795 additions and 1096 deletions

View File

@@ -1,8 +1,8 @@
import { NextResponse } from "next/server";
import { auth } from "@/lib/auth";
import { prisma } from "@/lib/prisma";
import { Role, EventType } from "@/prisma/generated/prisma/client";
import { calculateEventStatus } from "@/lib/eventStatus";
import { eventService } from "@/services/events/event.service";
import { Role } from "@/prisma/generated/prisma/client";
import { ValidationError } from "@/services/errors";
export async function GET() {
try {
@@ -12,34 +12,22 @@ export async function GET() {
return NextResponse.json({ error: "Accès refusé" }, { status: 403 });
}
const events = await prisma.event.findMany({
orderBy: {
date: "desc",
},
include: {
_count: {
select: {
registrations: true,
},
},
},
});
const events = await eventService.getEventsWithStatus();
// Transformer les données pour inclure le nombre d'inscriptions
// Le statut est calculé automatiquement en fonction de la date
// Transformer les données pour la sérialisation
const eventsWithCount = events.map((event) => ({
id: event.id,
date: event.date.toISOString(),
name: event.name,
description: event.description,
type: event.type,
status: calculateEventStatus(event.date),
status: event.status,
room: event.room,
time: event.time,
maxPlaces: event.maxPlaces,
createdAt: event.createdAt.toISOString(),
updatedAt: event.updatedAt.toISOString(),
registrationsCount: event._count.registrations,
registrationsCount: event.registrationsCount,
}));
return NextResponse.json(eventsWithCount);
@@ -63,45 +51,24 @@ export async function POST(request: Request) {
const body = await request.json();
const { date, name, description, type, room, time, maxPlaces } = body;
if (!date || !name || !description || !type) {
return NextResponse.json(
{ error: "Tous les champs sont requis" },
{ status: 400 }
);
}
// Convertir la date string en Date object
const eventDate = new Date(date);
if (isNaN(eventDate.getTime())) {
return NextResponse.json(
{ error: "Format de date invalide" },
{ status: 400 }
);
}
// Valider les enums
if (!Object.values(EventType).includes(type)) {
return NextResponse.json(
{ error: "Type d'événement invalide" },
{ status: 400 }
);
}
const event = await prisma.event.create({
data: {
date: eventDate,
name,
description,
type: type as EventType,
room: room || null,
time: time || null,
maxPlaces: maxPlaces ? parseInt(maxPlaces) : null,
},
const event = await eventService.validateAndCreateEvent({
date,
name,
description,
type,
room,
time,
maxPlaces,
});
return NextResponse.json(event);
} catch (error) {
console.error("Error creating event:", error);
if (error instanceof ValidationError) {
return NextResponse.json({ error: error.message }, { status: 400 });
}
return NextResponse.json(
{ error: "Erreur lors de la création de l'événement" },
{ status: 500 }