docs: ARCHITECTURE v3.0 + ROADMAP v4.0 — comptes, intégrations, sidebar
ARCHITECTURE.md: - Section 6.5: modèle de comptes (local/gitea/github) - Matrice d'intégrations & règles de déconnexion - 3 scénarios de workspace (A/B/C) - Sidebar: règles d'affichage par type de compte - Share & Publish: modale 2 tabs + schéma DB - Library: /library?tab= + filtres source - Trash local-only, édition unifiée, stockage Private - Plan de migration 5 phases ROADMAP.md: - v4.0.0 section prioritaire: Account Model, Intégrations, Sidebar rules, Share/Publish, Library, Édition unifiée
This commit is contained in:
+254
-3
@@ -1,7 +1,7 @@
|
|||||||
# Architecture FlowDeck — Document Complet v2.0
|
# Architecture FlowDeck — Document Complet v3.0
|
||||||
|
|
||||||
> **Version:** 2.0 · **Date:** 2026-07-10 · **Auteur:** Hermes-Deepin
|
> **Version:** 3.0 · **Date:** 2026-07-14 · **Auteur:** Hermes-Deepin
|
||||||
> **Cible:** Clone Notion intégré à Gitea avec support multi-utilisateurs
|
> **Cible:** Clone Notion intégré à Gitea/GitHub — multi-comptes, multi-intégrations
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -800,6 +800,257 @@ User authorize ──→ GET /auth/callback?code=xxx
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 6.5 Modèle de comptes & intégrations (v4.0)
|
||||||
|
|
||||||
|
### 6.5.1 Types de comptes
|
||||||
|
|
||||||
|
FlowDeck supporte 3 types de comptes, déterminés par `auth_method` dans la table `users` :
|
||||||
|
|
||||||
|
```
|
||||||
|
┌──────────────┬──────────────────┬─────────────────────────────────────┐
|
||||||
|
│ auth_method │ Login via │ Identité dans le sidebar │
|
||||||
|
├──────────────┼──────────────────┼─────────────────────────────────────┤
|
||||||
|
│ local │ email + password │ Nom local (ex: "Draco") │
|
||||||
|
│ gitea │ OAuth2 Gitea │ Nom Gitea + badge 🦎 Gitea │
|
||||||
|
│ github │ OAuth2 GitHub │ Nom GitHub + badge 🐙 GitHub │
|
||||||
|
└──────────────┴──────────────────┴─────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**Règle fondamentale** : Un compte local avec intégration(s) reste un compte LOCAL.
|
||||||
|
Le badge OAuth (🦎/🐙) n'apparaît QUE pour les comptes dont `auth_method` est le provider.
|
||||||
|
|
||||||
|
```
|
||||||
|
Compte LOCAL avec intégrations :
|
||||||
|
┌──────────────────────────────────┐
|
||||||
|
│ [D] Draco │ ← Nom local, PAS de badge
|
||||||
|
│ [email protected] │
|
||||||
|
└──────────────────────────────────┘
|
||||||
|
|
||||||
|
Compte GITEA (auth_method=gitea) :
|
||||||
|
┌──────────────────────────────────┐
|
||||||
|
│ [B] bruno [🦎 Gitea] │ ← Badge visible
|
||||||
|
│ [email protected] │
|
||||||
|
└──────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.5.2 Matrice des intégrations
|
||||||
|
|
||||||
|
```
|
||||||
|
Compte principal Peut ajouter Déconnexion possible
|
||||||
|
─────────────────────────────────────────────────────────
|
||||||
|
local Gitea ✅ Oui
|
||||||
|
local GitHub ✅ Oui
|
||||||
|
local Gitea + GitHub ✅ Les deux
|
||||||
|
─────────────────────────────────────────────────────────
|
||||||
|
gitea GitHub ✅ GitHub ❌ Gitea
|
||||||
|
github Gitea ✅ Gitea ❌ GitHub
|
||||||
|
```
|
||||||
|
|
||||||
|
**Settings → Integrations** : Affiche toutes les intégrations avec bouton
|
||||||
|
Disconnect. Le provider principal (auth_method) n'a PAS de bouton Disconnect.
|
||||||
|
|
||||||
|
### 6.5.3 Scénarios de workspace
|
||||||
|
|
||||||
|
```
|
||||||
|
SCÉNARIO A : Compte local pur
|
||||||
|
─────────────────────────────
|
||||||
|
· Login email+password
|
||||||
|
· Workspaces locaux uniquement
|
||||||
|
· Section Private : CACHÉE (tout est déjà local)
|
||||||
|
· Trash : ✅ (restauration locale)
|
||||||
|
|
||||||
|
SCÉNARIO B : Compte local + intégration(s)
|
||||||
|
──────────────────────────────────────────
|
||||||
|
· Login email+password
|
||||||
|
· Workspaces : locaux + Gitea + GitHub
|
||||||
|
· Section Private : VISIBLE si workspace distant actif
|
||||||
|
· Private : stockage DB locale, associé user+repo
|
||||||
|
· Trash : ✅ (local uniquement)
|
||||||
|
|
||||||
|
SCÉNARIO C : Compte OAuth pur (gitea ou github)
|
||||||
|
────────────────────────────────────────────────
|
||||||
|
· Login via OAuth
|
||||||
|
· Workspaces : distants du provider principal
|
||||||
|
· Section Private : VISIBLE (toujours)
|
||||||
|
· Trash : ❌ (pas de contenu local)
|
||||||
|
· Intégration secondaire : possible
|
||||||
|
· Déconnexion provider principal : impossible
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.5.4 Sidebar — règles d'affichage par section
|
||||||
|
|
||||||
|
```
|
||||||
|
Section Scénario A Scénario B Scénario C
|
||||||
|
───────────── ────────────── ────────────────────── ──────────────
|
||||||
|
Recents ✅ (local) ✅ (tout) ✅ (tout)
|
||||||
|
Favorites ✅ (local) ✅ (tout) ✅ (tout)
|
||||||
|
Shared ✅ (local) ✅ (tout) ✅ (tout)
|
||||||
|
Published ✅ (local) ✅ (tout) ✅ (tout)
|
||||||
|
Agents ✅ ✅ ✅
|
||||||
|
Private ❌ CACHÉ ✅ si ws distant actif ✅
|
||||||
|
Workspace ✅ ✅ ✅
|
||||||
|
Trash ✅ (local) ✅ (local) ❌
|
||||||
|
```
|
||||||
|
|
||||||
|
Chaque section a un bouton `→ Library` qui ouvre :
|
||||||
|
```
|
||||||
|
/library?tab=recents|favorites|shared|published|private|workspace
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.5.5 Système Share & Publish
|
||||||
|
|
||||||
|
Le bouton [Share] dans la topbar d'une page ouvre une modale à 2 tabs :
|
||||||
|
|
||||||
|
```
|
||||||
|
┌──────────────────────────────────────────────────────┐
|
||||||
|
│ [ Share ] [ Publish ] │
|
||||||
|
├──────────────────────────────────────────────────────┤
|
||||||
|
│ Share tab : │
|
||||||
|
│ · Invite people : [email] [Invite] │
|
||||||
|
│ · General access : [🔒 Restricted] Copy link │
|
||||||
|
│ · Liste des personnes/groupes avec accès │
|
||||||
|
│ → Document listé dans sidebar "Shared" │
|
||||||
|
├──────────────────────────────────────────────────────┤
|
||||||
|
│ Publish tab : │
|
||||||
|
│ · [Publish to web] → URL publique générée │
|
||||||
|
│ · URL : https://flowdeck.draco.dev/p/<slug> │
|
||||||
|
│ · [Unpublish] │
|
||||||
|
│ → Document listé dans sidebar "Published" │
|
||||||
|
└──────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.5.6 Stockage des fichiers Private
|
||||||
|
|
||||||
|
Quand un workspace distant est actif, les fichiers créés dans la section
|
||||||
|
Private sont stockés dans la **base de données locale** (table `pages` avec
|
||||||
|
`parent_section='Private'` et `workspace=gitea:<owner>/<repo>`).
|
||||||
|
|
||||||
|
Cela permet de :
|
||||||
|
- Prendre des notes personnelles liées à un projet sans les committer
|
||||||
|
- Garder des brouillons avant de les pousser
|
||||||
|
- Avoir un espace de travail privé même sur un repo partagé
|
||||||
|
|
||||||
|
### 6.5.7 Trash — règles
|
||||||
|
|
||||||
|
```
|
||||||
|
Contenu Trash ? Comportement
|
||||||
|
─────────────────────── ──────── ──────────────────────────
|
||||||
|
Workspace local ✅ Supprimé → restaurable
|
||||||
|
Dossier/fichier local ✅ Supprimé → restaurable
|
||||||
|
Fichier Gitea/GitHub ❌ Commit "delete" → pas trash
|
||||||
|
Page distante ❌ Commit "delete" → pas trash
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.5.8 Édition de fichiers — UI unifiée
|
||||||
|
|
||||||
|
```
|
||||||
|
Fichier LOCAL Fichier DISTANT (Gitea/GitHub)
|
||||||
|
┌─────────────────────────┐ ┌─────────────────────────────┐
|
||||||
|
│ Même UI d'édition │ │ Même UI d'édition │
|
||||||
|
│ Même rendu visuel │ │ Même rendu visuel │
|
||||||
|
│ Sauvegarde auto DB │ │ + Bouton [Commit] │
|
||||||
|
│ Pas de commit │ │ + Champ message commit │
|
||||||
|
└─────────────────────────┘ └─────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.5.9 Page Library — `/library?tab=<tab>`
|
||||||
|
|
||||||
|
```
|
||||||
|
┌──────────────────────────────────────────────────────────────┐
|
||||||
|
│ Library │
|
||||||
|
│ [Recents] [Favorites] [Shared] [Published] │
|
||||||
|
│ [Private] [Workspace] │
|
||||||
|
├──────────────────────────────────────────────────────────────┤
|
||||||
|
│ Filtres : [All] [Local] [Gitea] [GitHub] │
|
||||||
|
│ │
|
||||||
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ 📄 Document X Local · modifié il y a 2h │ │
|
||||||
|
│ │ 📄 README.md Gitea · bruno/flowdeck │ │
|
||||||
|
│ │ 📄 Notes Local · Workspace Projet A │ │
|
||||||
|
│ └─────────────────────────────────────────────────────────┘ │
|
||||||
|
└──────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.5.10 Schéma DB — mises à jour pour v4.0
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- users : ajout auth_method
|
||||||
|
ALTER TABLE users ADD COLUMN auth_method TEXT NOT NULL DEFAULT 'local';
|
||||||
|
-- 'local' | 'gitea' | 'github'
|
||||||
|
|
||||||
|
-- users : colonnes OAuth existantes
|
||||||
|
-- gitea_id INTEGER (NULL si pas Gitea)
|
||||||
|
-- github_id INTEGER (NULL si pas GitHub)
|
||||||
|
-- gitea_token TEXT (token intégration, NULL si pas connecté)
|
||||||
|
-- github_token TEXT (token intégration, NULL si pas connecté)
|
||||||
|
|
||||||
|
-- pages : ajout published
|
||||||
|
ALTER TABLE pages ADD COLUMN is_published BOOLEAN NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE pages ADD COLUMN publish_slug TEXT;
|
||||||
|
ALTER TABLE pages ADD COLUMN is_shared BOOLEAN NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE pages ADD COLUMN share_mode TEXT DEFAULT 'restricted';
|
||||||
|
-- 'restricted' | 'link' | 'public'
|
||||||
|
|
||||||
|
-- page_shares : qui a accès à quel document
|
||||||
|
CREATE TABLE page_shares (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
|
||||||
|
shared_with_user_id INTEGER REFERENCES users(id),
|
||||||
|
shared_with_email TEXT,
|
||||||
|
permission TEXT NOT NULL DEFAULT 'view',
|
||||||
|
-- 'view' | 'comment' | 'edit'
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
created_by INTEGER REFERENCES users(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- recents : historique de consultation
|
||||||
|
CREATE TABLE recents (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
||||||
|
page_id INTEGER NOT NULL REFERENCES pages(id),
|
||||||
|
workspace TEXT NOT NULL,
|
||||||
|
source_type TEXT NOT NULL DEFAULT 'local',
|
||||||
|
-- 'local' | 'gitea' | 'github'
|
||||||
|
accessed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
UNIQUE(user_id, page_id)
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.5.11 Plan de migration
|
||||||
|
|
||||||
|
```
|
||||||
|
Phase 1 — DB & Modèles
|
||||||
|
1. Ajouter auth_method aux users existants (auto-détecter)
|
||||||
|
2. Ajouter is_published, is_shared, share_mode aux pages
|
||||||
|
3. Créer table page_shares
|
||||||
|
4. Créer table recents
|
||||||
|
|
||||||
|
Phase 2 — Sidebar
|
||||||
|
1. Badge OAuth (🦎/🐙) basé sur auth_method
|
||||||
|
2. Afficher/cacher Private selon type de compte + workspace actif
|
||||||
|
3. Boutons Library par section
|
||||||
|
4. Trash filtré local-only
|
||||||
|
|
||||||
|
Phase 3 — Share & Publish
|
||||||
|
1. Modale Share à 2 tabs fonctionnelle
|
||||||
|
2. Share via email/user → table page_shares
|
||||||
|
3. Share via lien → share_mode='link'
|
||||||
|
4. Publish → is_published + publish_slug
|
||||||
|
5. Page publique servable à /p/<slug>
|
||||||
|
|
||||||
|
Phase 4 — Library
|
||||||
|
1. Page /library avec tabs
|
||||||
|
2. Filtrage par source (local/gitea/github)
|
||||||
|
3. Recents alimentés automatiquement
|
||||||
|
|
||||||
|
Phase 5 — Intégrations
|
||||||
|
1. GitHub OAuth déjà fait (providers.py)
|
||||||
|
2. Matrice de déconnexion respectée
|
||||||
|
3. Compte local peut connecter/déconnecter Gitea+GitHub
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 7. Intégration Gitea
|
## 7. Intégration Gitea
|
||||||
|
|
||||||
### 7.1 Flux de données
|
### 7.1 Flux de données
|
||||||
|
|||||||
+41
@@ -172,6 +172,47 @@ Propriétés custom, AI keywords, sync API, 12 tables DB
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## v4.0.0 — Accounts, Integrations & Sidebar (priorité haute)
|
||||||
|
|
||||||
|
> **Rappel** : Section 6.5 de ARCHITECTURE.md documente le design complet.
|
||||||
|
|
||||||
|
### 4.0 Account Model
|
||||||
|
- [ ] **`auth_method`** — colonne `users.auth_method ∈ {local, gitea, github}`
|
||||||
|
- [ ] **Auto-détection** — migrer les comptes existants (gitea_token → gitea, sinon local)
|
||||||
|
- [ ] **Badge OAuth** — 🦎/🐙 dans sidebar SI `auth_method` = provider
|
||||||
|
- [ ] **Pas de badge** — un compte local avec intégration ne montre PAS de badge
|
||||||
|
|
||||||
|
### 4.0a Intégrations & Déconnexion
|
||||||
|
- [ ] **Settings page** — montre toutes les intégrations avec bouton Connect/Disconnect
|
||||||
|
- [ ] **Matrice déconnexion** : local→déco ok · gitea→déco github ok · github→déco gitea ok
|
||||||
|
- [ ] **Provider principal** — pas de bouton Disconnect sur auth_method
|
||||||
|
- [ ] **Compte local** — peut connecter Gitea + GitHub simultanément
|
||||||
|
|
||||||
|
### 4.0b Sidebar — règles par type de compte
|
||||||
|
- [ ] **Private visible** UNIQUEMENT si workspace actif est distant (Gitea/GitHub)
|
||||||
|
- [ ] **Private caché** pour Scénario A (local pur)
|
||||||
|
- [ ] **Trash local-only** — caché pour compte OAuth pur, restreint au contenu local
|
||||||
|
- [ ] **Boutons → Library** sur chaque section (recents, favorites, shared, published…)
|
||||||
|
|
||||||
|
### 4.0c Share & Publish
|
||||||
|
- [ ] **Modale Share** — 2 tabs (Share + Publish) fonctionnels
|
||||||
|
- [ ] **Share tab** — inviter email/user, général access lien
|
||||||
|
- [ ] **Publish tab** — activer/désactiver, slug généré
|
||||||
|
- [ ] **Page publique** — `/p/<slug>` sert le contenu publié
|
||||||
|
- [ ] **Tables DB** — `page_shares`, colonnes `is_published`, `is_shared`, `share_mode`
|
||||||
|
|
||||||
|
### 4.0d Library
|
||||||
|
- [ ] **Page `/library?tab=`** — tabs Recents, Favorites, Shared, Published, Private, Workspace
|
||||||
|
- [ ] **Filtres source** — All | Local | Gitea | GitHub
|
||||||
|
- [ ] **Table `recents`** — tracking automatique des documents consultés
|
||||||
|
|
||||||
|
### 4.0e Édition unifiée
|
||||||
|
- [ ] **Même UI** pour fichiers locaux ET distants
|
||||||
|
- [ ] **Bouton Commit** — visible uniquement pour fichiers distants
|
||||||
|
- [ ] **Champ message** — pour les commits Gitea/GitHub
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## v4.0.0 — Parité Notion (Delta Analysis)
|
## v4.0.0 — Parité Notion (Delta Analysis)
|
||||||
|
|
||||||
> **Méthodologie**: Comparaison exhaustive de FlowDeck v3.0.1 vs Notion (2025) — 60+ fonctionnalités analysées, 45 manquantes identifiées, 30 retenues pour v4.0.0.
|
> **Méthodologie**: Comparaison exhaustive de FlowDeck v3.0.1 vs Notion (2025) — 60+ fonctionnalités analysées, 45 manquantes identifiées, 30 retenues pour v4.0.0.
|
||||||
|
|||||||
Reference in New Issue
Block a user