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.
Some checks failed
Deploy with Docker Compose / deploy (push) Failing after 3m2s

This commit is contained in:
Julien Froidefond
2025-12-15 15:16:54 +01:00
parent 9518eef3d4
commit f093977b34
34 changed files with 11414 additions and 9081 deletions

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