"use server"; import { revalidatePath } from "next/cache"; import { auth } from "@/lib/auth"; import { userService } from "@/services/users/user.service"; import { userStatsService } from "@/services/users/user-stats.service"; import { Role } from "@/prisma/generated/prisma/client"; import { ValidationError, NotFoundError, ConflictError, } 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 updateUser( userId: string, data: { username?: string; avatar?: string | null; hpDelta?: number; xpDelta?: number; score?: number; level?: number; role?: string; } ) { try { await checkAdminAccess()(); // Valider username si fourni if (data.username !== undefined) { try { await userService.validateAndUpdateUserProfile(userId, { username: data.username, }); } catch (error) { if ( error instanceof ValidationError || error instanceof ConflictError ) { return { success: false, error: error.message }; } throw error; } } // Mettre à jour stats et profil const updatedUser = await userStatsService.updateUserStatsAndProfile( userId, { username: data.username, avatar: data.avatar, hpDelta: data.hpDelta, xpDelta: data.xpDelta, score: data.score, level: data.level, role: data.role ? (data.role as Role) : undefined, }, { id: true, username: true, email: true, role: true, score: true, level: true, hp: true, maxHp: true, xp: true, maxXp: true, avatar: true, } ); revalidatePath("/admin"); revalidatePath("/leaderboard"); return { success: true, data: updatedUser }; } catch (error) { console.error("Error updating user:", 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 mise à jour de l'utilisateur", }; } } export async function deleteUser(userId: string) { try { const session = await checkAdminAccess()(); await userService.validateAndDeleteUser(userId, session.user.id); revalidatePath("/admin"); revalidatePath("/leaderboard"); return { success: true }; } catch (error) { console.error("Error deleting user:", 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 suppression de l'utilisateur", }; } }