77 lines
2.2 KiB
PHP
77 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api\Blog;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Blog\StorePostRequest;
|
|
use App\Http\Requests\Blog\UpdatePostRequest;
|
|
use App\Http\Resources\PostResource;
|
|
use App\Models\Blog\Post;
|
|
use Illuminate\Http\Request;
|
|
|
|
class PostController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$filters = $request->only(['category', 'tag', 'search', 'author', 'published']);
|
|
|
|
$sortField = $request->get('sort_field', 'published_at');
|
|
$sortDirection = $request->get('sort_direction', 'desc');
|
|
|
|
$perPage = $request->get('per_page', 10);
|
|
|
|
$query = Post::with(['category', 'tags', 'author'])
|
|
->filter($filters)
|
|
->sort($sortField, $sortDirection);
|
|
|
|
$posts = $query->paginate($perPage);
|
|
|
|
return PostResource::collection($posts);
|
|
}
|
|
|
|
public function show($slug)
|
|
{
|
|
$post = Post::with(['category', 'tags', 'author', 'relatedPosts.category', 'relatedPosts.tags', 'relatedPosts.author'])
|
|
->where('slug', $slug)
|
|
->firstOrFail();
|
|
|
|
return response()->json([
|
|
'post' => new PostResource($post),
|
|
'related_posts' => PostResource::collection($post->relatedPosts->sortByDesc('published_at')->take(5)),
|
|
], 200);
|
|
}
|
|
|
|
public function store(StorePostRequest $request)
|
|
{
|
|
$post = Post::create($request->validated());
|
|
|
|
if ($request->has('tags')) {
|
|
$post->tags()->attach($request->tags);
|
|
}
|
|
|
|
return new PostResource($post->load(['category', 'tags', 'author']));
|
|
}
|
|
|
|
public function update(UpdatePostRequest $request, $id)
|
|
{
|
|
$post = Post::findOrFail($id);
|
|
$post->update($request->validated());
|
|
|
|
if ($request->has('tags')) {
|
|
$post->tags()->sync($request->tags);
|
|
}
|
|
|
|
return new PostResource($post->load(['category', 'tags', 'author']));
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
$post = Post::findOrFail($id);
|
|
$post->tags()->detach();
|
|
$post->relatedPosts()->detach();
|
|
$post->delete();
|
|
|
|
return response()->json(['message' => 'Post deleted successfully'], 200);
|
|
}
|
|
}
|