Percursos
/
Ballerina
Ballerina
/
Exercícios
/
The Cake is a Lie
The Cake is a Lie

The Cake is a Lie

Médio

Instruções

Enunciado do problema

A CakeStation, uma pastelaria popular que faz vários bolos, pediu-te para criares um sistema de gestão de encomendas online.

Os detalhes dos itens do menu são os seguintes.

Item Preço
Butter Cake 15
Chocolate Cake 20
Tres Leches 25

Espera-se que seja possível fazer o seguinte.

  • Obter o menu.
  • Fazer uma encomenda.
  • Obter o estado de uma encomenda (um de pending, in progress ou completed).
  • Atualizar uma encomenda. Só é permitido se o estado ainda for pending.
  • Eliminar uma encomenda. Só é permitido se o estado ainda for pending.

Restrições

  1. Obter o menu

    • Método - GET
    • Caminho - /menu
    • Resposta
      • 200 OK
      • content-type - application/json
      • um objeto JSON com os nomes dos itens como chaves e os preços como valores (inteiro)
        {
           "Butter Cake": 15,
           "Chocolate Cake": 20,
           "Tres Leches": 25
        }
        
  2. Fazer uma encomenda

    • Método - POST

    • Caminho - /order

    • Pedido

      • o payload do pedido será um objeto JSON com os seguintes campos
        • username - o nome de utilizador do utilizador (string)
        • order_items - um array de objetos JSON que representam os itens da encomenda. Cada objeto JSON conterá exatamente dois campos: um campo item, do tipo string, que indica o nome do item, e um campo quantity, do tipo inteiro, que indica a quantidade encomendada desse item.
        {
            "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"
            ]
        }
        
    • Resposta

      • 400 Bad Request se
        • o payload não corresponder ao formato esperado ou
        • o username estiver vazio ou
        • o array order_items estiver vazio ou
        • o array order_items contiver mais do que um objeto JSON para um determinado tipo de bolo ou
        • um elemento do array order_items tiver um campo item com um tipo de bolo que não está no menu ou
        • um elemento do array order_items tiver um campo quantity com um valor inferior a 1
      • 201 Created se a encomenda for feita com sucesso
        • content-type - application/json
        • um objeto JSON com dois campos
          • um order_id que contém a string do ID da encomenda gerada aleatoriamente. Esta deve ser a representação em string de um valor numérico válido.
          • um campo total que contém o valor total (inteiro) da encomenda (ou seja, a soma de preço x quantidade para cada tipo de bolo)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          
  3. Obter o estado de uma encomenda

    • Método - GET
    • Caminho - /order/{orderId}
    • Resposta
      • 404 Not Found se não existir nenhuma encomenda com o orderId especificado
      • 200 OK
        • content-type - application/json

        • um objeto JSON com dois campos string, order_id e status, que representam, respetivamente, o ID da encomenda e o estado (um de pending, in progress ou completed)

          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "status": {
                      "type": "string"
                  }
              },
              "required": [
                  "order_id",
                  "status"
              ]
          }
          
  4. Atualizar uma encomenda. Só é permitido se o estado ainda for pending.

    • Método - PUT

    • Caminho - /order/{orderId}

    • Pedido

      • o payload do pedido será um objeto JSON com um único campo order_items.

        • order_items - um array de objetos JSON que representam os itens da encomenda. Cada objeto JSON conterá exatamente dois campos: um campo item, do tipo string, que indica o nome do item, e um campo quantity, do tipo inteiro, que indica a quantidade encomendada desse item.
        {
            "type": "object",
            "properties": {
                "order_items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "item": {
                                "type": "string"
                            },
                            "quantity": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "item",
                            "quantity"
                        ]
                    }
                }
            },
            "required": [
                "order_items"
            ]
        }
        
    • Resposta

      • 404 Not Found se não existir nenhuma encomenda com o orderId especificado
      • 403 Forbidden se o estado da encomenda não for pending (ou seja, in progress ou completed)
      • 400 Bad Request se o array order_items não cumprir os mesmos requisitos que os de fazer a encomenda (2)
      • 200 OK se a atualização for bem-sucedida
        • content-type - application/json

        • um objeto JSON com dois campos

          • um order_id que contém a mesma string de ID da encomenda original
          • um campo total que contém o valor total da encomenda (ou seja, a soma de preço x quantidade para cada tipo de bolo)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          

      Nota: se uma tentativa de atualização falhar, não deve ser feita nenhuma alteração à encomenda existente.

  5. Eliminar uma encomenda. Só é permitido se o estado ainda for pending.

    • Método - DELETE
    • Caminho - /order/{orderId}
    • Resposta
      • 404 Not Found se não existir nenhuma encomenda com o orderId especificado
      • 403 Forbidden se o estado da encomenda não for pending (ou seja, in progress ou completed)
      • 200 OK se a eliminação for bem-sucedida
  6. O ID da encomenda gerado deve ser único, deve ser uma string e deve ser a representação em string de um número válido (por exemplo, "1", "1234").

Definição

  • Usa uma variável configurable port com o valor predefinido de 8080 para especificar a porta em que o serviço escuta.
  • Usa um map orderStatus ao nível do módulo para manter o estado das encomendas, em que o valor é "pending", "in progress" ou "completed" associado à string do ID da encomenda gerada aleatoriamente.
    • chave - string do ID da encomenda gerada aleatoriamente
    • valor - estado da encomenda ("pending", "in progress" ou "completed")
  • Atualiza o map orderStatus com o valor "pending" para cada nova encomenda.

Exemplo 1

Obter o 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}

Exemplo 2

Tentar fazer a encomenda com um payload 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" deverá/será uma string única gerada aleatoriamente.

Exemplo 3

Tentar fazer a encomenda com um payload que não corresponde ao 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

Dicas

Editar via GitHub A ligação abre numa nova janela ou separador
Ballerina Exercism

Estás pronto para começar The Cake is a Lie?

Inscreve-te no Exercism para aprenderes e dominares Ballerina com 60 exercícios, e mentoria humana real, tudo grátis.