All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 2m38s
117 lines
3.0 KiB
TypeScript
117 lines
3.0 KiB
TypeScript
'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' }
|
|
}
|
|
}
|
|
|