Files
flowdeck/docs/V73_Wiki_Teamspaces_Polish.md
T
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

73 lines
5.1 KiB
Markdown

# 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
```sql
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.