|
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 }); |
|
} |
|
} |
|
|