'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' } } }