where('status', 'registration_open') ->first(); if ($event === null) { abort(404, 'Event not found or not accepting registrations.'); } $festivalEvent = $event->isSubEvent() ? $event->parent : $event; $sectionQuery = FestivalSection::where('event_id', $festivalEvent->id) ->where(function ($query) { $query->where('type', '!=', 'cross_event') ->orWhereNull('type'); }) ->ordered(); if ($festivalEvent->isFestival()) { $childIds = $festivalEvent->children()->pluck('id'); $sectionQuery->orWhere(function ($query) use ($childIds) { $query->whereIn('event_id', $childIds) ->where(function ($q) { $q->where('type', '!=', 'cross_event') ->orWhereNull('type'); }); }); } $sections = $sectionQuery->get(['id', 'name', 'category', 'icon']); $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, ]), '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, ]), ], ]); } }