162 lines
4.4 KiB
TypeScript
162 lines
4.4 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|
|
|