From 990c577764d2bf7337db3be97078c14b33ecdd44 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Sat, 29 Nov 2025 11:43:38 +0100 Subject: [PATCH] prevent group swapping to finished rounds --- app/Policies/RoundPolicy.php | 12 +++++++++++- resources/js/helpers/permissions.js | 8 +++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/Policies/RoundPolicy.php b/app/Policies/RoundPolicy.php index bd1f0e9..ba8c3ad 100644 --- a/app/Policies/RoundPolicy.php +++ b/app/Policies/RoundPolicy.php @@ -184,7 +184,17 @@ class RoundPolicy public function swapGroup(User $user, Round $round) { $result = $user->findResult($round); - return $result && !$round->locked; + if (!$result || $round->locked || $round->tournament->locked) { + return false; + } + $remaining = $round->tournament->rounds() + ->where('number', '=', $round->number) + ->where('group', '!=', $round->group) + ->whereDoesntHave('results', function ($query) use ($user) { + $query->where('user_id', '=', $user->id); + }) + ->count(); + return $remaining > 0; } } diff --git a/resources/js/helpers/permissions.js b/resources/js/helpers/permissions.js index 3b9356c..542d5a6 100644 --- a/resources/js/helpers/permissions.js +++ b/resources/js/helpers/permissions.js @@ -214,7 +214,13 @@ export const maySeeResult = (user, tournament, round, result) => { }; export const maySwapGroup = (user, tournament, round, result) => { - return user && result && tournament?.group_size > 1 && !tournament.locked && round && !round.locked; + if (!user || !result || tournament?.group_size <= 1 || tournament.locked || !tournament?.rounds || !round || round.locked) { + return false; + } + const remaining_rounds = tournament.rounds.filter( + (r) => r.number === round.number && r.group !== round.group && !User.findResult(user, r), + ); + return remaining_rounds.length > 0; }; export const mayModifyResults = (user, tournament, round) => { -- 2.47.3