Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BCrwHHnGCB5XH968Nxokqw
54 lines
1.6 KiB
PHP
54 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Enums\EventState;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\UpsertEventsRequest;
|
|
use App\Ingest\EventUpserter;
|
|
use App\Models\Event;
|
|
use App\Models\Source;
|
|
use App\Presenters\EventPresenter;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Response;
|
|
|
|
class EventsController extends Controller
|
|
{
|
|
public function __construct(private readonly EventUpserter $upserter) {}
|
|
|
|
public function upsert(UpsertEventsRequest $request): JsonResponse
|
|
{
|
|
/** @var Source $source */
|
|
$source = $request->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
|
|
{
|
|
$event = $this->lookup($request);
|
|
$event->update(['state' => EventState::Withdrawn]);
|
|
|
|
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;
|
|
}
|
|
}
|