Parcours
/
Ballerina
Ballerina
/
Exercices
/
Le gâteau est un mensonge
Le gâteau est un mensonge

Le gâteau est un mensonge

Moyen

Instructions

Énoncé du problème

CakeStation, une boulangerie réputée qui prépare toutes sortes de gâteaux, t'a demandé de lui mettre en place un système de gestion des commandes en ligne.

Voici le détail des articles du menu.

Article Prix
Butter Cake 15
Chocolate Cake 20
Tres Leches 25

Les opérations suivantes doivent être possibles.

  • Récupérer le menu.
  • Passer une commande.
  • Récupérer le statut d'une commande (l'un de pending, in progress ou completed).
  • Mettre à jour une commande. Autorisé uniquement si le statut est encore pending.
  • Supprimer une commande. Autorisé uniquement si le statut est encore pending.

Contraintes

  1. Récupérer le menu

    • Méthode - GET
    • Chemin - /menu
    • Réponse
      • 200 OK
      • content-type - application/json
      • un objet JSON dont les clés sont les noms des articles et les valeurs les prix (entiers)
        {
           "Butter Cake": 15,
           "Chocolate Cake": 20,
           "Tres Leches": 25
        }
        
  2. Passer une commande

    • Méthode - POST

    • Chemin - /order

    • Requête

      • la charge utile de la requête sera un objet JSON avec les champs suivants
        • username - nom d'utilisateur de l'utilisateur (string)
        • order_items - un tableau d'objets JSON représentant les articles de la commande. Chaque objet JSON contiendra exactement deux champs : un champ item de type string indiquant le nom de l'article et un champ quantity de type entier indiquant la quantité commandée pour cet article.
        {
            "type": "object",
            "properties": {
                "username": {
                    "type": "string"
                },
                "order_items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "item": {
                                "type": "string"
                            },
                            "quantity": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "item",
                            "quantity"
                        ]
                    }
                }
            },
            "required": [
                "username",
                "order_items"
            ]
        }
        
    • Réponse

      • 400 Bad Request si
        • la charge utile ne correspond pas au format attendu ou
        • le champ username est vide ou
        • le tableau order_items est vide ou
        • le tableau order_items contient plus d'un objet JSON pour un même type de gâteau ou
        • un élément du tableau order_items a un champ item dont le type de gâteau ne figure pas au menu ou
        • un élément du tableau order_items a un champ quantity dont la valeur est inférieure à 1
      • 201 Created si la commande est passée avec succès
        • content-type - application/json
        • un objet JSON avec deux champs
          • un order_id contenant l'identifiant de commande généré aléatoirement, sous forme de string. Il doit s'agir de la représentation d'une valeur numérique valide.
          • un champ total contenant la valeur totale (un entier) de la commande (c'est-à-dire la somme de prix × quantité pour chaque type de gâteau)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          
  3. Récupérer le statut d'une commande

    • Méthode - GET
    • Chemin - /order/{orderId}
    • Réponse
      • 404 Not Found s'il n'existe aucune commande avec l'orderId spécifié
      • 200 OK
        • content-type - application/json

        • un objet JSON avec deux champs de type string, order_id et status, représentant respectivement l'identifiant de la commande et son statut (l'un de pending, in progress ou completed)

          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "status": {
                      "type": "string"
                  }
              },
              "required": [
                  "order_id",
                  "status"
              ]
          }
          
  4. Mettre à jour une commande. Autorisé uniquement si le statut est encore pending.

    • Méthode - PUT

    • Chemin - /order/{orderId}

    • Requête

      • la charge utile de la requête sera un objet JSON avec un seul champ order_items.

        • order_items - un tableau d'objets JSON représentant les articles de la commande. Chaque objet JSON contiendra exactement deux champs : un champ item de type string indiquant le nom de l'article et un champ quantity de type entier indiquant la quantité commandée pour cet article.
        {
            "type": "object",
            "properties": {
                "order_items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "item": {
                                "type": "string"
                            },
                            "quantity": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "item",
                            "quantity"
                        ]
                    }
                }
            },
            "required": [
                "order_items"
            ]
        }
        
    • Réponse

      • 404 Not Found s'il n'existe aucune commande avec l'orderId spécifié
      • 403 Forbidden si le statut de la commande n'est pas pending (c'est-à-dire in progress ou completed)
      • 400 Bad Request si le tableau order_items ne remplit pas les mêmes conditions que pour passer une commande (2)
      • 200 OK si la mise à jour réussit
        • content-type - application/json

        • un objet JSON avec deux champs

          • un order_id contenant le même identifiant de commande que la commande d'origine
          • un champ total contenant la valeur totale de la commande (c'est-à-dire la somme de prix × quantité pour chaque type de gâteau)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          

      Note : si une tentative de mise à jour échoue, aucune modification ne doit être apportée à la commande existante.

  5. Supprimer une commande. Autorisé uniquement si le statut est encore pending.

    • Méthode - DELETE
    • Chemin - /order/{orderId}
    • Réponse
      • 404 Not Found s'il n'existe aucune commande avec l'orderId spécifié
      • 403 Forbidden si le statut de la commande n'est pas pending (c'est-à-dire in progress ou completed)
      • 200 OK si la suppression réussit
  6. L'identifiant de commande généré doit être unique, doit être une string et doit être la représentation sous forme de string d'un nombre valide (par exemple "1", "1234").

Définition

  • Utilise une variable configurable port avec la valeur par défaut 8080 pour spécifier le port sur lequel le service écoute.
  • Utilise une map orderStatus au niveau du module pour maintenir le statut des commandes, où la valeur est "pending", "in progress" ou "completed", associée à l'identifiant de commande généré aléatoirement.
    • clé - l'identifiant de commande généré aléatoirement
    • valeur - le statut de la commande ("pending", "in progress" ou "completed")
  • Mets à jour la map orderStatus avec la valeur "pending" pour chaque nouvelle commande.

Exemple 1

Récupération du menu.

$ curl -v http://localhost:8080/menu

< HTTP/1.1 200 OK
< content-type: application/json
{"Butter Cake":15, "Chocolate Cake":20, "Tres Leches":25}

Exemple 2

Tentative de passer une commande avec une charge utile valide.

$ curl -v http://localhost:8080/order -d '{"username": "mary", "order_items": [{"item": "Tres Leches", "quantity": 1}, {"item": "Chocolate Cake", "quantity": 2}]}' -H 'Content-Type: application/json'

< HTTP/1.1 201 Created
< content-type: application/json
{"order_id":"7", "total":65}

Note : « order_id » doit être, ou sera, une string unique générée aléatoirement.

Exemple 3

Tentative de passer une commande avec une charge utile qui ne correspond pas au format attendu.

$ curl -v http://localhost:8080/order -d '{"username": "mary", "order_items": [{"Tres Leches": 1}, {"Chocolate Cake": 2}]}' -H 'Content-Type: application/json'

< HTTP/1.1 400 Bad Request

Indices

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Ballerina Exercism

Prêt à commencer Le gâteau est un mensonge ?

Inscris-toi sur Exercism pour apprendre et maîtriser Ballerina avec 60 exercices, et un vrai mentorat humain, le tout gratuitement.