Add dotenv package for environment variable management and update pnpm-lock.yaml. Adjust layout in RegisterPage and LoginPage components for improved responsiveness. Enhance AdminPanel with ChallengeManagement section and update navigation links for challenges. Refactor Prisma schema to include Challenge model and related enums.
This commit is contained in:
152
actions/admin/challenges.ts
Normal file
152
actions/admin/challenges.ts
Normal file
@@ -0,0 +1,152 @@
|
||||
'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 {
|
||||
const session = 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 {
|
||||
const session = 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' }
|
||||
}
|
||||
}
|
||||
|
||||
112
actions/challenges/create.ts
Normal file
112
actions/challenges/create.ts
Normal file
@@ -0,0 +1,112 @@
|
||||
'use server'
|
||||
|
||||
import { revalidatePath } from 'next/cache'
|
||||
import { auth } from '@/lib/auth'
|
||||
import { challengeService } from '@/services/challenges/challenge.service'
|
||||
import {
|
||||
ValidationError,
|
||||
NotFoundError,
|
||||
ConflictError,
|
||||
} from '@/services/errors'
|
||||
|
||||
export async function createChallenge(data: {
|
||||
challengedId: string
|
||||
title: string
|
||||
description: string
|
||||
pointsReward?: number
|
||||
}) {
|
||||
try {
|
||||
const session = await auth()
|
||||
|
||||
if (!session?.user?.id) {
|
||||
return { success: false, error: 'Vous devez être connecté pour créer un défi' }
|
||||
}
|
||||
|
||||
const challenge = await challengeService.createChallenge({
|
||||
challengerId: session.user.id,
|
||||
challengedId: data.challengedId,
|
||||
title: data.title,
|
||||
description: data.description,
|
||||
pointsReward: data.pointsReward || 100,
|
||||
})
|
||||
|
||||
revalidatePath('/challenges')
|
||||
revalidatePath('/profile')
|
||||
|
||||
return { success: true, message: 'Défi créé avec succès', data: challenge }
|
||||
} catch (error) {
|
||||
console.error('Create challenge error:', error)
|
||||
|
||||
if (error instanceof ValidationError || error instanceof ConflictError) {
|
||||
return { success: false, error: error.message }
|
||||
}
|
||||
if (error instanceof NotFoundError) {
|
||||
return { success: false, error: error.message }
|
||||
}
|
||||
|
||||
return { success: false, error: 'Une erreur est survenue lors de la création du défi' }
|
||||
}
|
||||
}
|
||||
|
||||
export async function acceptChallenge(challengeId: string) {
|
||||
try {
|
||||
const session = await auth()
|
||||
|
||||
if (!session?.user?.id) {
|
||||
return { success: false, error: 'Vous devez être connecté pour accepter un défi' }
|
||||
}
|
||||
|
||||
const challenge = await challengeService.acceptChallenge(
|
||||
challengeId,
|
||||
session.user.id
|
||||
)
|
||||
|
||||
revalidatePath('/challenges')
|
||||
revalidatePath('/profile')
|
||||
|
||||
return { success: true, message: 'Défi accepté', data: challenge }
|
||||
} catch (error) {
|
||||
console.error('Accept challenge error:', error)
|
||||
|
||||
if (error instanceof ValidationError) {
|
||||
return { success: false, error: error.message }
|
||||
}
|
||||
if (error instanceof NotFoundError) {
|
||||
return { success: false, error: error.message }
|
||||
}
|
||||
|
||||
return { success: false, error: 'Une erreur est survenue lors de l\'acceptation du défi' }
|
||||
}
|
||||
}
|
||||
|
||||
export async function cancelChallenge(challengeId: string) {
|
||||
try {
|
||||
const session = await auth()
|
||||
|
||||
if (!session?.user?.id) {
|
||||
return { success: false, error: 'Vous devez être connecté pour annuler un défi' }
|
||||
}
|
||||
|
||||
const challenge = await challengeService.cancelChallenge(
|
||||
challengeId,
|
||||
session.user.id
|
||||
)
|
||||
|
||||
revalidatePath('/challenges')
|
||||
revalidatePath('/profile')
|
||||
|
||||
return { success: true, message: 'Défi annulé', data: challenge }
|
||||
} catch (error) {
|
||||
console.error('Cancel challenge error:', error)
|
||||
|
||||
if (error instanceof ValidationError) {
|
||||
return { success: false, error: error.message }
|
||||
}
|
||||
if (error instanceof NotFoundError) {
|
||||
return { success: false, error: error.message }
|
||||
}
|
||||
|
||||
return { success: false, error: 'Une erreur est survenue lors de l\'annulation du défi' }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user