Trilhas
/
Ballerina
Ballerina
/
Exercícios
/
O Bolo é uma Mentira
O Bolo é uma Mentira

O Bolo é uma Mentira

Médio

Instruções

Enunciado

A CakeStation, uma confeitaria popular que faz vários bolos, pediu que você criasse um sistema online de gerenciamento de pedidos para ela.

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 o seguinte seja possível.

  • Obter o menu.
  • Fazer um pedido.
  • Obter o status de um pedido (um de pending, in progress ou completed).
  • Atualizar um pedido. Só é permitido se o status ainda for pending.
  • Excluir um pedido. Só é permitido se o status ainda for pending.

Restrições

  1. Recuperar 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 um pedido

    • Método - POST

    • Caminho - /order

    • Requisição

      • o payload da requisição será um objeto JSON com os seguintes campos
        • username - nome de usuário (string)
        • order_items - um array de objetos JSON que representam os itens do pedido. 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 pedida daquele 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 de um objeto JSON para um mesmo tipo de bolo ou
        • um membro do array order_items tiver um campo item com um tipo de bolo que não está no menu ou
        • um membro do array order_items tiver um campo quantity com valor menor que 1
      • 201 Created se o pedido for feito com sucesso
        • content-type - application/json
        • um objeto JSON com dois campos
          • um order_id contendo a string do ID do pedido gerada aleatoriamente. Ela deve ser a representação em string de um valor numérico válido.
          • um campo total contendo o valor total (inteiro) do pedido (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. Recuperar o status de um pedido

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

        • um objeto JSON com dois campos string, order_id e status, que representam, respectivamente, o ID do pedido e o status (um de pending, in progress ou completed)

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

    • Método - PUT

    • Caminho - /order/{orderId}

    • Requisição

      • o payload da requisição será um objeto JSON com um único campo order_items.

        • order_items - um array de objetos JSON que representam os itens do pedido. 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 pedida daquele 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 houver um pedido com o orderId especificado
      • 403 Forbidden se o status do pedido não for pending (ou seja, in progress ou completed)
      • 400 Bad Request se o array order_items não atender aos mesmos requisitos que os de fazer um pedido (2)
      • 200 OK se a atualização for bem-sucedida
        • content-type - application/json

        • um objeto JSON com dois campos

          • um order_id contendo a mesma string de ID do pedido original
          • um campo total contendo o valor total do pedido (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"
              ]
          }
          

      Observação: se uma tentativa de atualização falhar, nenhuma alteração deve ser feita no pedido existente.

  5. Excluir um pedido. Só é permitido se o status ainda for pending.

    • Método - DELETE
    • Caminho - /order/{orderId}
    • Resposta
      • 404 Not Found se não houver um pedido com o orderId especificado
      • 403 Forbidden se o status do pedido não for pending (ou seja, in progress ou completed)
      • 200 OK se a exclusão for bem-sucedida
  6. O ID do pedido 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

  • Use uma variável configurable chamada port, com o valor padrão 8080, para especificar a porta em que o serviço escuta.
  • Use um map orderStatus no nível do módulo para manter o status dos pedidos, em que o valor é "pending", "in progress" ou "completed" associado à string de ID do pedido gerada aleatoriamente.
    • chave - string de ID do pedido gerada aleatoriamente
    • valor - status do pedido ("pending", "in progress" ou "completed")
  • Atualize o map orderStatus com o valor "pending" para cada novo pedido.

Exemplo 1

Recuperando 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

Tentando fazer o pedido 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}

Observação: "order_id" deve/será uma string única gerada aleatoriamente.

Exemplo 3

Tentando fazer o pedido 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 O link abre em uma nova janela ou aba
Ballerina Exercism

Tudo pronto para começar O Bolo é uma Mentira?

Crie sua conta no Exercism para aprender e dominar Ballerina com 60 exercícios e mentoria humana de verdade, tudo de graça.