# POST /v2/flights/routes/update

# M. Update Airline Active Routes (Manual Trigger)

این اندپوینت برای **بروزرسانی دستی جدول مسیرهای فعال (Airline Active Routes)** استفاده می‌شود. سیستم با فراخوانی این سرویس، موجودی پروازها را برای ۷ روز آینده (از فردا) به تفکیک روزهای هفته بررسی کرده و در دیتابیس ذخیره می‌کند. این فرآیند با ارسال درخواست‌های متوالی به وب‌سرویس تامین‌کننده (Nira) انجام می‌شود.

<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/update`</div><div>**Method:** <span class="method-post">POST</span></div><div>**Controller:** V2BaseController@updateAirlineActiveRoute</div><div>**Logic Handler:** CronController::updateAirlineActiveRoute</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">airline</td><td dir="ltr">array/string</td><td>**(اختیاری)** کد IATA ایرلاین‌ها. در صورت ارسال، بروزرسانی فقط برای این ایرلاین(ها) انجام می‌شود (مثلاً `['W5', 'NV']`).</td></tr><tr><td dir="ltr">route\_id</td><td dir="ltr">integer</td><td>**(اختیاری)** شناسه مسیر (ID) در جدول `approved_flight_rate`. اگر ارسال شود، پردازش فقط برای این مسیر خاص انجام می‌گیرد.</td></tr></tbody></table>

</div>## Logic Details

منطق پردازش در `CronController` بسیار پیچیده است و شامل مراحل زیر می‌باشد:

<div class="api-docs" id="bkmrk-%D9%BE%D8%A7%DA%A9%D8%B3%D8%A7%D8%B2%DB%8C-%D9%88%D8%B6%D8%B9%DB%8C%D8%AA-%D9%82%D8%A8%D9%84%DB%8C%3A-">1. **پاکسازی وضعیت قبلی:** کلید ردیس `airline_active_route:cron:route_id` در ابتدای کار حذف می‌شود تا پردازش از نو آغاز شود.
2. **واکشی مسیرها (Routes):**
    - از جدول `approved_flight_rate` مسیرهایی که مبدا و مقصد غیرفارسی دارند انتخاب می‌شوند.
    - فیلتر بر اساس `route_id` (در صورت وجود در ورودی) اعمال می‌شود.
3. **واکشی ایرلاین‌ها:**
    - از جدول `application_interface` رکوردهایی با تایپ `api` و سرویس `nira` که فعال هستند (`status=1`) دریافت می‌شوند.
    - اگر پارامتر `airline` ارسال شده باشد، لیست ایرلاین‌ها محدود می‌شود.
4. **حلقه پردازش (هفتگی):**
    - برای ۷ روز آینده (شروع از فردا) یک بازه زمانی ایجاد می‌شود.
    - به ازای هر مسیر و هر روز، متد `NiraApi->sendRequestFlight` فراخوانی می‌شود.
    - اگر `flight['Data']['Information']` حاوی داده باشد، وضعیت آن روز (مثلاً `monday`) برابر با **1** و در غیر این صورت 0 در نظر گرفته می‌شود.
5. **بروزرسانی دیتابیس (Upsert):**
    - داده‌ها در جدول `airline_active_route` ذخیره می‌شوند.
    - سیستم بررسی می‌کند که آیا رکوردی با ترکیب (Airline + Origin + Destination) وجود دارد یا خیر (بدون توجه به جهت مسیر).
    - اگر موجود باشد **Update** و اگر نباشد **Insert** انجام می‌شود.
6. **محدودیت پردازش:** یک شرط `break` وجود دارد: اگر تعداد ایرلاین‌های یافت شده بیش از ۱ مورد باشد، حلقه مسیرها (Routes) پس از اولین اجرا متوقف می‌شود (جهت جلوگیری از Timeout در پردازش‌های انبوه).

</div>## Response Structure

### پاسخ موفق (200 OK)

```json
{
    "payload": {
        "Status": true,
        "Time": 1733738500
    },
    "meta": {
        "timestamp": 1733738500
    }
}
```

<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-process">Redis::del(cron_key)</div><div class="flow-arrow">↓</div><div class="flow-item-process">Fetch Routes (approved_flight_rate)</div><div class="flow-item-process">Fetch Airlines (Nira API configs)</div><div class="flow-arrow">↓</div><div class="flow-item-decision">Loop Routes</div><div class="flow-arrow">↓</div><div class="flow-item-process" style="background-color: #e3f2fd; border-color: #90caf9; color: #0d47a1;">**Loop Period (Next 7 Days)**  
1. Call NiraApi-&gt;sendRequestFlight  
2. Check Availability (1 or 0)  
3. Store in Memory ($checkedRoutes)</div><div class="flow-arrow">↓</div><div class="flow-item-decision">DB Check (airline_active_route)</div><div style="display: flex; justify-content: space-between; width: 300px; margin: 0 auto;"><div style="text-align: center;"><div class="flow-arrow">↙ (Exists)</div><div class="flow-item-process">Update Row</div></div><div style="text-align: center;"><div class="flow-arrow">↘ (New)</div><div class="flow-item-process">Insert Row</div></div></div><div class="flow-arrow">↓</div><div class="flow-item-decision">Count(Airlines) &gt; 1 ?</div><div style="position: relative;"><div class="flow-arrow-label-left" style="top: -20px; left: -30px;">Yes</div><div class="flow-item-error" style="float: left; margin-left: -130px;">Break Loop (Prevent Timeout)</div></div><div class="flow-arrow">↓ (No / Continue)</div><div class="flow-item-success">Return JSON Payload</div></div></div>