Files
animethemes-server/app/Http/Api/Parser/PagingParser.php
T
2025-10-01 17:18:31 -03:00

70 lines
1.6 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Api\Parser;
use App\Http\Api\Criteria\Paging\Criteria;
use App\Http\Api\Criteria\Paging\LimitCriteria;
use App\Http\Api\Criteria\Paging\OffsetCriteria;
use Illuminate\Support\Arr;
class PagingParser extends Parser
{
/**
* The parameter to parse.
*/
public static function param(): string
{
return 'page';
}
/**
* Parse paging from parameters.
*
* @return Criteria[]
*/
public static function parse(array $parameters): array
{
$criteria = [];
$pagingParam = Arr::get($parameters, static::param(), []);
$criteria[] = static::parseLimitCriteria($pagingParam);
$criteria[] = static::parseOffsetCriteria($pagingParam);
return $criteria;
}
/**
* Parse limit criteria instance from query string.
*/
protected static function parseLimitCriteria(array $pagingParam): LimitCriteria
{
$limit = Arr::get($pagingParam, LimitCriteria::PARAM);
$limit = filter_var($limit, FILTER_VALIDATE_INT);
if ($limit === false) {
$limit = Criteria::DEFAULT_SIZE;
}
return new LimitCriteria($limit);
}
/**
* Parse offset criteria instance from query string.
*/
protected static function parseOffsetCriteria(array $pagingParam): OffsetCriteria
{
$size = Arr::get($pagingParam, OffsetCriteria::SIZE_PARAM);
$size = filter_var($size, FILTER_VALIDATE_INT);
if ($size === false) {
$size = Criteria::DEFAULT_SIZE;
}
return new OffsetCriteria($size);
}
}