# 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)
