Tracks
/
Ballerina
Ballerina
/
Ejercicios
/
El pastel es una mentira
El pastel es una mentira

El pastel es una mentira

Intermedia

Instrucciones

Enunciado del problema

CakeStation, una panadería popular que hornea todo tipo de pasteles, te ha pedido que le montes un sistema de gestión de pedidos en línea.

Los detalles de los artículos del menú son los siguientes.

Artículo Precio
Butter Cake 15
Chocolate Cake 20
Tres Leches 25

Se espera que sea posible hacer lo siguiente.

  • Obtener el menú.
  • Realizar un pedido.
  • Obtener el estado de un pedido (uno de pending, in progress o completed).
  • Actualizar un pedido. Solo se permite si el estado sigue siendo pending.
  • Eliminar un pedido. Solo se permite si el estado sigue siendo pending.

Restricciones

  1. Obtener el menú

    • Método: GET
    • Ruta: /menu
    • Respuesta
      • 200 OK
      • content-type: application/json
      • un objeto JSON con los nombres de los artículos como claves y los precios como valores (enteros)
        {
           "Butter Cake": 15,
           "Chocolate Cake": 20,
           "Tres Leches": 25
        }
        
  2. Realizar un pedido

    • Método: POST

    • Ruta: /order

    • Solicitud

      • el cuerpo de la solicitud será un objeto JSON con los siguientes campos
        • username: el nombre de usuario (string)
        • order_items: un array de objetos JSON que representan los artículos del pedido. Cada objeto JSON contendrá exactamente dos campos: un campo item de tipo string que indica el nombre del artículo y un campo quantity de tipo entero que indica la cantidad pedida de ese artículo.
        {
            "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"
            ]
        }
        
    • Respuesta

      • 400 Bad Request si
        • el cuerpo de la solicitud no coincide con el formato esperado o
        • el username está vacío o
        • el array order_items está vacío o
        • el array order_items contiene más de un objeto JSON para un mismo tipo de pastel o
        • un elemento del array order_items tiene un campo item con un tipo de pastel que no está en el menú o
        • un elemento del array order_items tiene un campo quantity con un valor menor que 1
      • 201 Created si el pedido se realiza correctamente
        • content-type: application/json
        • un objeto JSON con dos campos
          • un order_id que contiene la cadena de ID de pedido generada aleatoriamente. Debe ser la representación en forma de cadena de un valor numérico válido.
          • un campo total que contiene el valor total (entero) del pedido (es decir, la suma de precio x cantidad para cada tipo de pastel)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          
  3. Obtener el estado de un pedido

    • Método: GET
    • Ruta: /order/{orderId}
    • Respuesta
      • 404 Not Found si no existe ningún pedido con el orderId especificado
      • 200 OK
        • content-type: application/json

        • un objeto JSON con dos campos de tipo string, order_id y status, que representan el ID del pedido y su estado (uno de pending, in progress o completed), respectivamente

          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "status": {
                      "type": "string"
                  }
              },
              "required": [
                  "order_id",
                  "status"
              ]
          }
          
  4. Actualizar un pedido. Solo se permite si el estado sigue siendo pending.

    • Método: PUT

    • Ruta: /order/{orderId}

    • Solicitud

      • el cuerpo de la solicitud será un objeto JSON con un único campo order_items.

        • order_items: un array de objetos JSON que representan los artículos del pedido. Cada objeto JSON contendrá exactamente dos campos: un campo item de tipo string que indica el nombre del artículo y un campo quantity de tipo entero que indica la cantidad pedida de ese artículo.
        {
            "type": "object",
            "properties": {
                "order_items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "item": {
                                "type": "string"
                            },
                            "quantity": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "item",
                            "quantity"
                        ]
                    }
                }
            },
            "required": [
                "order_items"
            ]
        }
        
    • Respuesta

      • 404 Not Found si no existe ningún pedido con el orderId especificado
      • 403 Forbidden si el estado del pedido no es pending (es decir, in progress o completed)
      • 400 Bad Request si el array order_items no cumple los mismos requisitos que los de realizar el pedido (2)
      • 200 OK si la actualización se realiza correctamente
        • content-type: application/json

        • un objeto JSON con dos campos

          • un order_id que contiene la misma cadena de ID de pedido que el pedido original
          • un campo total que contiene el valor total del pedido (es decir, la suma de precio x cantidad para cada tipo de pastel)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          

      Nota: si un intento de actualización falla, no se debe hacer ningún cambio al pedido existente.

  5. Eliminar un pedido. Solo se permite si el estado sigue siendo pending.

    • Método: DELETE
    • Ruta: /order/{orderId}
    • Respuesta
      • 404 Not Found si no existe ningún pedido con el orderId especificado
      • 403 Forbidden si el estado del pedido no es pending (es decir, in progress o completed)
      • 200 OK si la eliminación se realiza correctamente
  6. El ID de pedido generado debe ser único, debe ser una cadena y debe ser la representación en forma de cadena de un número válido (por ejemplo, "1", "1234").

Definición

  • Usa una variable configurable port con el valor predeterminado 8080 para especificar el puerto en el que escucha el servicio.
  • Usa un mapa orderStatus a nivel de módulo para mantener el estado de los pedidos, en el que el valor es "pending", "in progress" o "completed" para cada cadena de ID de pedido generada aleatoriamente.
    • clave: cadena de ID de pedido generada aleatoriamente
    • valor: estado del pedido ("pending", "in progress" o "completed")
  • Actualiza el mapa orderStatus con el valor "pending" para cada pedido nuevo.

Ejemplo 1

Obtener el menú.

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

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

Ejemplo 2

Intentar realizar el pedido con un cuerpo de solicitud válido.

$ 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}

Nota: «order_id» será una cadena única generada aleatoriamente.

Ejemplo 3

Intentar realizar el pedido con un cuerpo que no coincide con el formato esperado.

$ 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

Pistas

Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Ballerina Exercism

¿Todo listo para empezar El pastel es una mentira?

Regístrate en Exercism para aprender y dominar Ballerina con 60 ejercicios y mentoría humana real, todo gratis.