# POST /v2/flights/routes/min_price

# N. Flight Route Min Price (Cache)

این اندپوینت برای دریافت **حداقل قیمت پرواز** در یک مسیر خاص (مبدا و مقصد) استفاده می‌شود. داده‌های این سرویس مستقیماً از **Redis Cache** خوانده می‌شوند و دو حالت عملکرد دارد: دریافت قیمت برای یک تاریخ خاص، یا دریافت لیست تمام قیمت‌های موجود (Calendar View) برای آن مسیر.

<div class="api-docs" id="bkmrk-"></div>## Request Overview

<div class="api-docs" id="bkmrk-url%3A-%2Fv2%2Fflights%2Frou"><div class="endpoint-info"><div>**URL:** `/v2/flights/routes/min_price`</div><div>**Method:** <span class="method-post">POST</span></div><div>**Controller:** V2BaseController@getRouteFlightsMinPrice</div><div>**Storage:** Redis (Read-Only)</div><div>**Middleware:** authWithJwt</div></div></div>## Access Control

<div class="api-docs" id="bkmrk-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%D8%AA%D9%88%DA%A9%D9%86-%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2-%D9%87">- نیاز به توکن احراز هویت (JWT) دارد.
- این سرویس بسیار سریع است زیرا هیچ درخواستی به تامین‌کنندگان خارجی ارسال نمی‌کند و فقط با ردیس در ارتباط است.

</div>## Request Body Parameters

<div class="api-docs" id="bkmrk-field-type-descripti"><table class="schema-table" dir="rtl"><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td dir="ltr">origin</td><td dir="ltr">string</td><td>**(الزامی)** کد IATA فرودگاه مبدا (مثلاً `MHD`).</td></tr><tr><td dir="ltr">destination</td><td dir="ltr">string</td><td>**(الزامی)** کد IATA فرودگاه مقصد (مثلاً `THR`).</td></tr><tr><td dir="ltr">date</td><td dir="ltr">string</td><td>**(اختیاری)** تاریخ پرواز (فرمت YYYY-MM-DD). اگر ارسال شود، فقط قیمت همان روز برگردانده می‌شود. اگر ارسال نشود، لیست تمام تاریخ‌های موجود بازگردانده می‌شود.</td></tr></tbody></table>

</div>## Logic Details

منطق کنترلر بر اساس وجود یا عدم وجود پارامتر `date` به دو شاخه تقسیم می‌شود:

<div class="api-docs" id="bkmrk-%D8%AD%D8%A7%D9%84%D8%AA-%D8%AA%DA%A9-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%28speci">1. **حالت تک تاریخ (Specific Date):**
    - کلید ردیس به صورت مستقیم ساخته می‌شود: `min_price:flights:{origin}:{destination}:{date}`.
    - اگر کلید موجود باشد، مقدار آن (قیمت) در قالب آبجکت `payload` بازگردانده می‌شود.
    - اگر موجود نباشد، پاسخ JSON با خطای داخلی `code: 404` بازگردانده می‌شود.
2. **حالت کلی (Calendar View):**
    - اگر پارامتر `date` ارسال نشود، سیستم تمام کلیدهای منطبق با الگوی `min_price:flights:{origin}:{destination}:*` را جستجو می‌کند.
    - **مدیریت پیشوند ردیس:** کد به طور هوشمند Prefix اتصال ردیس را دریافت کرده و هنگام پردازش کلیدها، آن را حذف می‌کند (`str_replace`) تا به نام کلید خالص برسد.
    - تاریخ از بخش پنجم کلید (اینکس 4 در explode) استخراج شده و به همراه قیمت در آرایه `items` قرار می‌گیرد.

</div>## Response Structure

### حالت ۱: پاسخ موفق (تاریخ مشخص)

```json
{
    "payload": {
        "origin": "MHD",
        "destination": "THR",
        "date": "2025-12-10",
        "min_price": 1500000
    },
    "meta": {
        "timestamp": 1733739000
    }
}
```

### حالت ۲: پاسخ موفق (لیست کلی)

```json
{
    "items": [
        {
            "origin": "MHD",
            "destination": "THR",
            "date": "2025-12-10",
            "min_price": 1500000
        },
        {
            "origin": "MHD",
            "destination": "THR",
            "date": "2025-12-11",
            "min_price": 1450000
        }
    ],
    "meta": {
        "timestamp": 1733739000
    }
}
```

### پاسخ خطا (یافت نشد)

فقط در حالت "تک تاریخ" رخ می‌دهد:

```json
{
    "error": {
        "code": 404,
        "message": "not found."
    },
    "meta": {
        "timestamp": 1733739000
    }
}
```

<div class="api-docs" id="bkmrk--1"></div>## Flowchart

<div class="api-docs" id="bkmrk-start-request-%28post%29"><div class="flowchart"><div class="flow-item">Start Request (POST)</div><div class="flow-arrow">↓</div><div class="flow-item-decision">Is 'date' provided?</div><div style="display: flex; justify-content: space-between; width: 450px; margin: 0 auto;"><div style="text-align: center; width: 48%;"><div class="flow-arrow">↙ (Yes)</div><div class="flow-item-process">Redis::get(Specific Key)</div><div class="flow-arrow">↓</div><div class="flow-item-decision">Found?</div><div style="display: flex; justify-content: space-between;"><div><div class="flow-arrow">No</div><div class="flow-item-error">Return 404 Error</div></div><div><div class="flow-arrow">Yes</div><div class="flow-item-success">Return Single Payload</div></div></div></div><div style="text-align: center; width: 48%;"><div class="flow-arrow">↘ (No)</div><div class="flow-item-process">Redis::keys(Pattern *)</div><div class="flow-arrow">↓</div><div class="flow-item-process" style="background-color: #e3f2fd; border-color: #90caf9; color: #0d47a1;">Loop Keys:  
1. Remove Prefix  
2. Extract Date  
3. Get Price</div><div class="flow-arrow">↓</div><div class="flow-item-success">Return Items List</div></div></div></div></div>