<?php namespace App\Form\Actions; use App\Form\Models\Form; use App\Form\Models\Participant; use App\Form\Resources\ParticipantResource; use App\Form\Scopes\ParticipantFilterScope; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Http\Resources\Json\AnonymousResourceCollection; use Illuminate\Pagination\LengthAwarePaginator; use Lorisleiva\Actions\Concerns\AsAction; class ParticipantIndexAction { use AsAction; /** * @return HasMany<Participant> */ protected function getQuery(Form $form, ParticipantFilterScope $filter): HasMany { return $form->participants()->withFilter($filter)->withCount('children')->with('form'); } /** * @return LengthAwarePaginator<Participant> */ public function handle(Form $form, ParticipantFilterScope $filter): LengthAwarePaginator { return $this->getQuery($form, $filter)->paginate(15); } public function asController(Form $form, ?int $parent = null): AnonymousResourceCollection { $filter = ParticipantFilterScope::fromRequest(request()->input('filter')); $data = match ($parent) { null => $this->handle($form, $filter), -1 => $this->getQuery($form, $filter)->where('parent_id', null)->paginate(15), default => $this->getQuery($form, $filter)->where('parent_id', $parent)->get(), }; return ParticipantResource::collection($data)->additional(['meta' => ParticipantResource::meta($form)]); } }