orderByDesc('sort_order')->orderBy('id'); if ($type = $request->query('type')) { $query->where('type', $type); } if ($keyword = trim((string) $request->query('keyword', ''))) { $query->where(function ($q) use ($keyword) { $q->where('name', 'like', '%' . $keyword . '%') ->orWhere('slug', 'like', '%' . $keyword . '%') ->orWhere('description', 'like', '%' . $keyword . '%'); }); } $items = $query->get()->map(fn (Category $category) => $this->format($category))->values()->all(); return response()->json([ 'code' => 0, 'message' => 'ok', 'data' => [ 'items' => $items, ], ]); } public function store(StoreCategoryRequest $request): JsonResponse { $category = Category::query()->create([ 'type' => $request->validated('type'), 'name' => $request->validated('name'), 'slug' => $request->validated('slug'), 'description' => $request->validated('description', ''), 'sort_order' => (int) $request->validated('sort_order', 0), ]); return response()->json([ 'code' => 0, 'message' => 'category created', 'data' => $this->format($category), ], 201); } public function update(StoreCategoryRequest $request, int $id): JsonResponse { $category = Category::query()->find($id); if (!$category) { return response()->json([ 'code' => 404, 'message' => 'category not found', 'data' => null, ], 404); } $category->fill([ 'type' => $request->validated('type'), 'name' => $request->validated('name'), 'slug' => $request->validated('slug'), 'description' => $request->validated('description', ''), 'sort_order' => (int) $request->validated('sort_order', 0), ]); $category->save(); return response()->json([ 'code' => 0, 'message' => 'category updated', 'data' => $this->format($category), ]); } public function destroy(int $id): JsonResponse { $category = Category::query()->find($id); if (!$category) { return response()->json([ 'code' => 404, 'message' => 'category not found', 'data' => null, ], 404); } $category->packages()->detach(); $category->delete(); return response()->json([ 'code' => 0, 'message' => 'category deleted', 'data' => null, ]); } private function format(Category $category): array { return [ 'id' => $category->id, 'type' => $category->type, 'name' => $category->name, 'slug' => $category->slug, 'description' => $category->description, 'sort_order' => (int) $category->sort_order, 'package_count' => $category->packages()->count(), 'created_at' => optional($category->created_at)->toAtomString(), 'updated_at' => optional($category->updated_at)->toAtomString(), ]; } }