Adloun

Spring Boot : écrire le serveur (école d'ingénieur) · Chapitre 12 · Application directe du cours

Annuler une commande

Projet : l'API de la Librairie · niveau 2

Énoncé

Le personnel doit pouvoir annuler une commande : DELETE /api/admin/commandes/{numero} supprime la commande et remet ses exemplaires en stock, ou répond 404 si elle n'existe pas. Écrire le contrôleur et un test.

Corrigé

L'annulation charge la commande, rend les exemplaires (la méthode remettreEnStock de Livre existe depuis le chapitre 6) et supprime la commande ; ses lignes suivent (cascade et suppression des orphelins). Le tout dans une transaction.


    /** Annule une commande : ses exemplaires reviennent en stock, dans la même transaction. */
    @DeleteMapping("/api/admin/commandes/{numero}")
    @Transactional
    public ResponseEntity<Void> annuler(@PathVariable long numero) {
        Commande commande = commandes.findById(numero).orElseThrow(() ->
                new ResponseStatusException(HttpStatus.NOT_FOUND, "Aucune commande n° " + numero + "."));
        commande.getLignes().forEach(l -> l.getLivre().remettreEnStock(l.getQuantite()));
        commandes.delete(commande); // les lignes suivent (cascade, orphanRemoval)
        return ResponseEntity.noContent().build();
    }

La règle de sécurité /api/admin/** (rôle ADMIN) la protège déjà.


    @Test
    void annulerRendLesExemplaires() throws Exception {
        int avant = livres.findById("9782956300069").orElseThrow().getStock();
        long numero = commander("9782956300069", 2);
        assertThat(livres.findById("9782956300069").orElseThrow().getStock()).isEqualTo(avant - 2);
        assertThat(mvc.delete().uri("/api/admin/commandes/" + numero).header("Authorization", "Basic YWRtaW46bGlicmFpcmUtMjAyNg=="))
                .hasStatus(204);
        assertThat(livres.findById("9782956300069").orElseThrow().getStock()).isEqualTo(avant);
        assertThat(mvc.delete().uri("/api/admin/commandes/" + numero).header("Authorization", "Basic YWRtaW46bGlicmFpcmUtMjAyNg=="))
                .hasStatus(404);
    }

(commander est une petite méthode du test qui passe une commande par l'API et rend son numéro.)

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →