90 lines
3.3 KiB
PHP
90 lines
3.3 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\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'); // فیلد پیشفرض: published_at
|
||
$sortDirection = $request->get('sort_direction', 'desc'); // جهت پیشفرض: نزولی
|
||
|
||
// دریافت پارامترهای صفحهبندی از درخواست
|
||
$perPage = $request->get('per_page', 10); // تعداد آیتمها در هر صفحه (پیشفرض: ۱۰)
|
||
|
||
// ساخت Query با اعمال فیلترها و مرتبسازی
|
||
$query = Post::with(['category', 'tags', 'author'])
|
||
->filter($filters)
|
||
->sort($sortField, $sortDirection);
|
||
|
||
// اعمال صفحهبندی
|
||
$posts = $query->paginate($perPage);
|
||
|
||
// بازگشت نتایج به صورت JSON با استفاده از Resource
|
||
return PostResource::collection($posts);
|
||
}
|
||
|
||
// نمایش یک پست خاص
|
||
public function show($slug)
|
||
{
|
||
// یافتن پست بر اساس slug و بارگذاری روابط مرتبط
|
||
$post = Post::with(['category', 'tags', 'author', 'relatedPosts.category', 'relatedPosts.tags', 'relatedPosts.author'])
|
||
->where('slug', $slug)
|
||
->firstOrFail(); // در صورت عدم وجود پست، خطای 404 برمیگرداند
|
||
|
||
// بازگشت پست و پستهای مرتبط به صورت JSON با استفاده از منابع
|
||
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);
|
||
}
|
||
}
|