POST /api/stream-log — Stream Log (SSE)
📋 Genel Bilgi
Terminal'deki işlem durumunu gerçek zamanlı olarak takip etmek için Server-Sent Events (SSE) akışı başlatır. waiting → success durum geçişi izlenir.
Base URL: {{url}}/api/stream-log
Method: POST
Content-Type: application/json
🔐 Headers
| Header | Value |
|---|---|
| Authorization | Bearer {{masked_jwt_10}} |
| Content-Type | application/json |
📥 Request Body
{
"store_code": "mobildev-mq",
"terminal_code": "TERM-001"
}
Parametreler
| Alan | Tip | Zorunlu | Açıklama | Örnek |
|---|---|---|---|---|
store_code | string | ✅ | Mağaza kodu | "mobildev-mq" |
terminal_code | string | ✅ | Terminal kodu | "TERM-001" |
🔄 Akış Diyagramı (Stream Log — SSE ile Gerçek Zamanlı Takip)
Adım Açıklamaları:
| Adım | Taraf | İşlem | Açıklama |
|---|---|---|---|
| 1 | Kasiyer → API | POST /api/stream-log ile SSE dinlemeyi başlatır | Mağaza ve terminal bilgisi gönderilir. API SSE bağlantısı kurar. |
| 2 | API → Kasiyer | SSE stream bağlantısı kurulur | Response plain/text, chunked transfer ile gelir. Her satır ayrı JSON event'tir. |
| 3 | Terminal → Kasiyer | "İşlem bekleniyor" gösterilir | Kasiyer, müşterinin QR kodunu okutmasını bekler. |
| 4 | Müşteri → Terminal | QR kodu okutur | Müşteri mobil/web uygulamasından ürettiği auth code'u (QR veya PIN) kasiyere gösterir. |
| 5 | Terminal → API | Doğrulama başlatılır | QR/PIN doğrulama işlemi tetiklenir. |
| 6 | Müşteri → Passkey Ekranı | Passkey onay verir | Müşteri telefonda passkey ile doğrulama yapar. |
| 7 | Passkey → API | Doğrulama başarılı olur | Onay verildiğinde doğrulama tamamlanır ve stream'e success event'i gönderilir. |
| 8 | API → Kasiyer | SSE stream'den success event gelir | waiting → success durum geçişi gerçekleşir, müşteri bilgileri (data alanı) döner. |
| 9 | Terminal → Kasiyer | Sonuç gösterilir | Müşteri adı, telefon numarası, EK/KVKK onay durumu gibi bilgiler ekranda gösterilir. İşlem devam eder. |
SSE Event Akışı:
| Durum | Açıklama | Sıklık |
|---|---|---|
waiting | Terminal işlem bekliyor — müşteri henüz doğrulama yapmadı | Her ~3 saniye |
success | İşlem tamamlandı, müşteri bilgileri döndü | Tek seferlik (stream sonlanır) |
✅ Response — 200 OK (SSE Stream)
Response plain/text formatında chunked transfer ile gelir. Her satır ayrı bir JSON event'tir:
{"status":"waiting","terminalId":1,"timestamp":1785062098294}
{"status":"waiting","terminalId":1,"timestamp":1785062101326}
{"status":"waiting","terminalId":1,"timestamp":1785062104326}
{"status":"waiting","terminalId":1,"timestamp":1785062107327}
{"status":"success","timestamp":1785062110370,"data":{"token":"23166568","success":true,"msisdn":"{{customer_msisdn}}","ip":"{{customer_ip}}","deviceInfo":{"requestId":null,"timestamp":"2026-07-26T10:35:09.358Z","ip":"{{customer_ip}}","deviceContext":{"deviceName":"Desktop Computer","deviceVendor":"","deviceModel":"","deviceType":"desktop","osName":"Windows","osVersion":"10","browserName":"Chrome","browserVersion":"150.0.0.0","cpuArchitecture":"amd64"},"ipContext":{"country":"Türkiye","countryCode":"TR","city":"Küçükçekmece","region":"Istanbul","regionCode":"34","latitude":{{customer_latitude}},"longitude":{{customer_longitude}},"timezone":"Europe/Istanbul","postalCode":"{{customer_postal_code}}","accuracyRadius":500}},"ivt":{"etk":{"sms":1,"call":1,"email":1,"share":1},"kvkk":{"process":1,"share":1,"international":1},"loyalty":-1,"firstName":"{{customer_firstName}}","lastName":"{{customer_lastName}}","email":"{{customer_email}}"}}}
SSE Event Akışı
| Durum | Açıklama |
|---|---|
waiting | Terminal işlem bekliyor (her ~3 saniyede bir) |
success | İşlem tamamlandı, müşteri bilgileri döndü |
❌ Error Responses
{
"Response": {
"code": 3011,
"description": "store_code cannot be empty"
},
"Success": false
}
| Gerçek HTTP | Dönen HTTP | code | Enum | description | Ne Zaman Oluşur |
|---|---|---|---|---|---|
| 401 | 400 | 9999 | Status_9999_UnAccessClient | Hatalı Kullanıcı Adı / Parola | İstek yapan kullanıcı giriş yapmamış (_c.isLogin() false) |
| 400 | 400 | 3011 | LogStreamStoreCodeEmpty | store_code cannot be empty | store_code alanı boş gönderildi |
| 400 | 400 | 3012 | LogStreamTerminalCodeEmpty | terminal_code cannot be empty | terminal_code alanı boş gönderildi |
| 404 | 400 | 3013 | LogStreamTerminalCodeNotFound | terminal_code not found | store_code + terminal_code kombinasyonuna karşılık gelen bir terminal bulunamadı |
Örnek — Giriş Yapılmamış
{
"Response": {
"code": 9999,
"description": "Hatalı Kullanıcı Adı / Parola"
},
"Success": false
}
Örnek — store_code Boş
{
"Response": {
"code": 3011,
"description": "store_code cannot be empty"
},
"Success": false
}
Örnek — terminal_code Boş
{
"Response": {
"code": 3012,
"description": "terminal_code cannot be empty"
},
"Success": false
}
Örnek — Terminal Bulunamadı
{
"Response": {
"code": 3013,
"description": "terminal_code not found"
},
"Success": false
}
📝 Notlar
- SSE stream ~10-15 saniye devam eder (kod:
TIMEOUT_SECONDS = 60, yani gerçekte 60 saniye — dokümanın önceki hâlindeki "10-15 saniye" ifadesi kod ile uyuşmuyor, düzeltildi). - Her
waitingevent'i ~3 saniye arayla gönderilir. successevent'inde tam doğrulama response'u (dataalanı) bulunur.- Response header'larda
Cache-Control: no-cache,X-Accel-Buffering: no,Transfer-Encoding: chunkedbulunur.