festivalSections()->ordered()->get(); // For sub-events, also include cross_event sections from the parent festival if ($event->isSubEvent()) { $parentCrossEventSections = $event->parent ->festivalSections() ->where('type', 'cross_event') ->ordered() ->get(); $sections = $parentCrossEventSections->merge($sections)->sortBy('sort_order')->values(); } return FestivalSectionResource::collection($sections); } public function store(StoreFestivalSectionRequest $request, Event $event): JsonResponse { Gate::authorize('create', [FestivalSection::class, $event]); $data = $request->validated(); $redirectedToParent = false; if (($data['type'] ?? 'standard') === 'cross_event') { if ($event->isFlatEvent()) { return $this->error( 'Overkoepelende secties kunnen alleen worden aangemaakt bij festivals met programmaonderdelen.', 422, ); } if ($event->isSubEvent()) { $event = $event->parent; Gate::authorize('create', [FestivalSection::class, $event]); $redirectedToParent = true; } } $section = $event->festivalSections()->create($data); $response = $this->created(new FestivalSectionResource($section)); if ($redirectedToParent) { $original = $response->getData(true); $original['meta'] = [ 'redirected_to_parent' => true, 'parent_event_name' => $event->name, ]; return response()->json($original, 201); } return $response; } public function update(UpdateFestivalSectionRequest $request, Event $event, FestivalSection $section): JsonResponse { Gate::authorize('update', [$section, $event]); $section->update($request->validated()); return $this->success(new FestivalSectionResource($section->fresh())); } public function destroy(Event $event, FestivalSection $section): JsonResponse { Gate::authorize('delete', [$section, $event]); $section->delete(); return response()->json(null, 204); } public function reorder(ReorderFestivalSectionsRequest $request, Event $event): JsonResponse { Gate::authorize('reorder', [FestivalSection::class, $event]); foreach ($request->validated('sections') as $index => $id) { $event->festivalSections() ->where('id', $id) ->update(['sort_order' => $index]); } $sections = $event->festivalSections()->ordered()->get(); return $this->success(FestivalSectionResource::collection($sections)); } }