From 9522cd39c0f3515c64346e84ad251a0f82f2bf71 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Fri, 20 Jun 2025 23:52:31 +0200 Subject: [PATCH] allow users to view their own unpublished result --- app/Http/Controllers/TournamentController.php | 4 ++-- app/Models/Round.php | 6 ++++-- resources/js/components/results/DetailDialog.js | 6 +++--- resources/js/components/results/Item.js | 6 +++--- resources/js/helpers/permissions.js | 7 +++++++ 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/TournamentController.php b/app/Http/Controllers/TournamentController.php index 72947ca..eb4d048 100644 --- a/app/Http/Controllers/TournamentController.php +++ b/app/Http/Controllers/TournamentController.php @@ -38,7 +38,7 @@ class TournamentController extends Controller try { $this->authorize('seeResults', $round); } catch (AuthorizationException) { - $round->hideResults(); + $round->hideResults($request->user()); } } $json = $tournament->toArray(); @@ -97,7 +97,7 @@ class TournamentController extends Controller try { $this->authorize('seeResults', $round); } catch (AuthorizationException) { - $round->hideResults(); + $round->hideResults($request->user()); } } return $rounds->toArray(); diff --git a/app/Models/Round.php b/app/Models/Round.php index fb78af1..68dee71 100644 --- a/app/Models/Round.php +++ b/app/Models/Round.php @@ -101,9 +101,11 @@ class Round extends Model } - public function hideResults() { + public function hideResults(User $user = null) { foreach ($this->results as $result) { - $result->makeHidden(['forfeit', 'placement', 'score', 'time']); + if (!$user || $result->user_id != $user->id) { + $result->makeHidden(['forfeit', 'placement', 'score', 'time']); + } } } diff --git a/resources/js/components/results/DetailDialog.js b/resources/js/components/results/DetailDialog.js index 5739bbf..60e6b74 100644 --- a/resources/js/components/results/DetailDialog.js +++ b/resources/js/components/results/DetailDialog.js @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next'; import Box from '../users/Box'; import { getTime } from '../../helpers/Result'; -import { maySeeResults } from '../../helpers/permissions'; +import { maySeeResult } from '../../helpers/permissions'; import { findResult } from '../../helpers/User'; import { useUser } from '../../hooks/user'; @@ -27,8 +27,8 @@ const DetailDialog = ({ [round, user], ); const maySee = React.useMemo( - () => maySeeResults(authUser, tournament, round), - [authUser, round, tournament], + () => maySeeResult(authUser, tournament, round, result), + [authUser, result, round, tournament], ); return diff --git a/resources/js/components/results/Item.js b/resources/js/components/results/Item.js index 2e29d75..a95bffe 100644 --- a/resources/js/components/results/Item.js +++ b/resources/js/components/results/Item.js @@ -7,7 +7,7 @@ import DetailDialog from './DetailDialog'; import Icon from '../common/Icon'; import Box from '../users/Box'; import { getIcon, getTime } from '../../helpers/Result'; -import { maySeeResults } from '../../helpers/permissions'; +import { maySeeResult } from '../../helpers/permissions'; import { findResult } from '../../helpers/User'; import { useUser } from '../../hooks/user'; @@ -64,8 +64,8 @@ const Item = ({ [round, user], ); const maySee = React.useMemo( - () => maySeeResults(authUser, tournament, round), - [authUser, round, tournament], + () => maySeeResult(authUser, tournament, round, result), + [authUser, result, round, tournament], ); return
diff --git a/resources/js/helpers/permissions.js b/resources/js/helpers/permissions.js index 9515417..f1be876 100644 --- a/resources/js/helpers/permissions.js +++ b/resources/js/helpers/permissions.js @@ -174,6 +174,13 @@ export const maySeeResults = (user, tournament, round) => { return false; }; +export const maySeeResult = (user, tournament, round, result) => { + if (user && result && user.id === result.user_id) { + return true; + } + return maySeeResults(user, tournament, round); +}; + // Twitch export const mayManageTwitchBot = user => isAnyChannelAdmin(user); -- 2.39.5