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(Request $request) { $validator = Validator::make($request->all(), [ 'title' => 'required|string|max:255', 'body' => 'required|string', 'excerpt' => 'nullable|string|max:500', 'slug' => 'required|string|unique:posts,slug', 'author_id' => 'required|exists:users,id', 'category_id' => 'required|exists:categories,id', 'featured_image' => 'nullable|url', 'views' => 'nullable|integer', 'likes' => 'nullable|integer', 'published_at' => 'nullable|date', 'tags' => 'nullable|array', 'tags.*' => 'exists:tags,id', ]); if ($validator->fails()) { return response()->json($validator->errors(), 422); } $post = Post::create($validator->validated()); if ($request->has('tags')) { $post->tags()->attach($request->tags); } return new PostResource($post->load(['category', 'tags', 'author'])); } // به‌روزرسانی یک پست خاص public function update(Request $request, $id) { $post = Post::findOrFail($id); $validator = Validator::make($request->all(), [ 'title' => 'sometimes|required|string|max:255', 'body' => 'sometimes|required|string', 'excerpt' => 'nullable|string|max:500', 'slug' => 'sometimes|required|string|unique:posts,slug,' . $post->id, 'author_id' => 'sometimes|required|exists:users,id', 'category_id' => 'sometimes|required|exists:categories,id', 'featured_image' => 'nullable|url', 'views' => 'nullable|integer', 'likes' => 'nullable|integer', 'published_at' => 'nullable|date', 'tags' => 'nullable|array', 'tags.*' => 'exists:tags,id', ]); if ($validator->fails()) { return response()->json($validator->errors(), 422); } $post->update($validator->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); } }