Reviewed-on: Bonsai/Bonsai-api#6
Bonsai API
API REST de gestion d'issues (type Jira léger), construite avec Spring Boot 3.5 / Java 25 en Clean Architecture.
Prérequis
| Outil | Version minimale |
|---|---|
| Java (JDK) | 25 |
| Docker + Docker Compose | 24+ |
| Gradle (wrapper inclus) | 8+ |
Démarrage en développement
1. Cloner le dépôt
git clone https://git.goutailler-olivier.com/<org>/bonsai-api.git
cd bonsai-api
2. Démarrer la base de données
docker compose up db -d
PostgreSQL démarre sur localhost:5432, base bonsai, utilisateur bonsai, mot de passe bonsai.
3. Lancer l'API
./gradlew bootRun
Flyway applique automatiquement la migration V1__init.sql au premier démarrage.
L'API est disponible sur http://localhost:8080.
Démarrage complet via Docker Compose
Pour lancer l'API et la base de données en une seule commande :
docker compose up --build
Pour arrêter et supprimer les conteneurs :
docker compose down
Pour supprimer également le volume PostgreSQL (réinitialise la base) :
docker compose down -v
Variables d'environnement
Les valeurs par défaut conviennent pour le développement local. En production, surcharger les variables suivantes :
| Variable | Défaut | Description |
|---|---|---|
DATASOURCE_URL |
jdbc:postgresql://localhost:5432/bonsai |
URL JDBC PostgreSQL |
DATASOURCE_USERNAME |
bonsai |
Utilisateur base de données |
DATASOURCE_PASSWORD |
bonsai |
Mot de passe base de données |
KEYCLOAK_JWKS_URI |
https://auth.goutailler-olivier.com/realms/bonsai/protocol/openid-connect/certs |
Endpoint JWKS Keycloak |
CORS_ALLOWED_ORIGIN_PROD |
https://bonsai.goutailler-olivier.com |
Origine CORS de production |
Sécurité
Toutes les routes nécessitent un token JWT Bearer valide, émis par Keycloak :
- Realm :
bonsai - Client :
bonsai-webapp - Issuer :
https://auth.goutailler-olivier.com/realms/bonsai
Authorization: Bearer <token>
Endpoints
| Méthode | Route | Description |
|---|---|---|
GET |
/issues |
Liste toutes les issues |
POST |
/issues |
Crée une issue |
PUT |
/issues/{id} |
Remplace une issue complète |
DELETE |
/issues/{id} |
Supprime une issue (204) |
Lancer les tests
./gradlew test
Le rapport HTML est généré dans build/reports/tests/test/index.html.
Structure du projet
src/main/java/fr/bonsai/api/
├── domain/model/ # Entités métier (sans dépendance Spring)
├── application/
│ ├── port/in/ # Interfaces des use cases
│ ├── port/out/ # Interface du repository
│ └── usecase/ # Logique métier (IssueService)
├── adapter/
│ ├── in/web/ # Controllers REST et DTOs
│ └── out/persistence/ # Entités JPA et adaptateur repository
└── config/ # Configuration Spring (Security, CORS, Beans)