Skrytí osobních údajů #1

Nezobrazovat detail logu anonymnímu uživateli #2
This commit is contained in:
Zdeněk Burda
2026-01-10 12:50:45 +01:00
parent 41e3ce6f25
commit 1e484aef47
7 changed files with 419 additions and 203 deletions

View File

@@ -7,6 +7,7 @@ use App\Models\LogQso;
use App\Models\EvaluationRun;
use App\Models\QsoOverride;
use App\Models\QsoResult;
use App\Models\Round;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
@@ -86,6 +87,8 @@ class LogController extends BaseController
*/
public function show(Request $request, Log $log): JsonResponse
{
$this->authorize('view', $log);
$includeQsos = $request->boolean('include_qsos', false);
$relations = ['round', 'file'];
if ($includeQsos) {
@@ -96,11 +99,54 @@ class LogController extends BaseController
return response()->json($log);
}
/**
* Veřejný detail logu pouze ne-citlivá hlavička + deklarované výsledky.
*/
public function publicShow(Request $request, Log $log): JsonResponse
{
$log->load(['round']);
if (! $this->hasOfficialResultsPublished($log->round)) {
return response()->json([
'message' => 'Detail logu bude dostupný po zveřejnění finálních výsledků.',
], 403);
}
return response()->json([
'id' => $log->id,
'round_id' => $log->round_id,
'tname' => $log->tname,
'tdate' => $log->tdate,
'pcall' => $log->pcall,
'pband' => $log->pband,
'psect' => $log->psect,
'power_watt' => $log->power_watt,
'sante' => $log->sante,
'santh' => $log->santh,
'stxeq' => $log->stxeq,
'srxeq' => $log->srxeq,
'claimed_qso_count' => $log->claimed_qso_count,
'claimed_score' => $log->claimed_score,
'claimed_wwl' => $log->claimed_wwl,
'claimed_dxcc' => $log->claimed_dxcc,
'round' => $log->round ? [
'id' => $log->round->id,
'contest_id' => $log->round->contest_id,
'name' => $log->round->name,
'start_time' => $log->round->start_time,
'end_time' => $log->round->end_time,
'logs_deadline' => $log->round->logs_deadline,
] : null,
]);
}
/**
* QSO tabulka pro log: raw QSO + výsledky vyhodnocení + případné overrides.
*/
public function qsoTable(Request $request, Log $log): JsonResponse
{
$this->authorize('view', $log);
$evalRunId = $request->filled('evaluation_run_id')
? (int) $request->get('evaluation_run_id')
: null;
@@ -341,4 +387,17 @@ class LogController extends BaseController
'raw_header' => ['sometimes', 'nullable', 'string'],
]);
}
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();
}
}

View File

@@ -8,6 +8,16 @@ use Illuminate\Auth\Access\Response;
class LogPolicy
{
public function viewAny(User $user): bool
{
return (bool) $user->is_admin;
}
public function view(User $user, Log $log): bool
{
return (bool) $user->is_admin;
}
public function create(User $user): bool
{
return (bool) $user->is_admin;