TP Backend – dynors-core (Spring Boot)
Objectif : construire un mini backend qui utilise correctement dynors-core (DB multi‑tenant, sécurité, logging), sans dépendre d’un projet métier particulier. Ce TP formalise l’usage du core pour tout nouveau projet (Mediconnect, SuperGest, TRACIUM, modules internes, etc.).
Durée cible : 1 journée (ou 2 demi‑journées) avec accompagnement.
Étape 0 – Pré‑requis
- Avoir lu :
- Niveau 1 : Vision & Architecture (repos, tenants, RAGNAR/TAKKU).
- Niveau 2 : Projets clients & dynors-core.
- Disposer d’un PostgreSQL local.
- Disposer des accès au GitLab Maven Registry DYNORS (token lecture).
Étape 1 – Squelette projet
- Créer un projet Gradle Spring Boot (ex.
tp-demo-backendoumon-module-metier). - Ajouter les dépendances DYNORS (voir Guide projets clients) :
dependencies {
implementation(platform("com.dynors:dynors-core-bom:1.0.2")) // Dernière release — voir [Versions et dépendances](../99-annexes/versions-et-dependances.md)
implementation("com.dynors:dynors-commons")
implementation("com.dynors:dynors-security")
implementation("com.dynors:dynors-db")
implementation("com.dynors:dynors-logging:1.0.0-SNAPSHOT")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.postgresql:postgresql")
}
- Configurer le repository GitLab Maven Registry (voir doc core :
CONFIGURATION_CLIENT_PROJETS.mdou équivalent).
Objectif : ./gradlew build compile.
Étape 2 – Configuration application
- Classe principale :
@SpringBootApplicationavecscanBasePackagesincluantcom.dynors.db,com.dynors.security.@EntityScansurcom.dynors.db.tenant.model+ le package de vos entités métier.-
@EnableJpaRepositoriessurcom.dynors.db.tenant.repository+ le package de vos repositories. -
application.yml: spring.datasource(PostgreSQL local).spring.jpa.hibernate.ddl-auto=validate(ouupdateen dev contrôlé).dynors.db: multi‑tenant,strategy=schema,tier=TIER_2.dynors.security: JWT activé.dynors.logging.provider=console.
Objectif : l’application démarre (même sans endpoint métier).
Étape 3 – Modèle métier minimal (tenant‑aware)
- Créer une entité métier (ex.
PartnerouCustomer) dans votre package : - champs :
id(UUID), champs métier (nom, email, téléphone, etc.),createdAt,updatedAt. -
Pas de
tenant_idexplicite en stratégieSCHEMA_DEDICATED(isolation par schéma). -
Repository étendant
TenantAwareRepository<Entité, UUID>:
@Repository
public interface PartnerRepository extends TenantAwareRepository<Partner, UUID> {
Optional<Partner> findByEmail(String email);
}
-
Service métier :
create,findById,findAllavec validation simple (ex. email unique dans le tenant). -
Controller REST :
POST /api/partners,GET /api/partners,GET /api/partners/{id}.
Objectif :
- POST /api/partners crée un enregistrement.
- GET /api/partners liste les données du tenant courant uniquement.
Étape 4 – dynors-logging (DynorsLogger)
- Injecter
DynorsLoggeretTenantContextServicedans votre service. - Ajouter :
- un log
infoà la création (avec métadonnées : tenant, service, action, id). - un log
erroren cas d’exception.
Exemple :
logger.info("Partner créé", Map.of(
"tenant", tenantContextService.getCurrentTenant(),
"service", "PartnerService",
"action", "create",
"partnerId", created.getId()
));
Objectif : voir les logs en console avec le format DYNORS (métadonnées structurées).
Étape 5 – Authentification (JWT)
- Suivre Sécurité & Auth :
- entité
Usersimple (username / password hashé) ou utilisation du modèle core. - endpoint
/api/auth/loginrenvoyant un JWT. - Protéger les endpoints métier (
/api/partners/**) avec Spring Security + filtre dynors-security.
Objectif : impossible d’appeler /api/partners sans JWT valide.
Étape 6 – Tests & validation
- Au moins :
- un test d’intégration (création + lecture via le service).
- un test vérifiant l’isolation tenant : deux tenants différents → données isolées.
- Vérifier que l’app démarre avec un tenant défini (header ou config) et que les logs utilisent bien
DynorsLogger.
Étape 7 – Aller plus loin (optionnel)
- Ajouter une seconde entité et une relation (ex. commande liée au partenaire).
- Utiliser
QuotaServicepour une règle simple (ex. nombre max d’enregistrements par tenant). - Basculer
dynors.logging.providersursentrydans un profil de test.