tracks()->orderBy('sort')->orderBy('id')->get()->map(fn (CompetitionTrack $t) => $this->toArray($t)); return response()->json([ 'data' => $tracks, ]); } public function store(StoreCompetitionTrackRequest $request, Competition $competition): JsonResponse { /** @var array $validated */ $validated = $request->validated(); /** @var CompetitionTrack $track */ $track = $competition->tracks()->create($validated); return response()->json($this->toArray($track), 201); } public function show(Competition $competition, CompetitionTrack $track): JsonResponse { return response()->json($this->ensureTrackBelongsAndReturn($competition, $track)); } public function update(UpdateCompetitionTrackRequest $request, Competition $competition, CompetitionTrack $track): JsonResponse { $this->ensureTrackBelongs($competition, $track); $track->fill($request->validated()); $track->save(); return response()->json($this->toArray($track)); } public function destroy(Competition $competition, CompetitionTrack $track): Response { $this->ensureTrackBelongs($competition, $track); $track->delete(); return response()->noContent(); } /** * @return array */ private function toArray(CompetitionTrack $track): array { return [ 'id' => $track->id, 'competition_id' => $track->competition_id, 'track_code' => $track->track_code, 'title' => $track->title, 'description' => $track->description, 'sort' => $track->sort, 'is_enabled' => $track->is_enabled, 'created_at' => $track->created_at?->toIso8601String(), 'updated_at' => $track->updated_at?->toIso8601String(), ]; } /** * @return array */ private function ensureTrackBelongsAndReturn(Competition $competition, CompetitionTrack $track): array { $this->ensureTrackBelongs($competition, $track); return $this->toArray($track); } private function ensureTrackBelongs(Competition $competition, CompetitionTrack $track): void { if ($track->competition_id !== $competition->id) { abort(404); } } }