ci: pipeline Gitea Actions build & push Docker sur push main
CI — Tests & Docker Build / Tests (push) Failing after 2m55s
CI — Tests & Docker Build / Build & push image Docker (push) Has been skipped

- 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>
This commit is contained in:
2026-06-07 08:05:53 +02:00
parent b4e5bd69f6
commit c34cc41496
10 changed files with 377 additions and 1 deletions
+53
View File
@@ -0,0 +1,53 @@
# 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.