🔔 Correction - Notifications Agent IA
Date : 2025-01-11 Status : ✅ Résolu
📋 Problème
Les notifications push ne fonctionnaient pas lorsque l'Agent IA créait une nouvelle commande via WhatsApp.
Symptômes :
- ✅ Notifications fonctionnent pour les paiements
- ✅ Notifications fonctionnent pour les commandes terminées
- ❌ Pas de notification quand l'Agent IA crée une commande
🔍 Diagnostic
Cause racine identifiée
Incohérence de nom de table entre le backend Node.js et l'application mobile Flutter :
| Composant | Table utilisée | Colonnes |
|---|---|---|
| Mobile (Flutter) ✅ | user_fcm_tokens | user_id, fcm_token, platform, active |
| Backend (Node.js) ❌ | fcm_tokens | user_id, token, is_active |
Le backend cherchait les tokens FCM dans une table différente (fcm_tokens) alors que le mobile les sauvegardait dans user_fcm_tokens.
Résultat : Le backend ne trouvait aucun token et n'envoyait donc aucune notification.
✅ Solution appliquée
Modifications backend
Fichier modifié : kazalendar-agent-api/src/services/notification.service.ts
Changements :
- Table :
fcm_tokens→user_fcm_tokens - Colonne :
token→fcm_token - Colonne :
is_active→active - Ajout de logs détaillés pour le debugging
- Ajout du champ
commande_iddans les données de notification (pour la navigation)
Aucune modification mobile requise
L'application mobile Flutter fonctionnait déjà correctement. Seul le backend nécessitait une correction.
🎯 Workflow complet
┌─────────────────────────────────────────────────────────────┐
│ 1. Client envoie message WhatsApp │
│ "Je voudrais commander un gâteau pour 10 personnes" │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. Agent IA extrait les informations │
│ - Produit, date, nombre de personnes, etc. │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. Agent IA crée la commande dans Supabase │
│ → agent.service.ts : createOrder() │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. 🔔 NOTIFICATION envoyée (MAINTENANT CORRIGÉ) │
│ → NotificationService.notifyNewOrder() │
│ → Recherche dans user_fcm_tokens ✅ │
│ → Trouve les tokens actifs │
│ → Envoie via Firebase Cloud Messaging │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. 📱 Artisan reçoit la notification │
│ Titre: "🎂 Nouvelle commande Agent IA" │
│ Corps: "[Client] : [Produit]" │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 6. Artisan clique → Navigation vers calendrier │
│ → La commande est visible et peut être validée │
└─────────────────────────────────────────────────────────────┘
📱 Côté Mobile (Flutter)
Services concernés
Fichier : lib/core/services/notification_service.dart
- Gère les permissions FCM
- Reçoit les notifications en premier plan et arrière-plan
- Gère la navigation au clic
Fichier : lib/core/services/fcm_token_service.dart
- Sauvegarde le token FCM dans
user_fcm_tokens - Synchronise les tokens avec Supabase
- Gère les retry en cas d'échec réseau
Aucune modification requise
Les services Flutter fonctionnaient déjà correctement. Ils :
- ✅ Demandent les bonnes permissions
- ✅ Récupèrent le token FCM
- ✅ Le sauvegardent dans la bonne table (
user_fcm_tokens) - ✅ Gèrent les notifications reçues
- ✅ Naviguent vers la bonne page au clic
💻 Côté Backend (Node.js)
Fichier modifié
kazalendar-agent-api/src/services/notification.service.ts
Avant (ne fonctionnait pas) :
const { data: tokens } = await supabase
.from('fcm_tokens') // ❌ Table inexistante
.select('token') // ❌ Colonne incorrecte
.eq('user_id', userId)
.eq('is_active', true); // ❌ Colonne incorrecte
Après (fonctionne) :
const { data: tokens, error: tokenError } = await supabase
.from('user_fcm_tokens') // ✅ Bonne table
.select('fcm_token') // ✅ Bonne colonne
.eq('user_id', userId)
.eq('active', true); // ✅ Bonne colonne
console.log(`✅ ${tokens.length} token(s) FCM trouvé(s)`);
🗄️ Structure de la table Supabase
Table : user_fcm_tokens
CREATE TABLE user_fcm_tokens (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
fcm_token TEXT NOT NULL,
platform TEXT CHECK (platform IN ('ios', 'android', 'web')),
active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
UNIQUE(user_id, fcm_token)
);
CREATE INDEX idx_user_fcm_tokens_user_id ON user_fcm_tokens(user_id);
CREATE INDEX idx_user_fcm_tokens_active ON user_fcm_tokens(active);
Colonnes :
id: UUID uniqueuser_id: Référence vers l'utilisateurfcm_token: Le token Firebase Cloud Messagingplatform: ios, android, ou webactive: true si le token est valide, false sinoncreated_at/updated_at: Timestamps
🧪 Comment tester
Test 1 : Vérifier que l'app enregistre bien le token
-
Lancer l'application mobile
-
Se connecter avec un compte
-
Vérifier les logs Flutter :
✅ Permissions notifications accordées
📱 FCM Token: [votre-token]
✅ Token FCM sauvegardé pour l'utilisateur [user-id] -
Vérifier dans Supabase :
SELECT * FROM user_fcm_tokens
WHERE user_id = 'votre-user-id' AND active = true;
Test 2 : Tester une notification via l'Agent IA
- Envoyer un message WhatsApp pour créer une commande
- Vérifier les logs du backend :
📬 Tentative d'envoi de notification
✅ 1 token(s) FCM trouvé(s)
✅ Notification envoyée avec succès à 1/1 appareil(s) - Vérifier que la notification apparaît sur le mobile
- Cliquer sur la notification
- Vérifier que l'app s'ouvre sur le bon écran
📊 Logs à surveiller
Mobile (succès)
✅ Permissions notifications accordées
📱 FCM Token: eyJhb...
✅ Service de notifications initialisé
✅ Token FCM sauvegardé pour l'utilisateur abc-123
📬 Notification reçue en premier plan
Titre: 🎂 Nouvelle commande Agent IA
Backend (succès)
📬 Tentative d'envoi de notification pour la commande xyz-789
✅ 1 token(s) FCM trouvé(s) pour l'utilisateur
📤 Envoi de la notification à 1 appareil(s)...
✅ Notification envoyée avec succès à 1/1 appareil(s)
🐛 Troubleshooting
"Aucun token FCM actif trouvé"
Causes possibles :
- L'utilisateur n'a pas accordé les permissions de notifications
- Le token n'a pas été sauvegardé dans Supabase
- Le token a été marqué comme inactif
Solutions :
- Relancer l'app et accepter les permissions
- Se déconnecter et se reconnecter
- Vérifier manuellement dans Supabase et réactiver si nécessaire
"Firebase Admin initialization failed"
Causes :
- Variable d'environnement
FIREBASE_SERVICE_ACCOUNTmanquante ou invalide
Solution :
- Aller sur Firebase Console
- Paramètres > Comptes de service
- Générer une nouvelle clé privée
- Ajouter le JSON dans
.envdu backend
📝 Documentation complémentaire
- Guide de diagnostic complet
- Architecture Agent IA
- Tests de disponibilité
✅ Résultat
Avant :
- ❌ Notifications ne fonctionnaient pas pour l'Agent IA
- ⚠️ Artisan ne savait pas qu'une commande avait été créée
- ⚠️ Mauvaise expérience utilisateur
Après :
- ✅ Notifications fonctionnent pour toutes les commandes
- ✅ Artisan est notifié instantanément
- ✅ Peut valider rapidement les commandes
- ✅ Meilleure réactivité du service
Développé le : 2025-01-11 Temps estimé : 0.5-1 jour Temps réel : 1 heure (diagnostic + correction) Complexité : Simple (nom de table incorrect)