Nezobrazovat detail logu anonymnímu uživateli #2 - i v tabulce s deklarovanými výsledky byl lokátor a utíkaly informace závodníkům před uzávěrkou.

This commit is contained in:
Zdeněk Burda
2026-01-10 13:19:44 +01:00
parent 1e484aef47
commit cdc1082ae8
4 changed files with 287 additions and 60 deletions

View File

@@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use App\Models\LogResult;
use App\Models\Log;
use App\Models\EvaluationRun;
use App\Models\Round;
use Illuminate\Http\Request;
@@ -35,7 +36,7 @@ class LogResultController extends BaseController
$query = LogResult::query()
->with([
'evaluationRun.ruleSet:id,sixhr_ranking_mode',
'log',
'log.round',
'band:id,name,order',
'category:id,name,order',
'powerCategory:id,name,order',
@@ -116,6 +117,16 @@ class LogResultController extends BaseController
->orderByDesc('official_score')
->paginate($perPage);
if ($this->shouldRedactDeclaredResults($request)) {
$items->getCollection()->transform(function (LogResult $item) {
if ($item->log) {
$item->log->pwwlo = null;
$item->log->codxc = null;
}
return $item;
});
}
return response()->json($items);
}
@@ -149,12 +160,20 @@ class LogResultController extends BaseController
{
$logResult->load([
'evaluationRun.ruleSet:id,sixhr_ranking_mode',
'log',
'log.round',
'band:id,name,order',
'category:id,name,order',
'powerCategory:id,name,order',
]);
$request = request();
if ($this->shouldRedactDeclaredResults($request, $logResult)) {
if ($logResult->log) {
$logResult->log->pwwlo = null;
$logResult->log->codxc = null;
}
}
return response()->json($logResult);
}
@@ -236,4 +255,51 @@ class LogResultController extends BaseController
'status_reason' => ['sometimes', 'nullable', 'string'],
]);
}
private function shouldRedactDeclaredResults(Request $request, ?LogResult $logResult = null): bool
{
$user = $request->user();
if ($user && $user->is_admin) {
return false;
}
if ($logResult) {
$run = $logResult->evaluationRun;
$isClaimed = $run && strtoupper((string) $run->rules_version) === 'CLAIMED';
if (! $isClaimed) {
return false;
}
return ! $this->hasOfficialResultsPublished($logResult->log?->round);
}
if ($request->get('status') !== 'CLAIMED') {
return false;
}
$round = null;
if ($request->filled('round_id')) {
$round = Round::find((int) $request->get('round_id'));
} elseif ($request->filled('evaluation_run_id')) {
$run = EvaluationRun::find((int) $request->get('evaluation_run_id'));
$round = $run?->round;
} elseif ($request->filled('log_id')) {
$log = Log::with('round')->find((int) $request->get('log_id'));
$round = $log?->round;
}
return ! $this->hasOfficialResultsPublished($round);
}
private function hasOfficialResultsPublished(?Round $round): bool
{
if (! $round || ! $round->official_evaluation_run_id) {
return false;
}
return EvaluationRun::query()
->where('id', $round->official_evaluation_run_id)
->where('status', 'SUCCEEDED')
->where('result_type', 'FINAL')
->exists();
}
}