middleware('auth:sanctum')->only(['store', 'update', 'destroy']); } /** * Seznam override záznamů – lze filtrovat podle evaluation_run_id/log_qso_id. */ public function index(Request $request): JsonResponse { $perPage = (int) $request->get('per_page', 100); $query = QsoOverride::query() ->with(['evaluationRun', 'logQso', 'forcedMatchedLogQso', 'createdByUser']); if ($request->filled('evaluation_run_id')) { $query->where('evaluation_run_id', (int) $request->get('evaluation_run_id')); } if ($request->filled('log_qso_id')) { $query->where('log_qso_id', (int) $request->get('log_qso_id')); } $items = $query->orderByDesc('id')->paginate($perPage); return response()->json($items); } /** * Vytvoření override záznamu. */ public function store(Request $request): JsonResponse { $this->authorize('create', QsoOverride::class); $data = $this->validateData($request); if (! isset($data['created_by_user_id']) && $request->user()) { $data['created_by_user_id'] = $request->user()->id; } $item = QsoOverride::create($data); $item->load(['evaluationRun', 'logQso', 'forcedMatchedLogQso', 'createdByUser']); return response()->json($item, 201); } /** * Detail override záznamu. */ public function show(QsoOverride $qsoOverride): JsonResponse { $qsoOverride->load(['evaluationRun', 'logQso', 'forcedMatchedLogQso', 'createdByUser']); return response()->json($qsoOverride); } /** * Aktualizace override záznamu. */ public function update(Request $request, QsoOverride $qsoOverride): JsonResponse { $this->authorize('update', $qsoOverride); $data = $this->validateData($request, partial: true); $qsoOverride->fill($data); $qsoOverride->save(); $qsoOverride->load(['evaluationRun', 'logQso', 'forcedMatchedLogQso', 'createdByUser']); return response()->json($qsoOverride); } /** * Smazání override záznamu. */ public function destroy(QsoOverride $qsoOverride): JsonResponse { $this->authorize('delete', $qsoOverride); $qsoOverride->delete(); return response()->json(null, 204); } protected function validateData(Request $request, bool $partial = false): array { $required = $partial ? 'sometimes' : 'required'; return $request->validate([ 'evaluation_run_id' => [$required, 'integer', 'exists:evaluation_runs,id'], 'log_qso_id' => [$required, 'integer', 'exists:log_qsos,id'], 'forced_matched_log_qso_id' => ['sometimes', 'nullable', 'integer', 'exists:log_qsos,id'], 'forced_status' => [ 'sometimes', 'string', 'in:AUTO,VALID,INVALID,NIL,DUPLICATE,BUSTED_CALL,BUSTED_EXCHANGE,OUT_OF_WINDOW', ], 'forced_points' => ['sometimes', 'nullable', 'numeric'], 'forced_penalty' => ['sometimes', 'nullable', 'numeric'], 'reason' => ['sometimes', 'nullable', 'string', 'max:500'], 'context' => ['sometimes', 'nullable', 'array'], 'created_by_user_id' => ['sometimes', 'nullable', 'integer', 'exists:users,id'], ]); } }