dcrey7's picture
Upload 522 files
811126d verified
import { NextRequest, NextResponse } from "next/server";
import prisma from "@/lib/prisma";
export async function POST(
request: NextRequest,
{ params }: { params: { inviteCode: string } }
) {
try {
const { inviteCode } = await params;
const { userId, votedPlayerId } = await request.json();
if (!userId || !votedPlayerId) {
return NextResponse.json(
{ error: "ID utilisateur et ID du joueur voté requis" },
{ status: 400 }
);
}
// Récupérer le groupe et son état
const group = await prisma.group.findUnique({
where: { inviteCode },
include: {
members: true,
gameState: {
include: {
rounds: {
orderBy: {
roundNumber: "desc",
},
take: 1,
include: {
guesses: true,
},
},
},
},
},
});
if (!group || !group.gameState) {
return NextResponse.json(
{ error: "Groupe ou partie non trouvé" },
{ status: 404 }
);
}
const currentRound = group.gameState.rounds[0];
// Vérifier que le joueur n'a pas déjà voté
const hasVoted = currentRound.guesses.some(
(g) => g.guesserId === parseInt(userId)
);
if (hasVoted) {
return NextResponse.json(
{ error: "Vous avez déjà voté" },
{ status: 400 }
);
}
// Enregistrer le vote
await prisma.guess.create({
data: {
gameRoundId: currentRound.id,
guesserId: parseInt(userId),
guessedId: parseInt(votedPlayerId),
isCorrect:
parseInt(votedPlayerId) === group.gameState.stolenVoicePlayerId,
},
});
// Vérifier si tout le monde a voté
const totalVotes = currentRound.guesses.length + 1; // +1 pour le vote qu'on vient d'ajouter
if (totalVotes === group.members.length) {
// Compter les votes
const votes = await prisma.guess.groupBy({
by: ["guessedId"],
where: {
gameRoundId: currentRound.id,
},
_count: {
guessedId: true,
},
});
// Trouver le joueur le plus voté
const mostVotedPlayer = votes.reduce((prev, current) =>
current._count.guessedId > prev._count.guessedId ? current : prev
);
if (mostVotedPlayer.guessedId === group.gameState.stolenVoicePlayerId) {
// Les joueurs ont gagné
await prisma.gameState.update({
where: { id: group.gameState.id },
data: {
status: "FINISHED",
endedAt: new Date(),
winnerId: null, // Victoire de l'équipe
},
});
} else {
// Commencer un nouveau round
await prisma.gameRound.create({
data: {
gameStateId: group.gameState.id,
roundNumber: currentRound.roundNumber + 1,
},
});
await prisma.gameState.update({
where: { id: group.gameState.id },
data: {
status: "ANSWERS",
},
});
}
}
return NextResponse.json({ success: true });
} catch (error) {
console.error("Erreur lors de l'enregistrement du vote:", error);
return NextResponse.json({ error: "Erreur serveur" }, { status: 500 });
}
}