- Dashboard projets Gitea (user + orgs) - Board Kanban 5 colonnes avec drag & drop (SortableJS) - Sync bidirectionnelle colonnes ↔ labels Gitea - Filtres milestone/label/assignee - Notes Markdown par projet - API REST (/api/health, /api/move, /api/col-mapping…) - Colonnes custom, WIP limits - Thème clair/sombre - Cache Gitea TTL - Docker + docker-compose - Tests pytest - Docs: README, ARCHITECTURE, CHANGELOG, ROADMAP
4.1 KiB
4.1 KiB
Architecture FlowDeck
Schéma
┌──────────────────────────────────────────────┐
│ Browser │
│ HTMX + Alpine.js + SortableJS │
└──────────────┬───────────────────────────────┘
│ HTTP (Jinja2 HTML / JSON API)
┌──────────────▼───────────────────────────────┐
│ FastAPI (Python) │
│ ┌──────────┬──────────┬──────────┐ │
│ │ dashboard│ board │ notes │ api │
│ └────┬─────┴────┬─────┴──────────┴────┬─────┘
│ │ │ │
│ ┌────▼──────────▼─────────────────────▼─────┐
│ │ GiteaClient (httpx async) │
│ │ repos, issues, labels, milestones │
│ └──────────────────┬────────────────────────┘
│ │
│ ┌──────────────────▼────────────────────────┐
│ │ SQLite (WAL mode) │
│ │ boards, cards, notes, col_mapping │
│ └───────────────────────────────────────────┘
└──────────────────────┬────────────────────────┘
│ HTTPS
┌──────────────────────▼────────────────────────┐
│ Gitea API REST v1 │
│ git.dracodev.net │
└───────────────────────────────────────────────┘
Flux de données
- Dashboard : appelle
/api/v1/user/repos+/api/v1/user/orgsGitea → affiche liste projets - Board : appelle
/api/v1/repos/{owner}/{repo}/issues→ mappe sur colonnes via BDD locale - Drag & drop : SortableJS →
POST /api/move→ mise à jour SQLite + sync Gitea (labels/close) - Notes : stockées en SQLite local (non sync Gitea)
Décisions techniques
- SQLite (pas PostgreSQL) : KISS. Un fichier, pas de serveur. Migration future triviale via Alembic si besoin.
- HTMX + Alpine.js (pas React) : Léger, progressif. Pas de build step.
- Cache Gitea in-memory : TTL configurable, pas de Redis. Suffisant pour <100 repos.
- Pas d'auth OAuth en v0.2 : token global Gitea. OAuth par utilisateur prévu v0.3.
- Pas de webhooks : polling implicite au refresh. Webhooks prévus v0.4.
Base de données
boards → config Kanban par projet (colonnes, WIP)
cards → position des issues dans les colonnes
notes → notes markdown par projet
col_mapping → mapping colonne→label Gitea (sync bidirectionnelle)
Routes
GET / → Dashboard projets
GET /board/{owner}/{repo} → Board Kanban
GET /notes/{owner}/{repo} → Notes markdown
POST /notes/{owner}/{repo} → Sauvegarder notes
GET /api/health → Health check
GET /api/stats → Statistiques
GET /api/projects → Projets (JSON)
POST /api/move → Déplacer carte
POST /api/col-mapping → Config mapping colonne→label
GET /api/board-config/{o}/{r} → Config board
POST /api/board-config/{o}/{r} → MàJ config board