namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\Category; use Illuminate\Http\Request; use Illuminate\Support\Str; class CategoryController extends Controller { public function index(Request $request) { $query = Category::withCount('services'); // Search if ($request->has('search')) { $search = $request->search; $query->where('name', 'like', "%{$search}%") ->orWhere('description', 'like', "%{$search}%"); } // Filter by status if ($request->has('status') && $request->status != 'all') { $query->where('status', $request->status); } $categories = $query->orderBy('sort_order')->paginate(20); return view('admin.categories.index', compact('categories')); } public function create() { $categories = Category::orderBy('name')->get(); return view('admin.categories.create', compact('categories')); } public function store(Request $request) { $request->validate([ 'name' => 'required|string|max:100', 'slug' => 'nullable|string|max:100|unique:categories', 'description' => 'nullable|string', 'icon' => 'nullable|string|max:255', 'banner_image' => 'nullable|image|max:2048', 'parent_id' => 'nullable|exists:categories,id', 'sort_order' => 'nullable|integer', 'status' => 'required|in:active,inactive', 'meta_title' => 'nullable|string|max:255', 'meta_description' => 'nullable|string', 'meta_keywords' => 'nullable|string', ]); $data = $request->except('banner_image'); // Generate slug if not provided if (empty($data['slug'])) { $data['slug'] = Str::slug($request->name); } // Handle banner image if ($request->hasFile('banner_image')) { $path = $request->file('banner_image')->store('categories', 'public'); $data['banner_image'] = $path; } $category = Category::create($data); // Log activity auth()->guard('admin')->user()->logActivity( 'Created category: ' . $category->name, ['category_id' => $category->id] ); return redirect()->route('admin.categories.index') ->with('success', 'Category created successfully.'); } public function edit(Category $category) { $categories = Category::where('id', '!=', $category->id) ->orderBy('name') ->get(); return view('admin.categories.edit', compact('category', 'categories')); } public function update(Request $request, Category $category) { $request->validate([ 'name' => 'required|string|max:100', 'slug' => 'nullable|string|max:100|unique:categories,slug,' . $category->id, 'description' => 'nullable|string', 'icon' => 'nullable|string|max:255', 'banner_image' => 'nullable|image|max:2048', 'parent_id' => 'nullable|exists:categories,id', 'sort_order' => 'nullable|integer', 'status' => 'required|in:active,inactive', 'meta_title' => 'nullable|string|max:255', 'meta_description' => 'nullable|string', 'meta_keywords' => 'nullable|string', ]); $data = $request->except('banner_image'); // Generate slug if not provided if (empty($data['slug'])) { $data['slug'] = Str::slug($request->name); } // Handle banner image if ($request->hasFile('banner_image')) { // Delete old image if ($category->banner_image) { \Storage::disk('public')->delete($category->banner_image); } $path = $request->file('banner_image')->store('categories', 'public'); $data['banner_image'] = $path; } $category->update($data); // Log activity auth()->guard('admin')->user()->logActivity( 'Updated category: ' . $category->name, ['category_id' => $category->id] ); return redirect()->route('admin.categories.index') ->with('success', 'Category updated successfully.'); } public function destroy(Category $category) { // Check if category has services if ($category->services()->exists()) { return back()->with('error', 'Cannot delete category with existing services.'); } // Check if category has subcategories if ($category->children()->exists()) { return back()->with('error', 'Cannot delete category with subcategories.'); } // Delete banner image if ($category->banner_image) { \Storage::disk('public')->delete($category->banner_image); } $name = $category->name; $category->delete(); // Log activity auth()->guard('admin')->user()->logActivity( 'Deleted category: ' . $name, ['category_id' => $category->id] ); return redirect()->route('admin.categories.index') ->with('success', 'Category deleted successfully.'); } public function updateOrder(Request $request) { $request->validate([ 'order' => 'required|array', 'order.*.id' => 'required|exists:categories,id', 'order.*.sort_order' => 'required|integer', ]); foreach ($request->order as $item) { Category::where('id', $item['id'])->update(['sort_order' => $item['sort_order']]); } return response()->json(['success' => true]); } public function toggleStatus(Category $category) { $category->update([ 'status' => $category->status === 'active' ? 'inactive' : 'active' ]); return response()->json([ 'success' => true, 'status' => $category->status ]); } }