# πŸ› οΈ GUIDE DE DΓ‰VELOPPEMENT - BTPXPRESS BACKEND ## πŸ“‹ Table des matiΓ¨res - [PrΓ©requis](#prΓ©requis) - [Installation](#installation) - [Configuration](#configuration) - [Lancement](#lancement) - [Structure du projet](#structure-du-projet) - [Conventions de code](#conventions-de-code) - [Workflow de dΓ©veloppement](#workflow-de-dΓ©veloppement) - [Debugging](#debugging) - [Bonnes pratiques](#bonnes-pratiques) --- ## πŸ”§ PrΓ©requis ### **Logiciels requis** | Logiciel | Version minimale | RecommandΓ©e | VΓ©rification | |----------|------------------|-------------|--------------| | **Java JDK** | 17 | 17 LTS | `java -version` | | **Maven** | 3.8.1 | 3.9.6 | `mvn -version` | | **PostgreSQL** | 14 | 15 | `psql --version` | | **Docker** | 20.10 | 24.0 | `docker --version` | | **Git** | 2.30 | 2.40+ | `git --version` | ### **IDE recommandΓ©s** - **IntelliJ IDEA** (Ultimate ou Community) - **VS Code** avec extensions Java - **Eclipse** avec plugin Quarkus ### **Extensions IntelliJ IDEA recommandΓ©es** - Quarkus Tools - Lombok - MapStruct Support - Database Navigator - SonarLint --- ## πŸ“¦ Installation ### **1. Cloner le repository** ```bash git clone https://github.com/votre-org/btpxpress.git cd btpxpress/btpxpress-server ``` ### **2. Installer les dΓ©pendances** ```bash ./mvnw clean install ``` ### **3. Configurer la base de donnΓ©es** #### **Option A : PostgreSQL local** ```bash # CrΓ©er la base de donnΓ©es createdb btpxpress_dev # CrΓ©er l'utilisateur psql -c "CREATE USER btpxpress WITH PASSWORD 'btpxpress123';" psql -c "GRANT ALL PRIVILEGES ON DATABASE btpxpress_dev TO btpxpress;" ``` #### **Option B : Docker Compose** ```bash docker-compose up -d postgres ``` ### **4. Configurer Keycloak** ```bash # Lancer Keycloak avec Docker docker-compose up -d keycloak # AccΓ©der Γ  l'admin console # URL: http://localhost:8180 # User: admin # Password: admin ``` --- ## βš™οΈ Configuration ### **Fichiers de configuration** ``` src/main/resources/ β”œβ”€β”€ application.properties # Configuration principale β”œβ”€β”€ application-dev.properties # Configuration dΓ©veloppement β”œβ”€β”€ application-prod.properties # Configuration production └── application-test.properties # Configuration tests ``` ### **Variables d'environnement** CrΓ©er un fichier `.env` Γ  la racine : ```bash # Database DB_HOST=localhost DB_PORT=5432 DB_NAME=btpxpress_dev DB_USER=btpxpress DB_PASSWORD=btpxpress123 # Keycloak KEYCLOAK_URL=http://localhost:8180 KEYCLOAK_REALM=btpxpress KEYCLOAK_CLIENT_ID=btpxpress-backend KEYCLOAK_CLIENT_SECRET=your-secret-here # Application QUARKUS_PROFILE=dev LOG_LEVEL=DEBUG ``` ### **Configuration IntelliJ IDEA** 1. **Importer le projet Maven** - File β†’ Open β†’ SΓ©lectionner `pom.xml` - Cocher "Import Maven projects automatically" 2. **Configurer le JDK** - File β†’ Project Structure β†’ Project SDK β†’ Java 17 3. **Activer Lombok** - Settings β†’ Plugins β†’ Installer "Lombok" - Settings β†’ Build β†’ Compiler β†’ Annotation Processors β†’ Enable annotation processing 4. **Configurer Quarkus Dev Mode** - Run β†’ Edit Configurations β†’ Add New β†’ Maven - Command line: `quarkus:dev` - Working directory: `$PROJECT_DIR$` --- ## πŸš€ Lancement ### **Mode dΓ©veloppement (Dev Mode)** ```bash ./mvnw quarkus:dev ``` **FonctionnalitΓ©s Dev Mode** : - βœ… Hot reload automatique - βœ… Dev UI : http://localhost:8080/q/dev - βœ… Swagger UI : http://localhost:8080/q/swagger-ui - βœ… Health checks : http://localhost:8080/q/health - βœ… Metrics : http://localhost:8080/q/metrics ### **Mode production** ```bash # Build ./mvnw clean package -Pnative # Run java -jar target/quarkus-app/quarkus-run.jar ``` ### **Avec Docker** ```bash # Build image docker build -t btpxpress-server . # Run container docker run -p 8080:8080 btpxpress-server ``` --- ## πŸ“ Structure du projet ``` btpxpress-server/ β”œβ”€β”€ src/ β”‚ β”œβ”€β”€ main/ β”‚ β”‚ β”œβ”€β”€ java/dev/lions/btpxpress/ β”‚ β”‚ β”‚ β”œβ”€β”€ adapter/ # Couche Adapter (Hexagonal) β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ http/ # REST Resources (Controllers) β”‚ β”‚ β”‚ β”‚ └── config/ # Configurations β”‚ β”‚ β”‚ β”œβ”€β”€ application/ # Couche Application β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ service/ # Services mΓ©tier β”‚ β”‚ β”‚ β”‚ └── mapper/ # MapStruct mappers β”‚ β”‚ β”‚ └── domain/ # Couche Domain β”‚ β”‚ β”‚ β”œβ”€β”€ core/ β”‚ β”‚ β”‚ β”‚ └── entity/ # EntitΓ©s JPA β”‚ β”‚ β”‚ └── shared/ β”‚ β”‚ β”‚ └── dto/ # DTOs β”‚ β”‚ └── resources/ β”‚ β”‚ β”œβ”€β”€ application.properties β”‚ β”‚ └── db/migration/ # Scripts Flyway β”‚ └── test/ β”‚ β”œβ”€β”€ java/ # Tests unitaires et intΓ©gration β”‚ └── resources/ β”œβ”€β”€ docs/ # Documentation β”‚ β”œβ”€β”€ concepts/ # Documentation par concept β”‚ β”œβ”€β”€ architecture/ # Architecture β”‚ └── guides/ # Guides β”œβ”€β”€ pom.xml # Configuration Maven β”œβ”€β”€ README.md # README principal β”œβ”€β”€ DEVELOPMENT.md # Ce fichier └── docker-compose.yml # Docker Compose ``` --- ## πŸ“ Conventions de code ### **Nommage** | Γ‰lΓ©ment | Convention | Exemple | |---------|------------|---------| | **Classes** | PascalCase | `ChantierService` | | **MΓ©thodes** | camelCase | `findById()` | | **Variables** | camelCase | `montantTotal` | | **Constantes** | UPPER_SNAKE_CASE | `MAX_RETRY_COUNT` | | **Packages** | lowercase | `dev.lions.btpxpress.domain` | | **Enum** | PascalCase | `StatutChantier` | | **Enum values** | UPPER_SNAKE_CASE | `EN_COURS` | ### **Architecture Hexagonale** ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ ADAPTER LAYER (HTTP) β”‚ β”‚ ChantierResource, ClientResource, etc. β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ APPLICATION LAYER (Services) β”‚ β”‚ ChantierService, ClientService, etc. β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ DOMAIN LAYER (Entities/DTOs) β”‚ β”‚ Chantier, Client, ChantierDTO, etc. β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### **Annotations Lombok** ```java @Data // GΓ©nΓ¨re getters, setters, toString, equals, hashCode @Builder // Pattern Builder @NoArgsConstructor // Constructeur sans arguments @AllArgsConstructor // Constructeur avec tous les arguments @Slf4j // Logger SLF4J ``` ### **Validation** ```java @NotNull(message = "Le nom est obligatoire") @NotBlank(message = "Le nom ne peut pas Γͺtre vide") @Email(message = "Email invalide") @Size(min = 2, max = 100, message = "Le nom doit contenir entre 2 et 100 caractΓ¨res") @Pattern(regexp = "^[0-9]{14}$", message = "SIRET invalide") ``` --- ## πŸ”„ Workflow de dΓ©veloppement ### **1. CrΓ©er une branche** ```bash git checkout -b feature/nom-de-la-fonctionnalite ``` ### **2. DΓ©velopper** 1. CrΓ©er l'entitΓ© JPA (`domain/core/entity/`) 2. CrΓ©er le DTO (`domain/shared/dto/`) 3. CrΓ©er le Mapper MapStruct (`application/mapper/`) 4. CrΓ©er le Service (`application/service/`) 5. CrΓ©er le Resource REST (`adapter/http/`) 6. Γ‰crire les tests ### **3. Tester** ```bash # Tests unitaires ./mvnw test # Tests d'intΓ©gration ./mvnw verify # Tests avec couverture ./mvnw test jacoco:report ``` ### **4. Commit et Push** ```bash git add . git commit -m "feat: ajout de la fonctionnalitΓ© X" git push origin feature/nom-de-la-fonctionnalite ``` ### **5. Pull Request** - CrΓ©er une PR sur GitHub/GitLab - Demander une revue de code - Corriger les remarques - Merger aprΓ¨s validation --- ## πŸ› Debugging ### **Logs** ```java @Slf4j public class ChantierService { public Chantier create(ChantierDTO dto) { log.debug("CrΓ©ation d'un chantier: {}", dto); // ... log.info("Chantier créé avec succΓ¨s: {}", chantier.getId()); } } ``` ### **Debug IntelliJ IDEA** 1. Placer des breakpoints (clic gauche dans la marge) 2. Run β†’ Debug 'Quarkus Dev Mode' 3. Utiliser F8 (Step Over), F7 (Step Into), F9 (Resume) ### **Quarkus Dev UI** AccΓ©der Γ  http://localhost:8080/q/dev pour : - Voir les endpoints REST - Tester les requΓͺtes - Consulter les logs - GΓ©rer la base de donnΓ©es --- ## βœ… Bonnes pratiques ### **1. Gestion des transactions** ```java @Transactional public Chantier create(ChantierDTO dto) { // Code transactionnel } ``` ### **2. Gestion des erreurs** ```java public Chantier findById(UUID id) { return Chantier.findByIdOptional(id) .orElseThrow(() -> new NotFoundException("Chantier non trouvΓ©")); } ``` ### **3. Pagination** ```java public List findAll(int page, int size) { return Chantier.findAll() .page(page, size) .list(); } ``` ### **4. SΓ©curitΓ©** ```java @RolesAllowed({"ADMIN", "MANAGER"}) @Path("/chantiers") public class ChantierResource { // ... } ``` ### **5. Documentation API** ```java @Operation(summary = "CrΓ©er un chantier") @APIResponse(responseCode = "201", description = "Chantier créé") @APIResponse(responseCode = "400", description = "DonnΓ©es invalides") public Response create(ChantierDTO dto) { // ... } ``` --- ## πŸ“š Ressources - [Documentation Quarkus](https://quarkus.io/guides/) - [Hibernate ORM Panache](https://quarkus.io/guides/hibernate-orm-panache) - [RESTEasy Reactive](https://quarkus.io/guides/resteasy-reactive) - [Keycloak](https://www.keycloak.org/documentation) - [MapStruct](https://mapstruct.org/) --- **DerniΓ¨re mise Γ  jour**: 2025-09-30 **Version**: 1.0 **Auteur**: Γ‰quipe BTPXpress