Files
api-extranetwork/API_FLOW.md
ExtraNetwork e5c4b6aa13 first commit
2026-05-12 17:04:54 +03:00

17 KiB
Raw Blame History

API Akış Şeması — ExtraNetWork

300+ endpoint, 60+ controller, 9 channel manager entegrasyonu, 3 metasearch entegrasyonu.


1. Middleware Zinciri

graph LR
    A[Client] --> B[cors]
    B --> C[LanguageSetting]
    C --> D{Public?}
    D -->|Evet| Z[Controller]
    D -->|Hayır| E[jwt.auth]
    E --> F[userRoutePermissionAuthorize]
    F --> G[property]
    G --> H{Wizard gerekli mi?}
    H -->|Evet| I[contentWizard]
    H -->|Hayır| J{Channel sync?}
    I --> J
    J -->|Evet| K[checkPropertyChannelConnection]
    J -->|Hayır| Z
    K --> Z
    Z --> S[Service]
    S --> R[Repository]
    R --> DB[(MySQL)]
Middleware Amaç
cors CORS başlıkları
LanguageSetting TR/EN/DE dil seçimi
jwt.auth JWT + api_access_token doğrulama
userRoutePermissionAuthorize RBAC permission kontrolü
property user_property_mapping ile property ownership
contentWizard Onboarding tamamlanma kontrolü
checkPropertyChannelConnection Channel bağlantı durumu
bookingEngineToken BookingEngine widget token
myWebToken MyWeb template token

2. Genel Request Lifecycle

sequenceDiagram
    participant C as Client
    participant MW as Middleware Stack
    participant Ctrl as Controller
    participant Svc as Service
    participant Repo as Repository
    participant DB as MySQL

    C->>MW: HTTP + authToken
    MW->>MW: cors → lang → jwt → permission → property → wizard
    MW->>Ctrl: Request + credentials + property
    Ctrl->>Ctrl: Validator->validate(params)
    Ctrl->>Svc: business call
    Svc->>Repo: findByCriteria / create / update
    Repo->>DB: SQL
    DB-->>Repo: rows
    Repo-->>Svc: data
    Svc-->>Ctrl: ['status','data','message']
    Ctrl-->>C: apiResponse(status, message, data, code)

3. Auth Akışı (Login / Refresh / Logout)

sequenceDiagram
    participant U as User
    participant A as AuthController
    participant J as JwtService
    participant T as ApiAccessTokenService
    participant M as UserPropertyMappingService
    participant DB

    U->>A: POST auth/login {email, password, remember_me}
    A->>DB: user where email & status=1
    A->>A: Hash::check
    A->>J: jwtCreate(user_id, remember_me, day_counter=5)
    J-->>A: {token, exp}
    A->>T: create({token: md5(jwt), expire_date, user_id, invalidate=0})
    A->>M: select(user_property_mapping where user_id, status=1)
    M-->>A: property_list
    A-->>U: {token, expire_time, locale, property_list, user}

    Note over U,A: Refresh
    U->>A: GET auth/refresh-token (authToken header)
    A->>T: token bul (md5, expire>now, invalidate=0)
    A->>J: jwtCreate(day_counter=0.5)
    A->>T: update aynı token row
    A-->>U: {new token, expire_time}

    Note over U,A: Logout
    U->>A: POST logout (authToken header)
    A->>T: update invalidate=1
    A-->>U: 200 Logged out

4. Property Erişim Kontrolü

graph TD
    A[Request + property_id] --> B[jwt.auth ✓]
    B --> C[userRoutePermissionAuthorize]
    C -->|permission yok| X[403]
    C --> D[PropertyMiddleware]
    D --> E{user_property_mapping<br/>user_id+property_id+status=1}
    E -->|yok| X
    E --> F{Wizard route?}
    F -->|Evet| G{property.wizard_status<br/>= complete?}
    G -->|Hayır| Y[422 Wizard incomplete]
    G --> H[Controller]
    F -->|Hayır| H
    H --> I[Service: property_id ile scope]
    I --> J[(DB)]

5. Booking Lifecycle (BookingEngine)

sequenceDiagram
    participant G as Guest
    participant BE as BookingEngine Widget
    participant API as BookingEngine\BookingController
    participant Inv as Inventory/Rate
    participant Pay as PaymentLinkController
    participant DB

    G->>BE: arama (checkin/checkout, pax)
    BE->>API: POST /v1/search
    API->>Inv: availability + rates
    Inv->>DB: property_room_rate_mapping + availability
    API-->>BE: rate listesi

    G->>BE: oda seç
    BE->>API: POST /v1/booking
    API->>DB: insert booking + booking_contact + booking_room + booking_room_pax
    API-->>BE: booking_code (status=2 Pending)

    G->>BE: ödemeyi onayla
    BE->>API: POST /v1/bookingConfirm
    API->>Pay: paymentLinkInitialize
    Pay->>DB: insert payment_transaction (status=2 Start)
    Pay-->>BE: redirect URL

    G->>Pay: 3D Secure / POS
    Pay->>API: callback /paymentRedirect/{code}
    API->>DB: payment_transaction.status=1, booking.status=1
    API->>API: send confirmation email
    API-->>G: confirmation page

