Aller au contenu principal

🔔 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 :

ComposantTable utiliséeColonnes
Mobile (Flutter)user_fcm_tokensuser_id, fcm_token, platform, active
Backend (Node.js)fcm_tokensuser_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 :

  1. Table : fcm_tokensuser_fcm_tokens
  2. Colonne : tokenfcm_token
  3. Colonne : is_activeactive
  4. Ajout de logs détaillés pour le debugging
  5. Ajout du champ commande_id dans 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 unique
  • user_id : Référence vers l'utilisateur
  • fcm_token : Le token Firebase Cloud Messaging
  • platform : ios, android, ou web
  • active : true si le token est valide, false sinon
  • created_at / updated_at : Timestamps

🧪 Comment tester

Test 1 : Vérifier que l'app enregistre bien le token

  1. Lancer l'application mobile

  2. Se connecter avec un compte

  3. Vérifier les logs Flutter :

    ✅ Permissions notifications accordées
    📱 FCM Token: [votre-token]
    ✅ Token FCM sauvegardé pour l'utilisateur [user-id]
  4. 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

  1. Envoyer un message WhatsApp pour créer une commande
  2. 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)
  3. Vérifier que la notification apparaît sur le mobile
  4. Cliquer sur la notification
  5. 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 :

  1. L'utilisateur n'a pas accordé les permissions de notifications
  2. Le token n'a pas été sauvegardé dans Supabase
  3. Le token a été marqué comme inactif

Solutions :

  1. Relancer l'app et accepter les permissions
  2. Se déconnecter et se reconnecter
  3. Vérifier manuellement dans Supabase et réactiver si nécessaire

"Firebase Admin initialization failed"

Causes :

  • Variable d'environnement FIREBASE_SERVICE_ACCOUNT manquante ou invalide

Solution :

  1. Aller sur Firebase Console
  2. Paramètres > Comptes de service
  3. Générer une nouvelle clé privée
  4. Ajouter le JSON dans .env du 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)