aiblog/app/Http/Controllers/Api/CategoryController.php
2024-11-17 11:30:01 +08:00

84 lines
No EOL
2.3 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Category;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Http\Resources\CategoryResource;
use App\Http\Resources\PostResource;
class CategoryController extends Controller
{
public function index(): JsonResponse
{
$categories = Category::withCount('posts')->get();
return response()->json([
'categories' => CategoryResource::collection($categories)
]);
}
public function store(Request $request): JsonResponse
{
$validated = $request->validate([
'name' => 'required|string|max:255|unique:categories',
'description' => 'nullable|string',
]);
$category = Category::create($validated);
return response()->json([
'message' => 'Category created successfully',
'category' => $category
]);
}
public function update(Request $request, Category $category): JsonResponse
{
$validated = $request->validate([
'name' => 'sometimes|string|max:255|unique:categories,name,' . $category->id,
'description' => 'nullable|string',
]);
$category->update($validated);
return response()->json([
'message' => 'Category updated successfully',
'category' => $category
]);
}
public function destroy(Category $category): JsonResponse
{
$category->delete();
return response()->json([
'message' => 'Category deleted successfully'
]);
}
public function posts(Category $category, Request $request): JsonResponse
{
$perPage = $request->input('per_page', 10);
$perPage = min($perPage, 100);
$posts = $category->posts()
->with(['author:id,name'])
->latest()
->paginate($perPage);
return response()->json([
'posts' => PostResource::collection($posts),
'pagination' => [
'total' => $posts->total(),
'per_page' => $posts->perPage(),
'current_page' => $posts->currentPage(),
'last_page' => $posts->lastPage(),
]
]);
}
}