Skip to content

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]