Audit 07 — Decouplage
Objectif : verifier le decouplage entre frontend et backend, entre features, et la clarte des contrats d'interface.
Cible : document-parser/, frontend/src/, docker-compose.yml, nginx.conf
Checklist
7.1 Decouplage Frontend / Backend
| # |
Item |
Poids |
| 7.1.1 |
Le frontend communique avec le backend uniquement via l'API REST — pas de couplage par fichier partage, DB partagee, ou import croise |
3 |
| 7.1.2 |
Le contrat API est stable — les types TypeScript frontend correspondent aux schemas Pydantic backend |
3 |
| 7.1.3 |
Le frontend peut tourner avec un mock du backend (les appels API sont isoles dans des fichiers api.ts par feature) |
2 |
| 7.1.4 |
Le backend peut etre teste sans le frontend (endpoints testables via httpx / TestClient) |
2 |
| 7.1.5 |
Pas de logique metier dupliquee entre front et back (ex: validation faite cote back ET reinventee cote front) |
2 |
7.2 Decouplage inter-features (Frontend)
| # |
Item |
Poids |
| 7.2.1 |
Chaque feature (features/analysis, features/document, ...) a son propre store, API client et composants UI |
2 |
| 7.2.2 |
Les features ne s'importent pas mutuellement — la communication passe par shared/ ou par les props/events Vue |
3 |
| 7.2.3 |
Les types partages entre features sont dans shared/types.ts, pas dans une feature specifique |
2 |
| 7.2.4 |
Un store Pinia n'accede pas directement au state d'un autre store (sauf via des getters exposes) |
2 |
7.3 Decouplage inter-couches (Backend)
| # |
Item |
Poids |
| 7.3.1 |
Les repos (persistence/) retournent des objets du domaine, pas des dicts ou des Row SQLite |
2 |
| 7.3.2 |
Les adaptateurs infra n'exposent pas les types de leurs libs internes aux services (pas de types docling.* dans les signatures de services) |
3 |
| 7.3.3 |
Le changement de base de donnees (SQLite -> PostgreSQL) ne necessite de modifier que persistence/ |
2 |
| 7.3.4 |
Le changement de framework HTTP (FastAPI -> autre) ne necessite de modifier que api/ et main.py |
2 |
7.4 Contrats et interfaces
| # |
Item |
Poids |
| 7.4.1 |
Les ports dans domain/ports.py definissent des signatures claires avec des types du domaine |
2 |
| 7.4.2 |
Les schemas Pydantic (api/schemas.py) documentent le contrat HTTP — pas de dict ou Any dans les responses |
2 |
| 7.4.3 |
Les reponses API ont un format coherent (enveloppe, codes d'erreur normalises) |
1 |
Commandes de verification
# 7.2.2 — Imports croises entre features
grep -rn "from.*features/" frontend/src/features/ --include="*.ts" --include="*.vue" | grep -v "node_modules" | grep -v "__tests__"
# 7.2.4 — Store qui accede au state d'un autre store
grep -rn "useDocumentStore\|useAnalysisStore\|useChunkingStore\|useHistoryStore\|useSettingsStore" frontend/src/features/ --include="*.ts" | grep -v "index.ts"
# 7.3.2 — Types docling qui leakent
grep -rn "from docling\|import docling" document-parser/services/ --include="*.py"
# 7.4.2 — dict ou Any dans les reponses API
grep -rn "-> dict\|-> Any\|Dict\[str, Any\]" document-parser/api/ --include="*.py"
Regles de notation
- Tout item de poids 3 non conforme = ecart
[CRIT]
- Tout item de poids 2 non conforme = ecart
[MAJ]
- Tout item de poids 1 non conforme = ecart
[MIN]