withCount('subcategories'); if ($request->boolean('with_subcategories')) { $query->with('subcategories'); } return response()->json( $query->orderBy('name')->get() ); } public function store(Request $request) { $data = $request->validate([ 'name' => 'required|string|max:255|unique:categories,name', 'description' => 'nullable|string', 'icon' => 'nullable|file|extensions:jpg,jpeg,png,gif,webp,bmp,svg|max:8192', ]); $category = Category::create([ 'name' => $data['name'], 'description' => $data['description'] ?? null, 'icon' => $request->hasFile('icon') ? $this->storeUpload($request->file('icon'), 'categories/icons') : null, ]); return response()->json([ 'message' => 'Category created successfully', 'category' => $category, ], 201); } public function show($id) { $category = Category::with('subcategories')->withCount('subcategories')->findOrFail($id); return response()->json($category); } public function update(Request $request, $id) { $category = Category::findOrFail($id); $data = $request->validate([ 'name' => 'sometimes|string|max:255|unique:categories,name,' . $category->id, 'description' => 'nullable|string', 'icon' => 'nullable|file|extensions:jpg,jpeg,png,gif,webp,bmp,svg|max:8192', ]); if (array_key_exists('name', $data)) { $category->name = $data['name']; } if (array_key_exists('description', $data)) { $category->description = $data['description']; } if ($request->hasFile('icon')) { if ($category->icon) { Storage::disk('public')->delete($category->icon); } $category->icon = $this->storeUpload($request->file('icon'), 'categories/icons'); } $category->save(); return response()->json([ 'message' => 'Category updated successfully', 'category' => $category, ]); } public function destroy($id) { $category = Category::findOrFail($id); if ($category->icon) { Storage::disk('public')->delete($category->icon); } $category->delete(); return response()->json(['message' => 'Category deleted successfully']); } }