namespace App\Http\Controller\Animal;
use apivalk\apivalk\Http\Controller\Resource\AbstractListResourceController;
use apivalk\apivalk\Http\Request\ApivalkRequestInterface;
use apivalk\apivalk\Http\Response\AbstractApivalkResponse;
use apivalk\apivalk\Http\Response\Pagination\PagePaginationResponse;
use apivalk\apivalk\Http\Response\Resource\ResourceListResponse;
use apivalk\apivalk\Router\Route\Pagination\Pagination;
use apivalk\apivalk\Router\Route\Route;
use apivalk\apivalk\Security\RouteAuthorization;
use App\Domain\Animal\AnimalRepository;
use App\Resource\AnimalResource;
/**
* @extends AbstractListResourceController<AnimalResource>
*/
final class ListAnimalController extends AbstractListResourceController
{
/** @var AnimalRepository */
private $repository;
public function __construct(AnimalRepository $repository)
{
$this->repository = $repository;
}
public static function getResourceClass(): string
{
return AnimalResource::class;
}
// tags(), availableFilters(), availableSortings() are injected from AnimalResource automatically
protected static function buildRoute(): Route
{
return Route::get('/api/v1/animals')
->description('List animals')
->pagination(Pagination::page()->setMaxLimit(50))
->routeAuthorization(new RouteAuthorization('BearerAuth', ['animal'], ['animal:read']));
}
public function __invoke(ApivalkRequestInterface $request): AbstractApivalkResponse
{
$paginator = $request->paginator();
$filters = $request->filtering();
$sorting = $request->sorting();
$rows = $this->repository->findPage($filters, $sorting, $paginator);
$total = $this->repository->countForFilters($filters);
$resources = [];
foreach ($rows as $row) {
$resources[] = AnimalResource::byArray($row);
}
$totalPages = (int)\ceil($total / $paginator->getLimit());
return new ResourceListResponse(
$resources,
new PagePaginationResponse(
$paginator->getPage(),
$paginator->getLimit(),
$paginator->getPage() < $totalPages,
$totalPages
)
);
}
}