254 lines
8.8 KiB
PHP
254 lines
8.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Menu;
|
|
use App\Models\Category;
|
|
use Illuminate\Http\Request;
|
|
use App\Http\Resources\MenuResource;
|
|
use App\Http\Resources\CategoryResource;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Validator;
|
|
use App\Traits\ApiResponseHelper;
|
|
use App\Traits\ImageHelper;
|
|
|
|
class MenuController extends Controller
|
|
{
|
|
use ApiResponseHelper, ImageHelper;
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'category_id' => ['nullable', 'exists:categories,id'],
|
|
'per_page' => ['nullable', 'integer', 'min:1'],
|
|
]);
|
|
if ($validator->fails()) {
|
|
return $this->apiResponse(false, $validator->errors()->first(), $validator->errors());
|
|
}
|
|
|
|
$query = Menu::query();
|
|
$route = $request->route();
|
|
$prefix = $route ? $route->getPrefix() : null;
|
|
$isClient = $prefix && (str_contains($prefix, '/client') || $prefix === 'client');
|
|
|
|
if ($isClient && $request->has('category_id')) {
|
|
$category = \App\Models\Category::find($request->category_id);
|
|
if (!$category || !$category->isActive) {
|
|
return $this->apiResponse(false, __('messages.category_not_active'));
|
|
}
|
|
}
|
|
|
|
if ($isClient) {
|
|
$query->where('isActive', true);
|
|
}
|
|
$query->orderBy('menu_id', 'asc');
|
|
if ($request->has('category_id')) {
|
|
$query->where('category_id', $request->category_id);
|
|
}
|
|
|
|
$perPage = $request->per_page ?? config('custom.paginationItem');
|
|
$menus = $query->paginate($perPage);
|
|
|
|
$data = [
|
|
'content' => MenuResource::collection($menus),
|
|
'pagination' => [
|
|
'total' => $menus->total(),
|
|
'per_page' => $menus->perPage(),
|
|
'current_page' => $menus->currentPage(),
|
|
'last_page' => $menus->lastPage(),
|
|
'from' => $menus->firstItem(),
|
|
'to' => $menus->lastItem(),
|
|
]
|
|
];
|
|
return $this->apiResponse(true, __('messages.menus_fetched'), $data);
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'title.en' => ['required', 'string'],
|
|
'title.it' => ['required', 'string'],
|
|
'description.en' => ['nullable', 'string'],
|
|
'description.it' => ['nullable', 'string'],
|
|
'menu_id' => ['nullable', 'integer'],
|
|
'price' => ['required', 'numeric'],
|
|
'image' => ['nullable', 'image'],
|
|
'isActive' => ['nullable', 'boolean'],
|
|
'category_id' => ['required', 'exists:categories,id'],
|
|
]);
|
|
if ($validator->fails()) {
|
|
return $this->apiResponse(false, $validator->errors()->first(), $validator->errors());
|
|
}
|
|
try {
|
|
DB::beginTransaction();
|
|
$menu = new Menu();
|
|
$menu->title = $request->title;
|
|
$menu->description = $request->description;
|
|
$menu->menu_id = $request->menu_id;
|
|
$menu->price = $request->price;
|
|
$menu->isActive = $request->isActive ?? true;
|
|
$menu->category_id = $request->category_id;
|
|
$menu->save();
|
|
|
|
if ($request->has('menu_id')) {
|
|
$menu->menu_id = $request->menu_id;
|
|
}else{
|
|
$menu->menu_id = $menu->id;
|
|
}
|
|
|
|
if ($request->image) {
|
|
$prefix = 'menu';
|
|
$imagePath = $this->uploadFile($request->image, $prefix, false);
|
|
$menu->image = $imagePath;
|
|
$menu->save();
|
|
}
|
|
DB::commit();
|
|
$menu->refresh();
|
|
$data = new MenuResource($menu);
|
|
$message = __('messages.menu_created');
|
|
return $this->apiResponse(true, $message, $data);
|
|
} catch (\Throwable $exception) {
|
|
DB::rollBack();
|
|
return $this->apiResponse(false, $exception->getMessage());
|
|
}
|
|
}
|
|
|
|
|
|
public function showMcp($id)
|
|
{
|
|
$menu = Menu::where('menu_id', $id)->firstOrFail();
|
|
|
|
if (!$menu) {
|
|
return $this->apiResponse(false, __('messages.menu_not_found'));
|
|
}
|
|
return $this->apiResponse(true, __('messages.menu_fetched'), new MenuResource($menu));
|
|
}
|
|
|
|
|
|
public function updateMcp(Request $request, $id)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'title.en' => ['sometimes', 'string'],
|
|
'title.it' => ['sometimes', 'string'],
|
|
'description.en' => ['sometimes', 'string'],
|
|
'description.it' => ['sometimes', 'string'],
|
|
'price' => ['sometimes', 'numeric'],
|
|
'image' => ['nullable', 'image'],
|
|
]);
|
|
if ($validator->fails()) {
|
|
return $this->apiResponse(false, $validator->errors()->first(), $validator->errors());
|
|
}
|
|
try {
|
|
DB::beginTransaction();
|
|
$menu = Menu::where('menu_id', $id)->firstOrFail();
|
|
if ($request->has('title')) {
|
|
$menu->title = $request->title;
|
|
}
|
|
if ($request->has('description')) {
|
|
$menu->description = $request->description;
|
|
}
|
|
if ($request->has('price')) {
|
|
$menu->price = $request->price;
|
|
}
|
|
|
|
if ($request->image) {
|
|
$prefix = 'menu';
|
|
$menu->image = $this->updateFile($request->image, $menu->image, $prefix, false);
|
|
}
|
|
$menu->save();
|
|
DB::commit();
|
|
$menu->refresh();
|
|
$data = new MenuResource($menu);
|
|
$message = __('messages.menu_updated');
|
|
return $this->apiResponse(true, $message, $data);
|
|
} catch (\Throwable $exception) {
|
|
DB::rollBack();
|
|
return $this->apiResponse(false, $exception->getMessage());
|
|
}
|
|
}
|
|
|
|
|
|
public function show($id)
|
|
{
|
|
$menu = Menu::find($id);
|
|
if (!$menu) {
|
|
return $this->apiResponse(false, __('messages.menu_not_found'));
|
|
}
|
|
return $this->apiResponse(true, __('messages.menu_fetched'), new MenuResource($menu));
|
|
}
|
|
|
|
|
|
|
|
|
|
public function update(Request $request, $id)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'title.en' => ['sometimes', 'string'],
|
|
'title.it' => ['sometimes', 'string'],
|
|
'description.en' => ['sometimes', 'string'],
|
|
'description.it' => ['sometimes', 'string'],
|
|
'menu_id' => ['sometimes', 'integer'],
|
|
'price' => ['sometimes', 'numeric'],
|
|
'image' => ['nullable', 'image'],
|
|
'isActive' => ['sometimes', 'boolean'],
|
|
'category_id' => ['sometimes', 'exists:categories,id'],
|
|
]);
|
|
if ($validator->fails()) {
|
|
return $this->apiResponse(false, $validator->errors()->first(), $validator->errors());
|
|
}
|
|
try {
|
|
DB::beginTransaction();
|
|
$menu = Menu::findOrFail($id);
|
|
if ($request->has('title')) {
|
|
$menu->title = $request->title;
|
|
}
|
|
if ($request->has('description')) {
|
|
$menu->description = $request->description;
|
|
}
|
|
if ($request->has('menu_id')) {
|
|
$menu->menu_id = $request->menu_id;
|
|
}
|
|
if ($request->has('price')) {
|
|
$menu->price = $request->price;
|
|
}
|
|
if ($request->has('isActive')) {
|
|
$menu->isActive = $request->isActive;
|
|
}
|
|
if ($request->has('category_id')) {
|
|
$menu->category_id = $request->category_id;
|
|
}
|
|
if ($request->image) {
|
|
$prefix = 'menu';
|
|
$menu->image = $this->updateFile($request->image, $menu->image, $prefix, false);
|
|
}
|
|
$menu->save();
|
|
DB::commit();
|
|
$menu->refresh();
|
|
$data = new MenuResource($menu);
|
|
$message = __('messages.menu_updated');
|
|
return $this->apiResponse(true, $message, $data);
|
|
} catch (\Throwable $exception) {
|
|
DB::rollBack();
|
|
return $this->apiResponse(false, $exception->getMessage());
|
|
}
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
$menu = Menu::find($id);
|
|
if (!$menu) {
|
|
return $this->apiResponse(false, __('messages.menu_not_found'));
|
|
}
|
|
if ($menu->image) {
|
|
$this->deleteFile($menu->image);
|
|
}
|
|
$menu->delete();
|
|
DB::commit();
|
|
return $this->apiResponse(true, __('messages.menu_deleted'));
|
|
} catch (\Throwable $exception) {
|
|
return $this->apiResponse(false, $exception->getMessage());
|
|
}
|
|
}
|
|
}
|