import { NextResponse } from "next/server"; import { prisma } from "@/lib/prisma"; import { CharacterClass } from "@/prisma/generated/prisma/enums"; export async function POST(request: Request) { try { const body = await request.json(); const { userId, username, avatar, bio, characterClass } = body; if (!userId) { return NextResponse.json( { error: "ID utilisateur requis" }, { status: 400 } ); } // Vérifier que l'utilisateur existe et a été créé récemment (dans les 10 dernières minutes) const user = await prisma.user.findUnique({ where: { id: userId }, }); if (!user) { return NextResponse.json( { error: "Utilisateur non trouvé" }, { status: 404 } ); } // Vérifier que le compte a été créé récemment (dans les 10 dernières minutes) const tenMinutesAgo = new Date(Date.now() - 10 * 60 * 1000); if (user.createdAt < tenMinutesAgo) { return NextResponse.json( { error: "Temps écoulé pour finaliser l'inscription" }, { status: 400 } ); } // Validation username 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: userId }, }, }); 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) { if (bio === null || bio === "") { updateData.bio = null; } else if (typeof bio === "string") { updateData.bio = bio.trim() || null; } else { updateData.bio = null; } } if (characterClass !== undefined) { updateData.characterClass = (characterClass as CharacterClass) || null; } // Si aucun champ à mettre à jour, retourner succès quand même if (Object.keys(updateData).length === 0) { return NextResponse.json({ message: "Profil finalisé avec succès", userId: user.id, }); } const updatedUser = await prisma.user.update({ where: { id: userId }, data: updateData, }); return NextResponse.json({ message: "Profil finalisé avec succès", userId: updatedUser.id, }); } catch (error) { console.error("Error completing registration:", error); const errorMessage = error instanceof Error ? error.message : "Erreur inconnue"; return NextResponse.json( { error: `Erreur lors de la finalisation de l'inscription: ${errorMessage}`, }, { status: 500 } ); } }