validate([ 'after' => 'nullable|date', 'before' => 'nullable|date', 'order' => 'nullable|string', 'with' => 'nullable|array', 'with.*' => 'string', ]); $events = Event::where('visible', '=', true); if (isset($validatedData['before'])) { $events = $events->where(function ($query) use ($validatedData) { $query->whereNull('start'); $query->orWhere('start', '<', $validatedData['before']); }); } if (isset($validatedData['after'])) { $events = $events->where(function ($query) use ($validatedData) { $query->whereNull('end'); $query->orWhere('end', '>', $validatedData['after']); }); } if (isset($validatedData['order'])) { switch ($validatedData['order']) { case 'recency': $events->orderByRaw('start IS NOT NULL'); $events->orderByRaw('end IS NOT NULL'); $events->orderBy('end', 'DESC'); $events->orderBy('start', 'DESC'); $events->orderBy('name', 'ASC'); break; } } if (isset($validatedData['with'])) { if (in_array('description', $validatedData['with'])) { $events->with('description'); } } return $events->get()->toJson(); } public function single(Request $request, Event $event) { $this->authorize('view', $event); $event->load('description'); return $event->toJson(); } }