Files
bella_masala_laravel/app/Http/Controllers/MenuController.php
2025-11-06 06:55:15 +00:00

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