middleware('auth:sanctum')->only(['store', 'update', 'destroy']); } /** * Seznam contest parametrů (stránkovaně). */ public function index(Request $request): JsonResponse { $perPage = (int) $request->get('per_page', 100); $items = ContestParameter::query() ->with('contest') ->orderBy('contest_id') ->orderBy('log_type') ->paginate($perPage); return response()->json($items); } /** * Vytvoření nových parametrů pro contest. * Autorizace přes ContestParameterPolicy@create. */ public function store(Request $request): JsonResponse { $this->authorize('create', ContestParameter::class); $data = $this->validateData($request); $item = ContestParameter::create($data); $item->load('contest'); return response()->json($item, 201); } /** * Detail parametrů. */ public function show(ContestParameter $contest_parameter): JsonResponse { $contest_parameter->load('contest'); return response()->json($contest_parameter); } /** * Aktualizace parametrů (partial update). * Autorizace přes ContestParameterPolicy@update. */ public function update(Request $request, ContestParameter $contest_parameter): JsonResponse { $this->authorize('update', $contest_parameter); $data = $this->validateData($request, partial: true); $contest_parameter->fill($data); $contest_parameter->save(); $contest_parameter->load('contest'); return response()->json($contest_parameter); } /** * Smazání parametrů. * Autorizace přes ContestParameterPolicy@delete. */ public function destroy(ContestParameter $contest_parameter): JsonResponse { $this->authorize('delete', $contest_parameter); $contest_parameter->delete(); return response()->json(null, 204); } /** * Validace vstupu pro store / update. */ protected function validateData(Request $request, bool $partial = false): array { $required = $partial ? 'sometimes' : 'required'; return $request->validate([ 'contest_id' => [$required, 'integer', 'exists:contests,id'], 'log_type' => [$required, 'in:STANDARD,CHECK'], 'ignore_slash_part' => [$required, 'boolean'], 'ignore_third_part' => [$required, 'boolean'], 'letters_in_rst' => [$required, 'boolean'], 'discard_qso_rec_diff_call' => [$required, 'boolean'], 'discard_qso_sent_diff_call' => [$required, 'boolean'], 'discard_qso_rec_diff_rst' => [$required, 'boolean'], 'discard_qso_sent_diff_rst' => [$required, 'boolean'], 'discard_qso_rec_diff_code' => [$required, 'boolean'], 'discard_qso_sent_diff_code' => [$required, 'boolean'], 'unique_qso' => [$required, 'boolean'], 'time_tolerance' => [$required, 'integer', 'min:0'], ]); } }