트랙
/
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 객체
          • 무작위로 생성된 주문 ID 문자열을 담은 order_id예요. 이 값은 유효한 숫자의 문자열 표현이어야 해요.
          • 주문의 총액(정수)을 담은 total 필드예요. (즉, 각 케이크 종류별 가격 x 수량의 합)
          {
              "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 중 하나)를 각각 나타내는 두 개의 문자열 필드 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 객체는 정확히 두 개의 필드를 가져요. 품목의 이름을 나타내는 문자열 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

        • 두 개의 필드를 가진 JSON 객체

          • 원래 주문과 같은 주문 ID 문자열을 담은 order_id
          • 주문의 총액을 담은 total 필드 (즉, 각 케이크 종류별 가격 x 수량의 합)
          {
              "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에 가입하고 Ballerina 트랙을 연습 문제 60개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.