Треки
/
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-обʼєкт міститиме рівно два поля: рядкове поле 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
        • JSON-обʼєкт із двома полями
          • order_id, що містить випадково згенерований рядок ідентифікатора замовлення. Це має бути рядкове представлення коректного числового значення.
          • поле total, що містить загальну вартість замовлення (ціле число) (тобто суму ціна x кількість для кожного виду торта)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          
  3. Отримання статусу замовлення

    • Метод - GET
    • Шлях - /order/{orderId}
    • Відповідь
      • 404 Not Found, якщо немає замовлення із зазначеним orderId
      • 200 OK
        • content-type - application/json

        • JSON-обʼєкт із двома рядковими полями order_id і status, що представляють відповідно ідентифікатор замовлення та статус (одне з pending, in progress або completed)

          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "status": {
                      "type": "string"
                  }
              },
              "required": [
                  "order_id",
                  "status"
              ]
          }
          
  4. Оновлення замовлення. Дозволено лише якщо статус усе ще pending.

    • Метод - PUT

    • Шлях - /order/{orderId}

    • Запит

      • корисне навантаження запиту буде JSON-обʼєктом з єдиним полем order_items.

        • order_items - масив JSON-обʼєктів, що представляють позиції замовлення. Кожен JSON-обʼєкт міститиме рівно два поля: рядкове поле 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"
            ]
        }
        
    • Відповідь

      • 404 Not Found, якщо немає замовлення із зазначеним orderId
      • 403 Forbidden, якщо статус замовлення не pending (тобто in progress або completed)
      • 400 Bad Request, якщо масив order_items не відповідає тим самим вимогам, що й для оформлення замовлення (2)
      • 200 OK, якщо оновлення успішне
        • content-type - application/json

        • JSON-обʼєкт із двома полями

          • order_id, що містить той самий рядок ідентифікатора замовлення, що й початкове замовлення
          • поле total, що містить загальну вартість замовлення (тобто суму ціна x кількість для кожного виду торта)
          {
              "type": "object",
              "properties": {
                  "order_id": {
                      "type": "string"
                  },
                  "total": {
                      "type": "integer"
                  }
              },
              "required": [
                  "order_id",
                  "total"
              ]
          }
          

      Примітка: якщо спроба оновлення не вдалася, не слід вносити жодних змін до наявного замовлення.

  5. Видалення замовлення. Дозволено лише якщо статус усе ще pending.

    • Метод - DELETE
    • Шлях - /order/{orderId}
    • Відповідь
      • 404 Not Found, якщо немає замовлення із зазначеним orderId
      • 403 Forbidden, якщо статус замовлення не pending (тобто in progress або completed)
      • 200 OK, якщо видалення успішне
  6. Згенерований ідентифікатор замовлення має бути унікальним, має бути рядком і має бути рядковим представленням коректного числа (наприклад, "1", "1234").

Визначення

  • Використовуйте configurable-змінну port з типовим значенням 8080, щоб указати порт, який слухає сервіс.
  • Використовуйте мапу orderStatus рівня модуля, щоб зберігати статуси замовлень, у якій значенням для випадково згенерованого рядка ідентифікатора замовлення є "pending", "in progress" або "completed".
    • ключ - випадково згенерований рядок ідентифікатора замовлення
    • значення - статус замовлення ("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, щоб вивчати й опановувати Ballerina, а також 60 вправ та справжнє наставництво від людей, і все це безкоштовно.