Recherche partout (#68) : page de résultats unifiée + draco et 401 sur /api/search #30
Closed
bruno
wants to merge 11 commits from
recherche-partout-68 into main
pull from: recherche-partout-68
merge into: :main
:main
:fix-cors-search-doublons
:federation-recherche-console
:console-federation-recherche
:flowdeck-recherche-onglets
:flowdeck-texte-parasite
:align-recherche-console
:alertes-onglets-5-rebase-main
:alertes-onglets-5
:recherche-onglets-ux-68
:cors-recherche-alertes-68-69
:recherche-partout-68-rebase
:recherche-partout-68
:alertes-unifiees-69
:fusion-70-barre-console-spark
:barre-apps-v0.1.6-flowdeck
:feat/coffre-reference-obsigate
:feat/v6.5.0-synced-db
:feat/v6.0
:feat/v5.6.0-import
:feat/v5.5.0-embeds-media
:docs/roadmap-v5.4.0-completed
:feat/v5.4.0-v5.5.0
:feat/v4.5.0-sprints-my-tasks
:feat/v4.4.0-tasks-dependencies
:feat/v4.3.0-database-views
:feat/v4.2.0-templates-dashboards
:feat/v4.1.0-database-sources
:develop
:fix/no-workspace-sidebar
:feat/quality
:feat/onboarding
No Reviewers
Labels
Clear labels
bug
design
documentation
duplicate
enhancement
feature
kanban:agent-task
kanban:in_progress
kanban:qa
kanban:review
kanban:todo
kanban_Backlog
kanban_En_cours
kanban_Révision
kanban_Terminé
kanban_a_faire
performance
question
refactor
roadmap
security
wontfix
Bug à corriger
UI/UX
Documentation
Doublon
Amélioration
Nouvelle fonctionnalité
Colonne Backlog
Colonne En cours
Colonne Révision
Colonne Terminé
Colonne À faire
Optimisation
Question
Refactoring code
Feuille de route — programme Fusion
Sécurité
Ne sera pas corrigé
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: bruno/flowdeck#30
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Rechercher partout — page de résultats unifiée + draco sur /api/search (fusion #68, chantier 1)
Branche
recherche-partout-68→main. Ne pas merger sans le go du coordinateur ; aucune version bumpée, aucune issue fermée par cette PR.Audit des endpoints de recherche réels (vérifié sur
main, 2026-10-28)GET /api/search?q=&vault=all&limit=(SearchResponse.results[] : vault, path, title, snippet)access_token, cookieaccess_token, ou repli cookie SSOdraco_session{og}/#file={vault}:{path}GET /api/search?q=(app/routers/search.py)flowdeck_sessionseulement (voir correctif ci-dessous){fd}/pages/<id>,{fd}/db/<id>(émis par le service lui-même)GET /api/search?q=(et/api/v1/search)draco_session, ou Bearertck_…{tk}/search?q=<q>&task=<id>GET /searchuniquement (sa PR fournitGET /api/search){kb}/board/<owner>/<repo>(la carte n'a pas d'URL propre adressable)Conséquence honnête : pas de section Console (rien à agréger sans inventer une API).
Architecture choisie : page par hôte + agrégation côté client
Identique aux autres PR du chantier (voir PR TikTak #220 pour l'argumentaire complet) : pas de hub central (SPOF, dépendance runtime entre apps), pas de proxy fan-out serveur (l'hôte ne possède pas de credential sœur sans créer un relais d'identité générique). La page appelle les 4 API en parallèle depuis le navigateur (
credentials: "include": cookies de chaque origine, dont le SSO partagédraco_session,Domain=.dracodev.net), avec debounce 250 ms, timeout 8 s par section, et états chargement/vide/erreur par application. Résolution des bases :data-base-*rendus par l'hôte >DRACO_BAR.urls(barre v0.1.6) > dérivation-dev> href des onglets > défauts prod. Aucun fichierui/barre-apps.*touché. Clavier :/ou Ctrl+K focalise la recherche, ↑/↓ navigue, Entrée ouvre, Échap efface.Ce qui change (Flowdeck)
app/templates/recherche.html(nouveau) +static/js/recherche.js(nouveau, logique partagée du chantier) +static/css/recherche.css(nouveau) : pageGET /rechercheavec 4 sections (ObsiGate, Flowdeck, TikTak, Kanbante), titre/extrait/contexte par résultat, liens profonds.app/routers/search.py:GET /recherche(nouveau) : coquille rendue viaENV(même patron que les pages existantes), bases sœurs passées explicitement depuisdraco_urls.toutes(). La palette Ctrl+K native est inchangée.GET /api/search: repli SSOdraco_sessionvia le validateur local existantapp.services.draco.user_for_draco(même sémantique que TikTak/Kanbante), et authentification désormais requise (401 sinon). Correctif de sécurité préexistant : sans session, la route donnait auparavant une recherche sans périmètre (user_id=None→1=1dans_scope_where, tous les espaces) — y compris pour la palette d'un visiteur non connecté. Les résultats d'un utilisateur authentifié restent périmétrés comme avant.app/middleware/recherche_cors.py(nouveau, ASGI pur) +app/main.py: CORS bornée pourGET /api/searchuniquement — origines sœurs résolues pardraco_urls.toutes(), plus les origines prod ou-devofficielles de l'environnement de la requête (nécessaire car ce middleware s'exécute avant le middleware CSP qui pose le contexte d'hôte pourdraco_urls; sans cela, une page servie parflowdeck-devverrait ses sœurs-devrefusées quand la configuration seule ne les déclare pas). Jamais*, jamais d'autre route, jamais d'écriture. Le middleware répond lui-même aux preflights OPTIONS (qui ne portent jamais de cookies). La politique CORS globale est inchangée.app/middleware/security.py(ContentSecurityPolicyMiddleware) :connect-srcde la page/rechercheuniquement, étendue aux origines sœurs (ObsiGate, TikTak, Kanbante) — sinon le navigateur bloque les appels avant même CORS. Les autres pages gardent la CSP inchangée.app/templates/_draco_bar.html: 1 ligne — l'actionpalettede la barre va désormais sur/rechercheau lieu du toast « arrive avec la fédération ». Le reste du fragment est inchangé (attention au chantier parallèle sur la barre : conflit possible sur ce fichier, à résoudre au merge).tests/test_recherche.py(pytest, 6 tests) +tests/recherche.test.js(Node, 25 assertions : résolution d'URL, liens profonds, normalisation des 4 formats).Limites connues (à valider après déploiement)
/api/searchchange le comportement pour un visiteur non connecté (la palette ne renvoie plus de résultats sans périmètre) — c'est le correctif voulu, à confirmer au merge.flowdeck-devetflowdeck) à faire par Bruno après redéploiement — non vérifiable depuis la sandbox (pas d'accès aux instances).Tests (chiffres réels, exécutés le 2026-10-28)
node tests/recherche.test.js: 25 assertions OK.app/middleware/recherche_cors.py(chargé par chemin, pytest absent de la sandbox) : assertions OK — origines sœurs dev, ajout de l'environnement de la requête, refus tiers, preflight, middleware ASGI (preflight sœur → 204 +Access-Control-Allow-Originexact, autre route → aucun en-tête ajouté).python3 -m py_compilesurapp/main.py,app/middleware/security.py,app/routers/search.py,app/middleware/recherche_cors.py,tests/test_recherche.py: OK.pytest tests/test_recherche.pyet le serveur — à valider en CI / après déploiement. Zéro régression revendiquée au-delà de ce qui est mesuré ci-dessus.Remplacée par la PR #31 (rebase sur main post-#70 et post-#69 : conflits _draco_bar.html et app/main.py résolus en conservant la suppression du bouton •••, le contenu alertes #69 et la palette /recherche ; security.py non modifié car la CSP sœurs #69 couvre déjà /recherche. Contenu par ailleurs identique). Cette PR est fermée sans merge.
Pull request closed