import { NextResponse } from "next/server"; import { auth } from "@/lib/auth"; import { prisma } from "@/lib/prisma"; import { CharacterClass } from "@/prisma/generated/prisma/enums"; export async function GET() { try { const session = await auth(); if (!session?.user) { return NextResponse.json({ error: "Non authentifié" }, { status: 401 }); } const user = await prisma.user.findUnique({ where: { id: session.user.id }, select: { id: true, email: true, username: true, avatar: true, bio: true, characterClass: true, hp: true, maxHp: true, xp: true, maxXp: true, level: true, score: true, createdAt: true, }, }); if (!user) { return NextResponse.json( { error: "Utilisateur non trouvé" }, { status: 404 } ); } return NextResponse.json(user); } catch (error) { console.error("Error fetching profile:", error); return NextResponse.json( { error: "Erreur lors de la récupération du profil" }, { status: 500 } ); } } export async function PUT(request: Request) { try { const session = await auth(); if (!session?.user) { return NextResponse.json({ error: "Non authentifié" }, { status: 401 }); } const body = await request.json(); const { username, avatar, bio, characterClass } = body; // Validation if (username !== undefined) { if (typeof username !== "string" || username.trim().length === 0) { return NextResponse.json( { error: "Le nom d'utilisateur ne peut pas être vide" }, { status: 400 } ); } if (username.length < 3 || username.length > 20) { return NextResponse.json( { error: "Le nom d'utilisateur doit contenir entre 3 et 20 caractères", }, { status: 400 } ); } // Vérifier si le username est déjà pris par un autre utilisateur const existingUser = await prisma.user.findFirst({ where: { username: username.trim(), NOT: { id: session.user.id }, }, }); if (existingUser) { return NextResponse.json( { error: "Ce nom d'utilisateur est déjà pris" }, { status: 400 } ); } } // Validation bio if (bio !== undefined && bio !== null) { if (typeof bio !== "string") { return NextResponse.json( { error: "La bio doit être une chaîne de caractères" }, { status: 400 } ); } if (bio.length > 500) { return NextResponse.json( { error: "La bio ne peut pas dépasser 500 caractères" }, { status: 400 } ); } } // Validation characterClass const validClasses = [ "WARRIOR", "MAGE", "ROGUE", "RANGER", "PALADIN", "ENGINEER", "MERCHANT", "SCHOLAR", "BERSERKER", "NECROMANCER", ]; if (characterClass !== undefined && characterClass !== null) { if (!validClasses.includes(characterClass)) { return NextResponse.json( { error: "Classe de personnage invalide" }, { status: 400 } ); } } // Mettre à jour l'utilisateur const updateData: { username?: string; avatar?: string | null; bio?: string | null; characterClass?: CharacterClass | null; } = {}; if (username !== undefined) { updateData.username = username.trim(); } if (avatar !== undefined) { updateData.avatar = avatar || null; } if (bio !== undefined) { updateData.bio = bio === null ? null : bio.trim() || null; } if (characterClass !== undefined) { updateData.characterClass = (characterClass as CharacterClass) || null; } const updatedUser = await prisma.user.update({ where: { id: session.user.id }, data: updateData, select: { id: true, email: true, username: true, avatar: true, bio: true, characterClass: true, hp: true, maxHp: true, xp: true, maxXp: true, level: true, score: true, }, }); return NextResponse.json(updatedUser); } catch (error) { console.error("Error updating profile:", error); return NextResponse.json( { error: "Erreur lors de la mise à jour du profil" }, { status: 500 } ); } }