attributes->get('source'); return response()->json(['events' => $this->upserter->upsert($source, $request->items())]); } public function show(Request $request): JsonResponse { $event = $this->lookup($request); return response()->json(EventPresenter::forClient($event)); } public function destroy(Request $request): Response { $this->upserter->withdraw($this->lookup($request)); return response()->noContent(); } private function lookup(Request $request): Event { $request->validate(['source_ref' => ['required', 'string'], 'topic' => ['sometimes', 'nullable', 'string']]); /** @var Source $source */ $source = $request->attributes->get('source'); $event = $this->upserter->find($source, $request->query('source_ref'), (string) $request->query('topic', '')); abort_if($event === null, 404, 'Событие не найдено'); return $event; } }