FCM token kullanım raporu
FCM token yaşam döngüsü ve kullanım analizi
Firebase Cloud Messaging ve FCM Token Kullanim Raporu
Mühendislik notu
Bu sayfa entegratör yol haritasından çok ekip içi operasyon/backlog içeriği taşır. Entegrasyon için API Reference ve ilgili ürün rehberlerini kullanın.
1. Amac ve Kapsam
Bu rapor, backend tarafında Firebase Cloud Messaging (FCM) altyapisini ve FCM token yasam dongusunu nasil kullandigimizi açıklar. Icerik, dogrudan kod tabanindaki mevcut implementasyona dayanir.
2. Mimari Ozet
- FCM entegrasyonu
FirebaseModuleile global provider olarak ayaga kaldirilir. - Bildirim gönderimi
PushNotificationServicetarafında yapilir. - Token kayit/guncelleme/silme
PushNotificationsController+DeviceTokenService+DeviceTokenRepositoryzincirinde yonetilir. - Is kurali tarafında uygulama ici olaylardan gelen bildirimler
NotificationDeliveryServiceile push + in-app olarak orkestre edilir.
3. Firebase Admin Baslatma Akisi
FirebaseModule içinde kimlik bilgisi (service account) su oncelikle cozulur:
FIREBASE_ADMIN_SA_BASE64(base64 json)FIREBASE_PROJECT_ID+FIREBASE_CLIENT_EMAIL+FIREBASE_PRIVATE_KEYFIREBASE_ADMIN_SA_PATHdosya yolu- Son fallback olarak repodaki
src/config/firebase-service-account.json
Ardindan admin.initializeApp(...) ile app olusturulur ve app.messaging() DI ile enjekte edilir.
4. Endpoint ve Erisim Modeli
- Uygulama global prefix + versioning kullaniyor:
/api/v1/... - Device token endpointleri:
POST /api/v1/notifications/device-tokenDELETE /api/v1/notifications/device-token/:token
- Test endpointleri:
POST /api/v1/notifications/testPOST /api/v1/notifications/test/username
- Broadcast endpointi:
POST /api/v1/notifications/admin/broadcast(admin role gerekli)
Not: JwtAuthGuard global olarak aktif oldugu için @Public olmayan endpointlerde JWT zorunludur.
5. FCM Token Yasam Dongusu
5.1 Kayit/Güncelleme
POST /notifications/device-token çağrısı ile:
timezonegeldiyse veuserIdvarsa kullanıcının timezone bilgisi guncellenir.tokentrim edilerek normalize edilir.- Token bossa DB upsert yapilmaz (sadece timezone güncellemesi olur).
- Token varsa
upsertByTokenile kayit/guncelleme yapilir. - Ayni token için duplicate kayitlar temizlenir.
- Ayni
userId + deviceIdiçin eski tokenlar temizlenir (yeni token dışındakiler silinir).
5.2 Silme
DELETE /notifications/device-token/:token çağrısı:
- Token normalize edilir.
userIdvarsa silme filtresi token + userId ile yapilir; bu sayede kullanıcı baskasinin tokenini silemez.
5.3 Okuma ve Toplu Islem
- Kullanıcı bazli tokenlar:
findDistinctTokensByUser - Tüm tokenlar:
findDistinctAllTokens - Token sahibi user listesi:
findDistinctUserIdsWithTokens
6. Push Gonderim Akisi
6.1 Tekli/Test Gonderim
sendTestNotification:
- Token cozumu:
- DTO'da
tokenvarsa direkt onu kullanir - Yoksa
userIdveya current user tokenlari kullanılır
- DTO'da
- Mesaj formati:
notification.title/bodydatapayload string'e cevrilir- Android:
priority=high,restrictedPackageName - iOS(APNS):
apns-topic,content-available=true,sound=default
6.2 Is Kuralı Kaynakli Gonderim
sendNotificationByAction:
- Hedef kullanıcının tokenlari çekilir.
- Token yoksa sessizce
0 success / 0 failuredöner. - Varsa multicast gönderim yapar.
- Opsiyonel
imageUrliçin Android ve APNS tarafında image alanlari set edilir.
6.3 Toplu Gonderim (Broadcast Push)
sendNotificationToAllUsers:
- Tüm tokenlar dedupe edilir.
- Batch boyutu
500olacak sekilde parcali gönderim yapilir. - Toplam basari/basarisizlik metrikleri toplanir.
6.4 Gecersiz Token Temizligi
Tüm gönderim akislari su FCM hata kodlarini gecersiz token olarak kabul eder:
messaging/registration-token-not-registeredmessaging/invalid-registration-token
Bu tokenlar otomatik olarak removeInvalidTokens ile veritabanindan temizlenir.
7. NotificationDeliveryService ile Is Kuralı Entegrasyonu
NotificationDeliveryService.deliver(...) akisi:
- Kullanıcı tercih kontrolu:
userSettingsService.isNotificationEnabled(...) - Izin yoksa push ve in-app atlanir.
- Izin varsa push gönderimi denenir.
- Push hata verse bile in-app oluşturma devam eder.
Bu sayede push altyapisinda gecici sorun olsa da in-app bildirim kaydi olabildigince korunur.
8. FCM ve Tokenin Kullanildigi Baslica Is Senaryolari
- Takip bildirimi (
follow-user.usecase.ts) - Mesaj ve kredi transferi bildirimi (
message.service.ts) - Takip edilen kisinin yayin baslatmasi (
following-activity-notification.service.ts) - Yayin oncesi hatirlatmalar (
live-stream-pre-start-notification.service.ts) - Kullanıcıya yayin hatirlatma (
live-stream-user-reminder-notification.service.ts)
Bu senaryolarin hepsi NotificationDeliveryService uzerinden ortak push/in-app zincirine girer.
9. Test Kapsami Ozet
Mevcut unit testler asagidaki kritik davranislari dogrular:
- Token normalize ve dedupe davranisi
- Gecersiz token temizligi
- Broadcast kanallarinin (push + in-app) birlikte calismasi
- Kullanıcı tercihleri kapalıyken bildirimin atlanmasi
- Push hatasi olsa bile in-app akisinin devam etmesi
10. Gozlemler
- Dokumantasyonla kod davranisi arasinda bir fark var: bazi dokümanlarda device-token endpointi "opsiyonel auth" gibi anlatilsa da mevcut kodda endpoint
@Publicdeğil ve global JWT guard nedeniyle auth zorunlu. - Firebase credentials için repoda fallback service-account json bulunuyor. Guvenlik ve operasyon acisindan, production ortamında secret manager/env tabanli yonetim tercih edilmeli.
11. Kaynak Kod Referanslari
src/integrations/firebase/firebase.module.tssrc/config/firebase.config.tssrc/notifications/push-notifications.controller.tssrc/notifications/device-token.service.tssrc/notifications/repository/device-token.repository.tssrc/notifications/schemas/device-token.schema.tssrc/notifications/push-notification.service.tssrc/notifications/notification-delivery.service.tssrc/user-settings/user-settings.service.tssrc/auth/guards/jwt-auth.guard.tssrc/main.tssrc/follow/use-cases/follow-user.usecase.tssrc/message/message.service.tssrc/live-stream/services/following-activity-notification.service.tssrc/live-stream/services/live-stream-pre-start-notification.service.tssrc/live-stream/services/live-stream-user-reminder-notification.service.tssrc/notifications/push-notification.service.spec.tssrc/notifications/device-token.service.spec.tssrc/notifications/notification-delivery.service.spec.ts