トラック
/
Ballerina
Ballerina
/
演習
/
ケーキは嘘
ケーキは嘘

ケーキは嘘

中級

説明

問題

いろいろなケーキを焼く人気のベーカリー、CakeStationから、オンライン注文管理システムの構築を頼まれました。

メニューに載っている商品の詳細は次のとおりです。

商品 価格
Butter Cake 15
Chocolate Cake 20
Tres Leches 25

次のことができるようにします。

  • メニューを取得する。
  • 注文する。
  • 注文のステータス(pending、in progress、completedのいずれか)を取得する。
  • 注文を更新する。ステータスがまだpendingのときだけ可能です。
  • 注文を削除する。ステータスがまだpendingのときだけ可能です。

制約

  1. メニューの取得

    • メソッド - GET
    • パス - /menu
    • レスポンス
      • 200 OK
      • content-type - application/json
      • 商品名をキー、価格を値(整数)とするJSONオブジェクト
        {
           "Butter Cake": 15,
           "Chocolate Cake": 20,
           "Tres Leches": 25
        }
        
  2. 注文

    • メソッド - POST

    • パス - /order

    • リクエスト

      • リクエストのペイロードは、次のフィールドを持つJSONオブジェクトです
        • username - ユーザー名(string)
        • order_items - 注文商品を表すJSONオブジェクトの配列。各JSONオブジェクトはちょうど2つのフィールドを持ちます。商品名を表す文字列のitemフィールドと、その商品の注文数量を表す整数のquantityフィールドです。
        {
            "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"
            ]
        }
        
    • レスポンス

      • 次のいずれかに該当する場合は400 Bad Request
        • ペイロードが期待される形式と一致しない、または
        • usernameが空である、または
        • order_items配列が空である、または
        • order_items配列に、同じ種類のケーキについて複数のJSONオブジェクトが含まれている、または
        • order_items配列の要素が持つitemフィールドのケーキの種類がメニューにない、または
        • order_items配列の要素が持つquantityフィールドの値が1未満である
      • 注文が正常に完了した場合は201 Created
        • content-type - application/json
        • 2つのフィールドを持つJSONオブジェクト
          • ランダムに生成された注文ID文字列を格納するorder_id。これは有効な数値の文字列表現である必要があります。
          • 注文の合計金額(整数)を格納するtotalフィールド(つまり、ケーキの種類ごとの価格×数量の合計)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          
  3. 注文ステータスの取得

    • メソッド - GET
    • パス - /order/{orderId}
    • レスポンス
      • 指定されたorderIdの注文が存在しない場合は404 Not Found
      • 200 OK
        • content-type - application/json

        • 注文IDとステータス(pending、in progress、completedのいずれか)をそれぞれ表す、2つの文字列フィールドorder_idとstatusを持つJSONオブジェクト

          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "status": {
                      "type": "string"
                  }
              },
              "required": [
                  "order_id",
                  "status"
              ]
          }
          
  4. 注文の更新。ステータスがまだpendingのときだけ可能です。

    • メソッド - PUT

    • パス - /order/{orderId}

    • リクエスト

      • リクエストのペイロードは、単一のフィールドorder_itemsを持つJSONオブジェクトです。

        • order_items - 注文商品を表すJSONオブジェクトの配列。各JSONオブジェクトはちょうど2つのフィールドを持ちます。商品名を表す文字列のitemフィールドと、その商品の注文数量を表す整数のquantityフィールドです。
        {
            "type": "object",
            "properties": {
                "order_items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "item": {
                                "type": "string"
                            },
                            "quantity": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "item",
                            "quantity"
                        ]
                    }
                }
            },
            "required": [
                "order_items"
            ]
        }
        
    • レスポンス

      • 指定されたorderIdの注文が存在しない場合は404 Not Found
      • 注文のステータスがpendingでない場合(つまりin progressまたはcompleted)は403 Forbidden
      • order_items配列が、注文時(2)と同じ要件を満たしていない場合は400 Bad Request
      • 更新が成功した場合は200 OK
        • content-type - application/json

        • 2つのフィールドを持つJSONオブジェクト

          • 元の注文と同じ注文ID文字列を格納するorder_id
          • 注文の合計金額を格納するtotalフィールド(つまり、ケーキの種類ごとの価格×数量の合計)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          

      注意: 更新に失敗した場合、既存の注文には何も変更を加えないでください。

  5. 注文の削除。ステータスがまだpendingのときだけ可能です。

    • メソッド - DELETE
    • パス - /order/{orderId}
    • レスポンス
      • 指定されたorderIdの注文が存在しない場合は404 Not Found
      • 注文のステータスがpendingでない場合(つまりin progressまたはcompleted)は403 Forbidden
      • 削除が成功した場合は200 OK
  6. 生成される注文IDは一意で、文字列であり、かつ有効な数値の文字列表現である必要があります(例:"1"、"1234")。

定義

  • サービスが待ち受けるポートを指定するには、デフォルト値8080のconfigurable変数portを使います。
  • 注文のステータスを保持するには、モジュールレベルのorderStatusマップを使います。このマップでは、ランダムに生成された注文ID文字列に対して、値が"pending"、"in progress"、"completed"のいずれかになります。
    • キー - ランダムに生成された注文ID文字列
    • 値 - 注文のステータス("pending"、"in progress"、"completed"のいずれか)
  • 新しい注文ごとに、orderStatusマップを値"pending"で更新します。

例1

メニューを取得します。

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

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

例2

有効なペイロードで注文しようとする場合。

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

注意: "order_id"は、ランダムに生成される一意な文字列である必要があります(そしてそのようになります)。

例3

期待される形式と一致しないペイロードで注文しようとする場合。

$ 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

ヒント

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Ballerina Exercism

ケーキは嘘を始める準備はできましたか?

Exercismに登録すれば、60個の演習、そして本物の人間によるメンタリングとともに、Ballerinaを学んでマスターできます。すべて無料です。