input('filter'); $sortBy = $request->input('sort_by', 'created_at'); $sortDirection = $request->input('sort_direction', 'desc'); $perPage = $request->input('per_page', 10); $query = Category::with('posts'); if (!empty($filter)) { $query->where('name', 'like', '%' . $filter . '%'); } $query->orderBy($sortBy, $sortDirection); $categories = $query->paginate($perPage); return CategoryResource::collection($categories); } /** * @OA\Get( * path="/blog/categories/{id}", * tags={"Categories"}, * summary="Get a category by ID", * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * @OA\Response(response=200, description="OK") * ) */ public function show($id) { $category = Category::with('posts')->findOrFail($id); return new CategoryResource($category); } /** * @OA\Get( * path="/blog/categories/{slug}/posts", * tags={"Categories"}, * summary="Get posts by category slug", * @OA\Parameter(name="slug", in="path", required=true, @OA\Schema(type="string")), * @OA\Parameter(name="per_page", in="query", @OA\Schema(type="integer")), * @OA\Response(response=200, description="OK"), * @OA\Response(response=404, description="Category not found") * ) */ public function getCategoryWithPosts(Request $request, $slug) { $category = Category::where('slug', $slug)->first(); if (!$category) { return response()->json([ 'message' => 'Category not found.' ], 404); } $perPage = $request->input('per_page', 10); $filter = $request->input('filter'); $sortBy = $request->input('sort_by', 'published_at'); $sortDirection = $request->input('sort_direction', 'desc'); $postsQuery = $category->posts()->with(['category', 'tags', 'author']); if (!empty($filter)) { $postsQuery->where('title', 'like', '%' . $filter . '%'); } $postsQuery->orderBy($sortBy, $sortDirection); $posts = $postsQuery->paginate($perPage); $meta = [ 'total' => $posts->total(), 'per_page' => $posts->perPage(), 'current_page' => $posts->currentPage(), 'last_page' => $posts->lastPage(), 'from' => $posts->firstItem(), 'to' => $posts->lastItem(), ]; $links = [ 'first' => $posts->url(1), 'last' => $posts->url($posts->lastPage()), 'prev' => $posts->previousPageUrl(), 'next' => $posts->nextPageUrl(), ]; return response()->json([ 'category' => new CategoryResource($category), 'posts' => PostResource::collection($posts), 'meta' => $meta, 'links' => $links, ], 200); } /** * @OA\Post( * path="/blog/categories", * tags={"Categories"}, * summary="Create a category", * @OA\RequestBody(@OA\MediaType(mediaType="application/json")), * @OA\Response(response=201, description="Created") * ) */ public function store(StoreCategoryRequest $request) { $category = Category::create($request->validated()); return new CategoryResource($category); } /** * @OA\Put( * path="/blog/categories/{id}", * tags={"Categories"}, * summary="Update a category", * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * @OA\RequestBody(@OA\MediaType(mediaType="application/json")), * @OA\Response(response=200, description="OK") * ) */ public function update(UpdateCategoryRequest $request, $id) { $category = Category::findOrFail($id); $category->update($request->validated()); return new CategoryResource($category); } /** * @OA\Delete( * path="/blog/categories/{id}", * tags={"Categories"}, * summary="Delete a category", * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * @OA\Response(response=200, description="OK") * ) */ public function destroy($id) { $category = Category::findOrFail($id); $category->delete(); return response()->json(['message' => 'Category deleted successfully'], 200); } }