# language: fr

@rgpd @anonymization @gps
Fonctionnalité: Anonymisation des données GPS après 24h

  # 13.2 - Geohash après 24h (conformité RGPD + CNIL)

  Contexte:
    Étant donné que je suis un utilisateur avec le GPS activé
    Et que j'utilise l'application depuis plusieurs jours

  Scénario: Conservation des données GPS précises pendant 24h
    Étant donné que j'écoute un contenu à la position GPS 48.8566, 2.3522 (Paris, Tour Eiffel)
    Et qu'il est 10:00 le 2025-01-20
    Quand l'événement d'écoute est enregistré en base de données
    Alors les coordonnées précises 48.8566, 2.3522 sont stockées
    Et le champ `anonymized` est à `false`
    Et le champ `created_at` contient "2025-01-20 10:00:00"
    Et ces données précises servent à la recommandation personnalisée

  Scénario: Conversion en geohash après 24h
    Étant donné que j'ai écouté un contenu le 2025-01-20 à 10:00 à la position 48.8566, 2.3522
    Quand le job quotidien d'anonymisation s'exécute le 2025-01-21 à 02:00
    Alors les coordonnées précises sont converties en geohash précision 5
    Et le geohash correspond à une zone d'environ 5km²
    Et les coordonnées originales 48.8566, 2.3522 sont supprimées définitivement
    Et le champ `anonymized` passe à `true`
    Et il est impossible de retrouver la position précise d'origine

  Scénario: Requête SQL d'anonymisation (PostGIS)
    Étant donné que le job quotidien d'anonymisation s'exécute
    Quand la requête SQL suivante est exécutée:
      """sql
      UPDATE location_history
      SET location = ST_SetSRID(ST_GeomFromGeoHash(ST_GeoHash(location::geography, 5)), 4326)::geography,
          anonymized = true
      WHERE created_at < NOW() - INTERVAL '24 hours' AND anonymized = false;
      """
    Alors toutes les positions vieilles de plus de 24h sont anonymisées
    Et le processus est automatique et irréversible
    Et les données sont conformes RGPD

  Scénario: Précision du geohash niveau 5
    Étant donné qu'une position GPS est convertie en geohash précision 5
    Quand on analyse la zone couverte
    Alors la zone fait environ 5km² (4.9km × 4.9km)
    Et cette précision est suffisante pour des analytics agrégées
    Et cette précision ne permet pas d'identifier un individu (conformité CNIL)

  Scénario: Exemple de conversion Paris
    Étant donné que ma position précise est 48.8566, 2.3522 (Tour Eiffel)
    Quand la conversion en geohash précision 5 est appliquée
    Alors le geohash généré est "u09wh"
    Et ce geohash couvre une zone de ~5km² autour de la Tour Eiffel
    Et toutes les positions dans cette zone partagent le même geohash
    Et il est impossible de distinguer deux utilisateurs dans cette zone

  # Exception: Historique personnel

  Scénario: Conservation de l'historique personnel utilisateur
    Étant donné que j'ai écouté des contenus aux positions suivantes:
      | date       | heure | latitude | longitude | lieu             |
      | 2025-01-15 | 08:30 | 48.8566  | 2.3522    | Paris            |
      | 2025-01-16 | 14:00 | 43.6047  | 1.4442    | Toulouse         |
      | 2025-01-17 | 19:00 | 45.7640  | 4.8357    | Lyon             |
    Quand j'ouvre mon historique personnel dans "Profil > Mes trajets"
    Alors je vois mes trajets avec les positions précises intégrales
    Et ces données ne sont pas anonymisées tant que mon compte est actif
    Et seul moi peut accéder à ces données
    Et elles ne sont pas utilisées pour des analytics globales

  Scénario: Anonymisation pour analytics globales uniquement
    Étant donné que RoadWave génère des analytics agrégées
    Quand l'équipe analyse les zones géographiques populaires
    Alors seules les données anonymisées (geohash) sont utilisées
    Et les positions précises de l'historique personnel ne sont jamais agrégées
    Et les heatmaps de trafic utilisent uniquement les geohash ~5km²

  # Job quotidien automatique

  Scénario: Planification du job d'anonymisation
    Étant donné que le système est en production
    Quand on consulte les jobs planifiés (cron)
    Alors un job "anonymize_gps_data" est configuré
    Et le job s'exécute tous les jours à 02:00 (heure creuse)
    Et le job traite toutes les positions vieilles de plus de 24h
    Et un log est généré pour traçabilité

  Scénario: Exécution du job avec métriques
    Étant donné que le job d'anonymisation s'exécute le 2025-01-21 à 02:00
    Quand le job se termine
    Alors un rapport est généré avec:
      | métrique                       | valeur  |
      | Nombre de positions traitées   | 15420   |
      | Nombre de positions anonymisées| 15420   |
      | Durée d'exécution              | 3.5s    |
      | Erreurs                        | 0       |
    Et le rapport est loggé dans Sentry/Grafana
    Et une alerte est envoyée si le job échoue

  Scénario: Performances du job d'anonymisation
    Étant donné que 100 000 positions doivent être anonymisées
    Quand le job s'exécute
    Alors le traitement se fait en moins de 30 secondes
    Et la requête PostGIS est optimisée avec index
    Et aucun impact sur les performances de l'application en production

  # Vraie anonymisation RGPD

  Scénario: Impossibilité de réidentification
    Étant donné qu'une position a été anonymisée en geohash "u09wh"
    Quand un attaquant tente de retrouver la position précise d'origine
    Alors il est impossible de déterminer la position exacte
    Et des milliers de positions précises correspondent au même geohash
    Et il n'y a aucune traçabilité vers la position originale
    Et cette anonymisation est irréversible

  Scénario: Conformité CNIL - données véritablement anonymisées
    Étant donné que les positions sont converties en geohash précision 5
    Quand un auditeur CNIL vérifie la conformité
    Alors les données sont considérées comme véritablement anonymisées
    Et elles ne sont plus considérées comme des données personnelles
    Et aucun consentement n'est requis pour leur traitement analytique
    Et elles peuvent être conservées indéfiniment

  # Analytics agrégées autorisées

  Scénario: Heatmap de trafic avec données anonymisées
    Étant donné que RoadWave génère une heatmap des zones populaires
    Quand on analyse les données utilisées
    Alors seules les positions anonymisées (geohash) sont agrégées
    Et la heatmap montre des zones de ~5km²
    Et aucune position précise n'est révélée
    Et cette analyse ne nécessite pas de consentement utilisateur (données anonymes)

  Scénario: Statistiques géographiques par département
    Étant donné que RoadWave analyse l'utilisation par département
    Quand les statistiques sont générées
    Alors les données anonymisées sont agrégées par département
    Et les résultats montrent: "Paris (75): 12 500 écoutes, Lyon (69): 8 300 écoutes"
    Et aucune donnée personnelle n'est révélée
    Et les statistiques sont RGPD-compliant

  # PostGIS natif - 0€

  Scénario: Coût de la solution d'anonymisation
    Étant donné que PostGIS est utilisé pour l'anonymisation GPS
    Quand on calcule le coût de la solution
    Alors le coût est de 0€ (PostGIS inclus dans PostgreSQL)
    Et aucune librairie tierce n'est nécessaire
    Et la solution est entièrement maîtrisée (self-hosted)

  # Cas limites

  Scénario: Anonymisation respecte les positions en cours de session
    Étant donné que je suis en train d'écouter du contenu actuellement
    Et que certaines de mes positions ont plus de 24h
    Quand le job d'anonymisation s'exécute
    Alors mes positions de plus de 24h sont anonymisées
    Mais ma position actuelle (session en cours) reste précise
    Et la recommandation continue de fonctionner normalement

  Scénario: Suppression de compte et anonymisation GPS
    Étant donné que je demande la suppression de mon compte
    Quand le compte est supprimé (après grace period de 30j)
    Alors toutes mes positions GPS (précises et anonymisées) sont supprimées
    Et mon historique personnel de trajets est supprimé
    Et aucune donnée GPS ne subsiste, même anonymisée

  Scénario: Export de données avant anonymisation
    Étant donné que je demande un export de mes données
    Et que certaines de mes positions ont été anonymisées
    Quand l'export est généré
    Alors les positions précises de mon historique personnel sont incluses
    Mais les positions déjà anonymisées (>24h, analytics) apparaissent en geohash
    Et l'export précise quelles données ont été anonymisées et pourquoi
