#P1811
GET /b2c/v1/articles
GET /b2c/v1/articles
این اندپوینت برای دریافت فهرست مقالات در سیستم B2C استفاده میشود. امکان فیلتر بر اساس دستهبندیها، تگها و موقعیتها (places) و همچنین مرتبسازی بر اساس امتیاز (score) یا تعداد بازدید (views) فراهم شده است. در حالت عادی خروجی صفحهبندیشده برمیگردد، اما در حالت مرتبسازی خاص، دادهها به صورت محدود و غیر صفحهبندی بازگردانده میشوند.
Endpoint Information
URL:
/b2c/v1/articlesMethod: GET
Controller:
V1ArticleController@indexMiddleware:
web (بدون JWT)Model:
ArticleResource:
ArticleResourceپارامترهای Query قابل استفاده
| نام پارامتر | نوع | الزامی | توضیح |
|---|---|---|---|
branch |
integer | ✅ | شناسه دفتر یا شعبهای که مقاله در آن تعریف شده است |
categories |
array (JSON) | ❌ | لیست شناسههای دستهبندی برای فیلتر (مثلاً [1,5,7]) |
tags |
array (JSON) | ❌ | لیست شناسههای تگها برای فیلتر |
places |
array (JSON) | ❌ | لیست شناسه نواحی مکانی مرتبط با مقاله |
sortByScore |
boolean | ❌ | مرتبسازی بر اساس بیشترین امتیاز (برترین ۱۰ مقاله) |
sortByViews |
boolean | ❌ | مرتبسازی بر اساس بیشترین بازدید (۶ مقاله برتر) |
منطق پردازشی و جریان داده (Flowchart)
📥 ۱. دریافت پارامترها از Query (categories, tags, places, sortBy…)
↓
⚙️ ۲. ایجاد Query Builder روی مدل
Article با شرط اولیه branch = $request->branch↓
🔍 ۳. بررسی فیلترها:
- اگر
categoriesارسال شده →orWhereJsonContains('categories', $value)در حلقه - اگر
tagsارسال شده →orWhereJsonContains('tags', $value) - اگر
placesارسال شده →orWhereJsonContains('places', $value)
↓
✳️ ۴. اعمال مرتبسازیها:
- در صورت وجود
sortByScore: مرتبسازی بر اساس امتیاز نزولی و محدودیت به ۱۰ نتیجه - در صورت وجود
sortByViews: مرتبسازی بر اساس بازدید نزولی و محدودیت به ۶ نتیجه
↓
📑 ۵. خروجی دادهها:
- اگر
sortByScoreیاsortByViewsفعال باشد → خروجیget()بدون pagination - در غیر این صورت → خروجی
paginate(15)
↓
✅ ۶. ساخت پاسخ JSON شامل وضعیت، زمان، دادهها و لینکهای صفحهبندی.
📦 ساختار پاسخ JSON
پاسخ موفق
{
"status": true,
"time": 1733799551,
"data": [
{
"id": 245,
"title": "راهنمای سفر مشهد",
"excerpt": "در این مقاله به جاذبههای گردشگری...",
"cover": "https://cdn.site.com/uploads/article245.jpg",
"views": 932,
"score": 4.8,
"categories": [5, 7],
"tags": [12, 98],
"created_at": "2025-11-22T10:00:00Z"
},
...
],
"links": {
"first": "https://api.domain.com/b2c/v1/articles?page=1",
"last": "https://api.domain.com/b2c/v1/articles?page=15",
"prev": null,
"next": "https://api.domain.com/b2c/v1/articles?page=2"
}
}
🔹 پاسخ در حالت مرتبسازی (بدون pagination)
{
"status": true,
"time": 1733799553,
"data": [ { ... }, { ... }, ... ],
"links": false
}
نکات فنی
- فیلترها با استفاده از
orWhereJsonContainsاعمال میشوند، بنابراین اگر مقاله شامل هرکدام از مقادیر دادهشده باشد در نتایج بازمیگردد. - رتبهبندی بر اساس
scoreیاviewsباعث بایپس شدن pagination میشود تا فقط n نتیجه برتر برگردد. - در خروجی از
ArticleResourceبرای ساختاردهی دادهها استفاده شده است. - پارامتر
branchالزامی است و باید در Query لحاظ شود؛ در غیر این صورت هیچ رکوردی پیدا نخواهد شد.
🚀 پیشنهادات بهبود برای توسعه آینده
- افزودن پارامتر
limitدلخواه برای sortByScore و sortByViews جهت کنترل خروجی. - بهینهسازی Query با استفاده از
->whereIn()در صورتی که فیلترها زیاد تکرار شوند تا از تکرارorWhereJsonContainsجلوگیری شود. - افزودن cache با کلید
articles:list:{branch}:{hash_of_params}جهت افزایش سرعت واکشی مقالات محبوب.