392 lines
17 KiB
Markdown
392 lines
17 KiB
Markdown
# 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<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)
|
||
|
||
```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<br/>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: <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)
|
||
```
|