171 lines
5.3 KiB
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);
|
|
}
|
|
}
|