Les DTO d'entrée et de sortie
On sépare l'objet exposé (DTO) de l'entité stockée. En sortie, un CampagneDTO avec les champs calculés ; en entrée, des DTO de création.
public record CampagneDTO(String id, String zone, Statut statut, Instant dateLimite, int volumeTotal, BigDecimal prixLitre) {} public record CreerCommandeDTO(int litres, String commune, String adresse) {}
Le CampagneController
Il délègue tout au service ; aucune logique métier ici.
@RestController @RequestMapping("/api/campagnes") public class CampagneController { private final CampagneService service; public CampagneController(CampagneService s) { service = s; } @GetMapping public List<CampagneDTO> lister(@RequestParam(required=false) String zone) { return service.listerOuvertes(zone); } @GetMapping("/{id}") public CampagneDTO consulter(@PathVariable String id) { return service.consulter(id); } }
Une sous-ressource : les commandes
« Rejoindre une campagne » agit sur une sous-ressource : POST /campagnes/{id}/commandes.
@PostMapping("/{id}/commandes") @ResponseStatus(HttpStatus.CREATED) public CampagneDTO rejoindre(@PathVariable String id, @RequestBody CreerCommandeDTO dto) { return service.rejoindre(id, dto); }
Formaliser le contrat
On documente chaque endpoint : URL, entrée, sortie, codes. Swagger sert de contrat vivant, testable depuis le navigateur.
🛢️ Sur le projet Fioul Groupé
Implémente les contrôleurs et DTO, teste dans Swagger. À ce stade le service peut renvoyer des données factices ; on branchera la vraie base aux chapitres 9-10.
À retenir
- DTO séparés de l'entité, en entrée et en sortie.
- Le contrôleur délègue au service, sans logique métier.
- Sous-ressource pour « rejoindre » ; contrat documenté via Swagger.