attributes->get('user'); $request->validate([ 'state' => ['sometimes', Rule::in(array_map(fn ($s) => $s->value, EventState::cases()))], ]); $states = $request->query('state') ? [$request->query('state')] : EventState::nonTerminalValues(); return response()->json(['events' => $user->liveEvents($states)->get()->map(EventPresenter::forUser(...))->values()]); } public function ack(Request $request, int $event): JsonResponse { $model = $this->own($request, $event); $this->actions->ack($model); return response()->json(EventPresenter::forUser($model->fresh('source'))); } public function done(Request $request, int $event): JsonResponse { $model = $this->own($request, $event); $this->actions->done($model); return response()->json(EventPresenter::forUser($model->fresh('source'))); } public function store(Request $request): JsonResponse { /** @var User $user */ $user = $request->attributes->get('user'); $data = $request->validate([ 'title' => ['required', 'string', 'max:200'], 'subtitle' => ['sometimes', 'nullable', 'string', 'max:200'], 'due_date' => ['required', 'date_format:Y-m-d'], 'due_time' => ['sometimes', 'nullable', 'date_format:H:i'], ]); $event = $this->manual->create($user, [ 'title' => $data['title'], 'subtitle' => $data['subtitle'] ?? null, 'due_at' => $data['due_date'].(empty($data['due_time']) ? '' : 'T'.$data['due_time']), ]); return response()->json(EventPresenter::forUser($event), 201); } public function archive(Request $request): JsonResponse { /** @var User $user */ $user = $request->attributes->get('user'); return response()->json(['events' => $user->archive()->get()->map(fn (Event $e) => EventPresenter::forUser($e) + [ 'closed_as' => EventPresenter::closedAs($e), ])->values()]); } private function own(Request $request, int $id): Event { /** @var User $user */ $user = $request->attributes->get('user'); return $user->ownEvent($id); } }