Skip to content

Job détection dégradation à risque (→ Firestore) #88

Open

Description

@Nicolas-Dmb

📋 Description

Détecte, sur l'ensemble du périmètre couvert par BioWatch (pas seulement les zones suivies par un utilisateur en particulier), les zones dont le score écologique se dégrade et qui sont classées à risque — puis écrit un événement dans Firestore pour alimenter à la fois le badge de notification temps réel (ticket frontend 4.3.3) et le feed d'activité historique du dashboard (ticket frontend 5.1.3). Une seule collection Firestore sert les deux besoins : onSnapshot côté frontend pour le temps réel, requêtes paginées par curseur pour l'historique.

Placement confirmé : apps/jobs, exécuté sur le VPS — pas une Cloud Function. PostGIS n'est jamais exposée hors du VPS ; une Cloud Function sur GCP ne peut pas la lire sans ouvrir un accès entrant (interdit) ou un tunnel VPN (hors de portée pour ce projet). Ce job lit stress_score_by_zone localement, puis fait un appel sortant vers Firebase (Admin SDK) — symétrique à ce que fait une Cloud Function quand elle appelle Stripe, aucune exposition supplémentaire requise.

Scheduling confirmé : timer systemd quotidien à 10h00.

Où est stockée la notification (Firestore)

Collection partagée (pas nichée sous users/{uid}, l'événement concerne une zone, pas un utilisateur) :

risk_alerts/{zone_id}_{bucket_id}
  zone_id: string
  bucket_id: string
  score_before: number
  score_after: number
  detected_at: timestamp
  • ID de document déterministe ({zone_id}_{bucket_id}) : un set() sur cet ID est idempotent nativement — rejouer le job sur le même bucket écrase le même document au lieu de dupliquer.
  • firestore.rules : allow read: if request.auth != null; allow write: if false; — tout utilisateur connecté peut lire, seul l'Admin SDK (ce job) peut écrire.
  • Le marquage "vu/non vu" n'est pas stocké ici (par-événement-par-utilisateur, trop lourd) — géré via users/{uid}.last_seen_alert_at côté frontend (tickets 4.3.3/5.1.3).
uv run apps.jobs.risk_alerts --bucket 2026-08
{ "event": "job_completed", "job": "risk_alerts", "bucket_id": "2026-08", "events_written": 3 }

Document Firestore écrit (id 881f1d4a3fffffff_2026-08) :

{ "zone_id": "881f1d4a3fffffff", "bucket_id": "2026-08", "score_before": 68.4, "score_after": 58.1, "detected_at": "2026-09-25T10:00:00Z" }

✅ Acceptance Criteria

  • Job idempotent : englobé dans job_run(...), clé déterministe, pas de doublon d'événement pour un même bucket/zone
  • Timer systemd déclenche le job tous les jours à 10h00
  • Compare score_global entre le bucket courant et le précédent, par zone, sur tout le périmètre
  • N'écrit un document Firestore QUE si delta négatif ET nouveau score à risque (pas toute variation) — set() sur l'ID déterministe
  • Erreurs partielles tracées via job_run_zone_errors, comme les autres jobs
  • Tests : baisse + à risque (écrit), baisse sans être à risque (n'écrit pas), hausse (n'écrit pas), absence de bucket précédent (première mesure), rejeu du job sur le même bucket (pas de doublon)

🔗 Prerequisite Issues


Source : Notion « Job détection dégradation à risque (→ Firestore) » (Jobs Utilisateur & Notifications).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request🔃 Jobs Utilisateur & NotificationsJobs backend générant des effets de bord orientés utilisateur (Firestore)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions