> * * phpcs:enable */ final readonly class GetFrontRecipesQuery implements Query { private const int PER_PAGE = 100; public function __construct( private RecipeDirectory $recipeDirectory, private PublicS3Disk $publicS3Disk, ) { } /** * @return LengthAwarePaginator */ public function __invoke(QueryInput $input): LengthAwarePaginator { Assert::isAOf($input, GetFrontRecipesQueryInput::class); // * Load all recipes for client-side display $allRecipes = []; $page = 1; do { $pagination = Pagination::ofPage($page, self::PER_PAGE); $paginatedRecipes = $this->recipeDirectory->getPaginatedRecipes( pagination: $pagination, productRanges: $input->categories, consumptionTimes: $input->consumptionTimes, inspirations: $input->inspirations, seasons: $input->seasons, search: $input->search ); foreach ($paginatedRecipes->items() as $recipe) { $allRecipes[] = RecipeDto::fromEntity($recipe, $this->publicS3Disk); } $page++; } while ($page <= $paginatedRecipes->lastPage()); return new LengthAwarePaginator( items: $allRecipes, total: count($allRecipes), perPage: max(1, count($allRecipes)), currentPage: 1, ); } }