c34cc41496
- Dockerfile multi-stage (build eclipse-temurin:25-jdk → runtime) - CI : tests via actions/setup-java puis build & push vers registry Gitea - Trigger Watchtower après push sur main - CLAUDE.md + rules projet (.claude/rules/) - Version build.gradle : 0.0.1-SNAPSHOT → 0.0.1 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2.6 KiB
2.6 KiB
Architecture — Clean Architecture (Hexagonale)
Structure des couches
L'application suit une Clean Architecture avec le pattern Ports & Adapters :
src/main/java/com/olhar/olharapi/
domain/ ← Entités métier et exceptions (aucune dépendance framework)
model/
exception/
application/ ← Cas d'usage (logique métier), ports d'entrée et de sortie
port/
in/ ← Interfaces des cas d'usage (appelées par interfaces/)
out/ ← Interfaces de sortie (implémentées par infrastructure/)
usecase/ ← Implémentations des cas d'usage
infrastructure/ ← Adaptateurs sortants (BDD, sécurité, configuration)
persistence/
entity/ ← Entités JPA (distinctes des entités domaine)
mapper/ ← Conversion domaine ↔ JPA
repository/ ← Adaptateurs JPA implémentant les ports out
security/
config/
interfaces/ ← Adaptateurs entrants (REST)
rest/
controller/
dto/
request/
response/
mapper/ ← Conversion domaine ↔ DTO REST
exception/ ← Handlers d'exception globaux
Règles par couche
domain/: Java pur — pas de Spring, pas de JPA, pas de Lombok avancé. Entités et exceptions métier uniquement.application/: interfaces des ports (port/in,port/out) + services implémentant les cas d'usage. Pas de dépendance à Spring Web ou JPA.infrastructure/: adaptateurs Spring/JPA/sécurité. Implémente les portsout. Annoté Spring (@Service,@Repository,@Component).interfaces/: contrôleurs REST et DTOs. Invoque les portsin. Annoté@RestController. Pas de logique métier inline.
Interdictions
- Jamais d'import de
infrastructure/ouinterfaces/depuisdomain/ouapplication/. - Jamais de logique métier dans un contrôleur (
interfaces/rest/controller/). - Jamais d'entité JPA (
infrastructure/persistence/entity/) retournée directement par un contrôleur. - Jamais d'appel direct à un repository JPA depuis
application/usecase/— passer par les portsout. - Les mappers (
UserPersistenceMapper,UserRestMapper) restent dans leur couche respective, pas dansdomain/.
Règles de code
- Utiliser Lombok pour les entités, DTOs et mappers (mais pas dans
domain/model/si les entités sont simples). - Pas de commentaires explicatifs sur ce que fait le code — seulement sur le pourquoi si non évident.
- Pas d'abstraction prématurée : implémenter ce qui est demandé, pas ce qui pourrait être utile plus tard.