where('status', 'registration_open') ->first(); if ($event === null) { abort(404, 'Event not found or not accepting registrations.'); } $festivalEvent = $event->isSubEvent() ? $event->parent : $event; if ($festivalEvent->isFestival() || $festivalEvent->hasChildren()) { // Festival: get child event sections only (skip parent operational sections) $childIds = Event::where('parent_event_id', $festivalEvent->id)->pluck('id'); $sections = FestivalSection::whereIn('event_id', $childIds) ->where('show_in_registration', true) ->where('type', 'standard') ->select('id', 'name', 'category', 'icon', 'registration_description') ->orderBy('category') ->orderBy('sort_order') ->get() ->unique('name') ->values(); } else { // Flat event: all sections of the event $sections = FestivalSection::where('event_id', $festivalEvent->id) ->where('show_in_registration', true) ->where('type', 'standard') ->select('id', 'name', 'category', 'icon', 'registration_description') ->orderBy('category') ->orderBy('sort_order') ->get(); } $timeSlots = $festivalEvent->getAllRelevantTimeSlots() ->where('person_type', 'VOLUNTEER') ->values(); return response()->json([ 'data' => [ 'event' => [ 'id' => $festivalEvent->id, 'name' => $festivalEvent->name, 'start_date' => $festivalEvent->start_date->toDateString(), 'end_date' => $festivalEvent->end_date->toDateString(), 'organisation_id' => $festivalEvent->organisation_id, ], 'sections' => $sections->map(fn (FestivalSection $section) => [ 'id' => $section->id, 'name' => $section->name, 'category' => $section->category, 'icon' => $section->icon, 'registration_description' => $section->registration_description, ]), 'time_slots' => $timeSlots->map(fn (TimeSlot $slot) => [ 'id' => $slot->id, 'name' => $slot->name, 'date' => $slot->date->toDateString(), 'start_time' => $slot->start_time, 'end_time' => $slot->end_time, 'duration_hours' => $slot->duration_hours, ]), ], ]); } }