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>
54 lines
2.6 KiB
Markdown
54 lines
2.6 KiB
Markdown
# 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 ports `out`. Annoté Spring (`@Service`, `@Repository`, `@Component`).
|
|
- **`interfaces/`** : contrôleurs REST et DTOs. Invoque les ports `in`. Annoté `@RestController`. Pas de logique métier inline.
|
|
|
|
## Interdictions
|
|
|
|
- Jamais d'import de `infrastructure/` ou `interfaces/` depuis `domain/` ou `application/`.
|
|
- 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 ports `out`.
|
|
- Les mappers (`UserPersistenceMapper`, `UserRestMapper`) restent dans leur couche respective, pas dans `domain/`.
|
|
|
|
## 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.
|