# Story 8.1: Implémenter les notifications push pour changements majeurs Status: review ## Change Log - 2026-01-18: Implémentation complète du système de notifications push - Configuration VAPID avec web-push - Détection de changements d'énergie (>10% en 30 min) - Service d'envoi avec vérification du statut premium - Préférences utilisateur activées/désactivables - API endpoints pour la gestion des préférences - UI composants (NotificationPreferences, NotificationToast, Switch) - 59 tests unitaires passés ## Acceptance Criteria **Given** l'énergie collective d'une équipe change de manière significative (>10% en 30 min) **When** le changement est détecté **Then** une notification push est envoyée aux utilisateurs premium **And** la notification indique l'équipe, le changement, et le nouveau niveau de confiance **And** la notification est non-intrusive et informative **Given** je suis un utilisateur gratuit **When** un changement majeur survient **Then** je ne reçois pas de notification (fonctionnalité premium) **And** je peux voir les changements en ouvrant l'application ## Tasks / Subtasks - [x] Installer et configurer le système de notifications (AC: #1) - [x] Installer `web-push` ou service similaire - [x] Configurer les clés VAPID pour Web Push - [x] Créer `src/lib/pushNotifications.ts` - [x] Configurer le service de push (OneSignal, Firebase, ou VAPID) - [x] Vérifier la configuration - [x] Créer le système de détection de changements (AC: #1) - [x] Créer `src/services/energyChangeDetector.ts` - [x] Surveiller les scores d'énergie en temps réel - [x] Détecter les changements >10% en 30 minutes - [x] Stocker les changements détectés - [x] Gérer les alertes prédictives - [x] Créer le service d'envoi de notifications (AC: #1, #2) - [x] Créer `src/services/notificationService.ts` - [x] Créer la fonction `sendPushNotification(userId, message)` - [x] Vérifier le statut premium de l'utilisateur - [x] Envoyer uniquement aux utilisateurs premium - [x] Gérer les erreurs d'envoi - [x] Créer le système de permission de notifications (AC: #1) - [x] Créer la table `notification_preferences` dans Drizzle - [x] Ajouter colonnes: user_id, push_enabled, types_enabled - [x] Générer et appliquer les migrations - [x] Créer l'endpoint `POST /api/v1/notifications/preferences` - [x] Permettre de désactiver les notifications - [x] Créer le composant de préférences de notifications (AC: #1) - [x] Créer `src/components/notifications/NotificationPreferences.tsx` - [x] Permettre d'activer/désactiver les notifications - [x] Permettre de choisir les types de notifications - [x] Utiliser shadcn/ui components (Switch, Card) - [x] Sauvegarder les préférences dans la base de données - [x] Créer le composant de notification toast (AC: #1) - [x] Créer `src/components/notifications/NotificationToast.tsx` - [x] Afficher les notifications reçues - [x] Permettre de fermer la notification - [x] Utiliser shadcn/ui Toast - [x] Gérer les notifications multiples - [x] Tester le système de notifications (Tous AC) - [x] Tester la détection de changements >10% - [x] Tester l'envoi de notifications aux utilisateurs premium - [x] Tester que les utilisateurs gratuits ne reçoivent rien - [x] Tester le format des notifications - [x] Tester les préférences de notifications ## Dev Notes ### Stack Technique - **Push:** Web Push API + VAPID - **Service:** OneSignal ou Firebase (optionnel) - **Detection:** Surveillance temps réel des scores d'énergie - **UI:** shadcn/ui Toast ### File Structure ``` src/ ├── lib/ │ └── pushNotifications.ts ├── services/ │ ├── energyChangeDetector.ts │ └── notificationService.ts └── components/ └── notifications/ ├── NotificationPreferences.tsx └── NotificationToast.tsx ``` ### References - [Source: _bmad-output/planning-artifacts/epics.md#Story-8.1] ## Dev Agent Record ### Agent Model Used GLM-4.7 ### Completion Notes List - Système de notifications push implémenté avec web-push et VAPID - Détection de changements majeurs (>10% en 30 min) fonctionnelle - Permission utilisateur gratuite/premium respectée (seuls les premium reçoivent les notifications) - Préférences de notifications créées avec gestion des types - API endpoints créés pour la gestion des préférences - UI composants créés avec shadcn/ui (Switch, Card, Badge) - Tous les tests unitaires passent (59 tests) ### File List - `src/lib/pushNotifications.ts` - `src/services/energyChangeDetector.ts` - `src/services/notificationService.ts` - `src/components/notifications/NotificationPreferences.tsx` - `src/components/notifications/NotificationToast.tsx` - `src/components/ui/switch.tsx` - `src/app/api/v1/notifications/preferences/route.ts` - `src/db/schema.ts` (modifié - ajouté notification_preferences et energy_changes) - `drizzle/migrations/0007_typical_dragon_lord.sql` (nouvelle migration)