"use server"; import { revalidatePath } from "next/cache"; import { auth } from "@/lib/auth"; import { eventService } from "@/services/events/event.service"; import { Role, EventType } from "@/prisma/generated/prisma/client"; import { ValidationError, NotFoundError } from "@/services/errors"; function checkAdminAccess() { return async () => { const session = await auth(); if (!session?.user || session.user.role !== Role.ADMIN) { throw new Error("Accès refusé"); } return session; }; } export async function createEvent(data: { date: string; name: string; description?: string | null; type: string; room?: string | null; time?: string | null; maxPlaces?: number | null; }) { try { await checkAdminAccess()(); const event = await eventService.validateAndCreateEvent({ date: data.date, name: data.name, description: data.description ?? "", type: data.type as EventType, room: data.room ?? undefined, time: data.time ?? undefined, maxPlaces: data.maxPlaces ?? undefined, }); revalidatePath("/admin"); revalidatePath("/events"); revalidatePath("/"); return { success: true, data: event }; } catch (error) { console.error("Error creating event:", error); if (error instanceof ValidationError) { return { success: false, error: error.message }; } if (error instanceof Error && error.message === "Accès refusé") { return { success: false, error: "Accès refusé" }; } return { success: false, error: "Erreur lors de la création de l'événement", }; } } export async function updateEvent( eventId: string, data: { date?: string; name?: string; description?: string | null; type?: string; room?: string | null; time?: string | null; maxPlaces?: number | null; } ) { try { await checkAdminAccess()(); const event = await eventService.validateAndUpdateEvent(eventId, { date: data.date, name: data.name, description: data.description ?? undefined, type: data.type as EventType, room: data.room ?? undefined, time: data.time ?? undefined, maxPlaces: data.maxPlaces ?? undefined, }); revalidatePath("/admin"); revalidatePath("/events"); revalidatePath("/"); return { success: true, data: event }; } catch (error) { console.error("Error updating event:", error); if (error instanceof ValidationError) { return { success: false, error: error.message }; } if (error instanceof NotFoundError) { return { success: false, error: error.message }; } if (error instanceof Error && error.message === "Accès refusé") { return { success: false, error: "Accès refusé" }; } return { success: false, error: "Erreur lors de la mise à jour de l'événement", }; } } export async function deleteEvent(eventId: string) { try { await checkAdminAccess()(); const existingEvent = await eventService.getEventById(eventId); if (!existingEvent) { return { success: false, error: "Événement non trouvé" }; } await eventService.deleteEvent(eventId); revalidatePath("/admin"); revalidatePath("/events"); revalidatePath("/"); return { success: true }; } catch (error) { console.error("Error deleting event:", error); if (error instanceof Error && error.message === "Accès refusé") { return { success: false, error: "Accès refusé" }; } return { success: false, error: "Erreur lors de la suppression de l'événement", }; } }