Rejoindre une campagne
Le service ajoute une commande à la campagne (le $push vu côté Mongo), après vérifications.
public CampagneDTO rejoindre(String id, CreerCommandeDTO dto) { Campagne c = repo.findById(id) .orElseThrow(() -> new CampagneIntrouvable(id)); if (c.getStatut() != Statut.OUVERTE) throw new CampagneFermee(id); c.getCommandes().add(new Commande(dto.litres(), dto.commune(), dto.adresse())); repo.save(c); return versDTO(c); }
Calculer volume & palier de prix
On somme les litres, puis on choisit le palier du fournisseur — la logique de l'agrégation Mongo, ici en Java.
private BigDecimal calculerPrix(int volume, Fournisseur f) { return f.getPaliers().stream() .filter(p -> volume >= p.volumeMin()) .max(Comparator.comparingInt(Palier::volumeMin)) .map(Palier::prixLitre) .orElse(f.getPrixBase()); }
Les règles de gestion
- Refuser une inscription si la campagne est
CLOTUREEou la date dépassée → 409. - Quantité minimale de commande (ex. 500 L) → validée en amont (chapitre 5/DTO).
- Seul le coordinateur peut ouvrir/clôturer → contrôlé par la sécurité (chapitre 12).
Le mapping entité → DTO
C'est le service qui calcule volumeTotal et prixLitre pour remplir le DTO exposé.
🛢️ Sur le projet Fioul Groupé
Écris listerOuvertes, consulter, rejoindre, cloturer et calculerPrix. Ajoute des exceptions métier (CampagneIntrouvable, CampagneFermee) reliées aux codes 404/409 du chapitre 5.
À retenir
- La logique vit dans le service : rejoindre, calculer, valider les règles.
- Le calcul du palier reprend l'agrégation Mongo, en Java.
- Exceptions métier → codes HTTP via le
@RestControllerAdvice.