Files
flowdeck/docs/V73_Wiki_Teamspaces_Polish.md
bruno 1706ad1ee9
FlowDeck CI / lint (push) Successful in 1m48s
FlowDeck CI / test (push) Failing after 21m19s
FlowDeck CI / docker (push) Skipped
feat: v7.3.0 — cycle v6.8.0→v7.3.0 (Sites, Search, Automations, Calendar, SCIM, Wiki) + audit A9
- v6.8.0 Sites & Forms publics (migrations 24)
- v6.9.0 Recherche sémantique hybride + Ask AI (migration 25)
- v7.0.0 Automations v2 multi-étapes + Workers sandboxés (migration 26)
- v7.1.0 Calendar sync Google/CalDAV + Meeting Notes (migration 27)
- v7.2.0 Enterprise : SCIM 2.0, 2FA TOTP/passkeys, audit UI, agent approvals (migration 28)
- v7.3.0 Wiki/Teamspaces, verified pages, collab polish, charts, unfurl (migration 29)
- docs V68→V73, ROADMAP/CHANGELOG/WORKLOAD à jour, VERSION 7.3.0
- A9 : flowdeck.db, flowdeck_dev.db, test-commit.md, upload_test.txt et e2e/{node_modules,shots,test-results} désindexés + ignorés (.gitignore/.dockerignore)
2026-09-30 20:02:57 -04:00

5.1 KiB

V7.3.0 — Wiki / Teamspaces + Polish

Statut : ✅ Implémenté (2026-09-29) — 72 tests · suite complète 1016 verts · Roadmap : ROADMAP.md § v7.3.0 Référence Notion : Wikis + Teamspaces + Verified pages + Charts/Number + réactions/follow/guests + page analytics. Existant : workspaces + rôles, backlinks, wiki-links [[, collection_dashboards, Chart.js, comments, site_views.


1. Teamspaces + Verified

CREATE TABLE teamspaces (
  id INTEGER PRIMARY KEY AUTOINCREMENT, workspace_id INTEGER NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
  name TEXT NOT NULL, private BOOLEAN NOT NULL DEFAULT 0, UNIQUE(workspace_id, name));
CREATE TABLE teamspace_members (teamspace_id INTEGER NOT NULL REFERENCES teamspaces(id) ON DELETE CASCADE,
  user_id INTEGER NOT NULL REFERENCES users(id), role TEXT NOT NULL DEFAULT 'editor', UNIQUE(teamspace_id, user_id));
ALTER TABLE pages ADD COLUMN teamspace_id INTEGER REFERENCES teamspaces(id);
ALTER TABLE collections ADD COLUMN teamspace_id INTEGER REFERENCES teamspaces(id);
CREATE TABLE page_verifications (
  page_id INTEGER PRIMARY KEY REFERENCES pages(id) ON DELETE CASCADE,
  verified_by INTEGER REFERENCES users(id), note TEXT DEFAULT '',
  verified_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP);
  • private=1 sans membership → 404 (comme collections restricted) ; PermissionManager.get_teamspace_role().
  • Badge ✅ (owner/editor vérifie, expiry 90j défaut, job notif owner à J-7) ; filtre verified:1 en search + palette ; page /wiki auto (verified + recents + teamspaces).

2. Blocs & charts

  • Bloc mermaid : code → SVG serveur si mmdc présent, sinon fallback bloc code + rendu client (déjà Prism) ; export HTML/PDF embarque le SVG.
  • equation_inline : KaTeX inline (lib déjà self-hostée static/js/katex.min.js).
  • Bloc progress : {rollup_ref} → barre % (réutilise RollupEngine).
  • Charts : type number (big KPI), dashboards multi-DB en page (grille collection_dashboards + source any, limite 200 groupes documentée), « ouvrir la ligne » depuis chart.
    • Livré (follow-up) : number = KPI count|sum|avg|min|max (_chart_aggregate/_fmt_number) ; rendu grille GET /db/{collection_id}/dashboards/{dashboard_id} — widgets à collection_id (= source any), ≤ 40 widgets, ≤ 200 lignes/chart (CHART_MAX_GROUPS) ; la config de vue est choisie selon le view_type demandé (bug corrigé : la première vue était toujours utilisée) ; un widget pointant sur une DB restreinte est sauté (pas de leak).

3. Collab polish

  • comment_reactions (comment_id, user_id, emoji, UNIQUE) + picker emoji.
  • page_follows (page_id, user_id) → notif page.updated aux followers (pref follows, défaut ON si commenté).
    • Livré (follow-up) : wiki.notify_followers_of_page_update (throttle 10 min, actor_id exclu) branché dans automations.fire_event ; actor_id dans les payloads board.update_page/save_page_blocks ; auto-follow à la création d'un commentaire (wiki.ensure_follow).
  • Guests : guest_shares (page_id, email, token, role viewer|commenter, expires_at) — accès sans compte via /g/<token> (session guest limitée, auditée).
  • page_views (page_id, day, views PK) — même pattern site_views, exposé GET /board/api/pages/{id}/views (owner only).

4. Tests (tests/test_v73_wiki_polish.py, 72 ✅)

Teamspace private 404/grant, verify badge/expiry/notif, /wiki home, blocs mermaid/equation/progress + export, réactions, follow, guest token/expiry, page views. Follow-ups : sidebar cross-workspace (sans workspace_id), page HTML /wiki/teamspaces/{id} (owner 200 / outsider 404 API + non-leak HTML), auto-follow par commentaire, notif page.updated throttlée + acteur exclu, ensure_follow idempotent, regex + unfurl gitea/github (tokens mockés) + endpoint /board/api/og/metadata, KPI number + _chart_values (0 conservé) + dashboards multi-DB + 404.

5. Implémentation réelle vs. design initial

  • Livré : schema §1 à l'identique ; routes sous /api/v2/wiki/* (le design parlait de /wiki comme page HTML : l'agrégat est exposé en JSON, le front Tri-state reste à faire) ; blocs §2 (mermaid, equation_inline, progress) rendus côté serveur par app/services/wiki_blocks.py et branchés sur export.blocks_to_html ; collab §3 complet.
  • Follow-ups livrés : sidebar par teamspace (section base.html + listing cross-workspace + page HTML), charts number + dashboards multi-DB, notif page.updated déclenchée à l'édition + auto-follow, unfurl gitea:/github: dans POST /board/api/og/metadata (champs bookmark persistés), UI Settings → Audit branchée sur /api/v2/audit/logs. Les 21 casses SSO (test_v67_sso.py) sont corrigées (install python3-saml==1.16.0 + authlib==1.8.0).
  • Écart assumé : progress agrège directement sur collection_pages.property_values_json plutôt que via RollupEngine, dont la signature exige une chaîne de relations + une page source — ce qu'un bloc de progression embarqué dans une page n'a pas.