"use server"; import { revalidatePath } from "next/cache"; import { auth } from "@/lib/auth"; import { challengeService } from "@/services/challenges/challenge.service"; import { Role } from "@/prisma/generated/prisma/client"; import { ValidationError, NotFoundError } from "@/services/errors"; async function checkAdminAccess() { const session = await auth(); if (!session?.user || session.user.role !== Role.ADMIN) { throw new Error("Accès refusé - Admin uniquement"); } return session; } export async function validateChallenge( challengeId: string, winnerId: string, adminComment?: string ) { try { const session = await checkAdminAccess(); const challenge = await challengeService.validateChallenge( challengeId, session.user.id, winnerId, adminComment ); revalidatePath("/admin"); revalidatePath("/challenges"); revalidatePath("/leaderboard"); return { success: true, message: "Défi validé avec succès", data: challenge, }; } catch (error) { console.error("Validate challenge error:", 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.includes("Accès refusé")) { return { success: false, error: error.message }; } return { success: false, error: "Une erreur est survenue lors de la validation du défi", }; } } export async function rejectChallenge( challengeId: string, adminComment?: string ) { try { const session = await checkAdminAccess(); const challenge = await challengeService.rejectChallenge( challengeId, session.user.id, adminComment ); revalidatePath("/admin"); revalidatePath("/challenges"); return { success: true, message: "Défi rejeté", data: challenge }; } catch (error) { console.error("Reject challenge error:", 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.includes("Accès refusé")) { return { success: false, error: error.message }; } return { success: false, error: "Une erreur est survenue lors du rejet du défi", }; } } export async function updateChallenge( challengeId: string, data: { title?: string; description?: string; pointsReward?: number; } ) { try { await checkAdminAccess(); const challenge = await challengeService.updateChallenge(challengeId, { title: data.title, description: data.description, pointsReward: data.pointsReward, }); revalidatePath("/admin"); revalidatePath("/challenges"); return { success: true, message: "Défi mis à jour avec succès", data: challenge, }; } catch (error) { console.error("Update challenge error:", 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.includes("Accès refusé")) { return { success: false, error: error.message }; } return { success: false, error: "Une erreur est survenue lors de la mise à jour du défi", }; } } export async function deleteChallenge(challengeId: string) { try { await checkAdminAccess(); await challengeService.deleteChallenge(challengeId); revalidatePath("/admin"); revalidatePath("/challenges"); return { success: true, message: "Défi supprimé avec succès" }; } catch (error) { console.error("Delete challenge error:", error); if (error instanceof NotFoundError) { return { success: false, error: error.message }; } if (error instanceof Error && error.message.includes("Accès refusé")) { return { success: false, error: error.message }; } return { success: false, error: "Une erreur est survenue lors de la suppression du défi", }; } } export async function adminCancelChallenge(challengeId: string) { try { await checkAdminAccess(); const challenge = await challengeService.adminCancelChallenge(challengeId); revalidatePath("/admin"); revalidatePath("/challenges"); return { success: true, message: "Défi annulé avec succès", data: challenge, }; } catch (error) { console.error("Admin cancel challenge error:", 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.includes("Accès refusé")) { return { success: false, error: error.message }; } return { success: false, error: "Une erreur est survenue lors de l'annulation du défi", }; } } export async function reactivateChallenge(challengeId: string) { try { await checkAdminAccess(); const challenge = await challengeService.reactivateChallenge(challengeId); revalidatePath("/admin"); revalidatePath("/challenges"); return { success: true, message: "Défi réactivé avec succès", data: challenge, }; } catch (error) { console.error("Reactivate challenge error:", 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.includes("Accès refusé")) { return { success: false, error: error.message }; } return { success: false, error: "Une erreur est survenue lors de la réactivation du défi", }; } } export async function adminAcceptChallenge(challengeId: string) { try { await checkAdminAccess(); const challenge = await challengeService.adminAcceptChallenge(challengeId); revalidatePath("/admin"); revalidatePath("/challenges"); return { success: true, message: "Défi accepté avec succès", data: challenge, }; } catch (error) { console.error("Admin accept challenge error:", 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.includes("Accès refusé")) { return { success: false, error: error.message }; } return { success: false, error: "Une erreur est survenue lors de l'acceptation du défi", }; } }