Tracks
/
Ballerina
Ballerina
/
Übungen
/
Der Kuchen ist eine Lüge
Der Kuchen ist eine Lüge

Der Kuchen ist eine Lüge

Mittel

Anleitung

Problemstellung

CakeStation, eine beliebte Bäckerei, die verschiedene Kuchen backt, hat dich gebeten, ein Online-Bestellsystem für sie einzurichten.

Die Einträge auf der Speisekarte sehen wie folgt aus.

Artikel Preis
Butter Cake 15
Chocolate Cake 20
Tres Leches 25

Folgendes sollte möglich sein.

  • Die Speisekarte abrufen.
  • Eine Bestellung aufgeben.
  • Den Status einer Bestellung abrufen (entweder pending, in progress oder completed).
  • Eine Bestellung aktualisieren. Nur erlaubt, wenn der Status noch pending ist.
  • Eine Bestellung löschen. Nur erlaubt, wenn der Status noch pending ist.

Vorgaben

  1. Die Speisekarte abrufen

    • Methode - GET
    • Pfad - /menu
    • Antwort
      • 200 OK
      • content-type - application/json
      • ein JSON-Objekt mit den Artikelnamen als Schlüssel und den Preisen als Werte (Ganzzahl)
        {
           "Butter Cake": 15,
           "Chocolate Cake": 20,
           "Tres Leches": 25
        }
        
  2. Eine Bestellung aufgeben

    • Methode - POST

    • Pfad - /order

    • Anfrage

      • die Anfrage-Payload ist ein JSON-Objekt mit den folgenden Feldern
        • username - Benutzername des Nutzers (string)
        • order_items - ein Array aus JSON-Objekten, die die Bestellpositionen darstellen. Jedes JSON-Objekt enthält genau zwei Felder: ein Feld item (String), das den Namen des Artikels angibt, und ein Feld quantity (Ganzzahl), das die Bestellmenge für den jeweiligen Artikel angibt.
        {
            "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"
            ]
        }
        
    • Antwort

      • 400 Bad Request, wenn
        • die Payload nicht dem erwarteten Format entspricht oder
        • der username leer ist oder
        • das Array order_items leer ist oder
        • das Array order_items mehr als ein JSON-Objekt für eine bestimmte Kuchenart enthält oder
        • ein Element des Arrays order_items ein item-Feld mit einer Kuchenart enthält, die nicht auf der Speisekarte steht oder
        • ein Element des Arrays order_items ein quantity-Feld mit einem Wert kleiner als 1 enthält
      • 201 Created, wenn die Bestellung erfolgreich aufgegeben wurde
        • content-type - application/json
        • ein JSON-Objekt mit zwei Feldern
          • ein order_id mit der zufällig generierten Bestell-ID als String. Dies sollte die String-Darstellung eines gültigen numerischen Werts sein.
          • ein Feld total mit dem Gesamtwert (Ganzzahl) der Bestellung (d. h. die Summe von Preis x Menge für jede Kuchenart)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          
  3. Den Status einer Bestellung abrufen

    • Methode - GET
    • Pfad - /order/{orderId}
    • Antwort
      • 404 Not Found, wenn es keine Bestellung mit der angegebenen orderId gibt
      • 200 OK
        • content-type - application/json

        • ein JSON-Objekt mit zwei String-Feldern order_id und status, die die Bestell-ID bzw. den Status darstellen (entweder pending, in progress oder completed)

          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "status": {
                      "type": "string"
                  }
              },
              "required": [
                  "order_id",
                  "status"
              ]
          }
          
  4. Eine Bestellung aktualisieren. Nur erlaubt, wenn der Status noch pending ist.

    • Methode - PUT

    • Pfad - /order/{orderId}

    • Anfrage

      • die Anfrage-Payload ist ein JSON-Objekt mit einem einzigen Feld order_items.

        • order_items - ein Array aus JSON-Objekten, die die Bestellpositionen darstellen. Jedes JSON-Objekt enthält genau zwei Felder: ein Feld item (String), das den Namen des Artikels angibt, und ein Feld quantity (Ganzzahl), das die Bestellmenge für den jeweiligen Artikel angibt.
        {
            "type": "object",
            "properties": {
                "order_items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "item": {
                                "type": "string"
                            },
                            "quantity": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "item",
                            "quantity"
                        ]
                    }
                }
            },
            "required": [
                "order_items"
            ]
        }
        
    • Antwort

      • 404 Not Found, wenn es keine Bestellung mit der angegebenen orderId gibt
      • 403 Forbidden, wenn der Bestellstatus nicht pending ist (d. h. in progress oder completed)
      • 400 Bad Request, wenn das Array order_items nicht die gleichen Anforderungen erfüllt wie beim Aufgeben einer Bestellung (2)
      • 200 OK, wenn die Aktualisierung erfolgreich ist
        • content-type - application/json

        • ein JSON-Objekt mit zwei Feldern

          • ein order_id mit derselben Bestell-ID wie die ursprüngliche Bestellung
          • ein Feld total mit dem Gesamtwert der Bestellung (d. h. die Summe von Preis x Menge für jede Kuchenart)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          

      Hinweis: Wenn ein Aktualisierungsversuch fehlschlägt, dürfen keine Änderungen an der bestehenden Bestellung vorgenommen werden.

  5. Eine Bestellung löschen. Nur erlaubt, wenn der Status noch pending ist.

    • Methode - DELETE
    • Pfad - /order/{orderId}
    • Antwort
      • 404 Not Found, wenn es keine Bestellung mit der angegebenen orderId gibt
      • 403 Forbidden, wenn der Bestellstatus nicht pending ist (d. h. in progress oder completed)
      • 200 OK, wenn das Löschen erfolgreich ist
  6. Die generierte Bestell-ID sollte eindeutig sein, ein String sein und die String-Darstellung einer gültigen Zahl sein (z. B. "1", "1234").

Definition

  • Verwende eine configurable-Variable port mit dem Standardwert 8080, um den Port anzugeben, auf dem der Dienst lauscht.
  • Verwende eine orderStatus-Map auf Modulebene, um den Status der Bestellungen zu verwalten, wobei der Wert entweder "pending", "in progress" oder "completed" ist, zugeordnet zur zufällig generierten Bestell-ID als String.
    • Schlüssel - zufällig generierte Bestell-ID als String
    • Wert - Status der Bestellung ("pending", "in progress" oder "completed")
  • Aktualisiere die orderStatus-Map mit dem Wert "pending" für jede neue Bestellung.

Beispiel 1

Die Speisekarte abrufen.

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

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

Beispiel 2

Versuch, die Bestellung mit einer gültigen Payload aufzugeben.

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

Hinweis: „order_id“ sollte/wird ein zufällig generierter eindeutiger String sein.

Beispiel 3

Versuch, die Bestellung mit einer Payload aufzugeben, die nicht dem erwarteten Format entspricht.

$ 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

Hinweise

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Ballerina Exercism

Bereit, mit Der Kuchen ist eine Lüge zu starten?

Melde dich bei Exercism an, um Ballerina mit 60 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.