Fusion #69 : Alertes unifiées (panneau + pastille, agrégation à la demande) #29

Merged
bruno merged 7 commits from alertes-unifiees-69 into main 2026-10-28 12:40:51 -04:00
Owner

Fusion #69 (chantier 2) — Alertes unifiées, côté Flowdeck.

Audit (vérifié sur main, pas supposé)

  • Flowdeck expose réellement : GET /api/notifications?limit=50 ({notifications:[{id,ntype,title,message,url,is_read,created_at}], unread}) + GET /api/notifications/unread-count + cloche native _notification_bell.html (poll 30 s, marquage lu). Actif = is_read = 0 ; lien profond = base + url (ex. /collections/{id}). Les rappels deviennent des notifications via services/reminders.py (scan + reminder_log anti-doublon) : ils sont donc couverts sans inventer une seconde source.
  • TikTak : GET /api/notifications (non lues = actives ; lien /?task={id} sinon /notifications).
  • Kanbante : GET /api/events (aucun état lu/non lu → tout historique, jamais compté actif ; lien /board/{repo}).
  • ObsiGate : aucune notification entrante consultable (ses /api/notify/* sont des canaux d'envoi sortants admin).
  • Verrous constatés : CSP connect-src fermée aux seules origines self/agent, et CORS limité à app_base_url (+ localhost/extensions) → la lecture inter-origines était impossible sans les ouvertures ci-dessous, étroites et limitées aux sœurs.

Ce qui change (cette PR Flowdeck)

  • static/js/draco-alertes.js (nouveau, module partagé, pas un fichier ui/barre-apps.*) + static/css/draco-alertes.css : panneau Alertes (actives d'abord, puis historique, par application, origine/titre/date/état/lien profond ; textContent uniquement). Pastille via DRACO_BAR.setCounts({alertes: n}). Bases résolues dans l'ordre barre v0.1.6 : config explicite > hôte -dev dérivé > href rendu > défaut prod.
  • app/templates/_draco_bar.html : branche alertes → DRACO_ALERTES.open() (repli : cloche native) ; le toast « Alertes unifiées : arrive avec la fédération » DISPARAÎT ; chargement du module. (Hors périmètre : le toast de la branche palette « Recherche fédérée » est inchangé — autre chantier.)
  • app/main.py : allow_origins du CORSMiddleware += origines sœurs résolues par draco_urls.toutes() (lecture GET ; les POST restent soumis au CSRFMiddleware).
  • app/middleware/security.py : CSP connect-src += origines sœurs (même résolution que frame-src agent).
  • Tests : tests/test_draco_alertes.py (3 tests) + tests/draco-alertes.test.js (5 tests Node).

Limites, dites honnêtement

  • Agrégation À LA DEMANDE, pas une fédération temps réel (relecture à l'ouverture + au chargement pour la pastille).
  • Vue unifiée complète seulement quand les 4 PR du chantier sont déployées ; sinon la section manquante affiche « Connexion requise » ou « injoignable » avec son lien natif, jamais de faux contenu.
  • Pastille = Flowdeck non lues + TikTak non lues uniquement.
  • Aucun bump de version, aucun merge, aucune fermeture d'issue dans cette PR (coordinateur).

Tests (chiffres réels, sandbox)

  • pytest tests/test_draco_alertes.py : 3 passed.
  • pytest tests/test_fusion_draco.py tests/test_draco_urls_devprod.py : 32 passed, 0 échec (non-régression).
  • node --test tests/draco-alertes.test.js : 5 passed.
  • Caveat de test : dans la sandbox, les pages applicatives authentifiées ne sont pas atteignables telles quelles (l'écran de connexion est servi pour / comme pour /dashboard) ; le test de barre vérifie donc le gabarit livré + les statiques servis, et la CSP est vérifiée sur la réponse HTML servie. Le rendu authentifié complet reste à valider après déploiement, comme la pastille inter-apps en conditions réelles (par Bruno).
Fusion #69 (chantier 2) — Alertes unifiées, côté Flowdeck. ## Audit (vérifié sur main, pas supposé) - Flowdeck expose réellement : `GET /api/notifications?limit=50` (`{notifications:[{id,ntype,title,message,url,is_read,created_at}], unread}`) + `GET /api/notifications/unread-count` + cloche native `_notification_bell.html` (poll 30 s, marquage lu). Actif = `is_read = 0` ; lien profond = base + `url` (ex. `/collections/{id}`). Les rappels deviennent des notifications via `services/reminders.py` (scan + `reminder_log` anti-doublon) : ils sont donc couverts sans inventer une seconde source. - TikTak : `GET /api/notifications` (non lues = actives ; lien `/?task={id}` sinon `/notifications`). - Kanbante : `GET /api/events` (aucun état lu/non lu → tout historique, jamais compté actif ; lien `/board/{repo}`). - ObsiGate : aucune notification entrante consultable (ses `/api/notify/*` sont des canaux d'envoi sortants admin). - Verrous constatés : CSP `connect-src` fermée aux seules origines self/agent, et CORS limité à `app_base_url` (+ localhost/extensions) → la lecture inter-origines était impossible sans les ouvertures ci-dessous, étroites et limitées aux sœurs. ## Ce qui change (cette PR Flowdeck) - `static/js/draco-alertes.js` (nouveau, module partagé, pas un fichier `ui/barre-apps.*`) + `static/css/draco-alertes.css` : panneau Alertes (actives d'abord, puis historique, par application, origine/titre/date/état/lien profond ; `textContent` uniquement). Pastille via `DRACO_BAR.setCounts({alertes: n})`. Bases résolues dans l'ordre barre v0.1.6 : config explicite > hôte -dev dérivé > href rendu > défaut prod. - `app/templates/_draco_bar.html` : branche `alertes` → `DRACO_ALERTES.open()` (repli : cloche native) ; le toast « Alertes unifiées : arrive avec la fédération » DISPARAÎT ; chargement du module. (Hors périmètre : le toast de la branche `palette` « Recherche fédérée » est inchangé — autre chantier.) - `app/main.py` : `allow_origins` du CORSMiddleware += origines sœurs résolues par `draco_urls.toutes()` (lecture GET ; les POST restent soumis au CSRFMiddleware). - `app/middleware/security.py` : CSP `connect-src` += origines sœurs (même résolution que `frame-src` agent). - Tests : `tests/test_draco_alertes.py` (3 tests) + `tests/draco-alertes.test.js` (5 tests Node). ## Limites, dites honnêtement - Agrégation À LA DEMANDE, pas une fédération temps réel (relecture à l'ouverture + au chargement pour la pastille). - Vue unifiée complète seulement quand les 4 PR du chantier sont déployées ; sinon la section manquante affiche « Connexion requise » ou « injoignable » avec son lien natif, jamais de faux contenu. - Pastille = Flowdeck non lues + TikTak non lues uniquement. - Aucun bump de version, aucun merge, aucune fermeture d'issue dans cette PR (coordinateur). ## Tests (chiffres réels, sandbox) - `pytest tests/test_draco_alertes.py` : 3 passed. - `pytest tests/test_fusion_draco.py tests/test_draco_urls_devprod.py` : 32 passed, 0 échec (non-régression). - `node --test tests/draco-alertes.test.js` : 5 passed. - Caveat de test : dans la sandbox, les pages applicatives authentifiées ne sont pas atteignables telles quelles (l'écran de connexion est servi pour `/` comme pour `/dashboard`) ; le test de barre vérifie donc le gabarit livré + les statiques servis, et la CSP est vérifiée sur la réponse HTML servie. Le rendu authentifié complet reste à valider après déploiement, comme la pastille inter-apps en conditions réelles (par Bruno).
bruno added 7 commits 2026-10-28 12:11:30 -04:00
Fusion #69 : Alertes unifiees (app/templates/_draco_bar.html)
FlowDeck CI / test (push) Failing after 1s
FlowDeck CI / docker (push) Skipped
FlowDeck CI / lint (push) Successful in 1m57s
1065ffb017
Fusion #69 : Alertes unifiees (app/main.py)
FlowDeck CI / lint (push) Failing after 4s
FlowDeck CI / test (push) Failing after 1s
FlowDeck CI / docker (push) Skipped
acaae92e3a
Fusion #69 : Alertes unifiees (app/middleware/security.py)
FlowDeck CI / lint (push) Failing after 3s
FlowDeck CI / test (push) Failing after 16m42s
FlowDeck CI / docker (push) Skipped
52b62b48b8
Fusion #69 : Alertes unifiees (static/js/draco-alertes.js)
FlowDeck CI / test (push) Failing after 2s
FlowDeck CI / docker (push) Skipped
FlowDeck CI / lint (push) Failing after 1m55s
ab63000f5d
Fusion #69 : Alertes unifiees (static/css/draco-alertes.css)
FlowDeck CI / lint (push) Failing after 4s
FlowDeck CI / test (push) Failing after 2s
FlowDeck CI / docker (push) Skipped
fbe9151ab7
Fusion #69 : Alertes unifiees (tests/test_draco_alertes.py)
FlowDeck CI / lint (push) Failing after 2s
FlowDeck CI / test (push) Failing after 3s
FlowDeck CI / docker (push) Skipped
9abd6c9d4d
Fusion #69 : Alertes unifiees (tests/draco-alertes.test.js)
FlowDeck CI / lint (push) Failing after 3s
FlowDeck CI / test (push) Failing after 2s
FlowDeck CI / docker (push) Skipped
FlowDeck CI / lint (pull_request) Failing after 2s
FlowDeck CI / test (pull_request) Failing after 2s
FlowDeck CI / docker (pull_request) Skipped
7f9eb080b1
bruno merged commit fe389d46bc into main 2026-10-28 12:40:50 -04:00
Sign in to join this conversation.