182 lines
4.5 KiB
TypeScript
182 lines
4.5 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|