"use server"; import { revalidatePath } from "next/cache"; import { auth } from "@/lib/auth"; import { houseService } from "@/services/houses/house.service"; import { Role } from "@/prisma/generated/prisma/client"; import { ValidationError, NotFoundError, ConflictError, ForbiddenError, } 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 updateHouse( houseId: string, data: { name?: string; description?: string | null; } ) { try { await checkAdminAccess()(); // L'admin peut modifier n'importe quelle maison sans vérifier les permissions normales // On utilise directement le service mais on bypass les vérifications de propriétaire/admin const house = await houseService.getHouseById(houseId); if (!house) { return { success: false, error: "Maison non trouvée" }; } // Utiliser le service avec le creatorId pour bypass les vérifications const updatedHouse = await houseService.updateHouse( houseId, house.creatorId, // Utiliser le creatorId pour bypass data ); revalidatePath("/admin"); revalidatePath("/houses"); return { success: true, data: updatedHouse }; } catch (error) { console.error("Error updating house:", error); if (error instanceof ValidationError) { return { success: false, error: error.message }; } if (error instanceof ConflictError) { 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 la maison", }; } } export async function deleteHouse(houseId: string) { try { await checkAdminAccess()(); const house = await houseService.getHouseById(houseId); if (!house) { return { success: false, error: "Maison non trouvée" }; } // L'admin peut supprimer n'importe quelle maison // On utilise le creatorId pour bypass les vérifications await houseService.deleteHouse(houseId, house.creatorId); revalidatePath("/admin"); revalidatePath("/houses"); return { success: true }; } catch (error) { console.error("Error deleting house:", error); if (error instanceof NotFoundError) { return { success: false, error: error.message }; } if (error instanceof ForbiddenError) { 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 suppression de la maison", }; } } export async function removeMember(houseId: string, memberId: string) { try { await checkAdminAccess()(); // L'admin peut retirer n'importe quel membre (sauf le propriétaire) await houseService.removeMemberAsAdmin(houseId, memberId); revalidatePath("/admin"); revalidatePath("/houses"); return { success: true, message: "Membre retiré de la maison" }; } catch (error) { console.error("Error removing member:", error); if (error instanceof NotFoundError) { return { success: false, error: error.message }; } if (error instanceof ForbiddenError) { 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 du retrait du membre", }; } }