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:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user