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()); } } }