modelName = Recipe::modelName(); $this->modelPage = Recipe::modelPage(); } public function index(IndexRecipeRequest $request): Response { $this->authorize('viewAny', Recipe::class); /** @var \Illuminate\Database\Eloquent\Builder<\App\Models\Recipe> $query */ $query = Recipe::query(); if ($request->routeIs('back.recipes.trash')) { $query = $query->onlyTrashed(); } $searchValue = $request->getSearchValue(); if ($searchValue) { $this->searchQuery( $query, $searchValue, null, 'name' ); } $searchFields = \implode(', ', [ trans('validation.attributes.name'), ]); $this->sortQuery($query); $paginatedModels = $this->paginate($query); return $this->inertiaRender('back/Pages/Recipes/Index', [ 'paginatedModels' => CommonResource::collection($paginatedModels), 'search' => $searchValue, 'searchFields' => $searchFields, 'enumProductCategory' => ProductCategory::toArray(), 'enumConsumptionTime' => ConsumptionTime::toArray(), 'enumInspiration' => Inspiration::toArray(), 'enumSeason' => Season::toArray(), ]); } public function show(Recipe $recipe): RedirectResponse { $this->authorize('viewAny', Recipe::class); return redirect()->route('back.recipes.edit', $recipe); } public function create(Recipe $recipe, GetProductsSummariesQuery $getProductsSummaries): Response { $this->authorize('create', Recipe::class); $productSummaries = $this->executor->execute($getProductsSummaries, QueryInputEmpty::create()); return $this->inertiaRender('back/Pages/Recipes/Create', [ 'data' => CommonResource::make($recipe), 'enumProductCategory' => ProductCategory::toArray(), 'enumConsumptionTime' => ConsumptionTime::toArray(), 'enumInspiration' => Inspiration::toArray(), 'enumSeason' => Season::toArray(), 'allProducts' => $productSummaries->toArray(), ]); } public function store(StoreRecipeRequest $request, CreateRecipe $createRecipe): RedirectResponse { $this->authorize('create', Recipe::class); $result = $this->executor->execute($createRecipe, $request->toCreateRecipeInput()); return match (true) { $result instanceof RecipeId => redirect()->route('back.recipes.edit', $result) ->with('success', trans('uwil-backend::crud.messages.has_been_created', [ 'model' => Str::ucfirst(trans_choice('models.classes.recipe', 1)), ])), default => redirect()->back() ->with('error', trans('uwil-backend::crud.messages.cannot_be_created', [ 'model' => Str::ucfirst(trans_choice('models.classes.recipe', 1)), ])), }; } public function edit(Recipe $recipe, GetProductsSummariesQuery $getProductsSummaries): Response { $this->authorize('update', $recipe); $recipe->load('products'); $productSummaries = $this->executor->execute($getProductsSummaries, QueryInputEmpty::create()); return $this->inertiaRender('back/Pages/Recipes/Edit', [ 'data' => CommonResource::make($recipe), 'enumProductCategory' => ProductCategory::toArray(), 'enumConsumptionTime' => ConsumptionTime::toArray(), 'enumInspiration' => Inspiration::toArray(), 'enumSeason' => Season::toArray(), 'allProducts' => $productSummaries->toArray(), ]); } public function update( UpdateRecipeRequest $request, Recipe $recipe, UpdateRecipe $updateRecipe, ): RecipeDto { $this->authorize('update', $recipe); $result = $this->executor->execute($updateRecipe, $request->toUpdateRecipeInput($recipe)); if (! $result instanceof RecipeDto) { abort(500, trans('uwil-backend::crud.messages.cannot_be_updated', [ 'model' => Str::ucfirst(trans_choice('models.classes.recipe', 1)), ])); } return $result; } public function duplicate(Recipe $recipe, GetProductsSummariesQuery $getProductsSummaries): Response { $this->authorize('duplicate', $recipe); return $this->create($recipe->replicate(), $getProductsSummaries); } public function restore(string $id, RestoreRecipe $restoreRecipe): RedirectResponse { $recipe = Recipe::withTrashed()->findOrFail($id); $this->authorize('restore', $recipe); $previousQueries = $this->getPreviousQueries(); $result = $this->executor->execute($restoreRecipe, new RestoreRecipeInput($recipe->getId())); return match (true) { $result instanceof RecipeId => redirect()->route('back.recipes.trash', $previousQueries) ->with('success', trans('uwil-backend::crud.messages.has_been_restored', [ 'model' => Str::ucfirst(trans_choice('models.classes.recipe', 1)), ])), default => redirect()->back() ->with('error', trans('uwil-backend::crud.messages.cannot_be_restored', [ 'model' => Str::ucfirst(trans_choice('models.classes.recipe', 1)), ])), }; } public function destroy(Recipe $recipe, DeleteRecipe $deleteRecipe): RedirectResponse { $this->authorize('delete', $recipe); $previousQueries = $this->getPreviousQueries(); $result = $this->executor->execute($deleteRecipe, new DeleteRecipeInput($recipe->getId())); return match (true) { $result instanceof RecipeId => redirect()->route('back.recipes.index', $previousQueries) ->with('success', trans('uwil-backend::crud.messages.has_been_deleted', [ 'model' => Str::ucfirst(trans_choice('models.classes.recipe', 1)), ])), default => redirect()->back() ->with('error', trans('uwil-backend::crud.messages.cannot_be_deleted', [ 'model' => Str::ucfirst(trans_choice('models.classes.recipe', 1)), ])), }; } public function forceDestroy(string $id, ForceDeleteRecipe $forceDeleteRecipe): RedirectResponse { $recipe = Recipe::withTrashed()->findOrFail($id); $this->authorize('forceDelete', $recipe); $previousQueries = $this->getPreviousQueries(); $result = $this->executor->execute($forceDeleteRecipe, new ForceDeleteRecipeInput($recipe->getId())); return match (true) { $result instanceof RecipeId => redirect()->route('back.recipes.trash', $previousQueries) ->with('success', trans('uwil-backend::crud.messages.has_been_deleted', [ 'model' => Str::ucfirst(trans_choice('models.classes.recipe', 1)), ])), default => redirect()->back() ->with('error', trans('uwil-backend::crud.messages.cannot_be_deleted', [ 'model' => Str::ucfirst(trans_choice('models.classes.recipe', 1)), ])), }; } /** @return array> */ private function getPreviousQueries(): array { $previousQueries = []; $previousQueryString = \parse_url($this->getPreviousUrl(), \PHP_URL_QUERY) ?? '' ?: ''; \parse_str($previousQueryString, $previousQueries); return $previousQueries; } private function getPreviousUrl(): string { return url()->previous(route('back.dashboard.index')); } }