has('active')) { $query->where('active', (int) $request->active); } if ($request->boolean('select_only')) { $query->where('show_in_select', 1); } if ($request->filled('search')) { $query->where('name', 'like', '%' . $request->search . '%'); } $categories = $query ->orderBy('sort_order') ->orderBy('id') ->get(); return response()->json($categories); } public function store(Request $request) { $name = trim((string) $request->input('name')); if ($name === '') { throw new UnprocessableEntityHttpException('نام دسته‌بندی الزامی است'); } if (Category::where('name', $name)->exists()) { throw new UnprocessableEntityHttpException('این دسته‌بندی قبلا ثبت شده است'); } $maxOrder = (int) Category::max('sort_order'); $category = Category::create([ 'name' => $name, 'active' => $request->has('active') ? (int) $request->active : 1, 'show_in_filter' => $request->has('show_in_filter') ? (int) $request->show_in_filter : 1, 'show_in_select' => $request->has('show_in_select') ? (int) $request->show_in_select : 1, 'sort_order' => $maxOrder + 1, ]); return response()->json($category); } public function update(Request $request, $id) { $category = Category::findOrFail($id); if ($request->has('name')) { $name = trim((string) $request->input('name')); if ($name === '') { throw new UnprocessableEntityHttpException('نام دسته‌بندی الزامی است'); } if (Category::where('name', $name)->where('id', '!=', $id)->exists()) { throw new UnprocessableEntityHttpException('این نام قبلا ثبت شده است'); } $category->name = $name; } foreach (['active', 'show_in_filter', 'show_in_select', 'sort_order'] as $field) { if ($request->has($field)) { $category->{$field} = $field === 'sort_order' ? (int) $request->input($field) : (int) $request->input($field); } } $category->save(); return response()->json($category); } public function syncFromProducts(CategoryService $categoryService) { $created = $categoryService->syncFromProducts(); return response()->json([ 'message' => $created > 0 ? "{$created} دسته‌بندی از محصولات اضافه شد" : 'دسته‌بندی جدیدی برای افزودن نبود', 'created' => $created, 'items' => Category::query()->orderBy('sort_order')->orderBy('id')->get(), ]); } /** تب فیلتر اپ کاربر */ public function clientIndex(Request $request) { $query = Category::query() ->where('active', 1) ->where('show_in_filter', 1); if ($request->filled('search')) { $query->where('name', 'like', '%' . $request->search . '%'); } $categories = $query ->orderBy('sort_order') ->orderBy('id') ->get(['id', 'name', 'sort_order']); return response()->json($categories); } public function changeActive($id, $active) { $active = (int) $active; if (! in_array($active, [0, 1], true)) { throw new UnprocessableEntityHttpException('وضعیت active نامعتبر است'); } $category = Category::findOrFail($id); $category->active = $active; $category->save(); return response()->json([ 'message' => $active ? 'نمایش محصولات این دسته فعال شد' : 'نمایش محصولات این دسته غیرفعال شد', 'data' => $category, ]); } }