per_page ?? config('custom.paginationItem'); $route = $request->route(); $prefix = $route ? $route->getPrefix() : null; $isClient = $prefix && (str_contains($prefix, '/client') || $prefix === 'client'); $query = Category::orderBy('sortingIndex', 'desc'); if ($isClient) { $query->where('isActive', true); } $categories = $query->paginate($perPage); $data = array(); $data['content'] = CategoryResource::collection($categories); $data['pagination'] = [ 'total' => $categories->total(), 'per_page' => $categories->perPage(), 'current_page' => $categories->currentPage(), 'last_page' => $categories->lastPage(), 'from' => $categories->firstItem(), 'to' => $categories->lastItem() ]; return $this->apiResponse( true, __('messages.categories_retrieved'), $data ); } public function show($id) { $category = Category::find($id); if (!$category) { return $this->apiResponse( false, __('messages.category_not_found') ); } return $this->apiResponse( true, __('messages.category_retrieved'), new CategoryResource($category) ); } 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'], 'sortingIndex' => ['nullable', 'integer'], 'isActive' => ['nullable', 'boolean'], 'thumbnail' => ['nullable', 'image'], ]); if ($validator->fails()) { return $this->apiResponse(false, $validator->errors()->first(), $validator->errors()); } try { DB::beginTransaction(); $category = new Category(); $category->title = $request->title; $category->description = $request->description; $category->sortingIndex = $request->sortingIndex ?? 0; $category->isActive = $request->isActive ?? true; $category->save(); if ($request->thumbnail) { $prefix = 'category'; $thumbnailPath = $this->uploadFile($request->thumbnail, $prefix, false); $category->thumbnail = $thumbnailPath; $category->save(); } DB::commit(); $category->refresh(); $data = new CategoryResource($category); $message = __('messages.category_created'); return $this->apiResponse(true, $message, $data); } catch (\Throwable $exception) { DB::rollBack(); return $this->apiResponse(false, $exception->getMessage()); } } 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'], 'sortingIndex' => ['sometimes', 'integer'], 'isActive' => ['sometimes', 'boolean'], 'thumbnail' => ['nullable', 'image'], ]); if ($validator->fails()) { return $this->apiResponse(false, $validator->errors()->first(), $validator->errors()); } try { DB::beginTransaction(); $category = Category::findOrFail($id); if ($request->has('title')) { $category->title = $request->title; } if ($request->has('description')) { $category->description = $request->description; } if ($request->has('sortingIndex')) { $category->sortingIndex = $request->sortingIndex; } if ($request->has('isActive')) { $category->isActive = $request->isActive; } if ($request->thumbnail) { $prefix = 'category'; $category->thumbnail = $this->updateFile($request->thumbnail, $category->thumbnail, $prefix, false); } $category->save(); DB::commit(); $category->refresh(); $data = new CategoryResource($category); $message = __('messages.category_updated'); return $this->apiResponse(true, $message, $data); } catch (\Throwable $exception) { DB::rollBack(); return $this->apiResponse(false, $exception->getMessage()); } } public function destroy($id) { $category = Category::find($id); if (!$category) { return $this->apiResponse( false, __('messages.category_not_found') ); } $category->delete(); return $this->apiResponse( true, __('messages.category_deleted') ); } public function getAllData(Request $request) { $categories = \App\Models\Category::with('menus')->get(); $data = \App\Http\Resources\AdminCategoryWithMenusResource::collection($categories); return $this->apiResponse(true, __('messages.categories_retrieved'), $data); } public function importAllData() { try { $jsonPath = base_path('demo/bella_menu.json'); if (!file_exists($jsonPath)) { return $this->apiResponse(false, 'bella_menu.json not found'); } $json = file_get_contents($jsonPath); $categories = json_decode($json, true); if (!is_array($categories)) { return $this->apiResponse(false, 'Invalid JSON structure'); } \DB::beginTransaction(); foreach ($categories as $cat) { // Check if category exists by both en and it title $existingCategory = \App\Models\Category::whereJsonContains('title->en', $cat['title']['en']) ->orWhereJsonContains('title->it', $cat['title']['it']) ->first(); if ($existingCategory) { $category = $existingCategory; } else { $category = new \App\Models\Category(); $category->title = $cat['title']; $category->description = $cat['description']; $category->sortingIndex = 0; $category->isActive = $cat['isActive'] ?? true; $category->thumbnail = $cat['thumbnail'] ?? null; $category->save(); } if (!empty($cat['menus']) && is_array($cat['menus'])) { foreach ($cat['menus'] as $item) { // Check if menu exists by both en and it title for this category $exists = \App\Models\Menu::where('category_id', $category->id) ->where(function($query) use ($item) { $query->whereJsonContains('title->en', $item['title']['en']) ->orWhereJsonContains('title->it', $item['title']['it']); })->exists(); if ($exists) { continue; } $menu = new \App\Models\Menu(); $menu->menu_id = $item['menu_id'] ?? null; $menu->title = $item['title']; $menu->description = $item['description']; $menu->price = $item['price']; $menu->image = $item['image'] ?? null; $menu->isActive = $item['isActive'] ?? true; $menu->category_id = $category->id; $menu->save(); } } } \DB::commit(); return $this->apiResponse(true, 'All data imported successfully'); } catch (\Throwable $e) { \DB::rollBack(); return $this->apiResponse(false, $e->getMessage()); } } }