#P1742
GET /v2/core/hub/reservation
Hub: Get Master Reservation List
این اندپوینت یک لیست جامع و صفحهبندی شده از تمام رزروهای ثبت شده در سیستم مرکزی (Hub) را برمیگرداند. برای هر رزرو، اطلاعات از جداول مختلفی مانند offices، factor_items، colleagues، و wallet استخراج و با دادههای اصلی ادغام میشود تا یک خروجی کامل و غنیشده ارائه دهد.
Request Overview
URL:
/v2/core/hub/reservationMethod: GET
Controller: HubController@hubReservation
Middleware: authWithJwt
Access Control
- نیاز به توکن احراز هویت (JWT) دارد.
Query Parameters (Custom Pagination)
این اندپوینت از یک ساختار صفحهبندی سفارشی استفاده میکند که معمولاً توسط کتابخانههای جدولی مانند (jQuery DataTables) ارسال میشود. پارامترها باید در یک آبجکت به نام paginate ارسال شوند.
| Field | Type | Description |
|---|---|---|
| paginate[length] | integer | (الزامی) تعداد آیتمهای مورد نظر در هر صفحه. |
| paginate[start] | integer | (الزامی) آفست (offset) شروع رکوردها. برای صفحه اول 0، برای صفحه دوم (با length=10)، 10 و به همین ترتیب. |
Example URL: /v2/core/hub/reservation?paginate[length]=15&paginate[start]=0
Logic Details
فرآیند دریافت و پردازش رزروها بسیار گسترده است و شامل مراحل زیر میشود:
- کوئری اولیه و صفحهبندی:
- یک کوئری اصلی به جدول
hub_reservationزده میشود. - این کوئری با جدول
officesبر اساسhub_reservation.branchجوین میشود تا نام فارسی شعبه (brand_fa) استخراج شود. - نتایج بر اساس
idبه صورت نزولی مرتب میشوند. - با استفاده از پارامترهای
lengthوstart، صفحهبندی سفارشی روی نتایج اعمال میشود.
- یک کوئری اصلی به جدول
- حلقه غنیسازی دادهها (Data Enrichment Loop):
- سیستم روی هر یک از رزروهای برگشتی از کوئری اصلی، یک حلقه اجرا کرده و برای هرکدام، مجموعهای از عملیات و کوئریهای اضافی را انجام میدهد:
- نکته عملکردی (Performance Consideration): این رویکرد (کوئری در حلقه) به مشکل N+1 Query منجر میشود و ممکن است با افزایش تعداد آیتمها در هر صفحه، عملکرد را تحت تأثیر قرار دهد.
- مراحل داخل حلقه برای هر رزرو:
- واکشی آیتم فاکتور: از جدول
factor_items، آیتم مربوط به رزرو (item_id) واکشی میشود. اگر آیتم یافت نشود، کل آن رزرو از خروجی نهایی حذف میشود. - واکشی نام سرویسها: شناسههای عددی
serviceوsub_serviceبا اجرای کوئری روی جدولcolleaguesبه نام متنی (فیلدoffice) تبدیل میشوند. - تولید عنوان آیتم (
title_item): با فراخوانی متد پیچیدهTradeController::getReferenceItemTitle، یک عنوان توصیفی و قابل فهم برای آیتم (مانند "هواپیما تهران به مشهد | ۱۴۰۴/۰۹/۱۸ ۱۲:۳۰") تولید میشود. این متد به شدت از کش Redis برای بهینهسازی عملکرد استفاده میکند. - واکشی اطلاعات اپراتور: با فراخوانی متد
StaticController::getOperators، شناسه اپراتور به یک آبجکت کامل شامل نام، نام خانوادگی و سایر مشخصات تبدیل میشود. در صورت عدم وجود اپراتور، مقدارfalseبازگردانده میشود. - پردازش فیلدهای JSON: رشتههای JSON موجود در فیلدهای
supplier_detailsوdetailsبه آبجکت/آرایه تبدیل میشوند. - ضمیمه کردن دادههای جدید: اطلاعات پردازش شده (نام سرویس، عنوان، اطلاعات اپراتور و...) به آبجکت اصلی رزرو اضافه میشوند.
- بررسی استرداد (Refund): سیستم در جدول
walletجستجو میکند تا ببیند آیا تراکنش استردادی (target_type='refund') برای این رزرو ثبت شده است یا خیر. در صورت وجود، جزئیات آن به فیلدrefundاضافه میشود؛ در غیر این صورت، این فیلد مقدارfalseمیگیرد.
- واکشی آیتم فاکتور: از جدول
Response Structure
پاسخ موفق
- Status Code:
200 OK - فیلد
itemsحاوی آرایهای از آبجکتهای رزرو غنیشده است. - فیلد
meta.tableحاوی جزئیات کامل صفحهبندی است.
{
"items": [
{
"id": 12345,
"branch": "آژانس تابان", // از جدول offices
"item_id": 54321,
"operator": { // از متد getOperators
"id": 101,
"text": "1100 - علی اکبری",
"query": { /* ... details ... */ }
},
"service": "Ghasreshirin", // نام تبدیل شده
"sub_service": "Parsian System", // نام تبدیل شده
"supplier_details": { /* آبجکت JSON */ },
"details": { /* آبجکت JSON */ },
"status": "issued",
"created_at": "2025-12-09T12:00:00.000000Z",
// --- Fields added in the loop ---
"title_item": "هواپیما تهران به مشهد | ۱۴۰۴/۰۹/۱۸ ۱۲:۳۰ | W5065 | ماهان", // از getReferenceItemTitle
"item": { // آبجکت کامل از factor_items
"id": 54321,
"product": "online",
"byproduct": "aircraft",
"details": { /* ... */ },
"buy": 5400000,
"sell": 5500000
/* ... */
},
"refund": { // یا false اگر وجود نداشته باشد
"id": 789,
"credit": 5000000,
"description": "استرداد بابت کنسلی پرواز"
}
}
],
"meta": {
"timestamp": 1733737200,
"table": {
"total": 500,
"per_page": 15,
"current_page": 1,
"last_page": 34,
"from": 1,
"to": 15
}
}
}
Flowchart
Start Request (GET /v2/core/hub/reservation)
↓
Execute Paginated Query on `hub_reservation` with JOIN on `offices`.
(Using custom `start`/`length` params)
(Using custom `start`/`length` params)
↓
For each reservation in results:
Query `factor_items` using `item_id`
↓
Item Found?
No
Skip to next reservation
↓ (Yes)
Query `colleagues` for Service & Sub-Service names
↓
Call `getReferenceItemTitle` (Cached Title Generation)
↓
Call `getOperators` to format operator data
↓
Query `wallet` to find refund details
↓
Assemble all new data into the final reservation object
↓
Return 200 OK with `items` array & `meta.table`