Aller au contenu

Feature 6 – Concours (Partie 2 : inscriptions + transactions)

1. Pourquoi cette partie est importante ?

C’est ici qu’on apprend :


2. Modèle : Inscription

UML :

Concours 1 ---- * Inscription * ---- 1 Chien


3. Entité Inscription (clé de doublon)

@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.


4. Service d’inscription (@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));
}

5. Tests à exiger


6. Exemples HTTP

curl -X POST "http://localhost:8080/api/concours/1/inscriptions?chienId=1"

7. Mini-exercices

  1. Ajoutez l’annulation d’inscription.
  2. Ajoutez une métrique “nombre inscriptions”.