# API Akış Şeması — ExtraNetWork 300+ endpoint, 60+ controller, 9 channel manager entegrasyonu, 3 metasearch entegrasyonu. --- ## 1. Middleware Zinciri ```mermaid 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 ```mermaid 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) ```mermaid 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ü ```mermaid 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
user_id+property_id+status=1} E -->|yok| X E --> F{Wizard route?} F -->|Evet| G{property.wizard_status
= 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) ```mermaid 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ışı ```mermaid 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) ```mermaid 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 ```mermaid 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) ```mermaid 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 ```mermaid 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
NLP/sentiment] AN --> S[(review_statistics)] S --> RS[reputation-management/review/statistics] ``` --- ## 11. CPA (Competitor Price Analysis) ```mermaid 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 | Açı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: ` | `JwtMiddleware` | | BookingEngine | `bookingEngineToken: ` | `BookingEngineTokenMiddleware` | | MyWeb | `myWebToken: ` | `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) ```