parsaaghayi-backend/app/Http/Controllers/Api/Blog/CategoryController.php

171 lines
5.3 KiB
PHP

<?php
namespace App\Http\Controllers\Api\Blog;
use App\Http\Controllers\Controller;
use App\Http\Requests\Blog\StoreCategoryRequest;
use App\Http\Requests\Blog\UpdateCategoryRequest;
use App\Http\Resources\CategoryResource;
use App\Http\Resources\PostResource;
use App\Models\Blog\Category;
use Illuminate\Http\Request;
/**
* @OA\Tag(name="Categories", description="Blog categories")
*/
class CategoryController extends Controller
{
/**
* @OA\Get(
* path="/blog/categories",
* tags={"Categories"},
* summary="Paginated list of categories",
* @OA\Parameter(name="per_page", in="query", @OA\Schema(type="integer")),
* @OA\Parameter(name="filter", in="query", @OA\Schema(type="string")),
* @OA\Response(response=200, description="OK")
* )
*/
public function index(Request $request)
{
$filter = $request->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);
}
}