Notifications Push
Cette section détaille le système de notifications push utilisant Firebase Cloud Messaging (FCM) pour envoyer des notifications aux utilisateurs mobiles.
FirebaseMessagingService (firebase-messaging.service.ts)
Service qui gère l'envoi de notifications push via Firebase Cloud Messaging.
Propriétés
private admin: FirebaseAdmin.App: Instance Firebase Admin
Méthodes principales
async sendNotificationToUser(firebaseUid: string, notification: NotificationPayload)
Description : Envoie une notification push à un utilisateur spécifique.
Paramètres :
firebaseUid: Firebase UID du destinatairenotification: Payload de notification
Flux :
- Récupère l'utilisateur via
UserService - Récupère les tokens FCM de l'utilisateur
- Envoie la notification à tous les tokens
- Gère les tokens invalides/expirés
Retour : Promise<void>
async sendNotificationToTokens(tokens: string[], notification: NotificationPayload)
Description : Envoie une notification à une liste de tokens FCM.
Paramètres :
tokens: Liste des tokens FCMnotification: Payload de notification
Actions :
- Envoie via
admin.messaging().sendMulticast() - Log des succès/échecs
- Retrait des tokens invalides
Retour : Promise<void>
async removeInvalidToken(firebaseUid: string, token: string)
Description : Retire un token FCM invalide de l'utilisateur.
Retour : Promise<void>
Structure NotificationPayload
{
title: string, // Titre de la notification
body: string, // Corps du message
imageUrl?: string, // URL d'image (optionnel)
data?: { // Données custom (optionnel)
[key: string]: string
}
}
Enregistrement des Tokens FCM
Endpoint
POST /api/user/fcm-token
Description : Enregistre un token FCM pour un utilisateur.
Body :
{ fcmToken: string }
Actions :
- Valide le token (non vide)
- Récupère l'utilisateur
- Ajoute le token à
user.fcmTokens[](si pas déjà présent) - Sauvegarde dans MongoDB
Réponse :
{
success: true,
message: 'FCM token registered successfully'
}
Gestion multi-device
Un utilisateur peut avoir plusieurs tokens FCM :
- Un token par appareil mobile
- Stockés dans
user.fcmTokens: string[] - Notifications envoyées à tous les appareils
Cas d'utilisation
1. Demande d'ami
Déclencheur : Un utilisateur envoie une demande d'ami
Notification :
{
title: 'Nouvelle demande d\'ami',
body: `${senderUsername} vous a envoyé une demande d'ami`,
data: {
type: 'friend_request',
senderUid: senderFirebaseUid
}
}
Service : FriendsService.sendFriendRequest()
2. Demande acceptée
Déclencheur : Un utilisateur accepte une demande d'ami
Notification :
{
title: 'Demande d\'ami acceptée',
body: `${accepterUsername} a accepté votre demande d'ami`,
data: {
type: 'friend_accepted',
accepterUid: accepterFirebaseUid
}
}
Service : FriendsService.acceptFriendRequest()
3. Nouveau message (futur)
Déclencheur : Nouveau message dans un canal
Notification :
{
title: `Nouveau message dans ${channelName}`,
body: `${authorUsername}: ${messagePreview}`,
data: {
type: 'new_message',
channelId: channelId
}
}
Service : ChatSocketService.handleSendMessage()
Gestion des erreurs
Tokens invalides
Lorsque FCM retourne une erreur pour un token :
- messaging/invalid-registration-token
- messaging/registration-token-not-registered
Actions :
- Log de l'erreur
- Suppression du token via
removeInvalidToken() - Mise à jour de l'utilisateur dans MongoDB
Erreurs d'envoi
Types d'erreurs :
- Token expiré
- Token invalide
- Quota dépassé
- Erreur serveur FCM
Gestion :
- Retry automatique (selon l'erreur)
- Log pour debugging
- Notification silencieuse côté utilisateur
Configuration
Variables d'environnement
FIREBASE_PROJECT_ID=your_project_id
FIREBASE_PRIVATE_KEY=your_private_key
FIREBASE_CLIENT_EMAIL=your_client_email
FCM_SERVER_KEY=your_fcm_server_key (optionnel)
Firebase Admin SDK utilise les credentials du service account pour envoyer les notifications.
Initialisation Firebase Admin
import * as admin from 'firebase-admin';
admin.initializeApp({
credential: admin.credential.cert({
projectId: process.env.FIREBASE_PROJECT_ID,
privateKey: process.env.FIREBASE_PRIVATE_KEY,
clientEmail: process.env.FIREBASE_CLIENT_EMAIL
})
});
Intégration Mobile (Flutter)
Installation (côté mobile)
- Ajouter
firebase_messagingaupubspec.yaml - Configurer Firebase dans l'app Flutter
- Demander permissions de notifications
Récupération du token
final fcmToken = await FirebaseMessaging.instance.getToken();
// Envoyer au serveur via POST /api/user/fcm-token
Écoute des notifications
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
// Notification reçue en foreground
print('Message data: ${message.data}');
if (message.notification != null) {
print('Notification: ${message.notification!.title}');
}
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
// Notification tapée (app en background)
print('A new onMessageOpenedApp event was published!');
});
Gestion de l'action
Basé sur data.type, l'app mobile navigue vers :
friend_request→ Page des demandes d'amisfriend_accepted→ Page de profil de l'aminew_message→ Canal de chat
Permissions
Android
Automatique depuis Android 13 (Tiramisu)
iOS
Demande explicite à l'utilisateur :
NotificationSettings settings = await FirebaseMessaging.instance.requestPermission(
alert: true,
badge: true,
sound: true,
);
Limites FCM
Quotas gratuits
- Messages : Illimité
- Throughput : 1M messages/minute
Taille du payload
- Data : Max 4KB
- Notification : Max 2KB
Durée de vie
- TTL par défaut : 4 semaines
- Configurable via
timeToLive
Sécurité
Validation des tokens
- Tokens validés par Firebase lors de l'envoi
- Tokens invalides automatiquement retirés
Données sensibles
- Pas de données sensibles dans le payload
- Seulement IDs et références
- Client récupère les détails via API
Authentification
- Endpoint d'enregistrement protégé par
authMiddleware - Seul l'utilisateur authentifié peut enregistrer son token
Notifications en temps réel vs Push
Socket.IO (temps réel)
- Utilisateur connecté
- Notification instantanée
- App en foreground
FCM (push)
- Utilisateur déconnecté ou app en background
- Notification persistante
- Réveil de l'app
Stratégie : Utiliser les deux en parallèle
- Socket.IO pour temps réel si connecté
- FCM pour notification si déconnecté
Extensions possibles
Notifications groupées
- Regrouper plusieurs notifications du même type
- Exemple : "3 nouvelles demandes d'amis"
Notifications riches
- Images
- Actions (accepter/refuser depuis la notification)
- Contenu étendu
Notifications planifiées
- Rappels de parties en cours
- Événements spéciaux
- Promotions boutique
Analytics
- Taux d'ouverture
- Conversions
- A/B testing
Topics
- Notifications broadcast à tous les utilisateurs
- Notifications par langue
- Notifications par région