Track
/
Ballerina
Ballerina
/
Esercizi
/
La torta è una bugia
La torta è una bugia

La torta è una bugia

Medio

Istruzioni

Descrizione del problema

CakeStation, una famosa pasticceria che sforna torte di ogni tipo, ti ha chiesto di creare per loro un sistema di gestione degli ordini online.

I dettagli degli articoli del menu sono i seguenti.

Articolo Prezzo
Butter Cake 15
Chocolate Cake 20
Tres Leches 25

Deve essere possibile fare quanto segue.

  • Recuperare il menu.
  • Effettuare un ordine.
  • Recuperare lo stato di un ordine (uno tra pending, in progress o completed).
  • Aggiornare un ordine. Consentito solo se lo stato è ancora pending.
  • Eliminare un ordine. Consentito solo se lo stato è ancora pending.

Vincoli

  1. Recuperare il menu

    • Metodo: GET
    • Percorso: /menu
    • Risposta
      • 200 OK
      • content-type: application/json
      • un oggetto JSON con i nomi degli articoli come chiavi e i prezzi come valori (interi)
        {
           "Butter Cake": 15,
           "Chocolate Cake": 20,
           "Tres Leches": 25
        }
        
  2. Effettuare un ordine

    • Metodo: POST

    • Percorso: /order

    • Richiesta

      • il payload della richiesta sarà un oggetto JSON con i seguenti campi
        • username: lo username dell'utente (string)
        • order_items: un array di oggetti JSON che rappresentano gli articoli dell'ordine. Ogni oggetto JSON conterrà esattamente due campi: un campo item di tipo stringa che indica il nome dell'articolo e un campo quantity di tipo intero che indica la quantità ordinata per quel particolare articolo.
        {
            "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"
            ]
        }
        
    • Risposta

      • 400 Bad Request se
        • il payload non corrisponde al formato previsto, oppure
        • lo username è vuoto, oppure
        • l'array order_items è vuoto, oppure
        • l'array order_items contiene più di un oggetto JSON per un particolare tipo di torta, oppure
        • un elemento dell'array order_items ha un campo item con un tipo di torta che non è nel menu, oppure
        • un elemento dell'array order_items ha un campo quantity con un valore minore di 1
      • 201 Created se l'ordine viene effettuato correttamente
        • content-type: application/json
        • un oggetto JSON con due campi
          • un order_id contenente la stringa dell'ID dell'ordine generata casualmente. Deve essere la rappresentazione sotto forma di stringa di un valore numerico valido.
          • un campo total contenente il valore totale (intero) dell'ordine (cioè la somma di prezzo x quantità per ogni tipo di torta)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          
  3. Recuperare lo stato di un ordine

    • Metodo: GET
    • Percorso: /order/{orderId}
    • Risposta
      • 404 Not Found se non esiste un ordine con l'orderId specificato
      • 200 OK
        • content-type: application/json

        • un oggetto JSON con due campi di tipo stringa, order_id e status, che rappresentano rispettivamente l'ID dell'ordine e lo stato (uno tra pending, in progress o completed)

          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "status": {
                      "type": "string"
                  }
              },
              "required": [
                  "order_id",
                  "status"
              ]
          }
          
  4. Aggiornare un ordine. Consentito solo se lo stato è ancora pending.

    • Metodo: PUT

    • Percorso: /order/{orderId}

    • Richiesta

      • il payload della richiesta sarà un oggetto JSON con un unico campo order_items.

        • order_items: un array di oggetti JSON che rappresentano gli articoli dell'ordine. Ogni oggetto JSON conterrà esattamente due campi: un campo item di tipo stringa che indica il nome dell'articolo e un campo quantity di tipo intero che indica la quantità ordinata per quel particolare articolo.
        {
            "type": "object",
            "properties": {
                "order_items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "item": {
                                "type": "string"
                            },
                            "quantity": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "item",
                            "quantity"
                        ]
                    }
                }
            },
            "required": [
                "order_items"
            ]
        }
        
    • Risposta

      • 404 Not Found se non esiste un ordine con l'orderId specificato
      • 403 Forbidden se lo stato dell'ordine non è pending (cioè in progress o completed)
      • 400 Bad Request se l'array order_items non soddisfa gli stessi requisiti previsti per effettuare l'ordine (2)
      • 200 OK se l'aggiornamento va a buon fine
        • content-type: application/json

        • un oggetto JSON con due campi

          • un order_id contenente la stessa stringa dell'ID dell'ordine originale
          • un campo total contenente il valore totale dell'ordine (cioè la somma di prezzo x quantità per ogni tipo di torta)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          

      Nota: se un tentativo di aggiornamento fallisce, non deve essere apportata alcuna modifica all'ordine esistente.

  5. Eliminare un ordine. Consentito solo se lo stato è ancora pending.

    • Metodo: DELETE
    • Percorso: /order/{orderId}
    • Risposta
      • 404 Not Found se non esiste un ordine con l'orderId specificato
      • 403 Forbidden se lo stato dell'ordine non è pending (cioè in progress o completed)
      • 200 OK se l'eliminazione va a buon fine
  6. L'ID dell'ordine generato deve essere univoco, deve essere una stringa e deve essere la rappresentazione sotto forma di stringa di un numero valido (ad esempio "1", "1234").

Definizione

  • Usa una variabile configurable port con il valore predefinito 8080 per specificare la porta su cui il servizio resta in ascolto.
  • Usa una mappa orderStatus a livello di modulo per mantenere lo stato degli ordini, in cui il valore è "pending", "in progress" o "completed" associato alla stringa dell'ID dell'ordine generata casualmente.
    • chiave: la stringa dell'ID dell'ordine generata casualmente
    • valore: lo stato dell'ordine ("pending", "in progress" o "completed")
  • Aggiorna la mappa orderStatus con il valore "pending" per ogni nuovo ordine.

Esempio 1

Recupero del 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}

Esempio 2

Tentativo di effettuare l'ordine con un payload valido.

$ 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" sarà, o dovrebbe essere, una stringa univoca generata casualmente.

Esempio 3

Tentativo di effettuare l'ordine con un payload che non corrisponde al formato previsto.

$ 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

Suggerimenti

Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Ballerina Exercism

Vuoi iniziare La torta è una bugia?

Iscriviti a Exercism per imparare e padroneggiare Ballerina con 60 esercizi e il mentoring di persone reali, tutto gratis.