This update introduces new routes for duplicating, restoring, and force deleting products and recipes, enhancing the management capabilities in the application.
233 lines
8.1 KiB
PHP
233 lines
8.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Controllers\Back;
|
|
|
|
use App\Http\Requests\Back\Products\IndexProductRequest;
|
|
use App\Http\Requests\Back\Products\StoreProductRequest;
|
|
use App\Http\Requests\Back\Products\UpdateProductRequest;
|
|
use App\Http\Resources\CommonResource;
|
|
use App\Models\Product;
|
|
use Domain\Models\ValueObjects\Products\BreedingMethod;
|
|
use Domain\Models\ValueObjects\Products\Business;
|
|
use Domain\Models\ValueObjects\Products\ProductCategory;
|
|
use Domain\Models\ValueObjects\Products\ProductFormat;
|
|
use Domain\Models\ValueObjects\Products\Technology;
|
|
use Illuminate\Contracts\Session\Session;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Str;
|
|
use Inertia\Response;
|
|
|
|
class ProductController extends BackendController
|
|
{
|
|
public function __construct(
|
|
Request $request,
|
|
Session $session,
|
|
) {
|
|
parent::__construct(
|
|
$request,
|
|
$session
|
|
);
|
|
|
|
$this->modelName = Product::modelName();
|
|
$this->modelPage = Product::modelPage();
|
|
}
|
|
|
|
public function index(IndexProductRequest $request): Response
|
|
{
|
|
$this->authorize('viewAny', Product::class);
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Builder<\App\Models\Product> $query */
|
|
$query = Product::query();
|
|
|
|
if ($request->routeIs('back.products.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/Products/Index', [
|
|
'paginatedModels' => CommonResource::collection($paginatedModels),
|
|
'search' => $searchValue,
|
|
'searchFields' => $searchFields,
|
|
'enumProductCategory' => ProductCategory::toArray(),
|
|
'enumTechnology' => Technology::toArray(),
|
|
]);
|
|
}
|
|
|
|
public function show(Product $product): RedirectResponse
|
|
{
|
|
$this->authorize('viewAny', Product::class);
|
|
|
|
return redirect()->route('back.products.edit', $product);
|
|
}
|
|
|
|
public function create(Product $product): Response
|
|
{
|
|
$this->authorize('create', Product::class);
|
|
|
|
return $this->inertiaRender('back/Pages/Products/Create', [
|
|
'data' => CommonResource::make($product),
|
|
'enumProductCategory' => ProductCategory::toArray(),
|
|
'enumTechnology' => Technology::toArray(),
|
|
'enumBreedingMethod' => BreedingMethod::toArray(),
|
|
'enumBusiness' => Business::toArray(),
|
|
'enumProductFormat' => ProductFormat::toArray(),
|
|
]);
|
|
}
|
|
|
|
public function store(StoreProductRequest $request): RedirectResponse
|
|
{
|
|
$this->authorize('create', Product::class);
|
|
|
|
return DB::transaction(function () use ($request) {
|
|
$product = new Product();
|
|
$product->inertiaFill($request->validated());
|
|
|
|
if ($product->saveOrFail()) {
|
|
return redirect()->route('back.products.edit', $product)
|
|
->with('success', trans('uwil-backend::crud.messages.has_been_created', [
|
|
'model' => Str::ucfirst(trans_choice('models.classes.product', 1)),
|
|
]));
|
|
}
|
|
|
|
return redirect()->back()
|
|
->with('error', trans('uwil-backend::crud.messages.cannot_be_created', [
|
|
'model' => Str::ucfirst(trans_choice('models.classes.product', 1)),
|
|
]));
|
|
});
|
|
}
|
|
|
|
public function edit(Product $product): Response
|
|
{
|
|
$this->authorize('update', $product);
|
|
|
|
return $this->inertiaRender('back/Pages/Products/Edit', [
|
|
'data' => CommonResource::make($product),
|
|
'enumProductCategory' => ProductCategory::toArray(),
|
|
'enumTechnology' => Technology::toArray(),
|
|
'enumBreedingMethod' => BreedingMethod::toArray(),
|
|
'enumBusiness' => Business::toArray(),
|
|
'enumProductFormat' => ProductFormat::toArray(),
|
|
]);
|
|
}
|
|
|
|
public function update(
|
|
UpdateProductRequest $request,
|
|
Product $product
|
|
): RedirectResponse {
|
|
$this->authorize('update', $product);
|
|
|
|
return DB::transaction(function () use ($request, $product) {
|
|
$product->inertiaFill($request->validated());
|
|
|
|
if ($product->saveOrFail()) {
|
|
return redirect()->route('back.products.edit', $product)
|
|
->with('success', trans('uwil-backend::crud.messages.has_been_updated', [
|
|
'model' => Str::ucfirst(trans_choice('models.classes.product', 1)),
|
|
]));
|
|
}
|
|
|
|
return redirect()->route('back.products.edit', $product)
|
|
->with('error', trans('uwil-backend::crud.messages.cannot_be_updated', [
|
|
'model' => Str::ucfirst(trans_choice('models.classes.product', 1)),
|
|
]));
|
|
});
|
|
}
|
|
|
|
public function duplicate(Product $product): Response
|
|
{
|
|
return $this->create($product->replicate());
|
|
}
|
|
|
|
public function restore(string $id): RedirectResponse
|
|
{
|
|
$product = Product::withTrashed()->findOrFail($id);
|
|
$this->authorize('restore', $product);
|
|
|
|
$previousQueries = $this->getPreviousQueries();
|
|
|
|
if ($product->restore()) {
|
|
return redirect()->route('back.products.trash', $previousQueries)
|
|
->with('success', trans('uwil-backend::crud.messages.has_been_restored', [
|
|
'model' => Str::ucfirst(trans_choice('models.classes.product', 1)),
|
|
]));
|
|
}
|
|
|
|
return redirect()->back()
|
|
->with('error', trans('uwil-backend::crud.messages.cannot_be_restored', [
|
|
'model' => Str::ucfirst(trans_choice('models.classes.product', 1)),
|
|
]));
|
|
}
|
|
|
|
public function destroy(Product $product): RedirectResponse
|
|
{
|
|
$this->authorize('delete', $product);
|
|
$previousQueries = $this->getPreviousQueries();
|
|
|
|
if ($product->delete()) {
|
|
return redirect()->route('back.products.index', $previousQueries)
|
|
->with('success', trans('uwil-backend::crud.messages.has_been_deleted', [
|
|
'model' => Str::ucfirst(trans_choice('models.classes.product', 1)),
|
|
]));
|
|
}
|
|
|
|
return redirect()->back()
|
|
->with('error', trans('uwil-backend::crud.messages.cannot_be_deleted', [
|
|
'model' => Str::ucfirst(trans_choice('models.classes.product', 1)),
|
|
]));
|
|
}
|
|
|
|
public function forceDestroy(string $id): RedirectResponse
|
|
{
|
|
$product = Product::withTrashed()->findOrFail($id);
|
|
$this->authorize('forceDelete', $product);
|
|
|
|
$previousQueries = $this->getPreviousQueries();
|
|
|
|
if ($product->forceDelete()) {
|
|
return redirect()->route('back.products.trash', $previousQueries)
|
|
->with('success', trans('uwil-backend::crud.messages.has_been_deleted', [
|
|
'model' => Str::ucfirst(trans_choice('models.classes.product', 1)),
|
|
]));
|
|
}
|
|
|
|
return redirect()->back()
|
|
->with('error', trans('uwil-backend::crud.messages.cannot_be_deleted', [
|
|
'model' => Str::ucfirst(trans_choice('models.classes.product', 1)),
|
|
]));
|
|
}
|
|
|
|
/** @return array<array-key,string|array<mixed>> */
|
|
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'));
|
|
}
|
|
}
|