🖨️ Version PDF
C’est ici qu’on apprend :
UML :
Concours 1 ---- * Inscription * ---- 1 Chien
@Entity @Table(uniqueConstraints = @UniqueConstraint(columnNames = {"concours_id","chien_id"})) public class Inscription { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @ManyToOne(optional=false) private Concours concours; @ManyToOne(optional=false) private Chien chien; private LocalDateTime dateInscription; }
La contrainte unique en base = sécurité anti-doublon.
@Transactional
Règles métier :
@Transactional public InscriptionDto inscrire(Long concoursId, Long chienId) { Concours concours = concoursRepo.findById(concoursId).orElseThrow(...); if (concours.getEtat() == EtatConcours.FERME) { throw new IllegalStateException("Concours fermé"); } Chien chien = chienRepo.findById(chienId).orElseThrow(...); if (chien.getEtat() == EtatChien.RETIRE) { throw new IllegalStateException("Chien retiré"); } if (inscriptionRepo.existsByConcoursIdAndChienId(concoursId, chienId)) { throw new IllegalStateException("Déjà inscrit"); } Inscription ins = new Inscription(); ins.setConcours(concours); ins.setChien(chien); ins.setDateInscription(LocalDateTime.now()); return mapper.toDto(inscriptionRepo.save(ins)); }
curl -X POST "http://localhost:8080/api/concours/1/inscriptions?chienId=1"