ldc-ovoteam/app/Http/Controllers/Front/RecipeController.php

80 lines
2.4 KiB
PHP
Raw Permalink Normal View History

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Front;
use App\Contracts\Directories\ProductDirectory;
use App\Contracts\Directories\RecipeDirectory;
use App\Http\Controllers\Controller;
use App\Http\Requests\Front\Recipes\IndexRecipeRequest;
use Domain\Models\Entities\Recipe;
use Domain\Models\ValueObjects\Pagination;
use Illuminate\Pagination\LengthAwarePaginator;
use Inertia\Inertia;
use Inertia\Response;
class RecipeController extends Controller
{
public function __construct(
private readonly RecipeDirectory $recipeDirectory,
private readonly ProductDirectory $productDirectory,
) {
}
public function index(IndexRecipeRequest $request): Response
{
$categories = $request->getCategories();
$consumptionTimes = $request->getConsumptionTimes();
$inspirations = $request->getInspirations();
$seasons = $request->getSeasons();
$search = $request->getSearchValue() ?? '';
// * Load all recipes for client-side display
$allRecipes = [];
$page = 1;
$perPage = 100;
do {
$pagination = Pagination::ofPage($page, $perPage);
$paginatedRecipes = $this->recipeDirectory->getPaginatedRecipes(
pagination: $pagination,
productRanges: $categories,
consumptionTimes: $consumptionTimes,
inspirations: $inspirations,
seasons: $seasons,
search: $search
);
foreach ($paginatedRecipes->items() as $recipe) {
$allRecipes[] = $recipe;
}
$page++;
} while ($page <= $paginatedRecipes->lastPage());
$mockedPaginatedRecipes = new LengthAwarePaginator(
items: $allRecipes,
total: count($allRecipes),
perPage: max(1, count($allRecipes)),
currentPage: 1,
);
return Inertia::render('front/Pages/Recipes/Index', [
'paginatedRecipes' => $mockedPaginatedRecipes,
]);
}
public function show(Recipe $recipe): Response
{
$relatedProducts = $this->productDirectory
->getRelatedProducts($recipe->id(), 10);
return Inertia::render('front/Pages/Recipes/Show', [
'recipe' => $recipe,
'relatedProducts' => $relatedProducts,
]);
}
}