| 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 } |
| ); |
| } |
|
|
| |
| 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]; |
|
|
| |
| const hasVoted = currentRound.guesses.some( |
| (g) => g.guesserId === parseInt(userId) |
| ); |
| if (hasVoted) { |
| return NextResponse.json( |
| { error: "Vous avez déjà voté" }, |
| { status: 400 } |
| ); |
| } |
|
|
| |
| await prisma.guess.create({ |
| data: { |
| gameRoundId: currentRound.id, |
| guesserId: parseInt(userId), |
| guessedId: parseInt(votedPlayerId), |
| isCorrect: |
| parseInt(votedPlayerId) === group.gameState.stolenVoicePlayerId, |
| }, |
| }); |
|
|
| |
| const totalVotes = currentRound.guesses.length + 1; |
| if (totalVotes === group.members.length) { |
| |
| const votes = await prisma.guess.groupBy({ |
| by: ["guessedId"], |
| where: { |
| gameRoundId: currentRound.id, |
| }, |
| _count: { |
| guessedId: true, |
| }, |
| }); |
|
|
| |
| const mostVotedPlayer = votes.reduce((prev, current) => |
| current._count.guessedId > prev._count.guessedId ? current : prev |
| ); |
|
|
| if (mostVotedPlayer.guessedId === group.gameState.stolenVoicePlayerId) { |
| |
| await prisma.gameState.update({ |
| where: { id: group.gameState.id }, |
| data: { |
| status: "FINISHED", |
| endedAt: new Date(), |
| winnerId: null, |
| }, |
| }); |
| } else { |
| |
| 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 }); |
| } |
| } |
|
|