first commit

This commit is contained in:
2026-02-18 19:54:52 +07:00
commit 8e070562cb
101 changed files with 13462 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
<?php
declare(strict_types=1);
namespace App\Pipelines;
use App\Contracts\FilterFactoryInterface;
use App\Contracts\QueryFilterPipelineInterface;
use App\Contracts\RequestFilterInterface;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Contracts\Pipeline\Pipeline;
use InvalidArgumentException;
use Log;
use Throwable;
final readonly class QueryFilterPipeline implements QueryFilterPipelineInterface
{
public function __construct(private Pipeline $pipeline, private FilterFactoryInterface $factory)
{
}
/**
* @inheritDoc
*/
public function applyFilters(Builder $builder, RequestFilterInterface $filterRequest): LengthAwarePaginator
{
$perPage = $filterRequest->perPage();
$perPage ??= config('filters.pagination.per_page', 15);
$maxPerPage = config('filters.pagination.max_per_page', 50);
if ($perPage > $maxPerPage) {
throw new InvalidArgumentException(
sprintf('per_page cannot exceed %d', $maxPerPage)
);
}
try {
$values = $filterRequest->values();
$filters = collect($filterRequest->filters())
->map(fn($name) => $this->factory->make($name, $values))
->filter()
->values()
->all();
$builder = $this->pipeline
->send($builder)
->through($filters)
->thenReturn();
} catch (Throwable $e) {
Log::error('Pipeline execution failed', [
'error' => $e->getMessage(),
]);
throw $e;
}
/**
* @var Builder $builder
*/
return $builder->paginate($perPage);
}
}