Status kodları:

  • booking.status: 0=İptal/Refund, 1=Confirmed, 2=Pending
  • booking_payment.status: 0=İptal, 1=Confirmed, 2=Pending
  • payment_transaction.status: 0=Error, 1=Success, 2=Start, 3=Pending, 4=Cancel/Refund, 5=Manual

6. Channel Sync Akışı

graph TD
    A[Property Manager] -->|property/property-channel-mapping/add| B[PropertyChannelMappingController]
    B --> C[(property_channel_mapping)]
    C --> D[Job: PropertyCatalogServiceJob]
    D --> E{Channel?}
    E -->|Reseliva| R1[ChannelManager/Reseliva]
    E -->|Channex| R2[ChannelManager/Channex]
    E -->|HotelRunner| R3[ChannelManager/HotelRunner]
    E -->|ElektraWeb| R4[ChannelManager/ElektraWeb]
    E -->|Athena/Fina/SistemOtel/1C/HyperGuest| R5[Diğer Adapters]
    R1 & R2 & R3 & R4 & R5 --> X[Remote Channel API]
    X --> L[Sync log + status update]
    L --> N[Dashboard'da görünür]

7. Inventory & Rate Update (Channel-Connection-Protected)

sequenceDiagram
    participant M as Manager
    participant API as PropertyRoomRateMappingController
    participant CC as checkPropertyChannelConnection
    participant DB
    participant Ch as Remote Channel

    M->>API: POST property/room-rate-mapping/bulk-update
    API->>CC: Channel bağlı mı?
    CC->>DB: property_channel_mapping.status
    alt Bağlı değil
        CC-->>M: 403 Channel disconnected
    else Bağlı
        API->>DB: update room_rate_mapping (price/availability)
        API->>Ch: push update
        Ch-->>API: ack
        API-->>M: success
    end

8. Wizard Onboarding

graph TD
    A[property/create] --> B[(property: wizard incomplete)]
    B --> C1[contact/update]
    B --> C2[room/add-room-bed]
    B --> C3[room-fact-mapping/update]
    B --> C4[room-photo-mapping/update]
    B --> C5[awards-certificates/list]
    B --> C6[fact/get-subcategory-facts]
    B --> C7[executive/list]
    C1 & C2 & C3 & C4 & C5 & C6 & C7 --> D[property/update/content-code]
    D --> E[(wizard_status = complete)]
    E --> F[Diğer property endpoint'leri açılır]

9. Web Site Builder (MyWeb)

sequenceDiagram
    participant M as Manager
    participant API as PropertyWebController
    participant DB
    participant FS as FileStorage/CDN
    participant V as Visitor
    participant MyW as MyWebContentController

    M->>API: web/create → property_web
    M->>API: web/update-content → component & content
    M->>API: web/meta-tag/sync
    M->>API: web/popup/create
    M->>API: web/publish → status=PUBLISHED
    API->>FS: assets

    V->>MyW: web/home (myWebToken)
    MyW->>DB: property_web_content + components
    MyW-->>V: render data (frontend tarafı şablonlar)

10. Reputation Management

graph TD
    A[reputation-management/channel/get] --> B[(reputation_channels)]
    A --> C[reputation-management/channel/sync]
    C --> J[Job: PropertyReviewServiceJob]
    J --> D{Source}
    D -->|TripAdvisor| T[TripAdvisor API]
    D -->|Google| G[Google Places API]
    D -->|Booking| BK[Booking API]
    T & G & BK --> R[(reviews)]
    R --> AN[Job: PropertyReviewAnalyzeServiceJob<br/>NLP/sentiment]
    AN --> S[(review_statistics)]
    S --> RS[reputation-management/review/statistics]

11. CPA (Competitor Price Analysis)

graph TD
    A[cpa/property/competitor/create] --> B[(property_competitors)]
    B --> C[cpa/property/competitor/sync]
    C --> D[Crawler/OTA API]
    D --> E[(competitor_prices günlük)]
    E --> F[cpa/property/competitor/analysis]
    F --> G[cpa/property/best-available-price]
    F --> H[cpa/property/promotion-available]
    F --> I[cpa/property/quick-pricing/rate]
    G & H & I --> J[Manager dashboard önerileri]

12. Endpoint Domain Özet Tablosu

# Domain Controller(lar) Endpoint ıklama
1 Auth AuthController 3 login / refresh / logout
2 User UserController 17 register, profile, password, mapping
3 Property PropertyController 12 CRUD + dashboard + raporlar
4 Property Info Contact, Brand, Config, Executive 14 Detay bilgi yönetimi
5 Content Content, Fact, FactMapping, AdditionalInfo 11 Property metadata
6 Photo PropertyPhoto + Category + Mapping 11 Foto yönetimi & CDN
7 Place PropertyPlaceController 15 Tesis içi yer/alan
8 Awards PropertyAwardCertificates 5 Sertifikalar
9 Room PropertyRoom + Type/View/Bed/Size 20+ Oda yapısı
10 Rate PropertyRoomRate + Mapping/Channel/Setup/Inclusion 27 Rate & inventory
11 Channel PropertyChannel + Mapping/Group/Contact/Category 23 OTA dağıtım
12 Cancellation Policy PropertyCancellationPolicy 5 İptal kuralları
13 Pricing Policy PropertyPersonPricingPolicy 7 Yetişkin/çocuk fiyat
14 Booking PropertyBookingController + Ticket 11 Rezervasyon ops
15 Payment PaymentController + PaymentLink 16 Ödeme + manual link + taksit
16 Offer PropertyOfferController 11 Teklif yönetimi
17 Promotion PropertyPromotionController 7 Promosyon & kampanya
18 Coupon/Addon PropertyCoupon + Addon 4 Ek ürün/kupon
19 CPA CompetitorPriceAnalysis + Group + QuickPricing 15+ Rakip analizi
20 Web Builder PropertyWebController + Content/Popup/Component 30+ Website yönetimi
21 MyWeb MyWebContentController 22+ Public site render
22 Booking Engine BookingEngine\BookingController + Search 17 Embedded widget
23 Channel Manager 9 entegrasyon adapter'ı 21 Reseliva, Channex, HotelRunner, ElektraWeb, Athena, Fina, SistemOtel, 1C, HyperGuest
24 MetaSearch Trivago, Yandex, Google 8 Meta arama
25 Reputation ReputationManagementController 4 Yorum & istatistik
26 AI AIController 1 OpenAI
27 Export ExportPdfController 5 PDF/Excel
28 Utility Language, Currency, Destination, Chain, Test, Contact 11 Referans veri

Toplam: ~300+ endpoint, ~60 controller dosyası.


13. Auth Header Konvansiyonu

Tip Header Doğrulayan
App API authToken: <jwt> JwtMiddleware
BookingEngine bookingEngineToken: <token> BookingEngineTokenMiddleware
MyWeb myWebToken: <token> MyWebTokenMiddleware
Channel Manager partner-specific header İlgili adapter

14. Body Konvansiyonu

Endpoint Tipi Body Şeması
Login { "email", "password", "remember_me", "locale", "onesignal_key" } (flat)
Tüm App API (POST) { "params": { ... } } (controller'lar $this->request->params okur)
BookingEngine { "params": { ... } } veya path param
ChannelManager adapter'a özel JSON şeması

15. Asenkron Olaylar (Queue Driver: database)

Job Tetikleyici Görev
PropertyCatalogServiceJob property/channel update Catalog senkronu
PropertyReviewServiceJob reputation sync Review fetch
PropertyReviewAnalyzeServiceJob review save NLP/sentiment
SlackLogJob sistem logu Slack bildirim

Mail kuyrukları: userCreateMail, UserForgotPassword.


16. Status Kodları Özeti

Tablo Alan Değerler
user status 0 inaktif / 1 aktif
user user_type 0 normal / 1 admin
api_access_token invalidate 0 geçerli / 1 iptal
booking status 0 İptal / 1 Onaylı / 2 Pending
booking_payment status 0 İptal / 1 Onaylı / 2 Pending
payment_transaction status 0 Error / 1 Success / 2 Start / 3 Pending / 4 Cancel / 5 Manual
property status 0 inaktif / 1 aktif

17. Hızlı Bakış: Tipik İstek Hayatı

1. Client → POST /app/v1/property/info/get  (Header: authToken)
2. cors → LanguageSetting → jwt.auth → userRoutePermissionAuthorize → property
3. PropertyController@getProperty
4. PropertyService->select(criteria scoped to property_id)
5. PropertyRepository->findByCriteria
6. MySQL property + relations (with: 'propertyContact', 'propertyType', ...)
7. apiResponse(1, null, $data, 200)