docling-studio/docs/audit/audits/01-clean-architecture.md
Pier-Jean Malandrino fe83dcdf79 feat(settings): paste-image size/type limits for #195 (#196)
* docs: rename Clean Architecture → Hexagonal Architecture (ports & adapters)

Le backend suit le pattern ports & adapters (ports dans domain/ports.py,
adaptateurs dans infra/), pas Clean Architecture au sens Uncle Bob.
Aligne la terminologie dans README, docs/architecture.md, ADR guide,
audit master, fiche audit 01, et la nav mkdocs.

Les noms de fichiers et la commande /audit:clean-architecture restent
stables pour preserver les liens croises et les skills existants.

* feat(settings): add paste-image size/type limits surfaced via /api/health

Introduces MAX_PASTE_IMAGE_SIZE_MB (default 10) and
PASTE_ALLOWED_IMAGE_TYPES (default image/png,image/jpeg,image/webp)
env vars so the upcoming Verify-mode clipboard-paste handler can
validate client-side against the same limits the backend enforces.

Follows the existing MAX_FILE_SIZE_MB pattern. Ships the accepted
design doc at docs/design/195-copy-paste-image-verify-mode.md.

Refs #195
2026-04-29 14:00:00 +02:00

2.5 KiB

Audit 01 — Hexagonal Architecture (ports & adapters)

Objectif : verifier que le backend respecte le pattern hexagonal (ports dans domain/ports.py, adaptateurs dans infra/), le flux de dependances strict api -> services -> domain, et que chaque couche a une responsabilite claire.

Cible : document-parser/ (hors .venv/, __pycache__/, tests/)


Checklist

1.1 Domain (couche pure)

# Item Poids
1.1.1 domain/ n'importe ni FastAPI, ni aiosqlite, ni aucune lib infra 3
1.1.2 Les modeles, value objects et ports ne font aucun I/O (file, HTTP, DB) 3
1.1.3 Toute interaction avec l'exterieur passe par un protocole dans domain/ports.py 3
1.1.4 Pas de Pydantic dans domain — le domain utilise des dataclasses 2

1.2 Services (orchestration)

# Item Poids
1.2.1 services/ n'importe jamais fastapi, Request, Response, Depends 3
1.2.2 Les services appellent les repos, jamais de requetes SQL directes 3
1.2.3 Les regles metier vivent dans domain/, pas dans les services 2
1.2.4 Les services recoivent leurs dependances par injection, pas par import direct de concretions 2

1.3 API (couche HTTP)

# Item Poids
1.3.1 Les routes n'importent pas persistence/ directement 3
1.3.2 Les transformations camelCase/snake_case restent dans api/schemas.py 1
1.3.3 Les endpoints delegent toute la logique aux services 2

1.4 Infra (adaptateurs)

# Item Poids
1.4.1 Chaque adaptateur dans infra/ implemente un protocole de domain/ports.py 3
1.4.2 Les valeurs de config viennent de infra/settings.py, pas de constantes en dur 2

Commandes de verification

# 1.1.1 — Domain ne doit importer aucune lib infra
grep -rn "from fastapi\|from aiosqlite\|from pydantic\|import fastapi\|import aiosqlite" document-parser/domain/

# 1.2.1 — Services ne doivent pas importer FastAPI
grep -rn "from fastapi\|import fastapi" document-parser/services/

# 1.3.1 — API ne doit pas importer persistence
grep -rn "from persistence\|import persistence" document-parser/api/

# 1.4.2 — Constantes en dur dans infra (hors settings)
grep -rn "= ['\"]http\|= [0-9]\{4,\}" document-parser/infra/ --include="*.py" | grep -v settings.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]