From c1d27b7b59d8638056653276cb1b11e0c9841d66 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Sun, 16 Feb 2025 15:18:27 +0900 Subject: [PATCH 01/71] =?UTF-8?q?[step0]=200=EB=8B=A8=EA=B3=84=20-=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EC=BD=94=EB=93=9C=20=EC=A4=80=EB=B9=84=20?= =?UTF-8?q?(#329)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(kitchen pos) : 이전 단계의 README.md 가져오기 * feat(kitchen pos) : 이전 단계의 프로덕션 코드 및 테스트 코드 가져오기 * fix(kitchen pos) : DeliveryOrder entity 생성으로 ddl.sql 안 맞아 주석 처리 --- README.md | 446 ++++++++++++++---- build.gradle.kts | 4 +- .../application}/PurgomalumClient.java | 2 +- .../external}/DefaultPurgomalumClient.java | 6 +- .../application/MenuGroupService.java | 11 +- .../application/MenuService.java | 23 +- .../domain => menu/domain/model}/Menu.java | 3 +- .../domain/model}/MenuGroup.java | 3 +- .../domain/model}/MenuProduct.java | 5 +- .../repository}/MenuGroupRepository.java | 3 +- .../domain/repository}/MenuRepository.java | 3 +- .../persistence}/JpaMenuGroupRepository.java | 7 +- .../infra/persistence}/JpaMenuRepository.java | 9 +- .../ui/MenuGroupRestController.java | 11 +- .../ui/MenuRestController.java | 13 +- .../common}/application/OrderService.java | 27 +- .../persistence}/JpaOrderRepository.java | 7 +- .../persistence}/JpaOrderTableRepository.java | 7 +- .../domain => order/common/model}/Order.java | 4 +- .../common/model}/OrderLineItem.java | 5 +- .../common/model}/OrderStatus.java | 2 +- .../common/model}/OrderType.java | 2 +- .../common/repository}/OrderRepository.java | 5 +- .../common}/ui/OrderRestController.java | 13 +- .../common}/ui/OrderTableRestController.java | 13 +- .../domain/model/DeliveryOrder.java | 50 ++ .../domain/model/DeliveryOrderFlow.java | 35 ++ .../domain/model/DeliveryOrderStatus.java | 5 + .../deliveryorder/domain/port/RiderPort.java | 10 + .../domain/repository/DeliveryRepository.java | 4 + .../service/DeliveryOrderDomainService.java | 23 + .../infra/adaptor/RiderAdaptor.java | 16 + .../external}/DefaultKitchenridersClient.java | 5 +- .../infra/external}/KitchenridersClient.java | 2 +- .../JpaDeliveryOrderRepository.java | 6 + .../service/DeliveryOrderService.java | 4 + .../ui/DeliveryOrderController.java | 4 + .../application/OrderTableService.java | 15 +- .../eatinorder/domain/model/EatInOrder.java | 4 + .../domain/model/EatInOrderFlow.java | 4 + .../domain/model/EatInOrderStatus.java | 5 + .../eatinorder/domain/model}/OrderTable.java | 3 +- .../repository/EatInOrderRepository.java | 4 + .../repository}/OrderTableRepository.java | 3 +- .../persistence/JpaEatInOrderRepository.java | 4 + .../persistence/JpaOrderTableRepository.java | 4 + .../eatinorder/service/EatInOrderService.java | 4 + .../eatinorder/ui/EatInOrderController.java | 4 + .../domain/model/TakeOutOrder.java | 4 + .../domain/model/TakeOutOrderFlow.java | 4 + .../domain/model/TakeOutOrderStatus.java | 5 + .../repository/TakeOutOrderRepository.java | 4 + .../JpaTakeOutOrderRepository.java | 4 + .../service/TakeOutOrderService.java | 4 + .../ui/TakeOutOrderController.java | 4 + .../application/ProductService.java | 19 +- .../domain/model}/Product.java | 3 +- .../domain/repository}/ProductRepository.java | 3 +- .../persistence}/JpaProductRepository.java | 7 +- .../ui/ProductRestController.java | 13 +- .../java/kitchenpos/takeoutorders/empty.txt | 0 src/main/resources/application.properties | 2 +- .../V1__Initialize_project_tables.sql | 184 ++++---- .../db/migration/V2__Insert_default_data.sql | 160 +++---- src/test/java/kitchenpos/Fixtures.java | 19 +- .../infra/external}/FakePurgomalumClient.java | 5 +- .../application/MenuGroupServiceTest.java | 20 +- .../application/MenuServiceTest.java | 53 ++- .../InMemoryMenuGroupRepository.java | 7 +- .../persistence}/InMemoryMenuRepository.java | 7 +- .../common}/application/OrderServiceTest.java | 58 +-- .../persistence}/InMemoryOrderRepository.java | 11 +- .../external}/FakeKitchenridersClient.java | 4 +- .../application/OrderTableServiceTest.java | 29 +- .../InMemoryOrderTableRepository.java | 7 +- .../application/ProductServiceTest.java | 37 +- .../InMemoryProductRepository.java | 7 +- 77 files changed, 1000 insertions(+), 536 deletions(-) rename src/main/java/kitchenpos/{products/infra => common/application}/PurgomalumClient.java (68%) rename src/main/java/kitchenpos/{products/infra => common/infra/external}/DefaultPurgomalumClient.java (90%) rename src/main/java/kitchenpos/{menus => menu}/application/MenuGroupService.java (87%) rename src/main/java/kitchenpos/{menus => menu}/application/MenuService.java (91%) rename src/main/java/kitchenpos/{menus/domain => menu/domain/model}/Menu.java (98%) rename src/main/java/kitchenpos/{menus/domain => menu/domain/model}/MenuGroup.java (94%) rename src/main/java/kitchenpos/{menus/domain => menu/domain/model}/MenuProduct.java (94%) rename src/main/java/kitchenpos/{menus/domain => menu/domain/repository}/MenuGroupRepository.java (72%) rename src/main/java/kitchenpos/{menus/domain => menu/domain/repository}/MenuRepository.java (78%) rename src/main/java/kitchenpos/{menus/domain => menu/infra/persistence}/JpaMenuGroupRepository.java (55%) rename src/main/java/kitchenpos/{menus/domain => menu/infra/persistence}/JpaMenuRepository.java (77%) rename src/main/java/kitchenpos/{menus => menu}/ui/MenuGroupRestController.java (89%) rename src/main/java/kitchenpos/{menus => menu}/ui/MenuRestController.java (93%) rename src/main/java/kitchenpos/{eatinorders => order/common}/application/OrderService.java (92%) rename src/main/java/kitchenpos/{eatinorders/domain => order/common/infra/persistence}/JpaOrderRepository.java (53%) rename src/main/java/kitchenpos/{eatinorders/domain => order/common/infra/persistence}/JpaOrderTableRepository.java (51%) rename src/main/java/kitchenpos/{eatinorders/domain => order/common/model}/Order.java (96%) rename src/main/java/kitchenpos/{eatinorders/domain => order/common/model}/OrderLineItem.java (95%) rename src/main/java/kitchenpos/{eatinorders/domain => order/common/model}/OrderStatus.java (70%) rename src/main/java/kitchenpos/{eatinorders/domain => order/common/model}/OrderType.java (59%) rename src/main/java/kitchenpos/{eatinorders/domain => order/common/repository}/OrderRepository.java (60%) rename src/main/java/kitchenpos/{eatinorders => order/common}/ui/OrderRestController.java (94%) rename src/main/java/kitchenpos/{eatinorders => order/common}/ui/OrderTableRestController.java (92%) create mode 100644 src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrder.java create mode 100644 src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderFlow.java create mode 100644 src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderStatus.java create mode 100644 src/main/java/kitchenpos/order/deliveryorder/domain/port/RiderPort.java create mode 100644 src/main/java/kitchenpos/order/deliveryorder/domain/repository/DeliveryRepository.java create mode 100644 src/main/java/kitchenpos/order/deliveryorder/domain/service/DeliveryOrderDomainService.java create mode 100644 src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java rename src/main/java/kitchenpos/{deliveryorders/infra => order/deliveryorder/infra/external}/DefaultKitchenridersClient.java (85%) rename src/main/java/kitchenpos/{deliveryorders/infra => order/deliveryorder/infra/external}/KitchenridersClient.java (76%) create mode 100644 src/main/java/kitchenpos/order/deliveryorder/infra/persistence/JpaDeliveryOrderRepository.java create mode 100644 src/main/java/kitchenpos/order/deliveryorder/service/DeliveryOrderService.java create mode 100644 src/main/java/kitchenpos/order/deliveryorder/ui/DeliveryOrderController.java rename src/main/java/kitchenpos/{eatinorders => order/eatinorder}/application/OrderTableService.java (89%) create mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderStatus.java rename src/main/java/kitchenpos/{eatinorders/domain => order/eatinorder/domain/model}/OrderTable.java (95%) create mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java rename src/main/java/kitchenpos/{eatinorders/domain => order/eatinorder/domain/repository}/OrderTableRepository.java (67%) create mode 100644 src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaOrderTableRepository.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderController.java create mode 100644 src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrder.java create mode 100644 src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrderFlow.java create mode 100644 src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrderStatus.java create mode 100644 src/main/java/kitchenpos/order/takeoutorder/domain/repository/TakeOutOrderRepository.java create mode 100644 src/main/java/kitchenpos/order/takeoutorder/infra/persistence/JpaTakeOutOrderRepository.java create mode 100644 src/main/java/kitchenpos/order/takeoutorder/service/TakeOutOrderService.java create mode 100644 src/main/java/kitchenpos/order/takeoutorder/ui/TakeOutOrderController.java rename src/main/java/kitchenpos/{products => product}/application/ProductService.java (88%) rename src/main/java/kitchenpos/{products/domain => product/domain/model}/Product.java (95%) rename src/main/java/kitchenpos/{products/domain => product/domain/repository}/ProductRepository.java (74%) rename src/main/java/kitchenpos/{products/domain => product/infra/persistence}/JpaProductRepository.java (54%) rename src/main/java/kitchenpos/{products => product}/ui/ProductRestController.java (91%) delete mode 100644 src/main/java/kitchenpos/takeoutorders/empty.txt rename src/test/java/kitchenpos/{products/application => common/infra/external}/FakePurgomalumClient.java (81%) rename src/test/java/kitchenpos/{menus => menu}/application/MenuGroupServiceTest.java (90%) rename src/test/java/kitchenpos/{menus => menu}/application/MenuServiceTest.java (93%) rename src/test/java/kitchenpos/{menus/application => menu/infra/persistence}/InMemoryMenuGroupRepository.java (82%) rename src/test/java/kitchenpos/{menus/application => menu/infra/persistence}/InMemoryMenuRepository.java (88%) rename src/test/java/kitchenpos/{eatinorders => order/common}/application/OrderServiceTest.java (95%) rename src/test/java/kitchenpos/{eatinorders/application => order/common/infra/persistence}/InMemoryOrderRepository.java (77%) rename src/test/java/kitchenpos/{eatinorders/application => order/deliveryorder/infra/external}/FakeKitchenridersClient.java (86%) rename src/test/java/kitchenpos/{eatinorders => order/eatinorder}/application/OrderTableServiceTest.java (92%) rename src/test/java/kitchenpos/{eatinorders/application => order/eatinorder/infra/persistence}/InMemoryOrderTableRepository.java (78%) rename src/test/java/kitchenpos/{products => product}/application/ProductServiceTest.java (90%) rename src/test/java/kitchenpos/{products/application => product/infra/persistence}/InMemoryProductRepository.java (85%) diff --git a/README.md b/README.md index 4a91e3f71..0facb592e 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,6 @@ docker compose -p kitchenpos up -d - 메뉴의 가격을 변경할 수 있다. - 메뉴의 가격이 올바르지 않으면 변경할 수 없다. - 메뉴의 가격은 0원 이상이어야 한다. -- 메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다. - 메뉴를 노출할 수 있다. - 메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 높을 경우 메뉴를 노출할 수 없다. - 메뉴를 숨길 수 있다. @@ -94,108 +93,363 @@ docker compose -p kitchenpos up -d - 완료되지 않은 매장 주문이 있는 주문 테이블은 빈 테이블로 설정하지 않는다. - 주문 목록을 조회할 수 있다. -## 용어 사전 +--- 이전 단계에서 만든 요구사항 --- -### 상품 +### 1. 메뉴(menu) 요구 사항 -| 한글명 | 영문명 | 설명 | -| --- | --- | --- | -| 상품 | product | 메뉴를 관리하는 기준이 되는 데이터 | -| 이름 | displayed name | 음식을 상상하게 만드는 중요한 요소 | + - [] : 메뉴는 등록할 수 있다. + - [] : 메뉴를 등록할 때, 메뉴 그룹에게 메뉴 검증을 요청한다. + - [] : 메뉴는 하나 이상의 메뉴 그룹으로 등록할 수 있다. + - [] : 메뉴의 가격을 변경할 수 있다. + - [] : 전체 메뉴를 볼 수 있다. + - [] : 메뉴의 가격은 0원 이상이어야 한다. + - [] : 메뉴에는 이름이 존재한다. + - [] : 판매 가격은 마진이 남아야 한다. + - [] : 메뉴는 게시 여부를 정할 수 있다. + - [] : 메뉴는 하나의 카테고리에 속한다. + - [] : 메뉴 이름에는 비속어를 넣을 수 없다. -### 메뉴 +### 1-1. 메뉴 상품(menu-product) 요구 사항 + + - [] : 메뉴 상품은 메뉴 검증을 할 수 있다. + - [] : 메뉴 상품은 메뉴와 수량으로 이루어져 있다. + - [] : 메뉴 상품의 메뉴 수량은 0보다 커야 한다. + +### 2. 카테고리(menu-group) 요구 사항 + + - [] : 카테고리는 이름을 가지고 있다. + - [] : 전체 카테고리를 볼 수 있다. + - [] : 카테고리를 등록할 수 있다. + +### 3. 상품(product) 요구 사항 + + - [] : 상품을 등록할 수 있다. + - [] : 상품의 가격을 변경할 수 있다. + - [] : 전체 상품을 볼 수 있다. + - [] : 상품에는 가격와 이름이 있다. + - [] : 상품의 가격은 0원 이상이어야 한다. + - [] : 상품 이름에는 비속어를 넣을 수 없다. + - [] : 상품 가격이 변하면, 메뉴에 마진이 남는지 물어본다. + - [] : 마진이 남지 않는다면, 메뉴 게시를 중단한다. + +### 4. 주문(order) 요구 사항 + + - [] : 주문은 하나 이상의 주문 내역으로 한다. + - [] : 주문이 정상적인지 확인하기 위해 주문 내역에게 주문 검증을 요청한다. + - [] : 주문을 할 때는 게시된 메뉴만 주문할 수 있다. + - [] : 모든 주문을 볼 수 있다. + - [] : 주문은 3가지 종류가 존재한다. (배달, 포장, 매장 식사) + - [] : 주문에는 6가지 주문 상태가 존재한다. (주문 대기 중, 주문 접수 완료, 서빙 완료, 배달 중, 배달 완료, 주문 완료) + +### 4-1. 배달 주문 요구 사항 + + - [] : 배달은 주소로 배달을 요청한다. + - [] : 배달 시 주소는 꼭 필요하다. + + - 배달 주문의 전체적인 순서 + - [] : 1. 주문 대기 중 (waiting) => 주문 대기 중일 때만 주문을 접수할 수 있다. + - [] : 2. 주문 접수 완료 (accepted) => 배달부에게 받아야 할 돈, 주소를 알려주고 배달해줄 것을 요청한다. + - [] : 3. 배달 중 (delivering) + - [] : 4. 배달 완료 (delivered) + - [] : 5. 주문 완료 (completed) + +### 4-2. 포장 주문 요구 사항 + + - [] : 포장은 아무때나 가능하다. + + - 포장 주문의 전체적인 순서 + - [] : 1. 주문 대기 중 (waiting) => 주문 대기 중일 때만 주문을 접수할 수 있다. + - [] : 2. 주문 접수 완료 (accepted) + - [] : 3. 서빙 완료 (served) + - [] : 4. 주문 완료 (completed) + +### 4-3. 매장 식사 주문 요구 사항 -| 한글명 | 영문명 | 설명 | -| --- | --- | --- | -| 금액 | amount | 가격 * 수량 | -| 메뉴 | menu | 메뉴 그룹에 속하는 실제 주문 가능 단위 | -| 메뉴 그룹 | menu group | 각각의 메뉴를 성격에 따라 분류하여 묶어둔 그룹 | -| 메뉴 상품 | menu product | 메뉴에 속하는 수량이 있는 상품 | -| 숨겨진 메뉴 | not displayed menu | 주문할 수 없는 숨겨진 메뉴 | -| 이름 | displayed name | 음식을 상상하게 만드는 중요한 요소 | - -### 매장 주문 - -| 한글명 | 영문명 | 설명 | -| --- | --- | --- | -| 방문한 손님 수 | number of guests | 식기가 필요한 사람 수. 필수 사항은 아니며 주문은 0명으로 등록할 수 있다. | -| 빈 테이블 | empty table | 주문을 등록할 수 없는 주문 테이블 | -| 서빙 | served | 조리가 완료되어 음식이 나갈 수 있는 단계 | -| 완료 | completed | 고객이 모든 식사를 마치고 결제를 완료한 단계 | -| 접수 | accepted | 주문을 받고 음식을 조리하는 단계 | -| 접수 대기 | waiting | 주문이 생성되어 매장으로 전달된 단계 | -| 주문 | order | 매장에서 식사하는 고객 대상. 손님들이 매장에서 먹을 수 있도록 조리된 음식을 가져다준다. | -| 주문 상태 | order status | 주문이 생성되면 매장에서 주문을 접수하고 고객이 음식을 받기까지의 단계를 표시한다. | -| 주문 테이블 | order table | 매장에서 주문이 발생하는 영역 | -| 주문 항목 | order line item | 주문에 속하는 수량이 있는 메뉴 | - -### 배달 주문 - -| 한글명 | 영문명 | 설명 | -| --- | --- | --- | -| 배달 | delivering | 배달원이 매장을 방문하여 배달 음식의 픽업을 완료하고 배달을 시작하는 단계 | -| 배달 대행사 | delivery agency | 준비한 음식을 고객에게 직접 배달하는 서비스 | -| 배달 완료 | delivered | 배달원이 주문한 음식을 고객에게 배달 완료한 단계 | -| 서빙 | served | 조리가 완료되어 음식이 나갈 수 있는 단계 | -| 완료 | completed | 배달 및 결제 완료 단계 | -| 접수 | accepted | 주문을 받고 음식을 조리하는 단계 | -| 접수 대기 | waiting | 주문이 생성되어 매장으로 전달된 단계 | -| 주문 | order | 집이나 직장 등 고객이 선택한 주소로 음식을 배달한다. | -| 주문 상태 | order status | 주문이 생성되면 매장에서 주문을 접수하고 고객이 음식을 받기까지의 단계를 표시한다. | -| 주문 항목 | order line item | 주문에 속하는 수량이 있는 메뉴 | - -### 포장 주문 - -| 한글명 | 영문명 | 설명 | -| --- | --- | --- | -| 서빙 | served | 조리가 완료되어 음식이 나갈 수 있는 단계 | -| 완료 | completed | 고객이 음식을 수령하고 결제를 완료한 단계 | -| 접수 | accepted | 주문을 받고 음식을 조리하는 단계 | -| 접수 대기 | waiting | 주문이 생성되어 매장으로 전달된 단계 | -| 주문 | order | 포장하는 고객 대상. 고객이 매장에서 직접 음식을 수령한다. | -| 주문 상태 | order status | 주문이 생성되면 매장에서 주문을 접수하고 고객이 음식을 받기까지의 단계를 표시한다. | -| 주문 항목 | order line item | 주문에 속하는 수량이 있는 메뉴 | + - [] : 자신이 이용하고 있는(앉아있는) 매장 테이블에서만 매장 식사를 할 수 있다. + - [] : 매장 이용 시 주문한 테이블에 앉아 있어야 한다. + + - 매장 식사 주문의 전체적인 순서 + - [] : 1. 주문 대기 중 (waiting) => 주문 대기 중일 때만 주문을 접수할 수 있다. + - [] : 2. 주문 접수 완료 (accepted) + - [] : 3. 서빙 완료 (served) + - [] : 4. 주문 완료 (completed) => 주문 완료를 하면 테이블에 주문이 남아있는지 확인하고 없으면 테이블을 비운다. + +### 5. 주문 내역(order-line) 요구 사항 + + - [] : 주문 내역은 주문 검증을 할 수 있다. + - [] : 주문 내역에는 메뉴와 수량, 가격으로 이루어져 있다. + +### 6. 매장 테이블(order-table) 요구 사항 + + - [] : 매장 테이블을 만들 수 있다. + - [] : 매장 테이블에는 이름이 존재한다. + - [] : 전체 매장 테이블을 볼 수 있다. + - [] : 빈 테이블만 이용할(앉을) 수 있다. + - [] : 모든 주문이 완료되면, 테이블을 정리할 수 있다. + - [] : 테이블에 손님이 있는 경우에만 앉아 있는 손님의 수가 바뀔 수 있다. + +## 용어 사전 + +### 상품 (Product) + +| 한글명 | 영문명 | 설명 | +|-----|---------|------------------------| +| 상품 | product | `상품`은 `메뉴`를 구성하는 단위이다. | + +### 메뉴 카테고리 (Menu Group) + +| 한글명 | 영문명 | 설명 | +|---------|------------|-------------| +| 메뉴 카테고리 | menu-group | 메뉴의 카테고리이다. | + +### 메뉴 (Menu) + +| 한글명 | 영문명 | 설명 | +|-------|-----------------|-------------------------------------------------| +| 메뉴 | menu | `주문`을 구성하는 최소한의 단위이다. | +| 메뉴 게시 | menu display | `메뉴`를 `주문`할 수 있는지에 대한 여부이다. | +| 마진 | margin | `메뉴`가격이 `메뉴`를 이루는 `상품`들의 가격의 총합보다 높은 것을 말한다. | +| 메뉴 검증 | menu validation | `메뉴`의 `상품`들과 메뉴 상품의 구성이 동일하게 존재하는지 확인하는 것을 말한다. | +| 메뉴 상품 | menu-product | 단일 `상품`의 그룹이다. | + +### 매장 테이블 (Order Table) + +| 한글명 | 영문명 | 설명 | +|--------------|-----------------|-------------------------------------| +| 매장 테이블 | order-table | `매장 테이블`은 `매장 주문`을 할 수 있는 장소이다. | +| 앉기 | sit | `매장 테이블`을 `손님`이 점유한다. | +| 점유 상태 해지 | release table | `매장 주문 완료`시에 `매장 테이블의 점유 상태`를 해지한다. | +| 매장 테이블 점유 상태 | table occupancy | `매장 테이블`을 `손님`이 점유한 상태를 말한다. | + +### 주문 (Order) + +| 한글명 | 영문명 | 설명 | +|----------|------------------|---------------------------------------------------------------------| +| 주문 | order | `주문`은 `게시`된 `메뉴`를 구매하는 것이다. | +| 주문 유형 | order type | `배달 주문`, `포장 주문`, `매장 주문`로 구성된 `주문`의 유형이다. | +| 주문 상태 | order status | 현재 확인 가능한 `주문`의 상태이다.(주문 대기 중, 주문 접수 완료, 서빙 완료, 배달 중, 배달 완료, 주문 완료) | +| 주문 검증 | order validation | `주문` 내역에 수량, 가격 구성과 `주문`한 `메뉴`들의 수량, 가격 구성이 동일하게 존재하는지 검증한다. | +| 손님 | guest | `주문`을 목적으로 하는 사람이다. | +| 주문 생성 시간 | order time | `손님`이 주문한 시간이다. | + +### 유저 (User) + +| 한글명 | 영문명 | 설명 | +|-----|-------------|---------------------| +| 손님 | guest | `주문`을 목적으로 하는 사람이다. | +| 사장님 | store owner | `메뉴`를 만드는 사람이다. | + +### 배달 주문 (Delivery) + +| 한글명 | 영문명 | 설명 | +|-------------|---------------------------|---------------------------------------------------------------------------------------| +| 배달 주문 | delivery order | `주문 유형`이 `배달 주문`인 `주문`을 말한다. | +| 배달 순서 | delivery order flow | `배달 주문`의 과정의 흐름을 말한다.(배달 주문 대기 - 배달 주문 접수 완료 - 배달 주문 서빙 완료 - 배달 중 - 배달 완료 - 배달 주문 완료) | +| 배달 주문 대기 | delivery order waiting | `손님`이 `배달 주문`을 한 상태이다. | +| 배달 주문 접수 완료 | delivery order accepted | `배달 기사`가 `배달 주문`을 수락한 상태이다. | +| 배달 주문 서빙 완료 | delivery order served | 조리가 완료된 음식을 `배달 기사`에게 제공한 상태이다. | +| 배달 중 | delivery order delivering | `배달 기사`가 배달을 진행하고 있는 상태이다. | +| 배달 완료 | delivery order delivered | `배달 기사`가 `손님`의 배달을 완료한 상태이다. | +| 배달 주문 완료 | delivery order completed | `배달 순서`가 종료된 상태이다. | + +### 포장 주문 (Takeout) + +| 한글명 | 영문명 | 설명 | +|-------------|-------------------------|------------------------------------------------------------------------| +| 포장 주문 | takeout order | `주문 유형`이 `포장 주문`인 `주문`을 말한다. | +| 포장 순서 | takeout order flow | `포장 주문`의 과정의 흐름을 말한다.(포장 주문 대기 → 포장 주문 접수 완료 → 포장 주문 서빙 완료 → 포장 주문 완료) | +| 포장 주문 대기 | takeout order waiting | `손님`이 `포장 주문`을 한 상태이다. | +| 포장 주문 접수 완료 | takeout order accepted | `포장 주문`을 수락한 상태이다. | +| 포장 주문 서빙 완료 | takeout order served | `손님`에게 조리가 완료된 음식을 제공한 상태이다. | +| 포장 주문 완료 | takeout order completed | `포장 순서`가 종료된 상태이다. | + +### 매장 주문 (Eat-in) + +| 한글명 | 영문명 | 설명 | +|-------------|------------------------|------------------------------------------------------------------------| +| 매장 주문 | eat-in order | `주문 유형`이 `매장 주문`인 `주문`을 말한다. | +| 매장 주문 순서 | eat-in order flow | `매장 주문`의 과정의 흐름을 말한다.(매장 주문 대기 - 매장 주문 접수 완료 - 매장 주문 서빙 완료 - 매장 주문 완료) | +| 매장 주문 대기 | eat-in order waiting | `매장 테이블`을 `점유`하고 있는 `손님`이 `매장 주문`을 한 상태이다. | +| 매장 주문 접수 완료 | eat-in order accepted | `매장 주문`을 수락한 상태이다. | +| 매장 주문 서빙 완료 | eat-in order served | `손님`에게 조리가 완료된 음식을 제공한 상태이다. | +| 매장 주문 완료 | eat-in order completed | `매장 순서`가 종료된 상태로 `매장 테이블`의 `점유 상태를 해지`한다. | + +### 주문 내역 (Order Line Item) + +| 한글명 | 영문명 | 설명 | +|-----------|--------------------------|---------------------------------| +| 주문 내역 | order line item | `주문 내역`은 단일`주문`한 `메뉴`에 대한 그룹이다. | +| 주문 내역의 가격 | order line item price | 단일`주문` 메뉴의 `수량`에 따른 총 가격이다. | +| 주문 내역의 수량 | order line item quantity | 단일`주문` 메뉴의 총 수량이다. | + +### 외부 시스템 (external System) + +| 한글명 | 영문명 | 설명 | +|------------|-----------------------|-----------------| +| 비속어 검증 시스템 | purgomalum client | 단어가 비속어인지 검증한다. | +| 배달 기사 | kitchen riders client | 배달 서비스를 제공한다. | ## 모델링 -### 상품 +### 1. 메뉴 + +- `메뉴`는 여러 `상품` 과 `메뉴 게시`를 가진다. +- `메뉴`는 상품의 가격과 수량을 토대로 `마진`을 검증한다. + +### 2. 외부 시스템 + +- `비속어 검증 시스템`은 비속어를 검증한다. +- `배달 기사`는 배달 정보를 받아 배달을 간다. + +### 3. 주문 + +- `주문`은 주문 방식을 구별할 수 있는 `주문 유형`을 가진다. +- `주문`은 여러 `메뉴`를 가진다. +- `주문`은 손님이 원하는 `주문 유형`에 따라 `주문`을 수행한다. +- `주문`은 `주문 내역`을 토대로 `주문`을 검증한다. + +### 4. 유저 + +- `손님`은 `주문`을 한다. +- `손님`은 `매장 테이블`을 `점유`한다. +- `사장님`은 `메뉴`를 만든다. + +### 5. 배달 주문 + +- `배달 주문`은 `배달 기사`에게 배달을 요청한다. +- `배달 주문`은 현재 `배달 주문 상태`를 기반으로 `배달 주문 순서`에게 다음 순서의 `배달 주문`을 요청한다. +- `배달 주문 순서`는 이전 `배달 주문 상태`와 `배달 주문 순서`를 고려해 다음 순서의 `배달 주문`을 수행한다. + +### 6. 포장 주문 + +- `포장 주문`은 `손님`에게 조리된 음식을 포장 해준다. +- `포장 주문`은 현재 `포장 주문 상태`를 기반으로 `포장 주문 순서`에게 다음 순서의 `포장 주문`을 요청한다. +- `포장 주문 순서`는 이전 `포장 주문 상태`와 `포장 주문 순서`를 고려해 다음 순서의 `포장 주문`을 수행한다. + +### 7. 매장 주문 + +- `매장 주문`은 `매장 테이블을 점유`한 `손님`에게 조리된 음식을 제공한다. +- `매장 주문`은 현재 `매장 주문 상태`를 기반으로 `매장 주문 순서`에게 다음 순서의 `매장 주문`을 요청한다. +- `매장 주문 순서`는 이전 `매장 주문 상태`와 `매장 주문 순서`를 고려해 다음 순서의 `매장 주문`을 수행한다. + +### 8. 매장 테이블 + +- `매장 테이블`은 `매장 주문이 완료`되면 `테이블 점유를 해지`한다. + +### Kitchen Pos 모델링 + +```mermaid +flowchart TD + guest + store_owner +%% 외부 시스템 (ID: externalSystem) + subgraph externalSystem [외부 시스템] + KitchenRidersClient + PurgomalumClient + end + + style externalSystem stroke-dasharray: 5 +%% 메뉴 + subgraph 메뉴 + style 주문 stroke-dasharray: 5 + menu + product + menu --> product + end + +%% 주문 + subgraph 주문 + style 주문 stroke-dasharray: 5 + order + deliveryOrder + takeOutOrder + eatInOrder + DeliveryOrderFlow + TakeOutOrderFlow + EatInOrderFlow + OrderTable + order -- case:delivery orderType --> deliveryOrder + order -- case:takeOut orderType --> takeOutOrder + order -- case:eatIn orderType --> eatInOrder + deliveryOrder -- 배달 주문 시작 --> DeliveryOrderFlow + takeOutOrder -- 포장 주문 시작 --> TakeOutOrderFlow + eatInOrder -- 매장 주문 시작 --> EatInOrderFlow + EatInOrderFlow -- 매장 테이블 해지 요청 --> OrderTable + end + + guest -- <순서 2> : 주문 요청 --> order + guest -- 매장 테이블 점유 --> OrderTable + guest -- <순서 1> : 메뉴 선택 --> menu + store_owner -- 메뉴 생성 --> menu + DeliveryOrderFlow -- 배달 요청 --> KitchenRidersClient + menu -- 비속어 검증 --> PurgomalumClient + product -- 비속어 검증 --> PurgomalumClient -- `Product`는 식별자와 `DisplayedName`, 가격을 가진다. -- `DisplayedName`에는 `Profanity`가 포함될 수 없다. +``` -### 메뉴 +### 배달 주문 순서 + +```mermaid +sequenceDiagram + participant Guest + participant Delivery Order + participant Delivery Order Flow + participant Kitchen Riders Client + Guest ->> Delivery Order: 배달 주문 요청 + Delivery Order ->> Delivery Order Flow: 배달 주문 프로세스 시작 + Delivery Order Flow ->> Delivery Order: 배달 주문 대기 중 + Delivery Order ->> Delivery Order Flow: 배달 주문 접수 요청 + Delivery Order Flow -->> Kitchen Riders Client: 배달 요청 + Delivery Order Flow ->> Delivery Order: 배달 접수 완료 + Kitchen Riders Client -->> Delivery Order Flow: 배달 요청 확인 + Delivery Order ->> Delivery Order Flow: 배달 주문 서빙 요청 + Delivery Order Flow ->> Delivery Order: 배달 주문 서빙 완료 + Delivery Order ->> Delivery Order Flow: 배달 중 요청 + Delivery Order Flow ->> Delivery Order: 배달 중 + Delivery Order ->> Delivery Order Flow: 배달 완료 요청 + Delivery Order Flow ->> Delivery Order: 배달 완료 + Delivery Order ->> Delivery Order Flow: 배달 주문 완료 요청 + Delivery Order Flow ->> Delivery Order: 배달 주문 완료 + +``` + +### 포장 주문 순서 + +```mermaid +sequenceDiagram + participant Guest + participant TakeOut Order + participant TakeOut Order Flow + Guest ->> TakeOut Order: 포장 주문 요청 + TakeOut Order ->> TakeOut Order Flow: 포장 주문 프로세스 시작 + TakeOut Order Flow ->> TakeOut Order: 포장 주문 대기 중 + TakeOut Order ->> TakeOut Order Flow: 포장 주문 접수 요청 + TakeOut Order Flow ->> TakeOut Order: 포장 접수 완료 + TakeOut Order ->> TakeOut Order Flow: 포장 주문 서빙 요청 + TakeOut Order Flow ->> TakeOut Order: 포장 주문 서빙 완료 + TakeOut Order ->> TakeOut Order Flow: 포장 주문 완료 요청 + TakeOut Order Flow ->> TakeOut Order: 포장 주문 완료 -- `MenuGroup`은 식별자와 이름을 가진다. -- `Menu`는 식별자와 `Displayed Name`, 가격, `MenuProducts`를 가진다. -- `Menu`는 특정 `MenuGroup`에 속한다. -- `Menu`의 가격은 `MenuProducts`의 금액의 합보다 적거나 같아야 한다. -- `Menu`의 가격이 `MenuProducts`의 금액의 합보다 크면 `NotDisplayedMenu`가 된다. -- `MenuProduct`는 가격과 수량을 가진다. - -### 매장 주문 - -- `OrderTable`은 식별자와 이름, `NumberOfGuests`를 가진다. -- `OrderTable`의 추가 `Order`는 `OrderTable`에 계속 쌓이며 모든 `Order`가 완료되면 `EmptyTable`이 된다. -- `EmptyTable`인 경우 `NumberOfGuests`는 0이며 변경할 수 없다. -- `Order`는 식별자와 `OrderStatus`, 주문 시간, `OrderLineItems`를 가진다. -- 메뉴가 노출되고 있으며 판매되는 메뉴 가격과 일치하면 `Order`가 생성된다. -- `Order`는 접수 대기 ➜ 접수 ➜ 서빙 ➜ 계산 완료 순서로 진행된다. -- `OrderLineItem`는 가격과 수량을 가진다. -- `OrderLineItem`의 수량은 기존 `Order`를 취소하거나 변경해도 수정되지 않기 때문에 0보다 적을 수 있다. - -### 배달 주문 - -- `Order`는 식별자와 `OrderStatus`, 주문 시간, 배달 주소, `OrderLineItems`를 가진다. -- 메뉴가 노출되고 있으며 판매되는 메뉴 가격과 일치하면 `Order`가 생성된다. -- `Order`는 접수 대기 ➜ 접수 ➜ 서빙 ➜ 배달 ➜ 배달 완료 ➜ 계산 완료 순서로 진행된다. -- `Order`가 접수되면 `DeliveryAgency`가 호출된다. -- `OrderLineItem`는 가격과 수량을 가진다. -- `OrderLineItem`의 수량은 1보다 커야 한다. - -### 포장 주문 - -- `Order`는 식별자와 `OrderStatus`, 주문 시간, `OrderLineItems`를 가진다. -- 메뉴가 노출되고 있으며 판매되는 메뉴 가격과 일치하면 `Order`가 생성된다. -- `Order`는 접수 대기 ➜ 접수 ➜ 서빙 ➜ 계산 완료 순서로 진행된다. -- `OrderLineItem`는 가격과 수량을 가진다. -- `OrderLineItem`의 수량은 1보다 커야 한다. +``` + +### 매장 주문 순서 + +```mermaid +sequenceDiagram + participant Guest + participant EatIn Order + participant EatIn Order Flow + participant OrderTable + Guest ->> EatIn Order: 매장 주문 요청 + EatIn Order ->> EatIn Order Flow: 매장 주문 프로세스 시작 + EatIn Order Flow ->> EatIn Order: 매장 주문 대기 중 + EatIn Order ->> EatIn Order Flow: 매장 주문 접수 요청 + EatIn Order Flow ->> EatIn Order: 매장 접수 완료 + EatIn Order ->> EatIn Order Flow: 매장 주문 서빙 요청 + EatIn Order Flow ->> EatIn Order: 매장 주문 서빙 완료 + EatIn Order ->> EatIn Order Flow: 매장 주문 완료 요청 + EatIn Order Flow -->> OrderTable: 매장 테이블 점유 해제 요청 + EatIn Order Flow ->> EatIn Order: 매장 주문 완료 + OrderTable -->> EatIn Order Flow: 매장 테이블 점유 해제 + +``` diff --git a/build.gradle.kts b/build.gradle.kts index 67ab16154..b04367191 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,8 +26,8 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") - implementation("org.flywaydb:flyway-core") - implementation("org.flywaydb:flyway-mysql") +// implementation("org.flywaydb:flyway-core") +// implementation("org.flywaydb:flyway-mysql") implementation("org.jetbrains.kotlin:kotlin-reflect") runtimeOnly("com.h2database:h2") runtimeOnly("com.mysql:mysql-connector-j") diff --git a/src/main/java/kitchenpos/products/infra/PurgomalumClient.java b/src/main/java/kitchenpos/common/application/PurgomalumClient.java similarity index 68% rename from src/main/java/kitchenpos/products/infra/PurgomalumClient.java rename to src/main/java/kitchenpos/common/application/PurgomalumClient.java index 4002a2bb8..47c31c355 100644 --- a/src/main/java/kitchenpos/products/infra/PurgomalumClient.java +++ b/src/main/java/kitchenpos/common/application/PurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.products.infra; +package kitchenpos.common.application; public interface PurgomalumClient { boolean containsProfanity(String text); diff --git a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java similarity index 90% rename from src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java rename to src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java index 87dba885c..d38831d2f 100644 --- a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java @@ -1,12 +1,12 @@ -package kitchenpos.products.infra; +package kitchenpos.common.infra.external; +import java.net.URI; +import kitchenpos.common.application.PurgomalumClient; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import java.net.URI; - @Component public class DefaultPurgomalumClient implements PurgomalumClient { private final RestTemplate restTemplate; diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menu/application/MenuGroupService.java similarity index 87% rename from src/main/java/kitchenpos/menus/application/MenuGroupService.java rename to src/main/java/kitchenpos/menu/application/MenuGroupService.java index c468893a2..a65f345f6 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menu/application/MenuGroupService.java @@ -1,13 +1,12 @@ -package kitchenpos.menus.application; - -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +package kitchenpos.menu.application; import java.util.List; import java.util.Objects; import java.util.UUID; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.repository.MenuGroupRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service public class MenuGroupService { diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menu/application/MenuService.java similarity index 91% rename from src/main/java/kitchenpos/menus/application/MenuService.java rename to src/main/java/kitchenpos/menu/application/MenuService.java index abefa5bcf..a7a06fdd3 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menu/application/MenuService.java @@ -1,15 +1,4 @@ -package kitchenpos.menus.application; - -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.products.domain.Product; -import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +package kitchenpos.menu.application; import java.math.BigDecimal; import java.util.ArrayList; @@ -17,6 +6,16 @@ import java.util.NoSuchElementException; import java.util.Objects; import java.util.UUID; +import kitchenpos.common.application.PurgomalumClient; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.menu.domain.repository.MenuGroupRepository; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service public class MenuService { diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java similarity index 98% rename from src/main/java/kitchenpos/menus/domain/Menu.java rename to src/main/java/kitchenpos/menu/domain/model/Menu.java index 8d1cc1139..6fe259b96 100644 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.domain; +package kitchenpos.menu.domain.model; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -10,7 +10,6 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import jakarta.persistence.Transient; - import java.math.BigDecimal; import java.util.List; import java.util.UUID; diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroup.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java similarity index 94% rename from src/main/java/kitchenpos/menus/domain/MenuGroup.java rename to src/main/java/kitchenpos/menu/domain/model/MenuGroup.java index 70e0b8e23..f0097e9c3 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java @@ -1,10 +1,9 @@ -package kitchenpos.menus.domain; +package kitchenpos.menu.domain.model; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; - import java.util.UUID; @Table(name = "menu_group") diff --git a/src/main/java/kitchenpos/menus/domain/MenuProduct.java b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java similarity index 94% rename from src/main/java/kitchenpos/menus/domain/MenuProduct.java rename to src/main/java/kitchenpos/menu/domain/model/MenuProduct.java index b47ca26cb..056bcc4a4 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.domain; +package kitchenpos.menu.domain.model; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -10,9 +10,8 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.persistence.Transient; -import kitchenpos.products.domain.Product; - import java.util.UUID; +import kitchenpos.product.domain.model.Product; @Table(name = "menu_product") @Entity diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java similarity index 72% rename from src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java rename to src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java index b25e6acbc..cfb05d515 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java @@ -1,8 +1,9 @@ -package kitchenpos.menus.domain; +package kitchenpos.menu.domain.repository; import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.menu.domain.model.MenuGroup; public interface MenuGroupRepository { MenuGroup save(MenuGroup menuGroup); diff --git a/src/main/java/kitchenpos/menus/domain/MenuRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java similarity index 78% rename from src/main/java/kitchenpos/menus/domain/MenuRepository.java rename to src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java index 5fbaab864..f83243f3d 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java @@ -1,8 +1,9 @@ -package kitchenpos.menus.domain; +package kitchenpos.menu.domain.repository; import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; public interface MenuRepository { Menu save(Menu menu); diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java similarity index 55% rename from src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java rename to src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java index 233488198..13d3e1fdb 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java @@ -1,8 +1,9 @@ -package kitchenpos.menus.domain; - -import org.springframework.data.jpa.repository.JpaRepository; +package kitchenpos.menu.infra.persistence; import java.util.UUID; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.repository.MenuGroupRepository; +import org.springframework.data.jpa.repository.JpaRepository; public interface JpaMenuGroupRepository extends MenuGroupRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java similarity index 77% rename from src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java rename to src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java index 796499c30..9f9ec4437 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java @@ -1,12 +1,13 @@ -package kitchenpos.menus.domain; +package kitchenpos.menu.infra.persistence; +import java.util.List; +import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.util.List; -import java.util.UUID; - public interface JpaMenuRepository extends MenuRepository, JpaRepository { @Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId") @Override diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java similarity index 89% rename from src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java rename to src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java index 30c38b4a1..141d95219 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java @@ -1,7 +1,9 @@ -package kitchenpos.menus.ui; +package kitchenpos.menu.ui; -import kitchenpos.menus.application.MenuGroupService; -import kitchenpos.menus.domain.MenuGroup; +import java.net.URI; +import java.util.List; +import kitchenpos.menu.application.MenuGroupService; +import kitchenpos.menu.domain.model.MenuGroup; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -9,9 +11,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.net.URI; -import java.util.List; - @RequestMapping("/api/menu-groups") @RestController public class MenuGroupRestController { diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menu/ui/MenuRestController.java similarity index 93% rename from src/main/java/kitchenpos/menus/ui/MenuRestController.java rename to src/main/java/kitchenpos/menu/ui/MenuRestController.java index 626b214fc..fd729b5db 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuRestController.java @@ -1,7 +1,10 @@ -package kitchenpos.menus.ui; +package kitchenpos.menu.ui; -import kitchenpos.menus.application.MenuService; -import kitchenpos.menus.domain.Menu; +import java.net.URI; +import java.util.List; +import java.util.UUID; +import kitchenpos.menu.application.MenuService; +import kitchenpos.menu.domain.model.Menu; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -11,10 +14,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.net.URI; -import java.util.List; -import java.util.UUID; - @RequestMapping("/api/menus") @RestController public class MenuRestController { diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderService.java b/src/main/java/kitchenpos/order/common/application/OrderService.java similarity index 92% rename from src/main/java/kitchenpos/eatinorders/application/OrderService.java rename to src/main/java/kitchenpos/order/common/application/OrderService.java index 1159a0ba0..42a6159f6 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderService.java +++ b/src/main/java/kitchenpos/order/common/application/OrderService.java @@ -1,17 +1,4 @@ -package kitchenpos.eatinorders.application; - -import kitchenpos.deliveryorders.infra.KitchenridersClient; -import kitchenpos.eatinorders.domain.Order; -import kitchenpos.eatinorders.domain.OrderLineItem; -import kitchenpos.eatinorders.domain.OrderRepository; -import kitchenpos.eatinorders.domain.OrderStatus; -import kitchenpos.eatinorders.domain.OrderTable; -import kitchenpos.eatinorders.domain.OrderTableRepository; -import kitchenpos.eatinorders.domain.OrderType; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +package kitchenpos.order.common.application; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -20,6 +7,18 @@ import java.util.NoSuchElementException; import java.util.Objects; import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.common.model.OrderType; +import kitchenpos.order.common.repository.OrderRepository; +import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service public class OrderService { diff --git a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java similarity index 53% rename from src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java rename to src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java index 01c825c45..22b55e7a9 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java +++ b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java @@ -1,8 +1,9 @@ -package kitchenpos.eatinorders.domain; - -import org.springframework.data.jpa.repository.JpaRepository; +package kitchenpos.order.common.infra.persistence; import java.util.UUID; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.repository.OrderRepository; +import org.springframework.data.jpa.repository.JpaRepository; public interface JpaOrderRepository extends OrderRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java similarity index 51% rename from src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java rename to src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java index 84c0d3c6f..975ca8c6c 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java @@ -1,8 +1,9 @@ -package kitchenpos.eatinorders.domain; - -import org.springframework.data.jpa.repository.JpaRepository; +package kitchenpos.order.common.infra.persistence; import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import org.springframework.data.jpa.repository.JpaRepository; public interface JpaOrderTableRepository extends OrderTableRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/eatinorders/domain/Order.java b/src/main/java/kitchenpos/order/common/model/Order.java similarity index 96% rename from src/main/java/kitchenpos/eatinorders/domain/Order.java rename to src/main/java/kitchenpos/order/common/model/Order.java index 4a5991301..3d7d0ba41 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/Order.java +++ b/src/main/java/kitchenpos/order/common/model/Order.java @@ -1,4 +1,4 @@ -package kitchenpos.eatinorders.domain; +package kitchenpos.order.common.model; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -12,10 +12,10 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import jakarta.persistence.Transient; - import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; @Table(name = "orders") @Entity diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java similarity index 95% rename from src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java rename to src/main/java/kitchenpos/order/common/model/OrderLineItem.java index a5fe38278..67a5a8691 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java +++ b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java @@ -1,4 +1,4 @@ -package kitchenpos.eatinorders.domain; +package kitchenpos.order.common.model; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -10,10 +10,9 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.persistence.Transient; -import kitchenpos.menus.domain.Menu; - import java.math.BigDecimal; import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; @Table(name = "order_line_item") @Entity diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderStatus.java b/src/main/java/kitchenpos/order/common/model/OrderStatus.java similarity index 70% rename from src/main/java/kitchenpos/eatinorders/domain/OrderStatus.java rename to src/main/java/kitchenpos/order/common/model/OrderStatus.java index fe0f76c7d..ae2e45364 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderStatus.java +++ b/src/main/java/kitchenpos/order/common/model/OrderStatus.java @@ -1,4 +1,4 @@ -package kitchenpos.eatinorders.domain; +package kitchenpos.order.common.model; public enum OrderStatus { WAITING, ACCEPTED, SERVED, DELIVERING, DELIVERED, COMPLETED diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderType.java b/src/main/java/kitchenpos/order/common/model/OrderType.java similarity index 59% rename from src/main/java/kitchenpos/eatinorders/domain/OrderType.java rename to src/main/java/kitchenpos/order/common/model/OrderType.java index 0e3133e69..d68c3bbcf 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderType.java +++ b/src/main/java/kitchenpos/order/common/model/OrderType.java @@ -1,4 +1,4 @@ -package kitchenpos.eatinorders.domain; +package kitchenpos.order.common.model; public enum OrderType { DELIVERY, TAKEOUT, EAT_IN diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderRepository.java b/src/main/java/kitchenpos/order/common/repository/OrderRepository.java similarity index 60% rename from src/main/java/kitchenpos/eatinorders/domain/OrderRepository.java rename to src/main/java/kitchenpos/order/common/repository/OrderRepository.java index f98d45c15..843816c3c 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderRepository.java +++ b/src/main/java/kitchenpos/order/common/repository/OrderRepository.java @@ -1,8 +1,11 @@ -package kitchenpos.eatinorders.domain; +package kitchenpos.order.common.repository; import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.eatinorder.domain.model.OrderTable; public interface OrderRepository { Order save(Order order); diff --git a/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java similarity index 94% rename from src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java rename to src/main/java/kitchenpos/order/common/ui/OrderRestController.java index dbb5568ad..7aa25b614 100644 --- a/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java +++ b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java @@ -1,7 +1,10 @@ -package kitchenpos.eatinorders.ui; +package kitchenpos.order.common.ui; -import kitchenpos.eatinorders.application.OrderService; -import kitchenpos.eatinorders.domain.Order; +import java.net.URI; +import java.util.List; +import java.util.UUID; +import kitchenpos.order.common.application.OrderService; +import kitchenpos.order.common.model.Order; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -11,10 +14,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.net.URI; -import java.util.List; -import java.util.UUID; - @RequestMapping("/api/orders") @RestController public class OrderRestController { diff --git a/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java b/src/main/java/kitchenpos/order/common/ui/OrderTableRestController.java similarity index 92% rename from src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java rename to src/main/java/kitchenpos/order/common/ui/OrderTableRestController.java index 1ceabe86f..c454787bc 100644 --- a/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/order/common/ui/OrderTableRestController.java @@ -1,7 +1,10 @@ -package kitchenpos.eatinorders.ui; +package kitchenpos.order.common.ui; -import kitchenpos.eatinorders.application.OrderTableService; -import kitchenpos.eatinorders.domain.OrderTable; +import java.net.URI; +import java.util.List; +import java.util.UUID; +import kitchenpos.order.eatinorder.application.OrderTableService; +import kitchenpos.order.eatinorder.domain.model.OrderTable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -11,10 +14,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.net.URI; -import java.util.List; -import java.util.UUID; - @RequestMapping("/api/order-tables") @RestController public class OrderTableRestController { diff --git a/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrder.java b/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrder.java new file mode 100644 index 000000000..da931a91f --- /dev/null +++ b/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrder.java @@ -0,0 +1,50 @@ +package kitchenpos.order.deliveryorder.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +public class DeliveryOrder { + + @Id + @GeneratedValue + private UUID id; + + @Enumerated + private DeliveryOrderFlow orderFlow; + + @Column(name = "order_date_time", nullable = false) + private LocalDateTime orderDateTime; + +// @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) +// @JoinColumn( +// name = "order_id", +// nullable = false, +// columnDefinition = "binary(16)", +// foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") +// ) +// private List orderLineItems; + + @Column(name = "delivery_address") + private String deliveryAddress; + + public boolean validateOrderFlowAndFindNextStep(DeliveryOrderStatus orderStatus) { + if (orderFlow.validateOrderStatus(orderStatus)) { + throw new IllegalArgumentException(); + } + return orderFlow.isRiderNecessary(orderStatus); + } + + public UUID getId() { + return id; + } + + public String getDeliveryAddress() { + return deliveryAddress; + } +} diff --git a/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderFlow.java b/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderFlow.java new file mode 100644 index 000000000..458ff375b --- /dev/null +++ b/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderFlow.java @@ -0,0 +1,35 @@ +package kitchenpos.order.deliveryorder.domain.model; + +import java.util.Arrays; + +public enum DeliveryOrderFlow { + ACCEPTED(DeliveryOrderStatus.ACCEPTED, DeliveryOrderStatus.WAITING), + SERVED(DeliveryOrderStatus.SERVED, DeliveryOrderStatus.ACCEPTED), + DELIVERING(DeliveryOrderStatus.DELIVERING, DeliveryOrderStatus.SERVED), + DELIVERED(DeliveryOrderStatus.DELIVERED, DeliveryOrderStatus.DELIVERING), + COMPLETED(DeliveryOrderStatus.COMPLETED, DeliveryOrderStatus.DELIVERED); + + private final DeliveryOrderStatus nextStatus; + private final DeliveryOrderStatus previousStatus; + + DeliveryOrderFlow(DeliveryOrderStatus nextStatus, DeliveryOrderStatus previousStatus) { + this.nextStatus = nextStatus; + this.previousStatus = previousStatus; + } + + public static DeliveryOrderFlow from(DeliveryOrderStatus status) { + return valueOf(status.name()); + } + + public boolean validateOrderStatus(DeliveryOrderStatus nextOrderStatus) { + DeliveryOrderFlow nextStatus = Arrays.stream(values()) + .filter(v -> v.nextStatus == nextOrderStatus) + .findFirst() + .orElseThrow(); + return nextStatus.previousStatus != (this.nextStatus); + } + + public boolean isRiderNecessary(DeliveryOrderStatus orderStatus) { + return orderStatus == DeliveryOrderStatus.SERVED; + } +} diff --git a/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderStatus.java b/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderStatus.java new file mode 100644 index 000000000..44dbfdfe9 --- /dev/null +++ b/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderStatus.java @@ -0,0 +1,5 @@ +package kitchenpos.order.deliveryorder.domain.model; + +public enum DeliveryOrderStatus { + WAITING, ACCEPTED, SERVED, DELIVERING, DELIVERED, COMPLETED +} diff --git a/src/main/java/kitchenpos/order/deliveryorder/domain/port/RiderPort.java b/src/main/java/kitchenpos/order/deliveryorder/domain/port/RiderPort.java new file mode 100644 index 000000000..13d8e0bec --- /dev/null +++ b/src/main/java/kitchenpos/order/deliveryorder/domain/port/RiderPort.java @@ -0,0 +1,10 @@ +package kitchenpos.order.deliveryorder.domain.port; + +import kitchenpos.order.deliveryorder.domain.model.DeliveryOrder; +import org.springframework.stereotype.Component; + +@Component +public interface RiderPort { + + void requestRider(DeliveryOrder order); +} diff --git a/src/main/java/kitchenpos/order/deliveryorder/domain/repository/DeliveryRepository.java b/src/main/java/kitchenpos/order/deliveryorder/domain/repository/DeliveryRepository.java new file mode 100644 index 000000000..ce903f938 --- /dev/null +++ b/src/main/java/kitchenpos/order/deliveryorder/domain/repository/DeliveryRepository.java @@ -0,0 +1,4 @@ +package kitchenpos.order.deliveryorder.domain.repository; + +public interface DeliveryRepository { +} diff --git a/src/main/java/kitchenpos/order/deliveryorder/domain/service/DeliveryOrderDomainService.java b/src/main/java/kitchenpos/order/deliveryorder/domain/service/DeliveryOrderDomainService.java new file mode 100644 index 000000000..36d804f40 --- /dev/null +++ b/src/main/java/kitchenpos/order/deliveryorder/domain/service/DeliveryOrderDomainService.java @@ -0,0 +1,23 @@ +package kitchenpos.order.deliveryorder.domain.service; + +import kitchenpos.order.deliveryorder.domain.model.DeliveryOrder; +import kitchenpos.order.deliveryorder.domain.model.DeliveryOrderStatus; +import kitchenpos.order.deliveryorder.domain.port.RiderPort; + +public class DeliveryOrderDomainService { + + private final RiderPort riderPort; + private final DeliveryOrder deliveryOrder; + + public DeliveryOrderDomainService(RiderPort riderPort, DeliveryOrder deliveryOrder) { + this.riderPort = riderPort; + this.deliveryOrder = deliveryOrder; + } + + public void doRide(DeliveryOrderStatus orderStatus) { + boolean existsNextStep = deliveryOrder.validateOrderFlowAndFindNextStep(orderStatus); + if (existsNextStep) { + riderPort.requestRider(deliveryOrder); + } + } +} diff --git a/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java b/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java new file mode 100644 index 000000000..faf88dabd --- /dev/null +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java @@ -0,0 +1,16 @@ +package kitchenpos.order.deliveryorder.infra.adaptor; + +import java.math.BigDecimal; +import kitchenpos.order.deliveryorder.domain.model.DeliveryOrder; +import kitchenpos.order.deliveryorder.domain.port.RiderPort; +import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; + +public class RiderAdaptor implements RiderPort { + + private KitchenridersClient kitchenridersClient; + + @Override + public void requestRider(DeliveryOrder order) { + kitchenridersClient.requestDelivery(order.getId(), BigDecimal.ONE, order.getDeliveryAddress()); + } +} diff --git a/src/main/java/kitchenpos/deliveryorders/infra/DefaultKitchenridersClient.java b/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java similarity index 85% rename from src/main/java/kitchenpos/deliveryorders/infra/DefaultKitchenridersClient.java rename to src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java index 31d6d8cee..580d076a1 100644 --- a/src/main/java/kitchenpos/deliveryorders/infra/DefaultKitchenridersClient.java +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java @@ -1,9 +1,8 @@ -package kitchenpos.deliveryorders.infra; - -import org.springframework.stereotype.Component; +package kitchenpos.order.deliveryorder.infra.external; import java.math.BigDecimal; import java.util.UUID; +import org.springframework.stereotype.Component; @Component public class DefaultKitchenridersClient implements KitchenridersClient { diff --git a/src/main/java/kitchenpos/deliveryorders/infra/KitchenridersClient.java b/src/main/java/kitchenpos/order/deliveryorder/infra/external/KitchenridersClient.java similarity index 76% rename from src/main/java/kitchenpos/deliveryorders/infra/KitchenridersClient.java rename to src/main/java/kitchenpos/order/deliveryorder/infra/external/KitchenridersClient.java index 0c8278791..061d45428 100644 --- a/src/main/java/kitchenpos/deliveryorders/infra/KitchenridersClient.java +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/external/KitchenridersClient.java @@ -1,4 +1,4 @@ -package kitchenpos.deliveryorders.infra; +package kitchenpos.order.deliveryorder.infra.external; import java.math.BigDecimal; import java.util.UUID; diff --git a/src/main/java/kitchenpos/order/deliveryorder/infra/persistence/JpaDeliveryOrderRepository.java b/src/main/java/kitchenpos/order/deliveryorder/infra/persistence/JpaDeliveryOrderRepository.java new file mode 100644 index 000000000..19240e443 --- /dev/null +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/persistence/JpaDeliveryOrderRepository.java @@ -0,0 +1,6 @@ +package kitchenpos.order.deliveryorder.infra.persistence; + +import kitchenpos.order.deliveryorder.domain.repository.DeliveryRepository; + +public interface JpaDeliveryOrderRepository extends DeliveryRepository { +} diff --git a/src/main/java/kitchenpos/order/deliveryorder/service/DeliveryOrderService.java b/src/main/java/kitchenpos/order/deliveryorder/service/DeliveryOrderService.java new file mode 100644 index 000000000..55fa1b586 --- /dev/null +++ b/src/main/java/kitchenpos/order/deliveryorder/service/DeliveryOrderService.java @@ -0,0 +1,4 @@ +package kitchenpos.order.deliveryorder.service; + +public class DeliveryOrderService { +} diff --git a/src/main/java/kitchenpos/order/deliveryorder/ui/DeliveryOrderController.java b/src/main/java/kitchenpos/order/deliveryorder/ui/DeliveryOrderController.java new file mode 100644 index 000000000..217461485 --- /dev/null +++ b/src/main/java/kitchenpos/order/deliveryorder/ui/DeliveryOrderController.java @@ -0,0 +1,4 @@ +package kitchenpos.order.deliveryorder.ui; + +public class DeliveryOrderController { +} diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java similarity index 89% rename from src/main/java/kitchenpos/eatinorders/application/OrderTableService.java rename to src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index 1df7e345f..f7184ff3f 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -1,16 +1,15 @@ -package kitchenpos.eatinorders.application; - -import kitchenpos.eatinorders.domain.OrderRepository; -import kitchenpos.eatinorders.domain.OrderStatus; -import kitchenpos.eatinorders.domain.OrderTable; -import kitchenpos.eatinorders.domain.OrderTableRepository; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +package kitchenpos.order.eatinorder.application; import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; import java.util.UUID; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.common.repository.OrderRepository; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service public class OrderTableService { diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java new file mode 100644 index 000000000..1230a5bea --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -0,0 +1,4 @@ +package kitchenpos.order.eatinorder.domain.model; + +public class EatInOrder { +} diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java new file mode 100644 index 000000000..a5ca8dee8 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java @@ -0,0 +1,4 @@ +package kitchenpos.order.eatinorder.domain.model; + +public class EatInOrderFlow { +} diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderStatus.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderStatus.java new file mode 100644 index 000000000..d2e925cc4 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderStatus.java @@ -0,0 +1,5 @@ +package kitchenpos.order.eatinorder.domain.model; + +public enum EatInOrderStatus { + WAITING, ACCEPTED, SERVED, DELIVERING, DELIVERED, COMPLETED +} diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderTable.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java similarity index 95% rename from src/main/java/kitchenpos/eatinorders/domain/OrderTable.java rename to src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java index bdd3dd23c..7e5462a70 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderTable.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java @@ -1,10 +1,9 @@ -package kitchenpos.eatinorders.domain; +package kitchenpos.order.eatinorder.domain.model; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; - import java.util.UUID; @Table(name = "order_table") diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java b/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java new file mode 100644 index 000000000..8e2cc2396 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java @@ -0,0 +1,4 @@ +package kitchenpos.order.eatinorder.domain.repository; + +public interface EatInOrderRepository { +} diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderTableRepository.java b/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java similarity index 67% rename from src/main/java/kitchenpos/eatinorders/domain/OrderTableRepository.java rename to src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java index 1e9047d43..86a420535 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderTableRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java @@ -1,8 +1,9 @@ -package kitchenpos.eatinorders.domain; +package kitchenpos.order.eatinorder.domain.repository; import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; public interface OrderTableRepository { OrderTable save(OrderTable orderTable); diff --git a/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java b/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java new file mode 100644 index 000000000..08c8626e6 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java @@ -0,0 +1,4 @@ +package kitchenpos.order.eatinorder.infra.persistence; + +public interface JpaEatInOrderRepository { +} diff --git a/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaOrderTableRepository.java b/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaOrderTableRepository.java new file mode 100644 index 000000000..c27f00b03 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaOrderTableRepository.java @@ -0,0 +1,4 @@ +package kitchenpos.order.eatinorder.infra.persistence; + +public interface JpaOrderTableRepository { +} diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java new file mode 100644 index 000000000..d0bc5dd95 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -0,0 +1,4 @@ +package kitchenpos.order.eatinorder.service; + +public class EatInOrderService { +} diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderController.java b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderController.java new file mode 100644 index 000000000..419d1327b --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderController.java @@ -0,0 +1,4 @@ +package kitchenpos.order.eatinorder.ui; + +public class EatInOrderController { +} diff --git a/src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrder.java b/src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrder.java new file mode 100644 index 000000000..75c618f66 --- /dev/null +++ b/src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrder.java @@ -0,0 +1,4 @@ +package kitchenpos.order.takeoutorder.domain.model; + +public class TakeOutOrder { +} diff --git a/src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrderFlow.java b/src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrderFlow.java new file mode 100644 index 000000000..d6c42e97c --- /dev/null +++ b/src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrderFlow.java @@ -0,0 +1,4 @@ +package kitchenpos.order.takeoutorder.domain.model; + +public class TakeOutOrderFlow { +} diff --git a/src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrderStatus.java b/src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrderStatus.java new file mode 100644 index 000000000..da4549de4 --- /dev/null +++ b/src/main/java/kitchenpos/order/takeoutorder/domain/model/TakeOutOrderStatus.java @@ -0,0 +1,5 @@ +package kitchenpos.order.takeoutorder.domain.model; + +public enum TakeOutOrderStatus { + WAITING, ACCEPTED, SERVED, DELIVERING, DELIVERED, COMPLETED +} diff --git a/src/main/java/kitchenpos/order/takeoutorder/domain/repository/TakeOutOrderRepository.java b/src/main/java/kitchenpos/order/takeoutorder/domain/repository/TakeOutOrderRepository.java new file mode 100644 index 000000000..1f2c5ec68 --- /dev/null +++ b/src/main/java/kitchenpos/order/takeoutorder/domain/repository/TakeOutOrderRepository.java @@ -0,0 +1,4 @@ +package kitchenpos.order.takeoutorder.domain.repository; + +public class TakeOutOrderRepository { +} diff --git a/src/main/java/kitchenpos/order/takeoutorder/infra/persistence/JpaTakeOutOrderRepository.java b/src/main/java/kitchenpos/order/takeoutorder/infra/persistence/JpaTakeOutOrderRepository.java new file mode 100644 index 000000000..4c46dbae7 --- /dev/null +++ b/src/main/java/kitchenpos/order/takeoutorder/infra/persistence/JpaTakeOutOrderRepository.java @@ -0,0 +1,4 @@ +package kitchenpos.order.takeoutorder.infra.persistence; + +public interface JpaTakeOutOrderRepository { +} diff --git a/src/main/java/kitchenpos/order/takeoutorder/service/TakeOutOrderService.java b/src/main/java/kitchenpos/order/takeoutorder/service/TakeOutOrderService.java new file mode 100644 index 000000000..ef337e9a1 --- /dev/null +++ b/src/main/java/kitchenpos/order/takeoutorder/service/TakeOutOrderService.java @@ -0,0 +1,4 @@ +package kitchenpos.order.takeoutorder.service; + +public class TakeOutOrderService { +} diff --git a/src/main/java/kitchenpos/order/takeoutorder/ui/TakeOutOrderController.java b/src/main/java/kitchenpos/order/takeoutorder/ui/TakeOutOrderController.java new file mode 100644 index 000000000..a20e071f4 --- /dev/null +++ b/src/main/java/kitchenpos/order/takeoutorder/ui/TakeOutOrderController.java @@ -0,0 +1,4 @@ +package kitchenpos.order.takeoutorder.ui; + +public class TakeOutOrderController { +} diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/product/application/ProductService.java similarity index 88% rename from src/main/java/kitchenpos/products/application/ProductService.java rename to src/main/java/kitchenpos/product/application/ProductService.java index 20cf63996..3eb0c543c 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/product/application/ProductService.java @@ -1,19 +1,18 @@ -package kitchenpos.products.application; - -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.products.domain.Product; -import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +package kitchenpos.product.application; import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; import java.util.UUID; +import kitchenpos.common.application.PurgomalumClient; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service public class ProductService { diff --git a/src/main/java/kitchenpos/products/domain/Product.java b/src/main/java/kitchenpos/product/domain/model/Product.java similarity index 95% rename from src/main/java/kitchenpos/products/domain/Product.java rename to src/main/java/kitchenpos/product/domain/model/Product.java index ee2a7dfa9..5400716fb 100644 --- a/src/main/java/kitchenpos/products/domain/Product.java +++ b/src/main/java/kitchenpos/product/domain/model/Product.java @@ -1,10 +1,9 @@ -package kitchenpos.products.domain; +package kitchenpos.product.domain.model; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; - import java.math.BigDecimal; import java.util.UUID; diff --git a/src/main/java/kitchenpos/products/domain/ProductRepository.java b/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java similarity index 74% rename from src/main/java/kitchenpos/products/domain/ProductRepository.java rename to src/main/java/kitchenpos/product/domain/repository/ProductRepository.java index 3637e4232..b54094985 100644 --- a/src/main/java/kitchenpos/products/domain/ProductRepository.java +++ b/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java @@ -1,8 +1,9 @@ -package kitchenpos.products.domain; +package kitchenpos.product.domain.repository; import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.product.domain.model.Product; public interface ProductRepository { Product save(Product product); diff --git a/src/main/java/kitchenpos/products/domain/JpaProductRepository.java b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java similarity index 54% rename from src/main/java/kitchenpos/products/domain/JpaProductRepository.java rename to src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java index 90b069779..a519bd5b2 100644 --- a/src/main/java/kitchenpos/products/domain/JpaProductRepository.java +++ b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java @@ -1,8 +1,9 @@ -package kitchenpos.products.domain; - -import org.springframework.data.jpa.repository.JpaRepository; +package kitchenpos.product.infra.persistence; import java.util.UUID; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import org.springframework.data.jpa.repository.JpaRepository; public interface JpaProductRepository extends ProductRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/products/ui/ProductRestController.java b/src/main/java/kitchenpos/product/ui/ProductRestController.java similarity index 91% rename from src/main/java/kitchenpos/products/ui/ProductRestController.java rename to src/main/java/kitchenpos/product/ui/ProductRestController.java index c71c795a4..4623065aa 100644 --- a/src/main/java/kitchenpos/products/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/product/ui/ProductRestController.java @@ -1,7 +1,10 @@ -package kitchenpos.products.ui; +package kitchenpos.product.ui; -import kitchenpos.products.application.ProductService; -import kitchenpos.products.domain.Product; +import java.net.URI; +import java.util.List; +import java.util.UUID; +import kitchenpos.product.application.ProductService; +import kitchenpos.product.domain.model.Product; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -11,10 +14,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.net.URI; -import java.util.List; -import java.util.UUID; - @RequestMapping("/api/products") @RestController public class ProductRestController { diff --git a/src/main/java/kitchenpos/takeoutorders/empty.txt b/src/main/java/kitchenpos/takeoutorders/empty.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index da61c4529..e5825434f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ spring.datasource.password=password spring.datasource.url=jdbc:mysql://localhost:33306/kitchenpos spring.datasource.username=user spring.flyway.enabled=true -spring.jpa.hibernate.ddl-auto=validate +spring.jpa.hibernate.ddl-auto=create spring.jpa.properties.hibernate.format_sql=true spring.jpa.show-sql=true logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE diff --git a/src/main/resources/db/migration/V1__Initialize_project_tables.sql b/src/main/resources/db/migration/V1__Initialize_project_tables.sql index feb5d03b0..109184f3c 100644 --- a/src/main/resources/db/migration/V1__Initialize_project_tables.sql +++ b/src/main/resources/db/migration/V1__Initialize_project_tables.sql @@ -1,92 +1,92 @@ -create table menu -( - id binary(16) not null, - displayed bit not null, - name varchar(255) not null, - price decimal(19, 2) not null, - menu_group_id binary(16) not null, - primary key (id) -) engine = InnoDB; - -create table menu_group -( - id binary(16) not null, - name varchar(255) not null, - primary key (id) -) engine = InnoDB; - -create table menu_product -( - seq bigint not null auto_increment, - quantity bigint not null, - product_id binary(16) not null, - menu_id binary(16) not null, - primary key (seq) -) engine = InnoDB; - -create table order_line_item -( - seq bigint not null auto_increment, - quantity bigint not null, - menu_id binary(16) not null, - order_id binary(16) not null, - primary key (seq) -) engine = InnoDB; - -create table order_table -( - id binary(16) not null, - occupied bit not null, - name varchar(255) not null, - number_of_guests integer not null, - primary key (id) -) engine = InnoDB; - -create table orders -( - id binary(16) not null, - delivery_address varchar(255), - order_date_time datetime(6) not null, - status varchar(255) not null, - type varchar(255) not null, - order_table_id binary(16), - primary key (id) -) engine = InnoDB; - -create table product -( - id binary(16) not null, - name varchar(255) not null, - price decimal(19, 2) not null, - primary key (id) -) engine = InnoDB; - -alter table menu - add constraint fk_menu_to_menu_group - foreign key (menu_group_id) - references menu_group (id); - -alter table menu_product - add constraint fk_menu_product_to_product - foreign key (product_id) - references product (id); - -alter table menu_product - add constraint fk_menu_product_to_menu - foreign key (menu_id) - references menu (id); - -alter table order_line_item - add constraint fk_order_line_item_to_menu - foreign key (menu_id) - references menu (id); - -alter table order_line_item - add constraint fk_order_line_item_to_orders - foreign key (order_id) - references orders (id); - -alter table orders - add constraint fk_orders_to_order_table - foreign key (order_table_id) - references order_table (id); +-- create table menu +-- ( +-- id binary(16) not null, +-- displayed bit not null, +-- name varchar(255) not null, +-- price decimal(19, 2) not null, +-- menu_group_id binary(16) not null, +-- primary key (id) +-- ) engine = InnoDB; +-- +-- create table menu_group +-- ( +-- id binary(16) not null, +-- name varchar(255) not null, +-- primary key (id) +-- ) engine = InnoDB; +-- +-- create table menu_product +-- ( +-- seq bigint not null auto_increment, +-- quantity bigint not null, +-- product_id binary(16) not null, +-- menu_id binary(16) not null, +-- primary key (seq) +-- ) engine = InnoDB; +-- +-- create table order_line_item +-- ( +-- seq bigint not null auto_increment, +-- quantity bigint not null, +-- menu_id binary(16) not null, +-- order_id binary(16) not null, +-- primary key (seq) +-- ) engine = InnoDB; +-- +-- create table order_table +-- ( +-- id binary(16) not null, +-- occupied bit not null, +-- name varchar(255) not null, +-- number_of_guests integer not null, +-- primary key (id) +-- ) engine = InnoDB; +-- +-- create table orders +-- ( +-- id binary(16) not null, +-- delivery_address varchar(255), +-- order_date_time datetime(6) not null, +-- status varchar(255) not null, +-- type varchar(255) not null, +-- order_table_id binary(16), +-- primary key (id) +-- ) engine = InnoDB; +-- +-- create table product +-- ( +-- id binary(16) not null, +-- name varchar(255) not null, +-- price decimal(19, 2) not null, +-- primary key (id) +-- ) engine = InnoDB; +-- +-- alter table menu +-- add constraint fk_menu_to_menu_group +-- foreign key (menu_group_id) +-- references menu_group (id); +-- +-- alter table menu_product +-- add constraint fk_menu_product_to_product +-- foreign key (product_id) +-- references product (id); +-- +-- alter table menu_product +-- add constraint fk_menu_product_to_menu +-- foreign key (menu_id) +-- references menu (id); +-- +-- alter table order_line_item +-- add constraint fk_order_line_item_to_menu +-- foreign key (menu_id) +-- references menu (id); +-- +-- alter table order_line_item +-- add constraint fk_order_line_item_to_orders +-- foreign key (order_id) +-- references orders (id); +-- +-- alter table orders +-- add constraint fk_orders_to_order_table +-- foreign key (order_table_id) +-- references order_table (id); diff --git a/src/main/resources/db/migration/V2__Insert_default_data.sql b/src/main/resources/db/migration/V2__Insert_default_data.sql index 59ca0714f..372459494 100644 --- a/src/main/resources/db/migration/V2__Insert_default_data.sql +++ b/src/main/resources/db/migration/V2__Insert_default_data.sql @@ -1,80 +1,80 @@ -insert into product (id, name, price) -values (x'3b52824434f7406bbb7e690912f66b10', '후라이드', 16000); -insert into product (id, name, price) -values (x'c5ee925c3dbb4941b825021446f24446', '양념치킨', 16000); -insert into product (id, name, price) -values (x'625c6fc4145d408f8dd533c16ba26064', '반반치킨', 16000); -insert into product (id, name, price) -values (x'4721ee722ff3417fade3acd0a804605b', '통구이', 16000); -insert into product (id, name, price) -values (x'0ac16db71b024a87b9c1e7d8f226c48d', '간장치킨', 17000); -insert into product (id, name, price) -values (x'7de4b8affa0f4391aaa9c61ea9b40f83', '순살치킨', 17000); - -insert into menu_group (id, name) -values (x'f1860abc2ea1411bbd4abaa44f0d5580', '두마리메뉴'); -insert into menu_group (id, name) -values (x'cbc75faefeb04bb18be2cb8ce5d8fded', '한마리메뉴'); -insert into menu_group (id, name) -values (x'5e9879b761124791a4cef22e94af8752', '순살파닭두마리메뉴'); -insert into menu_group (id, name) -values (x'd9bc21accc104593b5064a40e0170e02', '신메뉴'); - -insert into menu (id, displayed, name, price, menu_group_id) -values (x'f59b1e1cb145440aaa6f6095a0e2d63b', true, '후라이드치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -insert into menu (id, displayed, name, price, menu_group_id) -values (x'e1254913860846aab23aa07c1dcbc648', true, '양념치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -insert into menu (id, displayed, name, price, menu_group_id) -values (x'191fa247b5f34b51b175e65db523f754', true, '반반치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -insert into menu (id, displayed, name, price, menu_group_id) -values (x'33e558df7d934622b50efcc4282cd184', true, '통구이', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -insert into menu (id, displayed, name, price, menu_group_id) -values (x'b9c670b04ef5409083496868df1c7d62', true, '간장치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -insert into menu (id, displayed, name, price, menu_group_id) -values (x'a64af6cac34d4cd882fe454abf512d1f', true, '순살치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); - -insert into menu_product (quantity, product_id, menu_id) -values (1, x'3b52824434f7406bbb7e690912f66b10', x'f59b1e1cb145440aaa6f6095a0e2d63b'); -insert into menu_product (quantity, product_id, menu_id) -values (1, x'c5ee925c3dbb4941b825021446f24446', x'e1254913860846aab23aa07c1dcbc648'); -insert into menu_product (quantity, product_id, menu_id) -values (1, x'625c6fc4145d408f8dd533c16ba26064', x'191fa247b5f34b51b175e65db523f754'); -insert into menu_product (quantity, product_id, menu_id) -values (1, x'4721ee722ff3417fade3acd0a804605b', x'33e558df7d934622b50efcc4282cd184'); -insert into menu_product (quantity, product_id, menu_id) -values (1, x'0ac16db71b024a87b9c1e7d8f226c48d', x'b9c670b04ef5409083496868df1c7d62'); -insert into menu_product (quantity, product_id, menu_id) -values (1, x'7de4b8affa0f4391aaa9c61ea9b40f83', x'a64af6cac34d4cd882fe454abf512d1f'); - -insert into order_table (id, occupied, name, number_of_guests) -values (x'8d71004329b6420e8452233f5a035520', false, '1번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'6ab59e8106eb441684e99faabc87c9ca', false, '2번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'ae92335ccd264626b7979e4ae8c4efbd', false, '3번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'a9858d4b80d0428881f48f41596a23fb', false, '4번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'3faec3ab5217405daaa2804f87697f84', false, '5번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'815b8395a2ad4e3589dc74c3b2191478', false, '6번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'7ce8b3a235454542ab9cb3d493bbd4fb', false, '7번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'7bdb1ffde36e4e2b94e3d2c14d391ef3', false, '8번', 0); - -insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) -values (x'69d78f383bff457cbb7226319c985fd8', '서울시 송파구 위례성대로 2', '2021-07-27', 'WAITING', 'DELIVERY', null); -insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) -values (x'98da3d3859e04dacbbaeebf6560a43bd', null, '2021-07-27', 'COMPLETED', 'EAT_IN', - x'8d71004329b6420e8452233f5a035520'); -insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) -values (x'd7cc15b3e32c4bc8b440d3067b35522e', null, '2021-07-27', 'COMPLETED', 'EAT_IN', - x'8d71004329b6420e8452233f5a035520'); - -insert into order_line_item (quantity, menu_id, order_id) -values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'69d78f383bff457cbb7226319c985fd8'); -insert into order_line_item (quantity, menu_id, order_id) -values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'98da3d3859e04dacbbaeebf6560a43bd'); -insert into order_line_item (quantity, menu_id, order_id) -values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'd7cc15b3e32c4bc8b440d3067b35522e'); +-- insert into product (id, name, price) +-- values (x'3b52824434f7406bbb7e690912f66b10', '후라이드', 16000); +-- insert into product (id, name, price) +-- values (x'c5ee925c3dbb4941b825021446f24446', '양념치킨', 16000); +-- insert into product (id, name, price) +-- values (x'625c6fc4145d408f8dd533c16ba26064', '반반치킨', 16000); +-- insert into product (id, name, price) +-- values (x'4721ee722ff3417fade3acd0a804605b', '통구이', 16000); +-- insert into product (id, name, price) +-- values (x'0ac16db71b024a87b9c1e7d8f226c48d', '간장치킨', 17000); +-- insert into product (id, name, price) +-- values (x'7de4b8affa0f4391aaa9c61ea9b40f83', '순살치킨', 17000); +-- +-- insert into menu_group (id, name) +-- values (x'f1860abc2ea1411bbd4abaa44f0d5580', '두마리메뉴'); +-- insert into menu_group (id, name) +-- values (x'cbc75faefeb04bb18be2cb8ce5d8fded', '한마리메뉴'); +-- insert into menu_group (id, name) +-- values (x'5e9879b761124791a4cef22e94af8752', '순살파닭두마리메뉴'); +-- insert into menu_group (id, name) +-- values (x'd9bc21accc104593b5064a40e0170e02', '신메뉴'); +-- +-- insert into menu (id, displayed, name, price, menu_group_id) +-- values (x'f59b1e1cb145440aaa6f6095a0e2d63b', true, '후라이드치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +-- insert into menu (id, displayed, name, price, menu_group_id) +-- values (x'e1254913860846aab23aa07c1dcbc648', true, '양념치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +-- insert into menu (id, displayed, name, price, menu_group_id) +-- values (x'191fa247b5f34b51b175e65db523f754', true, '반반치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +-- insert into menu (id, displayed, name, price, menu_group_id) +-- values (x'33e558df7d934622b50efcc4282cd184', true, '통구이', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +-- insert into menu (id, displayed, name, price, menu_group_id) +-- values (x'b9c670b04ef5409083496868df1c7d62', true, '간장치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +-- insert into menu (id, displayed, name, price, menu_group_id) +-- values (x'a64af6cac34d4cd882fe454abf512d1f', true, '순살치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +-- +-- insert into menu_product (quantity, product_id, menu_id) +-- values (1, x'3b52824434f7406bbb7e690912f66b10', x'f59b1e1cb145440aaa6f6095a0e2d63b'); +-- insert into menu_product (quantity, product_id, menu_id) +-- values (1, x'c5ee925c3dbb4941b825021446f24446', x'e1254913860846aab23aa07c1dcbc648'); +-- insert into menu_product (quantity, product_id, menu_id) +-- values (1, x'625c6fc4145d408f8dd533c16ba26064', x'191fa247b5f34b51b175e65db523f754'); +-- insert into menu_product (quantity, product_id, menu_id) +-- values (1, x'4721ee722ff3417fade3acd0a804605b', x'33e558df7d934622b50efcc4282cd184'); +-- insert into menu_product (quantity, product_id, menu_id) +-- values (1, x'0ac16db71b024a87b9c1e7d8f226c48d', x'b9c670b04ef5409083496868df1c7d62'); +-- insert into menu_product (quantity, product_id, menu_id) +-- values (1, x'7de4b8affa0f4391aaa9c61ea9b40f83', x'a64af6cac34d4cd882fe454abf512d1f'); +-- +-- insert into order_table (id, occupied, name, number_of_guests) +-- values (x'8d71004329b6420e8452233f5a035520', false, '1번', 0); +-- insert into order_table (id, occupied, name, number_of_guests) +-- values (x'6ab59e8106eb441684e99faabc87c9ca', false, '2번', 0); +-- insert into order_table (id, occupied, name, number_of_guests) +-- values (x'ae92335ccd264626b7979e4ae8c4efbd', false, '3번', 0); +-- insert into order_table (id, occupied, name, number_of_guests) +-- values (x'a9858d4b80d0428881f48f41596a23fb', false, '4번', 0); +-- insert into order_table (id, occupied, name, number_of_guests) +-- values (x'3faec3ab5217405daaa2804f87697f84', false, '5번', 0); +-- insert into order_table (id, occupied, name, number_of_guests) +-- values (x'815b8395a2ad4e3589dc74c3b2191478', false, '6번', 0); +-- insert into order_table (id, occupied, name, number_of_guests) +-- values (x'7ce8b3a235454542ab9cb3d493bbd4fb', false, '7번', 0); +-- insert into order_table (id, occupied, name, number_of_guests) +-- values (x'7bdb1ffde36e4e2b94e3d2c14d391ef3', false, '8번', 0); +-- +-- insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +-- values (x'69d78f383bff457cbb7226319c985fd8', '서울시 송파구 위례성대로 2', '2021-07-27', 'WAITING', 'DELIVERY', null); +-- insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +-- values (x'98da3d3859e04dacbbaeebf6560a43bd', null, '2021-07-27', 'COMPLETED', 'EAT_IN', +-- x'8d71004329b6420e8452233f5a035520'); +-- insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +-- values (x'd7cc15b3e32c4bc8b440d3067b35522e', null, '2021-07-27', 'COMPLETED', 'EAT_IN', +-- x'8d71004329b6420e8452233f5a035520'); +-- +-- insert into order_line_item (quantity, menu_id, order_id) +-- values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'69d78f383bff457cbb7226319c985fd8'); +-- insert into order_line_item (quantity, menu_id, order_id) +-- values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'98da3d3859e04dacbbaeebf6560a43bd'); +-- insert into order_line_item (quantity, menu_id, order_id) +-- values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'd7cc15b3e32c4bc8b440d3067b35522e'); diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index 434768a52..93b8a850d 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -1,20 +1,19 @@ package kitchenpos; -import kitchenpos.eatinorders.domain.Order; -import kitchenpos.eatinorders.domain.OrderLineItem; -import kitchenpos.eatinorders.domain.OrderStatus; -import kitchenpos.eatinorders.domain.OrderTable; -import kitchenpos.eatinorders.domain.OrderType; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.products.domain.Product; - import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Random; import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.common.model.OrderType; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.product.domain.model.Product; public class Fixtures { public static final UUID INVALID_ID = new UUID(0L, 0L); diff --git a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java b/src/test/java/kitchenpos/common/infra/external/FakePurgomalumClient.java similarity index 81% rename from src/test/java/kitchenpos/products/application/FakePurgomalumClient.java rename to src/test/java/kitchenpos/common/infra/external/FakePurgomalumClient.java index 3c4114798..33994a9c7 100644 --- a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java +++ b/src/test/java/kitchenpos/common/infra/external/FakePurgomalumClient.java @@ -1,9 +1,8 @@ -package kitchenpos.products.application; - -import kitchenpos.products.infra.PurgomalumClient; +package kitchenpos.common.infra.external; import java.util.Arrays; import java.util.List; +import kitchenpos.common.application.PurgomalumClient; public class FakePurgomalumClient implements PurgomalumClient { private static final List profanities; diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java similarity index 90% rename from src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java rename to src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java index a5fbc71d1..9f9d5f016 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java @@ -1,20 +1,20 @@ -package kitchenpos.menus.application; +package kitchenpos.menu.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import static kitchenpos.Fixtures.menuGroup; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.util.List; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.repository.MenuGroupRepository; +import kitchenpos.menu.infra.persistence.InMemoryMenuGroupRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import java.util.List; - -import static kitchenpos.Fixtures.menuGroup; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - class MenuGroupServiceTest { private MenuGroupRepository menuGroupRepository; private MenuGroupService menuGroupService; diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java similarity index 93% rename from src/test/java/kitchenpos/menus/application/MenuServiceTest.java rename to src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 277679118..1fc04839f 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -1,29 +1,4 @@ -package kitchenpos.menus.application; - -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuGroupRepository; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.products.application.FakePurgomalumClient; -import kitchenpos.products.application.InMemoryProductRepository; -import kitchenpos.products.domain.Product; -import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; +package kitchenpos.menu.application; import static kitchenpos.Fixtures.INVALID_ID; import static kitchenpos.Fixtures.menu; @@ -34,6 +9,32 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import kitchenpos.common.application.PurgomalumClient; +import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.menu.domain.repository.MenuGroupRepository; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.infra.persistence.InMemoryMenuGroupRepository; +import kitchenpos.menu.infra.persistence.InMemoryMenuRepository; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import kitchenpos.product.infra.persistence.InMemoryProductRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; + class MenuServiceTest { private MenuRepository menuRepository; private MenuGroupRepository menuGroupRepository; diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuGroupRepository.java similarity index 82% rename from src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java rename to src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuGroupRepository.java index 85962e6dc..d48d5d936 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuGroupRepository.java @@ -1,7 +1,4 @@ -package kitchenpos.menus.application; - -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +package kitchenpos.menu.infra.persistence; import java.util.ArrayList; import java.util.HashMap; @@ -9,6 +6,8 @@ import java.util.Map; import java.util.Optional; import java.util.UUID; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.repository.MenuGroupRepository; public class InMemoryMenuGroupRepository implements MenuGroupRepository { private final Map menuGroups = new HashMap<>(); diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuRepository.java similarity index 88% rename from src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java rename to src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuRepository.java index ca30b679c..09d02eea2 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuRepository.java @@ -1,7 +1,4 @@ -package kitchenpos.menus.application; - -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; +package kitchenpos.menu.infra.persistence; import java.util.ArrayList; import java.util.HashMap; @@ -9,6 +6,8 @@ import java.util.Map; import java.util.Optional; import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; public class InMemoryMenuRepository implements MenuRepository { private final Map menus = new HashMap<>(); diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java similarity index 95% rename from src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java rename to src/test/java/kitchenpos/order/common/application/OrderServiceTest.java index 8701fcaef..7bef51af1 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java @@ -1,31 +1,4 @@ -package kitchenpos.eatinorders.application; - -import kitchenpos.eatinorders.domain.Order; -import kitchenpos.eatinorders.domain.OrderLineItem; -import kitchenpos.eatinorders.domain.OrderRepository; -import kitchenpos.eatinorders.domain.OrderStatus; -import kitchenpos.eatinorders.domain.OrderTable; -import kitchenpos.eatinorders.domain.OrderTableRepository; -import kitchenpos.eatinorders.domain.OrderType; -import kitchenpos.menus.application.InMemoryMenuRepository; -import kitchenpos.menus.domain.MenuRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.EnumSource; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Random; -import java.util.UUID; +package kitchenpos.order.common.application; import static kitchenpos.Fixtures.INVALID_ID; import static kitchenpos.Fixtures.menu; @@ -37,6 +10,35 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.UUID; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.infra.persistence.InMemoryMenuRepository; +import kitchenpos.order.common.infra.persistence.InMemoryOrderRepository; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.common.model.OrderType; +import kitchenpos.order.common.repository.OrderRepository; +import kitchenpos.order.deliveryorder.infra.external.FakeKitchenridersClient; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.infra.persistence.InMemoryOrderTableRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; + class OrderServiceTest { private OrderRepository orderRepository; private MenuRepository menuRepository; diff --git a/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderRepository.java b/src/test/java/kitchenpos/order/common/infra/persistence/InMemoryOrderRepository.java similarity index 77% rename from src/test/java/kitchenpos/eatinorders/application/InMemoryOrderRepository.java rename to src/test/java/kitchenpos/order/common/infra/persistence/InMemoryOrderRepository.java index 85f27e38d..a26de70e1 100644 --- a/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderRepository.java +++ b/src/test/java/kitchenpos/order/common/infra/persistence/InMemoryOrderRepository.java @@ -1,9 +1,4 @@ -package kitchenpos.eatinorders.application; - -import kitchenpos.eatinorders.domain.Order; -import kitchenpos.eatinorders.domain.OrderRepository; -import kitchenpos.eatinorders.domain.OrderStatus; -import kitchenpos.eatinorders.domain.OrderTable; +package kitchenpos.order.common.infra.persistence; import java.util.ArrayList; import java.util.HashMap; @@ -11,6 +6,10 @@ import java.util.Map; import java.util.Optional; import java.util.UUID; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.common.repository.OrderRepository; +import kitchenpos.order.eatinorder.domain.model.OrderTable; public class InMemoryOrderRepository implements OrderRepository { private final Map orders = new HashMap<>(); diff --git a/src/test/java/kitchenpos/eatinorders/application/FakeKitchenridersClient.java b/src/test/java/kitchenpos/order/deliveryorder/infra/external/FakeKitchenridersClient.java similarity index 86% rename from src/test/java/kitchenpos/eatinorders/application/FakeKitchenridersClient.java rename to src/test/java/kitchenpos/order/deliveryorder/infra/external/FakeKitchenridersClient.java index 301e1377b..808733387 100644 --- a/src/test/java/kitchenpos/eatinorders/application/FakeKitchenridersClient.java +++ b/src/test/java/kitchenpos/order/deliveryorder/infra/external/FakeKitchenridersClient.java @@ -1,6 +1,4 @@ -package kitchenpos.eatinorders.application; - -import kitchenpos.deliveryorders.infra.KitchenridersClient; +package kitchenpos.order.deliveryorder.infra.external; import java.math.BigDecimal; import java.util.UUID; diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java similarity index 92% rename from src/test/java/kitchenpos/eatinorders/application/OrderTableServiceTest.java rename to src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index 01551a8d4..dc691b7ac 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -1,9 +1,19 @@ -package kitchenpos.eatinorders.application; +package kitchenpos.order.eatinorder.application; -import kitchenpos.eatinorders.domain.OrderRepository; -import kitchenpos.eatinorders.domain.OrderStatus; -import kitchenpos.eatinorders.domain.OrderTable; -import kitchenpos.eatinorders.domain.OrderTableRepository; +import static kitchenpos.Fixtures.order; +import static kitchenpos.Fixtures.orderTable; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.util.List; +import java.util.UUID; +import kitchenpos.order.common.infra.persistence.InMemoryOrderRepository; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.common.repository.OrderRepository; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.infra.persistence.InMemoryOrderTableRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -11,15 +21,6 @@ import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; -import java.util.List; -import java.util.UUID; - -import static kitchenpos.Fixtures.order; -import static kitchenpos.Fixtures.orderTable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - class OrderTableServiceTest { private OrderTableRepository orderTableRepository; private OrderRepository orderRepository; diff --git a/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderTableRepository.java b/src/test/java/kitchenpos/order/eatinorder/infra/persistence/InMemoryOrderTableRepository.java similarity index 78% rename from src/test/java/kitchenpos/eatinorders/application/InMemoryOrderTableRepository.java rename to src/test/java/kitchenpos/order/eatinorder/infra/persistence/InMemoryOrderTableRepository.java index 663de6289..990542d2b 100644 --- a/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderTableRepository.java +++ b/src/test/java/kitchenpos/order/eatinorder/infra/persistence/InMemoryOrderTableRepository.java @@ -1,7 +1,4 @@ -package kitchenpos.eatinorders.application; - -import kitchenpos.eatinorders.domain.OrderTable; -import kitchenpos.eatinorders.domain.OrderTableRepository; +package kitchenpos.order.eatinorder.infra.persistence; import java.util.ArrayList; import java.util.HashMap; @@ -9,6 +6,8 @@ import java.util.Map; import java.util.Optional; import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; public class InMemoryOrderTableRepository implements OrderTableRepository { private final Map orderTables = new HashMap<>(); diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/product/application/ProductServiceTest.java similarity index 90% rename from src/test/java/kitchenpos/products/application/ProductServiceTest.java rename to src/test/java/kitchenpos/product/application/ProductServiceTest.java index 74a31073e..18f5cf1b5 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/product/application/ProductServiceTest.java @@ -1,21 +1,4 @@ -package kitchenpos.products.application; - -import kitchenpos.menus.application.InMemoryMenuRepository; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.products.domain.Product; -import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; - -import java.math.BigDecimal; -import java.util.List; -import java.util.UUID; +package kitchenpos.product.application; import static kitchenpos.Fixtures.menu; import static kitchenpos.Fixtures.menuProduct; @@ -24,6 +7,24 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; +import kitchenpos.common.application.PurgomalumClient; +import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.infra.persistence.InMemoryMenuRepository; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import kitchenpos.product.infra.persistence.InMemoryProductRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; + class ProductServiceTest { private ProductRepository productRepository; private MenuRepository menuRepository; diff --git a/src/test/java/kitchenpos/products/application/InMemoryProductRepository.java b/src/test/java/kitchenpos/product/infra/persistence/InMemoryProductRepository.java similarity index 85% rename from src/test/java/kitchenpos/products/application/InMemoryProductRepository.java rename to src/test/java/kitchenpos/product/infra/persistence/InMemoryProductRepository.java index b55c5ec5e..d96ec2e56 100644 --- a/src/test/java/kitchenpos/products/application/InMemoryProductRepository.java +++ b/src/test/java/kitchenpos/product/infra/persistence/InMemoryProductRepository.java @@ -1,7 +1,4 @@ -package kitchenpos.products.application; - -import kitchenpos.products.domain.Product; -import kitchenpos.products.domain.ProductRepository; +package kitchenpos.product.infra.persistence; import java.util.ArrayList; import java.util.HashMap; @@ -9,6 +6,8 @@ import java.util.Map; import java.util.Optional; import java.util.UUID; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; public class InMemoryProductRepository implements ProductRepository { private final Map products = new HashMap<>(); From f6c6f9d1dc07ba4b205239056db5a3eb00d4af83 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 18 Feb 2025 07:38:51 +0900 Subject: [PATCH 02/71] =?UTF-8?q?[Step1]=201=EB=8B=A8=EA=B3=84=20-=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81(=EC=83=81=ED=92=88)=20(#33?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(kitchen pos) : InMemoryProductRepository 패키지 구조 옮기기 * refactor(kitchen pos) : sql script 가 작동하도록 DeliveryOrder 주석 처리 * feat(kitchen pos) : 첫번째 미션에서 수행한 테스트 코드 다시 가져오기 * fix(kitchen pos) : 레거시 코드의 마진이 남지 않는 문제 코드 수정 * fix(kitchen pos) : ControllerTest 들이 pathVariable을 잘 인식하도록 문자열 추가 * feat(kitchen pos) : 첫번째 미션에 존재하는 Menu name 빈 문자열 검증 로직 추가 * feat(kitchen pos) : 예외를 처리할 수 있도록 ExceptionHandler 추가 * style(kitchen pos) : import 문 최적화 및 정렬 * feat(kitchen pos) : 이름 생성 객체 추가 * feat(kitchen pos) : 가격 생성 객체 추가 * feat(kitchen pos) : NameCreationService 추가 및 NameCreationService 만 Name 생성 책임을 가질 수 있도록 protected 접근 제어자 사용 * refactor(kitchen pos) : Name, Price, NameCreationService 코드에 적용 * refactor(kitchen pos) : Name, Price Embeddable 설정 및 기본 생성자 null 초기화 * feat(kitchen pos) : Name, Price equals & hashcode 추가 * feat(kitchen pos) : 마진을 검증하는 MarginValidator 생성 및 적용 * refactor(kitchen pos) : MarginValidator -> ProductServiceTest 에 적용 * refactor(kitchen pos) : import 문 최적화 및 필요없는 종속성 로컬 변수로 수정하기 * chore(kitchen pos) : 첫번째 미션에서 가져온 테스트 코드 패키지 구조 변경 * fix(kitchen pos) : ProductRestControllerTest 실패 해결 ~> jsonPath expression 수정 * fix(kitchen pos) : 필요 없는 애노테이션 제거 * refactor(kitchen pos) : Name -> ProductName, Menu -> ProductMenu * refactor(kitchen pos) : NameCreationService -> ProductNameCreationService * refactor(kitchen pos) : MarginValidator 가 MenuRepository에 강하게 의존하고 있어 패키지 이동 --- README.md | 20 +- build.gradle.kts | 4 +- .../exception/GlobalExceptionHandler.java | 19 + .../external/DefaultPurgomalumClient.java | 6 +- .../menu/application/MenuService.java | 48 +- .../kitchenpos/menu/domain/model/Menu.java | 39 +- .../menu/domain/model/MenuGroup.java | 9 + .../menu/domain/model/MenuProduct.java | 12 +- .../menu/domain/service/MarginValidator.java | 40 ++ .../menu/ui/MenuGroupRestController.java | 2 +- .../menu/ui/MenuRestController.java | 9 +- .../common/application/OrderService.java | 32 +- .../kitchenpos/order/common/model/Order.java | 31 +- .../order/common/model/OrderLineItem.java | 13 +- .../order/common/ui/OrderRestController.java | 12 +- .../domain/model/DeliveryOrder.java | 17 +- .../application/OrderTableService.java | 6 +- .../eatinorder/domain/model/OrderTable.java | 11 + .../ui/OrderTableRestController.java | 12 +- .../product/application/ProductService.java | 63 +- .../product/domain/model/Product.java | 46 +- .../product/domain/model/ProductName.java | 49 ++ .../model/ProductNameCreationService.java | 21 + .../product/domain/model/ProductPrice.java | 50 ++ .../product/ui/ProductRestController.java | 5 +- src/main/resources/application.properties | 2 +- .../V1__Initialize_project_tables.sql | 184 ++--- .../db/migration/V2__Insert_default_data.sql | 160 ++--- src/test/java/kitchenpos/Fixtures.java | 130 ---- .../java/kitchenpos/TestFixtureFactory.java | 114 +++ .../infra/external/FakePurgomalumClient.java | 16 +- .../application/MenuGroupServiceTest.java | 75 +- .../menu/application/MenuServiceTest.java | 356 +++++----- .../domain/service/MarginValidatorTest.java | 49 ++ .../persistence/FakeMenuGroupRepository.java | 36 + .../infra/persistence/FakeMenuRepository.java | 60 ++ .../InMemoryMenuGroupRepository.java | 30 - .../persistence/InMemoryMenuRepository.java | 46 -- .../menu/ui/MenuGroupRestControllerTest.java | 64 ++ .../menu/ui/MenuRestControllerTest.java | 195 +++++ .../common/application/OrderServiceTest.java | 665 ++++++++---------- .../persistence/InMemoryOrderRepository.java | 39 - .../common/ui/OrderRestControllerTest.java | 230 ++++++ .../external/FakeKitchenridersClient.java | 29 - .../application/OrderTableServiceTest.java | 198 +++--- .../InMemoryOrderTableRepository.java | 30 - .../ui/OrderTableRestControllerTest.java | 135 ++++ .../application/ProductServiceTest.java | 171 ++--- .../model/ProductNameCreationServiceTest.java | 35 + .../product/domain/model/ProductNameTest.java | 20 + .../domain/model/ProductPriceTest.java | 28 + .../persistence/FakeProductRepository.java | 43 ++ .../InMemoryProductRepository.java | 38 - .../product/ui/ProductRestControllerTest.java | 101 +++ 54 files changed, 2410 insertions(+), 1445 deletions(-) create mode 100644 src/main/java/kitchenpos/common/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/kitchenpos/menu/domain/service/MarginValidator.java rename src/main/java/kitchenpos/order/{common => eatinorder}/ui/OrderTableRestController.java (82%) create mode 100644 src/main/java/kitchenpos/product/domain/model/ProductName.java create mode 100644 src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java create mode 100644 src/main/java/kitchenpos/product/domain/model/ProductPrice.java delete mode 100644 src/test/java/kitchenpos/Fixtures.java create mode 100644 src/test/java/kitchenpos/TestFixtureFactory.java create mode 100644 src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java create mode 100644 src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java create mode 100644 src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java delete mode 100644 src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuGroupRepository.java delete mode 100644 src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuRepository.java create mode 100644 src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java create mode 100644 src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java delete mode 100644 src/test/java/kitchenpos/order/common/infra/persistence/InMemoryOrderRepository.java create mode 100644 src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java delete mode 100644 src/test/java/kitchenpos/order/deliveryorder/infra/external/FakeKitchenridersClient.java delete mode 100644 src/test/java/kitchenpos/order/eatinorder/infra/persistence/InMemoryOrderTableRepository.java create mode 100644 src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java create mode 100644 src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java create mode 100644 src/test/java/kitchenpos/product/domain/model/ProductNameTest.java create mode 100644 src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java create mode 100644 src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java delete mode 100644 src/test/java/kitchenpos/product/infra/persistence/InMemoryProductRepository.java create mode 100644 src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java diff --git a/README.md b/README.md index 0facb592e..ff8c2e40f 100644 --- a/README.md +++ b/README.md @@ -13,12 +13,12 @@ docker compose -p kitchenpos up -d - 상품을 등록할 수 있다. - 상품의 가격이 올바르지 않으면 등록할 수 없다. - - 상품의 가격은 0원 이상이어야 한다. + - 상품의 가격은 0원 이상이어야 한다. - 상품의 이름이 올바르지 않으면 등록할 수 없다. - - 상품의 이름에는 비속어가 포함될 수 없다. + - 상품의 이름에는 비속어가 포함될 수 없다. - 상품의 가격을 변경할 수 있다. - 상품의 가격이 올바르지 않으면 변경할 수 없다. - - 상품의 가격은 0원 이상이어야 한다. + - 상품의 가격은 0원 이상이어야 한다. - 상품의 가격이 변경될 때 메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 크면 메뉴가 숨겨진다. - 상품의 목록을 조회할 수 있다. @@ -26,7 +26,7 @@ docker compose -p kitchenpos up -d - 메뉴 그룹을 등록할 수 있다. - 메뉴 그룹의 이름이 올바르지 않으면 등록할 수 없다. - - 메뉴 그룹의 이름은 비워 둘 수 없다. + - 메뉴 그룹의 이름은 비워 둘 수 없다. - 메뉴 그룹의 목록을 조회할 수 있다. ### 메뉴 @@ -35,14 +35,14 @@ docker compose -p kitchenpos up -d - 상품이 없으면 등록할 수 없다. - 메뉴에 속한 상품의 수량은 0 이상이어야 한다. - 메뉴의 가격이 올바르지 않으면 등록할 수 없다. - - 메뉴의 가격은 0원 이상이어야 한다. + - 메뉴의 가격은 0원 이상이어야 한다. - 메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다. - 메뉴는 특정 메뉴 그룹에 속해야 한다. - 메뉴의 이름이 올바르지 않으면 등록할 수 없다. - - 메뉴의 이름에는 비속어가 포함될 수 없다. + - 메뉴의 이름에는 비속어가 포함될 수 없다. - 메뉴의 가격을 변경할 수 있다. - 메뉴의 가격이 올바르지 않으면 변경할 수 없다. - - 메뉴의 가격은 0원 이상이어야 한다. + - 메뉴의 가격은 0원 이상이어야 한다. - 메뉴를 노출할 수 있다. - 메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 높을 경우 메뉴를 노출할 수 없다. - 메뉴를 숨길 수 있다. @@ -52,13 +52,13 @@ docker compose -p kitchenpos up -d - 주문 테이블을 등록할 수 있다. - 주문 테이블의 이름이 올바르지 않으면 등록할 수 없다. - - 주문 테이블의 이름은 비워 둘 수 없다. + - 주문 테이블의 이름은 비워 둘 수 없다. - 빈 테이블을 해지할 수 있다. - 빈 테이블로 설정할 수 있다. - 완료되지 않은 주문이 있는 주문 테이블은 빈 테이블로 설정할 수 없다. - 방문한 손님 수를 변경할 수 있다. - 방문한 손님 수가 올바르지 않으면 변경할 수 없다. - - 방문한 손님 수는 0 이상이어야 한다. + - 방문한 손님 수는 0 이상이어야 한다. - 빈 테이블은 방문한 손님 수를 변경할 수 없다. - 주문 테이블의 목록을 조회할 수 있다. @@ -72,7 +72,7 @@ docker compose -p kitchenpos up -d - 매장 주문은 주문 항목의 수량이 0 미만일 수 있다. - 매장 주문을 제외한 주문의 경우 주문 항목의 수량은 0 이상이어야 한다. - 배달 주소가 올바르지 않으면 배달 주문을 등록할 수 없다. - - 배달 주소는 비워 둘 수 없다. + - 배달 주소는 비워 둘 수 없다. - 빈 테이블에는 매장 주문을 등록할 수 없다. - 숨겨진 메뉴는 주문할 수 없다. - 주문한 메뉴의 가격은 실제 메뉴 가격과 일치해야 한다. diff --git a/build.gradle.kts b/build.gradle.kts index b04367191..67ab16154 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,8 +26,8 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") -// implementation("org.flywaydb:flyway-core") -// implementation("org.flywaydb:flyway-mysql") + implementation("org.flywaydb:flyway-core") + implementation("org.flywaydb:flyway-mysql") implementation("org.jetbrains.kotlin:kotlin-reflect") runtimeOnly("com.h2database:h2") runtimeOnly("com.mysql:mysql-connector-j") diff --git a/src/main/java/kitchenpos/common/exception/GlobalExceptionHandler.java b/src/main/java/kitchenpos/common/exception/GlobalExceptionHandler.java new file mode 100644 index 000000000..353d5b25d --- /dev/null +++ b/src/main/java/kitchenpos/common/exception/GlobalExceptionHandler.java @@ -0,0 +1,19 @@ +package kitchenpos.common.exception; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity handleIllegalArgument(IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + + @ExceptionHandler(IllegalStateException.class) + public ResponseEntity handleIllegalState(IllegalStateException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } +} diff --git a/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java index d38831d2f..a4d421c88 100644 --- a/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java @@ -18,9 +18,9 @@ public DefaultPurgomalumClient(final RestTemplateBuilder restTemplateBuilder) { @Override public boolean containsProfanity(final String text) { final URI url = UriComponentsBuilder.fromUriString("https://www.purgomalum.com/service/containsprofanity") - .queryParam("text", text) - .build() - .toUri(); + .queryParam("text", text) + .build() + .toUri(); return Boolean.parseBoolean(restTemplate.getForObject(url, String.class)); } } diff --git a/src/main/java/kitchenpos/menu/application/MenuService.java b/src/main/java/kitchenpos/menu/application/MenuService.java index a7a06fdd3..1fa1611ac 100644 --- a/src/main/java/kitchenpos/menu/application/MenuService.java +++ b/src/main/java/kitchenpos/menu/application/MenuService.java @@ -25,10 +25,10 @@ public class MenuService { private final PurgomalumClient purgomalumClient; public MenuService( - final MenuRepository menuRepository, - final MenuGroupRepository menuGroupRepository, - final ProductRepository productRepository, - final PurgomalumClient purgomalumClient + final MenuRepository menuRepository, + final MenuGroupRepository menuGroupRepository, + final ProductRepository productRepository, + final PurgomalumClient purgomalumClient ) { this.menuRepository = menuRepository; this.menuGroupRepository = menuGroupRepository; @@ -43,15 +43,15 @@ public Menu create(final Menu request) { throw new IllegalArgumentException(); } final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); final List menuProductRequests = request.getMenuProducts(); if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) { throw new IllegalArgumentException(); } final List products = productRepository.findAllByIdIn( - menuProductRequests.stream() - .map(MenuProduct::getProductId) - .toList() + menuProductRequests.stream() + .map(MenuProduct::getProductId) + .toList() ); if (products.size() != menuProductRequests.size()) { throw new IllegalArgumentException(); @@ -64,21 +64,21 @@ public Menu create(final Menu request) { throw new IllegalArgumentException(); } final Product product = productRepository.findById(menuProductRequest.getProductId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); sum = sum.add( - product.getPrice() - .multiply(BigDecimal.valueOf(quantity)) + product.getInnerPrice() + .multiply(BigDecimal.valueOf(quantity)) ); final MenuProduct menuProduct = new MenuProduct(); menuProduct.setProduct(product); menuProduct.setQuantity(quantity); menuProducts.add(menuProduct); } - if (price.compareTo(sum) > 0) { + if (price.compareTo(sum) < 0) { throw new IllegalArgumentException(); } final String name = request.getName(); - if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { + if (Objects.isNull(name) || name.isEmpty() || purgomalumClient.containsProfanity(name)) { throw new IllegalArgumentException(); } final Menu menu = new Menu(); @@ -98,16 +98,16 @@ public Menu changePrice(final UUID menuId, final Menu request) { throw new IllegalArgumentException(); } final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); BigDecimal sum = BigDecimal.ZERO; for (final MenuProduct menuProduct : menu.getMenuProducts()) { sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) + menuProduct.getProduct() + .getInnerPrice() + .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) ); } - if (price.compareTo(sum) > 0) { + if (price.compareTo(sum) < 0) { throw new IllegalArgumentException(); } menu.setPrice(price); @@ -117,16 +117,16 @@ public Menu changePrice(final UUID menuId, final Menu request) { @Transactional public Menu display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); BigDecimal sum = BigDecimal.ZERO; for (final MenuProduct menuProduct : menu.getMenuProducts()) { sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) + menuProduct.getProduct() + .getInnerPrice() + .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) ); } - if (menu.getPrice().compareTo(sum) > 0) { + if (menu.getPrice().compareTo(sum) < 0) { throw new IllegalStateException(); } menu.setDisplayed(true); @@ -136,7 +136,7 @@ public Menu display(final UUID menuId) { @Transactional public Menu hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); menu.setDisplayed(false); return menu; } diff --git a/src/main/java/kitchenpos/menu/domain/model/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java index 6fe259b96..48432c41e 100644 --- a/src/main/java/kitchenpos/menu/domain/model/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -29,9 +29,9 @@ public class Menu { @ManyToOne(optional = false) @JoinColumn( - name = "menu_group_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") + name = "menu_group_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") ) private MenuGroup menuGroup; @@ -40,10 +40,10 @@ public class Menu { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( - name = "menu_id", - nullable = false, - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") + name = "menu_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") ) private List menuProducts; @@ -53,6 +53,23 @@ public class Menu { public Menu() { } + public Menu(UUID id, String name, BigDecimal price, boolean displayed, List menuProducts, + MenuGroup menuGroup, + UUID menuGroupId) { + this.id = id; + this.name = name; + this.price = price; + this.displayed = displayed; + this.menuProducts = menuProducts; + this.menuGroup = menuGroup; + this.menuGroupId = menuGroupId; + } + + public Menu(String name, BigDecimal price, boolean displayed, List menuProducts, MenuGroup menuGroup, + UUID menuGroupId) { + this(UUID.randomUUID(), name, price, displayed, menuProducts, menuGroup, menuGroupId); + } + public UUID getId() { return id; } @@ -93,6 +110,10 @@ public void setDisplayed(final boolean displayed) { this.displayed = displayed; } + public void changeDisplay() { + this.displayed = !this.displayed; + } + public List getMenuProducts() { return menuProducts; } @@ -104,8 +125,4 @@ public void setMenuProducts(final List menuProducts) { public UUID getMenuGroupId() { return menuGroupId; } - - public void setMenuGroupId(final UUID menuGroupId) { - this.menuGroupId = menuGroupId; - } } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java index f0097e9c3..92ecc5cf7 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java @@ -19,6 +19,15 @@ public class MenuGroup { public MenuGroup() { } + public MenuGroup(String name, UUID id) { + this.name = name; + this.id = id; + } + + public MenuGroup(String name) { + this(name, UUID.randomUUID()); + } + public UUID getId() { return id; } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java index 056bcc4a4..b065b1394 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java @@ -23,9 +23,9 @@ public class MenuProduct { @ManyToOne(optional = false) @JoinColumn( - name = "product_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_product") + name = "product_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_product_to_product") ) private Product product; @@ -38,6 +38,12 @@ public class MenuProduct { public MenuProduct() { } + public MenuProduct(long quantity, Product product, UUID productId) { + this.quantity = quantity; + this.product = product; + this.productId = productId; + } + public Long getSeq() { return seq; } diff --git a/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java b/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java new file mode 100644 index 000000000..825cd78bd --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java @@ -0,0 +1,40 @@ +package kitchenpos.menu.domain.service; + +import java.math.BigDecimal; +import java.util.List; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.product.domain.model.Product; +import org.springframework.stereotype.Service; + +@Service +public class MarginValidator { + + private final MenuRepository menuRepository; + + public MarginValidator(MenuRepository menuRepository) { + this.menuRepository = menuRepository; + } + + public void checkMargin(Product product) { + List menus = menuRepository.findAllByProductId(product.getId()); + for (Menu menu : menus) { + checkMargin(menu); + } + } + + private void checkMargin(Menu menu) { + BigDecimal sum = BigDecimal.ZERO; + for (final MenuProduct menuProduct : menu.getMenuProducts()) { + sum = sum.add( + menuProduct.getProduct() + .getInnerPrice() + .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) + ); + } + if (menu.getPrice().compareTo(sum) < 0) { + menu.changeDisplay(); + } + } +} diff --git a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java index 141d95219..bc89f2359 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java @@ -24,7 +24,7 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { public ResponseEntity create(@RequestBody final MenuGroup request) { final MenuGroup response = menuGroupService.create(request); return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getId())) - .body(response); + .body(response); } @GetMapping diff --git a/src/main/java/kitchenpos/menu/ui/MenuRestController.java b/src/main/java/kitchenpos/menu/ui/MenuRestController.java index fd729b5db..f0d7c8f41 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuRestController.java @@ -27,21 +27,22 @@ public MenuRestController(final MenuService menuService) { public ResponseEntity create(@RequestBody final Menu request) { final Menu response = menuService.create(request); return ResponseEntity.created(URI.create("/api/menus/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{menuId}/price") - public ResponseEntity changePrice(@PathVariable final UUID menuId, @RequestBody final Menu request) { + public ResponseEntity changePrice(@PathVariable("menuId") final UUID menuId, + @RequestBody final Menu request) { return ResponseEntity.ok(menuService.changePrice(menuId, request)); } @PutMapping("/{menuId}/display") - public ResponseEntity display(@PathVariable final UUID menuId) { + public ResponseEntity display(@PathVariable("menuId") final UUID menuId) { return ResponseEntity.ok(menuService.display(menuId)); } @PutMapping("/{menuId}/hide") - public ResponseEntity hide(@PathVariable final UUID menuId) { + public ResponseEntity hide(@PathVariable("menuId") final UUID menuId) { return ResponseEntity.ok(menuService.hide(menuId)); } diff --git a/src/main/java/kitchenpos/order/common/application/OrderService.java b/src/main/java/kitchenpos/order/common/application/OrderService.java index 42a6159f6..76af7bb1e 100644 --- a/src/main/java/kitchenpos/order/common/application/OrderService.java +++ b/src/main/java/kitchenpos/order/common/application/OrderService.java @@ -28,10 +28,10 @@ public class OrderService { private final KitchenridersClient kitchenridersClient; public OrderService( - final OrderRepository orderRepository, - final MenuRepository menuRepository, - final OrderTableRepository orderTableRepository, - final KitchenridersClient kitchenridersClient + final OrderRepository orderRepository, + final MenuRepository menuRepository, + final OrderTableRepository orderTableRepository, + final KitchenridersClient kitchenridersClient ) { this.orderRepository = orderRepository; this.menuRepository = menuRepository; @@ -50,9 +50,9 @@ public Order create(final Order request) { throw new IllegalArgumentException(); } final List menus = menuRepository.findAllByIdIn( - orderLineItemRequests.stream() - .map(OrderLineItem::getMenuId) - .toList() + orderLineItemRequests.stream() + .map(OrderLineItem::getMenuId) + .toList() ); if (menus.size() != orderLineItemRequests.size()) { throw new IllegalArgumentException(); @@ -66,7 +66,7 @@ public Order create(final Order request) { } } final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (!menu.isDisplayed()) { throw new IllegalStateException(); } @@ -93,7 +93,7 @@ public Order create(final Order request) { } if (type == OrderType.EAT_IN) { final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (!orderTable.isOccupied()) { throw new IllegalStateException(); } @@ -105,7 +105,7 @@ public Order create(final Order request) { @Transactional public Order accept(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getStatus() != OrderStatus.WAITING) { throw new IllegalStateException(); } @@ -113,8 +113,8 @@ public Order accept(final UUID orderId) { BigDecimal sum = BigDecimal.ZERO; for (final OrderLineItem orderLineItem : order.getOrderLineItems()) { sum = orderLineItem.getMenu() - .getPrice() - .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())); + .getPrice() + .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())); } kitchenridersClient.requestDelivery(orderId, sum, order.getDeliveryAddress()); } @@ -125,7 +125,7 @@ public Order accept(final UUID orderId) { @Transactional public Order serve(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getStatus() != OrderStatus.ACCEPTED) { throw new IllegalStateException(); } @@ -136,7 +136,7 @@ public Order serve(final UUID orderId) { @Transactional public Order startDelivery(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getType() != OrderType.DELIVERY) { throw new IllegalStateException(); } @@ -150,7 +150,7 @@ public Order startDelivery(final UUID orderId) { @Transactional public Order completeDelivery(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getStatus() != OrderStatus.DELIVERING) { throw new IllegalStateException(); } @@ -161,7 +161,7 @@ public Order completeDelivery(final UUID orderId) { @Transactional public Order complete(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); final OrderType type = order.getType(); final OrderStatus status = order.getStatus(); if (type == OrderType.DELIVERY) { diff --git a/src/main/java/kitchenpos/order/common/model/Order.java b/src/main/java/kitchenpos/order/common/model/Order.java index 3d7d0ba41..ff4edfb13 100644 --- a/src/main/java/kitchenpos/order/common/model/Order.java +++ b/src/main/java/kitchenpos/order/common/model/Order.java @@ -37,10 +37,10 @@ public class Order { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( - name = "order_id", - nullable = false, - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") + name = "order_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") ) private List orderLineItems; @@ -49,9 +49,9 @@ public class Order { @ManyToOne @JoinColumn( - name = "order_table_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_orders_to_order_table") + name = "order_table_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_orders_to_order_table") ) private OrderTable orderTable; @@ -61,6 +61,23 @@ public class Order { public Order() { } + public Order(UUID id, OrderType type, OrderStatus status, LocalDateTime orderDateTime, + List orderLineItems, String deliveryAddress, OrderTable orderTable, UUID orderTableId) { + this.id = id; + this.type = type; + this.status = status; + this.orderDateTime = orderDateTime; + this.orderLineItems = orderLineItems; + this.deliveryAddress = deliveryAddress; + this.orderTable = orderTable; + this.orderTableId = orderTableId; + } + + public Order(OrderType type, OrderStatus status, LocalDateTime orderDateTime, + List orderLineItems, String deliveryAddress, OrderTable orderTable, UUID orderTableId) { + this(UUID.randomUUID(), type, status, orderDateTime, orderLineItems, deliveryAddress, orderTable, orderTableId); + } + public UUID getId() { return id; } diff --git a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java index 67a5a8691..ecd62fb3c 100644 --- a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java +++ b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java @@ -24,9 +24,9 @@ public class OrderLineItem { @ManyToOne(optional = false) @JoinColumn( - name = "menu_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu") + name = "menu_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu") ) private Menu menu; @@ -42,6 +42,13 @@ public class OrderLineItem { public OrderLineItem() { } + public OrderLineItem(Menu menu, long quantity, UUID menuId, BigDecimal price) { + this.menu = menu; + this.quantity = quantity; + this.menuId = menuId; + this.price = price; + } + public Long getSeq() { return seq; } diff --git a/src/main/java/kitchenpos/order/common/ui/OrderRestController.java b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java index 7aa25b614..7fa233224 100644 --- a/src/main/java/kitchenpos/order/common/ui/OrderRestController.java +++ b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java @@ -27,31 +27,31 @@ public OrderRestController(final OrderService orderService) { public ResponseEntity create(@RequestBody final Order request) { final Order response = orderService.create(request); return ResponseEntity.created(URI.create("/api/orders/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{orderId}/accept") - public ResponseEntity accept(@PathVariable final UUID orderId) { + public ResponseEntity accept(@PathVariable("orderId") final UUID orderId) { return ResponseEntity.ok(orderService.accept(orderId)); } @PutMapping("/{orderId}/serve") - public ResponseEntity serve(@PathVariable final UUID orderId) { + public ResponseEntity serve(@PathVariable("orderId") final UUID orderId) { return ResponseEntity.ok(orderService.serve(orderId)); } @PutMapping("/{orderId}/start-delivery") - public ResponseEntity startDelivery(@PathVariable final UUID orderId) { + public ResponseEntity startDelivery(@PathVariable("orderId") final UUID orderId) { return ResponseEntity.ok(orderService.startDelivery(orderId)); } @PutMapping("/{orderId}/complete-delivery") - public ResponseEntity completeDelivery(@PathVariable final UUID orderId) { + public ResponseEntity completeDelivery(@PathVariable("orderId") final UUID orderId) { return ResponseEntity.ok(orderService.completeDelivery(orderId)); } @PutMapping("/{orderId}/complete") - public ResponseEntity complete(@PathVariable final UUID orderId) { + public ResponseEntity complete(@PathVariable("orderId") final UUID orderId) { return ResponseEntity.ok(orderService.complete(orderId)); } diff --git a/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrder.java b/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrder.java index da931a91f..17495dd38 100644 --- a/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrder.java +++ b/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrder.java @@ -1,24 +1,19 @@ package kitchenpos.order.deliveryorder.domain.model; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Enumerated; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; import java.time.LocalDateTime; import java.util.UUID; -@Entity +//@Entity public class DeliveryOrder { - @Id - @GeneratedValue + // @Id +// @GeneratedValue private UUID id; - @Enumerated + // @Enumerated private DeliveryOrderFlow orderFlow; - @Column(name = "order_date_time", nullable = false) + // @Column(name = "order_date_time", nullable = false) private LocalDateTime orderDateTime; // @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @@ -30,7 +25,7 @@ public class DeliveryOrder { // ) // private List orderLineItems; - @Column(name = "delivery_address") + // @Column(name = "delivery_address") private String deliveryAddress; public boolean validateOrderFlowAndFindNextStep(DeliveryOrderStatus orderStatus) { diff --git a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index f7184ff3f..c78070fb9 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -38,7 +38,7 @@ public OrderTable create(final OrderTable request) { @Transactional public OrderTable sit(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); orderTable.setOccupied(true); return orderTable; } @@ -46,7 +46,7 @@ public OrderTable sit(final UUID orderTableId) { @Transactional public OrderTable clear(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { throw new IllegalStateException(); } @@ -62,7 +62,7 @@ public OrderTable changeNumberOfGuests(final UUID orderTableId, final OrderTable throw new IllegalArgumentException(); } final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (!orderTable.isOccupied()) { throw new IllegalStateException(); } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java index 7e5462a70..9064050d7 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java @@ -25,6 +25,17 @@ public class OrderTable { public OrderTable() { } + public OrderTable(UUID id, String name, int numberOfGuests, boolean occupied) { + this.id = id; + this.name = name; + this.numberOfGuests = numberOfGuests; + this.occupied = occupied; + } + + public OrderTable(String name, int numberOfGuests, boolean occupied) { + this(UUID.randomUUID(), name, numberOfGuests, occupied); + } + public UUID getId() { return id; } diff --git a/src/main/java/kitchenpos/order/common/ui/OrderTableRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java similarity index 82% rename from src/main/java/kitchenpos/order/common/ui/OrderTableRestController.java rename to src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java index c454787bc..ca215b771 100644 --- a/src/main/java/kitchenpos/order/common/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java @@ -1,4 +1,4 @@ -package kitchenpos.order.common.ui; +package kitchenpos.order.eatinorder.ui; import java.net.URI; import java.util.List; @@ -27,23 +27,23 @@ public OrderTableRestController(final OrderTableService orderTableService) { public ResponseEntity create(@RequestBody final OrderTable request) { final OrderTable response = orderTableService.create(request); return ResponseEntity.created(URI.create("/api/order-tables/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{orderTableId}/sit") - public ResponseEntity sit(@PathVariable final UUID orderTableId) { + public ResponseEntity sit(@PathVariable("orderTableId") final UUID orderTableId) { return ResponseEntity.ok(orderTableService.sit(orderTableId)); } @PutMapping("/{orderTableId}/clear") - public ResponseEntity clear(@PathVariable final UUID orderTableId) { + public ResponseEntity clear(@PathVariable("orderTableId") final UUID orderTableId) { return ResponseEntity.ok(orderTableService.clear(orderTableId)); } @PutMapping("/{orderTableId}/number-of-guests") public ResponseEntity changeNumberOfGuests( - @PathVariable final UUID orderTableId, - @RequestBody final OrderTable request + @PathVariable("orderTableId") final UUID orderTableId, + @RequestBody final OrderTable request ) { return ResponseEntity.ok(orderTableService.changeNumberOfGuests(orderTableId, request)); } diff --git a/src/main/java/kitchenpos/product/application/ProductService.java b/src/main/java/kitchenpos/product/application/ProductService.java index 3eb0c543c..16a0afcf5 100644 --- a/src/main/java/kitchenpos/product/application/ProductService.java +++ b/src/main/java/kitchenpos/product/application/ProductService.java @@ -3,12 +3,11 @@ import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; -import java.util.Objects; import java.util.UUID; -import kitchenpos.common.application.PurgomalumClient; -import kitchenpos.menu.domain.model.Menu; -import kitchenpos.menu.domain.model.MenuProduct; -import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.domain.service.MarginValidator; +import kitchenpos.product.domain.model.ProductName; +import kitchenpos.product.domain.model.ProductNameCreationService; +import kitchenpos.product.domain.model.ProductPrice; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.springframework.stereotype.Service; @@ -17,59 +16,35 @@ @Service public class ProductService { private final ProductRepository productRepository; - private final MenuRepository menuRepository; - private final PurgomalumClient purgomalumClient; + private final ProductNameCreationService productNameCreationService; + private final MarginValidator marginValidator; public ProductService( - final ProductRepository productRepository, - final MenuRepository menuRepository, - final PurgomalumClient purgomalumClient + final ProductRepository productRepository, + final ProductNameCreationService productNameCreationService, + final MarginValidator marginValidator ) { this.productRepository = productRepository; - this.menuRepository = menuRepository; - this.purgomalumClient = purgomalumClient; + this.productNameCreationService = productNameCreationService; + this.marginValidator = marginValidator; } @Transactional public Product create(final Product request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } - final String name = request.getName(); - if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(); - } - final Product product = new Product(); - product.setId(UUID.randomUUID()); - product.setName(name); - product.setPrice(price); + final BigDecimal price = request.getInnerPrice(); + final String name = request.getInnerName(); + final ProductName validProductName = productNameCreationService.createName(name); + final Product product = new Product(validProductName, new ProductPrice(price), UUID.randomUUID()); return productRepository.save(product); } @Transactional public Product changePrice(final UUID productId, final Product request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } + final BigDecimal price = request.getInnerPrice(); final Product product = productRepository.findById(productId) - .orElseThrow(NoSuchElementException::new); - product.setPrice(price); - final List menus = menuRepository.findAllByProductId(productId); - for (final Menu menu : menus) { - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (menu.getPrice().compareTo(sum) > 0) { - menu.setDisplayed(false); - } - } + .orElseThrow(NoSuchElementException::new); + product.changePrice(price); + marginValidator.checkMargin(product); return product; } diff --git a/src/main/java/kitchenpos/product/domain/model/Product.java b/src/main/java/kitchenpos/product/domain/model/Product.java index 5400716fb..c4f37931e 100644 --- a/src/main/java/kitchenpos/product/domain/model/Product.java +++ b/src/main/java/kitchenpos/product/domain/model/Product.java @@ -1,6 +1,7 @@ package kitchenpos.product.domain.model; import jakarta.persistence.Column; +import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; @@ -14,13 +15,24 @@ public class Product { @Id private UUID id; - @Column(name = "name", nullable = false) - private String name; + @Embedded + private ProductName name; - @Column(name = "price", nullable = false) - private BigDecimal price; + @Embedded + private ProductPrice price; + + public Product(ProductName name, ProductPrice price, UUID id) { + this.name = name; + this.price = price; + this.id = id; + } + + public Product(ProductName name, ProductPrice price) { + this(name, price, UUID.randomUUID()); + } + + protected Product() { - public Product() { } public UUID getId() { @@ -31,19 +43,31 @@ public void setId(final UUID id) { this.id = id; } - public String getName() { + public String getInnerName() { + return name.getValue(); + } + + public ProductName getName() { return name; } - public void setName(final String name) { - this.name = name; +// public void setName(final String name) { +// this.name = name; +// } + + public BigDecimal getInnerPrice() { + return price.getValue(); } - public BigDecimal getPrice() { + public ProductPrice getPrice() { return price; } - public void setPrice(final BigDecimal price) { - this.price = price; + public void changePrice(BigDecimal price) { + this.price = new ProductPrice(price); } + +// public void setPrice(final BigDecimal price) { +// this.price = price; +// } } diff --git a/src/main/java/kitchenpos/product/domain/model/ProductName.java b/src/main/java/kitchenpos/product/domain/model/ProductName.java new file mode 100644 index 000000000..4e51e2619 --- /dev/null +++ b/src/main/java/kitchenpos/product/domain/model/ProductName.java @@ -0,0 +1,49 @@ +package kitchenpos.product.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import java.util.Objects; + +@Embeddable +public class ProductName { + private static final String NAME_CREATION_EXCEPTION = "이름을 채워주세요!"; + + @Column(name = "name", nullable = false) + private final String value; + + protected ProductName(String value) { + validateName(value); + this.value = value; + } + + protected ProductName() { + this.value = null; + } + + private void validateName(String name) { + if (Objects.isNull(name) || name.isEmpty()) { + throw new IllegalArgumentException(NAME_CREATION_EXCEPTION); + } + } + + public String getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ProductName productName = (ProductName) o; + return Objects.equals(value, productName.value); + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } +} diff --git a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java new file mode 100644 index 000000000..afaaa9361 --- /dev/null +++ b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java @@ -0,0 +1,21 @@ +package kitchenpos.product.domain.model; + +import kitchenpos.common.application.PurgomalumClient; +import org.springframework.stereotype.Service; + +@Service +public class ProductNameCreationService { + private static final String NAME_VALIDATION_EXCEPTION = "이름에 비속어가 존재합니다. 비속어를 제외해주세요!"; + private final PurgomalumClient purgomalumClient; + + public ProductNameCreationService(PurgomalumClient purgomalumClient) { + this.purgomalumClient = purgomalumClient; + } + + public ProductName createName(String name) { + if (purgomalumClient.containsProfanity(name)) { + throw new IllegalArgumentException(NAME_VALIDATION_EXCEPTION); + } + return new ProductName(name); + } +} diff --git a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java new file mode 100644 index 000000000..5a4ad559d --- /dev/null +++ b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java @@ -0,0 +1,50 @@ +package kitchenpos.product.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import java.math.BigDecimal; +import java.util.Objects; + +@Embeddable +public class ProductPrice { + private static final String PRICE_CREATION_EXCEPTION = "가격을 채워주세요!"; + + @Column(name = "price", nullable = false) + private final BigDecimal value; + + public ProductPrice(BigDecimal value) { + validatePrice(value); + this.value = value; + } + + protected ProductPrice() { + this.value = null; + } + + private void validatePrice(BigDecimal value) { + if (Objects.isNull(value) || value.compareTo(BigDecimal.ZERO) < 0) { + throw new IllegalArgumentException(PRICE_CREATION_EXCEPTION); + } + } + + public BigDecimal getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ProductPrice productPrice = (ProductPrice) o; + return Objects.equals(value, productPrice.value); + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } +} diff --git a/src/main/java/kitchenpos/product/ui/ProductRestController.java b/src/main/java/kitchenpos/product/ui/ProductRestController.java index 4623065aa..c5f061243 100644 --- a/src/main/java/kitchenpos/product/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/product/ui/ProductRestController.java @@ -27,11 +27,12 @@ public ProductRestController(final ProductService productService) { public ResponseEntity create(@RequestBody final Product request) { final Product response = productService.create(request); return ResponseEntity.created(URI.create("/api/products/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{productId}/price") - public ResponseEntity changePrice(@PathVariable final UUID productId, @RequestBody final Product request) { + public ResponseEntity changePrice(@PathVariable("productId") final UUID productId, + @RequestBody final Product request) { return ResponseEntity.ok(productService.changePrice(productId, request)); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e5825434f..00c2ec53b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ spring.datasource.password=password spring.datasource.url=jdbc:mysql://localhost:33306/kitchenpos spring.datasource.username=user spring.flyway.enabled=true -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.format_sql=true spring.jpa.show-sql=true logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE diff --git a/src/main/resources/db/migration/V1__Initialize_project_tables.sql b/src/main/resources/db/migration/V1__Initialize_project_tables.sql index 109184f3c..748371dbb 100644 --- a/src/main/resources/db/migration/V1__Initialize_project_tables.sql +++ b/src/main/resources/db/migration/V1__Initialize_project_tables.sql @@ -1,92 +1,92 @@ --- create table menu --- ( --- id binary(16) not null, --- displayed bit not null, --- name varchar(255) not null, --- price decimal(19, 2) not null, --- menu_group_id binary(16) not null, --- primary key (id) --- ) engine = InnoDB; --- --- create table menu_group --- ( --- id binary(16) not null, --- name varchar(255) not null, --- primary key (id) --- ) engine = InnoDB; --- --- create table menu_product --- ( --- seq bigint not null auto_increment, --- quantity bigint not null, --- product_id binary(16) not null, --- menu_id binary(16) not null, --- primary key (seq) --- ) engine = InnoDB; --- --- create table order_line_item --- ( --- seq bigint not null auto_increment, --- quantity bigint not null, --- menu_id binary(16) not null, --- order_id binary(16) not null, --- primary key (seq) --- ) engine = InnoDB; --- --- create table order_table --- ( --- id binary(16) not null, --- occupied bit not null, --- name varchar(255) not null, --- number_of_guests integer not null, --- primary key (id) --- ) engine = InnoDB; --- --- create table orders --- ( --- id binary(16) not null, --- delivery_address varchar(255), --- order_date_time datetime(6) not null, --- status varchar(255) not null, --- type varchar(255) not null, --- order_table_id binary(16), --- primary key (id) --- ) engine = InnoDB; --- --- create table product --- ( --- id binary(16) not null, --- name varchar(255) not null, --- price decimal(19, 2) not null, --- primary key (id) --- ) engine = InnoDB; --- --- alter table menu --- add constraint fk_menu_to_menu_group --- foreign key (menu_group_id) --- references menu_group (id); --- --- alter table menu_product --- add constraint fk_menu_product_to_product --- foreign key (product_id) --- references product (id); --- --- alter table menu_product --- add constraint fk_menu_product_to_menu --- foreign key (menu_id) --- references menu (id); --- --- alter table order_line_item --- add constraint fk_order_line_item_to_menu --- foreign key (menu_id) --- references menu (id); --- --- alter table order_line_item --- add constraint fk_order_line_item_to_orders --- foreign key (order_id) --- references orders (id); --- --- alter table orders --- add constraint fk_orders_to_order_table --- foreign key (order_table_id) --- references order_table (id); +create table menu +( + id binary(16) not null, + displayed bit not null, + name varchar(255) not null, + price decimal(19, 2) not null, + menu_group_id binary(16) not null, + primary key (id) +) engine = InnoDB; + +create table menu_group +( + id binary(16) not null, + name varchar(255) not null, + primary key (id) +) engine = InnoDB; + +create table menu_product +( + seq bigint not null auto_increment, + quantity bigint not null, + product_id binary(16) not null, + menu_id binary(16) not null, + primary key (seq) +) engine = InnoDB; + +create table order_line_item +( + seq bigint not null auto_increment, + quantity bigint not null, + menu_id binary(16) not null, + order_id binary(16) not null, + primary key (seq) +) engine = InnoDB; + +create table order_table +( + id binary(16) not null, + occupied bit not null, + name varchar(255) not null, + number_of_guests integer not null, + primary key (id) +) engine = InnoDB; + +create table orders +( + id binary(16) not null, + delivery_address varchar(255), + order_date_time datetime(6) not null, + status varchar(255) not null, + type varchar(255) not null, + order_table_id binary(16), + primary key (id) +) engine = InnoDB; + +create table product +( + id binary(16) not null, + name varchar(255) not null, + price decimal(19, 2) not null, + primary key (id) +) engine = InnoDB; + +alter table menu + add constraint fk_menu_to_menu_group + foreign key (menu_group_id) + references menu_group (id); + +alter table menu_product + add constraint fk_menu_product_to_product + foreign key (product_id) + references product (id); + +alter table menu_product + add constraint fk_menu_product_to_menu + foreign key (menu_id) + references menu (id); + +alter table order_line_item + add constraint fk_order_line_item_to_menu + foreign key (menu_id) + references menu (id); + +alter table order_line_item + add constraint fk_order_line_item_to_orders + foreign key (order_id) + references orders (id); + +alter table orders + add constraint fk_orders_to_order_table + foreign key (order_table_id) + references order_table (id); diff --git a/src/main/resources/db/migration/V2__Insert_default_data.sql b/src/main/resources/db/migration/V2__Insert_default_data.sql index 372459494..59ca0714f 100644 --- a/src/main/resources/db/migration/V2__Insert_default_data.sql +++ b/src/main/resources/db/migration/V2__Insert_default_data.sql @@ -1,80 +1,80 @@ --- insert into product (id, name, price) --- values (x'3b52824434f7406bbb7e690912f66b10', '후라이드', 16000); --- insert into product (id, name, price) --- values (x'c5ee925c3dbb4941b825021446f24446', '양념치킨', 16000); --- insert into product (id, name, price) --- values (x'625c6fc4145d408f8dd533c16ba26064', '반반치킨', 16000); --- insert into product (id, name, price) --- values (x'4721ee722ff3417fade3acd0a804605b', '통구이', 16000); --- insert into product (id, name, price) --- values (x'0ac16db71b024a87b9c1e7d8f226c48d', '간장치킨', 17000); --- insert into product (id, name, price) --- values (x'7de4b8affa0f4391aaa9c61ea9b40f83', '순살치킨', 17000); --- --- insert into menu_group (id, name) --- values (x'f1860abc2ea1411bbd4abaa44f0d5580', '두마리메뉴'); --- insert into menu_group (id, name) --- values (x'cbc75faefeb04bb18be2cb8ce5d8fded', '한마리메뉴'); --- insert into menu_group (id, name) --- values (x'5e9879b761124791a4cef22e94af8752', '순살파닭두마리메뉴'); --- insert into menu_group (id, name) --- values (x'd9bc21accc104593b5064a40e0170e02', '신메뉴'); --- --- insert into menu (id, displayed, name, price, menu_group_id) --- values (x'f59b1e1cb145440aaa6f6095a0e2d63b', true, '후라이드치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); --- insert into menu (id, displayed, name, price, menu_group_id) --- values (x'e1254913860846aab23aa07c1dcbc648', true, '양념치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); --- insert into menu (id, displayed, name, price, menu_group_id) --- values (x'191fa247b5f34b51b175e65db523f754', true, '반반치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); --- insert into menu (id, displayed, name, price, menu_group_id) --- values (x'33e558df7d934622b50efcc4282cd184', true, '통구이', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); --- insert into menu (id, displayed, name, price, menu_group_id) --- values (x'b9c670b04ef5409083496868df1c7d62', true, '간장치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); --- insert into menu (id, displayed, name, price, menu_group_id) --- values (x'a64af6cac34d4cd882fe454abf512d1f', true, '순살치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); --- --- insert into menu_product (quantity, product_id, menu_id) --- values (1, x'3b52824434f7406bbb7e690912f66b10', x'f59b1e1cb145440aaa6f6095a0e2d63b'); --- insert into menu_product (quantity, product_id, menu_id) --- values (1, x'c5ee925c3dbb4941b825021446f24446', x'e1254913860846aab23aa07c1dcbc648'); --- insert into menu_product (quantity, product_id, menu_id) --- values (1, x'625c6fc4145d408f8dd533c16ba26064', x'191fa247b5f34b51b175e65db523f754'); --- insert into menu_product (quantity, product_id, menu_id) --- values (1, x'4721ee722ff3417fade3acd0a804605b', x'33e558df7d934622b50efcc4282cd184'); --- insert into menu_product (quantity, product_id, menu_id) --- values (1, x'0ac16db71b024a87b9c1e7d8f226c48d', x'b9c670b04ef5409083496868df1c7d62'); --- insert into menu_product (quantity, product_id, menu_id) --- values (1, x'7de4b8affa0f4391aaa9c61ea9b40f83', x'a64af6cac34d4cd882fe454abf512d1f'); --- --- insert into order_table (id, occupied, name, number_of_guests) --- values (x'8d71004329b6420e8452233f5a035520', false, '1번', 0); --- insert into order_table (id, occupied, name, number_of_guests) --- values (x'6ab59e8106eb441684e99faabc87c9ca', false, '2번', 0); --- insert into order_table (id, occupied, name, number_of_guests) --- values (x'ae92335ccd264626b7979e4ae8c4efbd', false, '3번', 0); --- insert into order_table (id, occupied, name, number_of_guests) --- values (x'a9858d4b80d0428881f48f41596a23fb', false, '4번', 0); --- insert into order_table (id, occupied, name, number_of_guests) --- values (x'3faec3ab5217405daaa2804f87697f84', false, '5번', 0); --- insert into order_table (id, occupied, name, number_of_guests) --- values (x'815b8395a2ad4e3589dc74c3b2191478', false, '6번', 0); --- insert into order_table (id, occupied, name, number_of_guests) --- values (x'7ce8b3a235454542ab9cb3d493bbd4fb', false, '7번', 0); --- insert into order_table (id, occupied, name, number_of_guests) --- values (x'7bdb1ffde36e4e2b94e3d2c14d391ef3', false, '8번', 0); --- --- insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) --- values (x'69d78f383bff457cbb7226319c985fd8', '서울시 송파구 위례성대로 2', '2021-07-27', 'WAITING', 'DELIVERY', null); --- insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) --- values (x'98da3d3859e04dacbbaeebf6560a43bd', null, '2021-07-27', 'COMPLETED', 'EAT_IN', --- x'8d71004329b6420e8452233f5a035520'); --- insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) --- values (x'd7cc15b3e32c4bc8b440d3067b35522e', null, '2021-07-27', 'COMPLETED', 'EAT_IN', --- x'8d71004329b6420e8452233f5a035520'); --- --- insert into order_line_item (quantity, menu_id, order_id) --- values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'69d78f383bff457cbb7226319c985fd8'); --- insert into order_line_item (quantity, menu_id, order_id) --- values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'98da3d3859e04dacbbaeebf6560a43bd'); --- insert into order_line_item (quantity, menu_id, order_id) --- values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'd7cc15b3e32c4bc8b440d3067b35522e'); +insert into product (id, name, price) +values (x'3b52824434f7406bbb7e690912f66b10', '후라이드', 16000); +insert into product (id, name, price) +values (x'c5ee925c3dbb4941b825021446f24446', '양념치킨', 16000); +insert into product (id, name, price) +values (x'625c6fc4145d408f8dd533c16ba26064', '반반치킨', 16000); +insert into product (id, name, price) +values (x'4721ee722ff3417fade3acd0a804605b', '통구이', 16000); +insert into product (id, name, price) +values (x'0ac16db71b024a87b9c1e7d8f226c48d', '간장치킨', 17000); +insert into product (id, name, price) +values (x'7de4b8affa0f4391aaa9c61ea9b40f83', '순살치킨', 17000); + +insert into menu_group (id, name) +values (x'f1860abc2ea1411bbd4abaa44f0d5580', '두마리메뉴'); +insert into menu_group (id, name) +values (x'cbc75faefeb04bb18be2cb8ce5d8fded', '한마리메뉴'); +insert into menu_group (id, name) +values (x'5e9879b761124791a4cef22e94af8752', '순살파닭두마리메뉴'); +insert into menu_group (id, name) +values (x'd9bc21accc104593b5064a40e0170e02', '신메뉴'); + +insert into menu (id, displayed, name, price, menu_group_id) +values (x'f59b1e1cb145440aaa6f6095a0e2d63b', true, '후라이드치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +insert into menu (id, displayed, name, price, menu_group_id) +values (x'e1254913860846aab23aa07c1dcbc648', true, '양념치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +insert into menu (id, displayed, name, price, menu_group_id) +values (x'191fa247b5f34b51b175e65db523f754', true, '반반치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +insert into menu (id, displayed, name, price, menu_group_id) +values (x'33e558df7d934622b50efcc4282cd184', true, '통구이', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +insert into menu (id, displayed, name, price, menu_group_id) +values (x'b9c670b04ef5409083496868df1c7d62', true, '간장치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +insert into menu (id, displayed, name, price, menu_group_id) +values (x'a64af6cac34d4cd882fe454abf512d1f', true, '순살치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); + +insert into menu_product (quantity, product_id, menu_id) +values (1, x'3b52824434f7406bbb7e690912f66b10', x'f59b1e1cb145440aaa6f6095a0e2d63b'); +insert into menu_product (quantity, product_id, menu_id) +values (1, x'c5ee925c3dbb4941b825021446f24446', x'e1254913860846aab23aa07c1dcbc648'); +insert into menu_product (quantity, product_id, menu_id) +values (1, x'625c6fc4145d408f8dd533c16ba26064', x'191fa247b5f34b51b175e65db523f754'); +insert into menu_product (quantity, product_id, menu_id) +values (1, x'4721ee722ff3417fade3acd0a804605b', x'33e558df7d934622b50efcc4282cd184'); +insert into menu_product (quantity, product_id, menu_id) +values (1, x'0ac16db71b024a87b9c1e7d8f226c48d', x'b9c670b04ef5409083496868df1c7d62'); +insert into menu_product (quantity, product_id, menu_id) +values (1, x'7de4b8affa0f4391aaa9c61ea9b40f83', x'a64af6cac34d4cd882fe454abf512d1f'); + +insert into order_table (id, occupied, name, number_of_guests) +values (x'8d71004329b6420e8452233f5a035520', false, '1번', 0); +insert into order_table (id, occupied, name, number_of_guests) +values (x'6ab59e8106eb441684e99faabc87c9ca', false, '2번', 0); +insert into order_table (id, occupied, name, number_of_guests) +values (x'ae92335ccd264626b7979e4ae8c4efbd', false, '3번', 0); +insert into order_table (id, occupied, name, number_of_guests) +values (x'a9858d4b80d0428881f48f41596a23fb', false, '4번', 0); +insert into order_table (id, occupied, name, number_of_guests) +values (x'3faec3ab5217405daaa2804f87697f84', false, '5번', 0); +insert into order_table (id, occupied, name, number_of_guests) +values (x'815b8395a2ad4e3589dc74c3b2191478', false, '6번', 0); +insert into order_table (id, occupied, name, number_of_guests) +values (x'7ce8b3a235454542ab9cb3d493bbd4fb', false, '7번', 0); +insert into order_table (id, occupied, name, number_of_guests) +values (x'7bdb1ffde36e4e2b94e3d2c14d391ef3', false, '8번', 0); + +insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +values (x'69d78f383bff457cbb7226319c985fd8', '서울시 송파구 위례성대로 2', '2021-07-27', 'WAITING', 'DELIVERY', null); +insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +values (x'98da3d3859e04dacbbaeebf6560a43bd', null, '2021-07-27', 'COMPLETED', 'EAT_IN', + x'8d71004329b6420e8452233f5a035520'); +insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +values (x'd7cc15b3e32c4bc8b440d3067b35522e', null, '2021-07-27', 'COMPLETED', 'EAT_IN', + x'8d71004329b6420e8452233f5a035520'); + +insert into order_line_item (quantity, menu_id, order_id) +values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'69d78f383bff457cbb7226319c985fd8'); +insert into order_line_item (quantity, menu_id, order_id) +values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'98da3d3859e04dacbbaeebf6560a43bd'); +insert into order_line_item (quantity, menu_id, order_id) +values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'd7cc15b3e32c4bc8b440d3067b35522e'); diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java deleted file mode 100644 index 93b8a850d..000000000 --- a/src/test/java/kitchenpos/Fixtures.java +++ /dev/null @@ -1,130 +0,0 @@ -package kitchenpos; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Random; -import java.util.UUID; -import kitchenpos.menu.domain.model.Menu; -import kitchenpos.menu.domain.model.MenuGroup; -import kitchenpos.menu.domain.model.MenuProduct; -import kitchenpos.order.common.model.Order; -import kitchenpos.order.common.model.OrderLineItem; -import kitchenpos.order.common.model.OrderStatus; -import kitchenpos.order.common.model.OrderType; -import kitchenpos.order.eatinorder.domain.model.OrderTable; -import kitchenpos.product.domain.model.Product; - -public class Fixtures { - public static final UUID INVALID_ID = new UUID(0L, 0L); - - public static Menu menu() { - return menu(19_000L, true, menuProduct()); - } - - public static Menu menu(final long price, final MenuProduct... menuProducts) { - return menu(price, false, menuProducts); - } - - public static Menu menu(final long price, final boolean displayed, final MenuProduct... menuProducts) { - final Menu menu = new Menu(); - menu.setId(UUID.randomUUID()); - menu.setName("후라이드+후라이드"); - menu.setPrice(BigDecimal.valueOf(price)); - menu.setMenuGroup(menuGroup()); - menu.setDisplayed(displayed); - menu.setMenuProducts(Arrays.asList(menuProducts)); - return menu; - } - - public static MenuGroup menuGroup() { - return menuGroup("두마리메뉴"); - } - - public static MenuGroup menuGroup(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(UUID.randomUUID()); - menuGroup.setName(name); - return menuGroup; - } - - public static MenuProduct menuProduct() { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product()); - menuProduct.setQuantity(2L); - return menuProduct; - } - - public static MenuProduct menuProduct(final Product product, final long quantity) { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product); - menuProduct.setQuantity(quantity); - return menuProduct; - } - - public static Order order(final OrderStatus status, final String deliveryAddress) { - final Order order = new Order(); - order.setId(UUID.randomUUID()); - order.setType(OrderType.DELIVERY); - order.setStatus(status); - order.setOrderDateTime(LocalDateTime.of(2020, 1, 1, 12, 0)); - order.setOrderLineItems(Arrays.asList(orderLineItem())); - order.setDeliveryAddress(deliveryAddress); - return order; - } - - public static Order order(final OrderStatus status) { - final Order order = new Order(); - order.setId(UUID.randomUUID()); - order.setType(OrderType.TAKEOUT); - order.setStatus(status); - order.setOrderDateTime(LocalDateTime.of(2020, 1, 1, 12, 0)); - order.setOrderLineItems(Arrays.asList(orderLineItem())); - return order; - } - - public static Order order(final OrderStatus status, final OrderTable orderTable) { - final Order order = new Order(); - order.setId(UUID.randomUUID()); - order.setType(OrderType.EAT_IN); - order.setStatus(status); - order.setOrderDateTime(LocalDateTime.of(2020, 1, 1, 12, 0)); - order.setOrderLineItems(Arrays.asList(orderLineItem())); - order.setOrderTable(orderTable); - return order; - } - - public static OrderLineItem orderLineItem() { - final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setSeq(new Random().nextLong()); - orderLineItem.setMenu(menu()); - return orderLineItem; - } - - public static OrderTable orderTable() { - return orderTable(false, 0); - } - - public static OrderTable orderTable(final boolean occupied, final int numberOfGuests) { - final OrderTable orderTable = new OrderTable(); - orderTable.setId(UUID.randomUUID()); - orderTable.setName("1번"); - orderTable.setNumberOfGuests(numberOfGuests); - orderTable.setOccupied(occupied); - return orderTable; - } - - public static Product product() { - return product("후라이드", 16_000L); - } - - public static Product product(final String name, final long price) { - final Product product = new Product(); - product.setId(UUID.randomUUID()); - product.setName(name); - product.setPrice(BigDecimal.valueOf(price)); - return product; - } -} diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java new file mode 100644 index 000000000..8d84647ae --- /dev/null +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -0,0 +1,114 @@ +package kitchenpos; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import kitchenpos.product.domain.model.ProductName; +import kitchenpos.product.domain.model.ProductNameCreationService; +import kitchenpos.product.domain.model.ProductPrice; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.common.model.OrderType; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.product.domain.model.Product; +import kitchenpos.common.infra.external.FakePurgomalumClient; + +public class TestFixtureFactory { + + public static MenuGroup createMenuGroup() { + return new MenuGroup("한식"); + } + + public static Product createProduct(BigDecimal value) { + ProductName productName = createName("김치"); + ProductPrice productPrice = createPrice(value); + return new Product(productName, productPrice); + } + + private static ProductName createName(String value) { + ProductNameCreationService productNameCreationService = new ProductNameCreationService(new FakePurgomalumClient()); + return productNameCreationService.createName(value); + } + + private static ProductPrice createPrice(BigDecimal price) { + return new ProductPrice(price); + } + + public static Menu createMenuWithProductAndGroup() { + MenuGroup menuGroup = createMenuGroup(); + Product product = createProduct(BigDecimal.valueOf(5000)); + MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); + return new Menu("김치찌개", BigDecimal.valueOf(8000), true, List.of(menuProduct), menuGroup, + menuGroup.getId()); + } + + public static Menu createMenuWithProductAndGroup(boolean displayed) { + MenuGroup menuGroup = createMenuGroup(); + Product product = createProduct(BigDecimal.valueOf(5000)); + MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); + return new Menu("김치찌개", BigDecimal.valueOf(8000), displayed, List.of(menuProduct), menuGroup, + menuGroup.getId()); + } + + public static Menu createMenu(MenuGroup menuGroup, Product product) { + MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); + return new Menu("김치찌개", BigDecimal.valueOf(8000), true, List.of(menuProduct), menuGroup, + menuGroup.getId()); + } + + public static Menu createMenu(MenuGroup menuGroup, Product product, long quantity) { + MenuProduct menuProduct = new MenuProduct(quantity, product, product.getId()); + return new Menu("김치찌개", BigDecimal.valueOf(8000), true, List.of(menuProduct), menuGroup, + menuGroup.getId()); + } + + public static Menu createMenuWithProductAndGroup(String name, long price, Product product) { + MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); + MenuGroup menuGroup = new MenuGroup("찌개"); + return new Menu(name, BigDecimal.valueOf(price), true, List.of(menuProduct), menuGroup, menuGroup.getId()); + } + + public static OrderTable createEmptyOrderTable() { + return new OrderTable("비어 있는 테이블", 0, false); + } + + public static OrderTable createUsingOrderTable() { + return new OrderTable("사용 중인 테이블", 4, true); + } + + public static Product createProduct(String name, long price) { + return new Product(createName(name), createPrice(BigDecimal.valueOf(price))); + } + + public static Order createOrderWithDeliveryType(OrderLineItem orderLineItem, OrderTable orderTable, + OrderStatus status) { + return new Order(OrderType.DELIVERY, status, LocalDateTime.now(), List.of(orderLineItem), + "주소", orderTable, orderTable.getId()); + } + + public static Order createOrderWithTakeOutType(OrderLineItem orderLineItem, OrderTable orderTable, + OrderStatus status) { + return new Order(OrderType.TAKEOUT, status, LocalDateTime.now(), List.of(orderLineItem), + "주소", orderTable, orderTable.getId()); + } + + public static Order createOrderWithEatInType(OrderLineItem orderLineItem, OrderTable orderTable, + OrderStatus status) { + return new Order(OrderType.EAT_IN, status, LocalDateTime.now(), List.of(orderLineItem), + "주소", orderTable, orderTable.getId()); + } + + public static Order createOrder(OrderLineItem orderLineItem, OrderTable orderTable, OrderType orderType, + OrderStatus orderStatus, String address) { + return new Order(orderType, orderStatus, LocalDateTime.now(), List.of(orderLineItem), + address, orderTable, orderTable.getId()); + } + + public static OrderLineItem createOrderLineItem(Menu menu) { + return new OrderLineItem(menu, 2, menu.getId(), BigDecimal.valueOf(8000)); + } +} diff --git a/src/test/java/kitchenpos/common/infra/external/FakePurgomalumClient.java b/src/test/java/kitchenpos/common/infra/external/FakePurgomalumClient.java index 33994a9c7..40402dc35 100644 --- a/src/test/java/kitchenpos/common/infra/external/FakePurgomalumClient.java +++ b/src/test/java/kitchenpos/common/infra/external/FakePurgomalumClient.java @@ -1,19 +1,17 @@ package kitchenpos.common.infra.external; -import java.util.Arrays; -import java.util.List; import kitchenpos.common.application.PurgomalumClient; public class FakePurgomalumClient implements PurgomalumClient { - private static final List profanities; - static { - profanities = Arrays.asList("비속어", "욕설"); - } + private boolean isProfanity = false; @Override - public boolean containsProfanity(final String text) { - return profanities.stream() - .anyMatch(profanity -> text.contains(profanity)); + public boolean containsProfanity(String text) { + return isProfanity; + } + + public void setProfanity(boolean isProfanity) { + this.isProfanity = isProfanity; } } diff --git a/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java index 9f9d5f016..b16a0595b 100644 --- a/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java @@ -1,14 +1,16 @@ package kitchenpos.menu.application; -import static kitchenpos.Fixtures.menuGroup; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import java.util.Arrays; import java.util.List; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; -import kitchenpos.menu.infra.persistence.InMemoryMenuGroupRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -16,47 +18,62 @@ import org.junit.jupiter.params.provider.NullAndEmptySource; class MenuGroupServiceTest { - private MenuGroupRepository menuGroupRepository; + private MenuGroupService menuGroupService; + private MenuGroupRepository menuGroupRepository; @BeforeEach void setUp() { - menuGroupRepository = new InMemoryMenuGroupRepository(); + menuGroupRepository = mock(MenuGroupRepository.class); menuGroupService = new MenuGroupService(menuGroupRepository); } - @DisplayName("메뉴 그룹을 등록할 수 있다.") @Test - void create() { - final MenuGroup expected = createMenuGroupRequest("두마리메뉴"); - final MenuGroup actual = menuGroupService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()) - ); + @DisplayName("메뉴 그룹을 생성한다") + void create_menuGroup() { + // given + MenuGroup request = new MenuGroup("한식"); + + when(menuGroupRepository.save(any(MenuGroup.class))) + .thenAnswer(invocation -> invocation.getArgument(0)); + + // when + MenuGroup result = menuGroupService.create(request); + + // then + assertThat(result.getId()).isNotNull(); + assertThat(result.getName()).isEqualTo("한식"); + verify(menuGroupRepository).save(any(MenuGroup.class)); } - @DisplayName("메뉴 그룹의 이름이 올바르지 않으면 등록할 수 없다.") - @NullAndEmptySource @ParameterizedTest - void create(final String name) { - final MenuGroup expected = createMenuGroupRequest(name); - assertThatThrownBy(() -> menuGroupService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + @NullAndEmptySource + @DisplayName("메뉴 그룹 이름이 null이거나 비어있으면 예외가 발생한다") + void create_MenuGroup_fail(String name) { + // given + MenuGroup request = new MenuGroup(name); + + // when // then + assertThatThrownBy(() -> menuGroupService.create(request)) + .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("메뉴 그룹의 목록을 조회할 수 있다.") @Test + @DisplayName("메뉴 그룹 목록을 조회한다") void findAll() { - menuGroupRepository.save(menuGroup("두마리메뉴")); - final List actual = menuGroupService.findAll(); - assertThat(actual).hasSize(1); - } + // given + MenuGroup group1 = new MenuGroup("한식"); + MenuGroup group2 = new MenuGroup("중식"); + List expected = Arrays.asList(group1, group2); + when(menuGroupRepository.findAll()).thenReturn(expected); + + // when + List result = menuGroupService.findAll(); - private MenuGroup createMenuGroupRequest(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setName(name); - return menuGroup; + // then + assertThat(result).hasSize(2) + .usingRecursiveComparison() + .isEqualTo(expected); + verify(menuGroupRepository).findAll(); } } diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 1fc04839f..0067873d4 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -1,271 +1,237 @@ package kitchenpos.menu.application; -import static kitchenpos.Fixtures.INVALID_ID; -import static kitchenpos.Fixtures.menu; -import static kitchenpos.Fixtures.menuGroup; -import static kitchenpos.Fixtures.menuProduct; -import static kitchenpos.Fixtures.product; +import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; +import static kitchenpos.TestFixtureFactory.createProduct; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; import java.math.BigDecimal; -import java.util.Arrays; -import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.NoSuchElementException; -import java.util.UUID; import kitchenpos.common.application.PurgomalumClient; -import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuProduct; import kitchenpos.menu.domain.repository.MenuGroupRepository; import kitchenpos.menu.domain.repository.MenuRepository; -import kitchenpos.menu.infra.persistence.InMemoryMenuGroupRepository; -import kitchenpos.menu.infra.persistence.InMemoryMenuRepository; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; -import kitchenpos.product.infra.persistence.InMemoryProductRepository; +import kitchenpos.menu.infra.persistence.FakeMenuGroupRepository; +import kitchenpos.menu.infra.persistence.FakeMenuRepository; +import kitchenpos.product.infra.persistence.FakeProductRepository; +import kitchenpos.common.infra.external.FakePurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; +import org.junit.jupiter.params.provider.NullAndEmptySource; class MenuServiceTest { + + private MenuService menuService; private MenuRepository menuRepository; private MenuGroupRepository menuGroupRepository; private ProductRepository productRepository; private PurgomalumClient purgomalumClient; - private MenuService menuService; - private UUID menuGroupId; - private Product product; @BeforeEach void setUp() { - menuRepository = new InMemoryMenuRepository(); - menuGroupRepository = new InMemoryMenuGroupRepository(); - productRepository = new InMemoryProductRepository(); + menuRepository = new FakeMenuRepository(new HashMap<>()); + menuGroupRepository = new FakeMenuGroupRepository(new HashMap<>()); + productRepository = new FakeProductRepository(new HashMap<>()); purgomalumClient = new FakePurgomalumClient(); menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalumClient); - menuGroupId = menuGroupRepository.save(menuGroup()).getId(); - product = productRepository.save(product("후라이드", 16_000L)); } - @DisplayName("1개 이상의 등록된 상품으로 메뉴를 등록할 수 있다.") @Test - void create() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - final Menu actual = menuService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()), - () -> assertThat(actual.getPrice()).isEqualTo(expected.getPrice()), - () -> assertThat(actual.getMenuGroup().getId()).isEqualTo(expected.getMenuGroupId()), - () -> assertThat(actual.isDisplayed()).isEqualTo(expected.isDisplayed()), - () -> assertThat(actual.getMenuProducts()).hasSize(1) - ); + @DisplayName("메뉴를 생성한다") + void create_menu() { + // given + MenuGroup menuGroup = createMenuGroup(); + menuGroupRepository.save(menuGroup); + Product product = createProduct(BigDecimal.valueOf(5000)); + productRepository.save(product); + Menu request = createMenuRequest("김치찌개", 8000, menuGroup, product); + + // when + Menu created = menuService.create(request); + + // then + assertThat(created.getId()).isNotNull(); + assertThat(created.getName()).isEqualTo("김치찌개"); + assertThat(created.getPrice()).isEqualTo(BigDecimal.valueOf(8000)); + MenuGroup actualMenuGroup = created.getMenuGroup(); + assertThat(actualMenuGroup.getName()).isEqualTo("한식"); + assertThat(menuRepository.findAll().size()).isEqualTo(1); } - @DisplayName("상품이 없으면 등록할 수 없다.") - @MethodSource("menuProducts") - @ParameterizedTest - void create(final List menuProducts) { - final Menu expected = createMenuRequest("후라이드+후라이드", 19_000L, menuGroupId, true, menuProducts); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + @Test + @DisplayName("메뉴 가격은 0원 미만이면 예외가 발생한다.") + void menu_price_exception() { + // given + MenuGroup menuGroup = createMenuGroup(); + Product product = createProduct(BigDecimal.valueOf(5000)); + Menu request = createMenuRequest("김치찌개", -1000, menuGroup, + product); + + // when // then + assertThatThrownBy(() -> menuService.create(request)) + .isInstanceOf(IllegalArgumentException.class); } - private static List menuProducts() { - return Arrays.asList( - null, - Arguments.of(Collections.emptyList()), - Arguments.of(Arrays.asList(createMenuProductRequest(INVALID_ID, 2L))) - ); + @ParameterizedTest + @NullAndEmptySource + @DisplayName("메뉴에 이름이 없으면 예외가 발생한다.") + void menu_name_exists_exception(String name) { + // given + MenuGroup menuGroup = createMenuGroup(); + menuGroupRepository.save(menuGroup); + Product product = createProduct(BigDecimal.valueOf(5000)); + productRepository.save(product); + Menu request = createMenuRequest(name, 8000, menuGroup, + product); + + // when // then + assertThatThrownBy(() -> menuService.create(request)) + .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("메뉴에 속한 상품의 수량은 0개 이상이어야 한다.") @Test - void createNegativeQuantity() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), -1L) - ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } + @DisplayName("메뉴 이름에 비속어가 포함되면 예외가 발생한다") + void menu_name_profanity_exception() { + // given + MenuGroup menuGroup = createMenuGroup(); + menuGroupRepository.save(menuGroup); + Product product = createProduct(BigDecimal.valueOf(5000)); + productRepository.save(product); + Menu request = createMenuRequest("fuck", 8000, menuGroup, + product); - @DisplayName("메뉴의 가격이 올바르지 않으면 등록할 수 없다.") - @ValueSource(strings = "-1000") - @NullSource - @ParameterizedTest - void create(final BigDecimal price) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + // 다운 캐스팅해서 강제로 메소드 호출 + FakePurgomalumClient fakePurgomalumClient = (FakePurgomalumClient) purgomalumClient; + fakePurgomalumClient.setProfanity(true); + + // when // then + assertThatThrownBy(() -> menuService.create(request)) + .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @Test - void createExpensiveMenu() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } + @DisplayName("메뉴 그룹이 존재하지 않으면 예외가 발생한다") + void menu_group_exception() { + // given + Product product = createProduct(BigDecimal.valueOf(5000)); + MenuGroup menuGroup = null; + MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); + Menu request = new Menu("김치찌개", BigDecimal.valueOf(8000), true, List.of(menuProduct), menuGroup, + null); - @DisplayName("메뉴는 특정 메뉴 그룹에 속해야 한다.") - @NullSource - @ParameterizedTest - void create(final UUID menuGroupId) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(NoSuchElementException.class); + // when // then + assertThatThrownBy(() -> menuService.create(request)) + .isInstanceOf(NoSuchElementException.class); } - @DisplayName("메뉴의 이름이 올바르지 않으면 등록할 수 없다.") - @ValueSource(strings = {"비속어", "욕설이 포함된 이름"}) - @NullSource - @ParameterizedTest - void create(final String name) { - final Menu expected = createMenuRequest( - name, 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + @Test + @DisplayName("메뉴의 판매 가격이 재료 가격의 총합 낮으면 예외가 발생한다.") + void create_menu_with_menuPrice_andTotalPrice_exception() { + // given + MenuGroup menuGroup = createMenuGroup(); + menuGroupRepository.save(menuGroup); + Product product = createProduct(BigDecimal.valueOf(10000)); + productRepository.save(product); + Menu request = createMenuRequest("김치찌개", 8000, menuGroup, product); + request.setPrice(BigDecimal.valueOf(8000)); + + // when // then + assertThatThrownBy(() -> menuService.create(request)) + .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("메뉴의 가격을 변경할 수 있다.") @Test - void changePrice() { - final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(16_000L); - final Menu actual = menuService.changePrice(menuId, expected); - assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); - } + @DisplayName("메뉴의 가격을 변경할 수 있다") + void change_price() { + // given + Menu menu = createMenuWithProductAndGroup(); + menuRepository.save(menu); + Menu request = new Menu(); + request.setPrice(BigDecimal.valueOf(12000)); - @DisplayName("메뉴의 가격이 올바르지 않으면 변경할 수 없다.") - @ValueSource(strings = "-1000") - @NullSource - @ParameterizedTest - void changePrice(final BigDecimal price) { - final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(price); - assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) - .isInstanceOf(IllegalArgumentException.class); + // when + Menu updated = menuService.changePrice(menu.getId(), request); + + // then + assertThat(updated.getPrice()).isEqualTo(BigDecimal.valueOf(12000)); } - @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @Test - void changePriceToExpensive() { - final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(33_000L); - assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) - .isInstanceOf(IllegalArgumentException.class); + @DisplayName("변경하려는 가격이 재료 가격의 총합보다 낮으면 예외가 발생한다") + void change_price_with_menuPrice_andTotalPrice_exception() { + // given + Menu menu = createMenuWithProductAndGroup(); + menuRepository.save(menu); + Menu request = new Menu(); + request.setPrice(BigDecimal.valueOf(4000)); + + // when // then + assertThatThrownBy(() -> menuService.changePrice(menu.getId(), request)) + .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("메뉴를 노출할 수 있다.") @Test + @DisplayName("메뉴를 표시 상태로 변경할 수 있다") void display() { - final UUID menuId = menuRepository.save(menu(19_000L, false, menuProduct(product, 2L))).getId(); - final Menu actual = menuService.display(menuId); - assertThat(actual.isDisplayed()).isTrue(); - } + // given + Menu menu = createMenuWithProductAndGroup(); + menuRepository.save(menu); - @DisplayName("메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 높을 경우 메뉴를 노출할 수 없다.") - @Test - void displayExpensiveMenu() { - final UUID menuId = menuRepository.save(menu(33_000L, false, menuProduct(product, 2L))).getId(); - assertThatThrownBy(() -> menuService.display(menuId)) - .isInstanceOf(IllegalStateException.class); + // when + Menu displayed = menuService.display(menu.getId()); + + // then + assertThat(displayed.isDisplayed()).isTrue(); } - @DisplayName("메뉴를 숨길 수 있다.") @Test + @DisplayName("메뉴를 숨김 상태로 변경할 수 있다") void hide() { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))).getId(); - final Menu actual = menuService.hide(menuId); - assertThat(actual.isDisplayed()).isFalse(); - } + // given + Menu menu = createMenuWithProductAndGroup(); + menu.changeDisplay(); + menuRepository.save(menu); - @DisplayName("메뉴의 목록을 조회할 수 있다.") - @Test - void findAll() { - menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); - final List actual = menuService.findAll(); - assertThat(actual).hasSize(1); - } + // when + Menu hidden = menuService.hide(menu.getId()); - private Menu createMenuRequest( - final String name, - final long price, - final UUID menuGroupId, - final boolean displayed, - final MenuProduct... menuProducts - ) { - return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); + // then + assertThat(hidden.isDisplayed()).isFalse(); } - private Menu createMenuRequest( - final String name, - final BigDecimal price, - final UUID menuGroupId, - final boolean displayed, - final MenuProduct... menuProducts - ) { - return createMenuRequest(name, price, menuGroupId, displayed, Arrays.asList(menuProducts)); - } - private Menu createMenuRequest( - final String name, - final long price, - final UUID menuGroupId, - final boolean displayed, - final List menuProducts - ) { - return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); - } + @Test + @DisplayName("전체 메뉴를 조회할 수 있다") + void find_allMenus() { + // given + List menus = List.of( + createMenuWithProductAndGroup(), createMenuWithProductAndGroup()); + for (Menu menu : menus) { + menuRepository.save(menu); + } - private Menu createMenuRequest( - final String name, - final BigDecimal price, - final UUID menuGroupId, - final boolean displayed, - final List menuProducts - ) { - final Menu menu = new Menu(); - menu.setName(name); - menu.setPrice(price); - menu.setMenuGroupId(menuGroupId); - menu.setDisplayed(displayed); - menu.setMenuProducts(menuProducts); - return menu; - } + // when + List found = menuService.findAll(); - private static MenuProduct createMenuProductRequest(final UUID productId, final long quantity) { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setProductId(productId); - menuProduct.setQuantity(quantity); - return menuProduct; + // then + assertThat(found).hasSize(2); } - private Menu changePriceRequest(final long price) { - return changePriceRequest(BigDecimal.valueOf(price)); + private MenuGroup createMenuGroup() { + return new MenuGroup("한식"); } - private Menu changePriceRequest(final BigDecimal price) { - final Menu menu = new Menu(); - menu.setPrice(price); - return menu; + private Menu createMenuRequest(String name, int price, MenuGroup menuGroup, Product product) { + MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); + return new Menu(name, BigDecimal.valueOf(price), true, List.of(menuProduct), menuGroup, + menuGroup.getId()); } } diff --git a/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java b/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java new file mode 100644 index 000000000..3619ce41b --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java @@ -0,0 +1,49 @@ +package kitchenpos.menu.domain.service; + +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.product.domain.model.Product; +import kitchenpos.menu.infra.persistence.FakeMenuRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class MarginValidatorTest { + + private MenuRepository menuRepository; + + @BeforeEach + void setUp() { + menuRepository = new FakeMenuRepository(new HashMap<>()); + } + + @Test + @DisplayName("상품이 속한 메뉴들의 마진을 확인하고, 마진이 남지 않으면 게시를 하지 않는다.") + void check_margin_by_product() { + // given + Product product = createProduct(BigDecimal.valueOf(2000)); + Menu soup = createMenu(createMenuGroup(), product, 5); + Menu cake = createMenu(createMenuGroup(), product, 4); + + HashMap storage = new HashMap<>(); + storage.put(UUID.randomUUID(), soup); + storage.put(UUID.randomUUID(), cake); + menuRepository = new FakeMenuRepository(storage); + + // when + MarginValidator marginValidator = new MarginValidator(menuRepository); + marginValidator.checkMargin(product); + + // then + assertThat(soup.isDisplayed()).isEqualTo(false); + assertThat(cake.isDisplayed()).isEqualTo(true); + } +} diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java new file mode 100644 index 000000000..0a3bc55b3 --- /dev/null +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java @@ -0,0 +1,36 @@ +package kitchenpos.menu.infra.persistence; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.repository.MenuGroupRepository; + +public class FakeMenuGroupRepository implements MenuGroupRepository { + + private final Map storage; + + public FakeMenuGroupRepository(Map storage) { + this.storage = storage; + } + + @Override + public MenuGroup save(MenuGroup menuGroup) { + UUID id = UUID.randomUUID(); + menuGroup.setId(id); + storage.put(id, menuGroup); + return menuGroup; + } + + @Override + public List findAll() { + return new ArrayList<>(storage.values()); + } + + @Override + public Optional findById(UUID menuGroupId) { + return Optional.ofNullable(storage.get(menuGroupId)); + } +} diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java new file mode 100644 index 000000000..68cd85e5d --- /dev/null +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java @@ -0,0 +1,60 @@ +package kitchenpos.menu.infra.persistence; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; + +public class FakeMenuRepository implements MenuRepository { + + private final Map storage; + + public FakeMenuRepository(Map storage) { + this.storage = storage; + } + + @Override + public Menu save(Menu menu) { + UUID id = UUID.randomUUID(); + menu.setId(id); + storage.put(id, menu); + return menu; + } + + @Override + public Optional findById(UUID menuId) { + return Optional.ofNullable(storage.get(menuId)); + } + + @Override + public List findAll() { + return new ArrayList<>(storage.values()); + } + + @Override + public List findAllByIdIn(List ids) { + return storage.values().stream() + .filter(menu -> ids.contains(menu.getId())) + .toList(); + } + + @Override + public List findAllByProductId(UUID productId) { + return storage.values().stream() + .filter(menu -> menu.getMenuProducts().stream() + .anyMatch(menuProduct -> menuProduct.getProductId().equals(productId))) + .toList(); + } + + public List saveAll(List menus) { + for (Menu menu : menus) { + UUID id = UUID.randomUUID(); + menu.setId(id); + storage.put(id, menu); + } + return new ArrayList<>(storage.values()); + } +} diff --git a/src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuGroupRepository.java deleted file mode 100644 index d48d5d936..000000000 --- a/src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuGroupRepository.java +++ /dev/null @@ -1,30 +0,0 @@ -package kitchenpos.menu.infra.persistence; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import kitchenpos.menu.domain.model.MenuGroup; -import kitchenpos.menu.domain.repository.MenuGroupRepository; - -public class InMemoryMenuGroupRepository implements MenuGroupRepository { - private final Map menuGroups = new HashMap<>(); - - @Override - public MenuGroup save(final MenuGroup menuGroup) { - menuGroups.put(menuGroup.getId(), menuGroup); - return menuGroup; - } - - @Override - public Optional findById(final UUID id) { - return Optional.ofNullable(menuGroups.get(id)); - } - - @Override - public List findAll() { - return new ArrayList<>(menuGroups.values()); - } -} diff --git a/src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuRepository.java deleted file mode 100644 index 09d02eea2..000000000 --- a/src/test/java/kitchenpos/menu/infra/persistence/InMemoryMenuRepository.java +++ /dev/null @@ -1,46 +0,0 @@ -package kitchenpos.menu.infra.persistence; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import kitchenpos.menu.domain.model.Menu; -import kitchenpos.menu.domain.repository.MenuRepository; - -public class InMemoryMenuRepository implements MenuRepository { - private final Map menus = new HashMap<>(); - - @Override - public Menu save(final Menu menu) { - menus.put(menu.getId(), menu); - return menu; - } - - @Override - public Optional findById(final UUID id) { - return Optional.ofNullable(menus.get(id)); - } - - @Override - public List findAll() { - return new ArrayList<>(menus.values()); - } - - @Override - public List findAllByIdIn(final List ids) { - return menus.values() - .stream() - .filter(menu -> ids.contains(menu.getId())) - .toList(); - } - - @Override - public List findAllByProductId(final UUID productId) { - return menus.values() - .stream() - .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProduct().getId().equals(productId))) - .toList(); - } -} diff --git a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java new file mode 100644 index 000000000..69b672ad3 --- /dev/null +++ b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java @@ -0,0 +1,64 @@ +package kitchenpos.menu.ui; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import kitchenpos.menu.domain.model.MenuGroup; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; + +@SpringBootTest +@AutoConfigureMockMvc +class MenuGroupRestControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Test + @DisplayName("메뉴 그룹을 생성한다.") + void create_success() throws Exception { + // given + MenuGroup request = new MenuGroup("한식"); + + // when + ResultActions result = mockMvc.perform(post("/api/menu-groups") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andExpect(jsonPath("$.id").exists()) + .andExpect(jsonPath("$.name").value("한식")); + } + + @ParameterizedTest + @NullAndEmptySource + @DisplayName("메뉴 그룹 이름이 비어있으면 400 상태코드를 반환한다") + void create_fail(String name) throws Exception { + // given + MenuGroup request = new MenuGroup(name); + + // when + ResultActions result = mockMvc.perform(post("/api/menu-groups") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isBadRequest()); + } +} diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java new file mode 100644 index 000000000..c31c99629 --- /dev/null +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -0,0 +1,195 @@ +package kitchenpos.menu.ui; + +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.math.BigDecimal; +import java.util.List; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.menu.domain.repository.MenuGroupRepository; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class MenuRestControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private MenuRepository menuRepository; + + @Autowired + private MenuGroupRepository menuGroupRepository; + + @Autowired + private ProductRepository productRepository; + + @Test + @DisplayName("메뉴를 생성한다") + void create_menu_success() throws Exception { + // given + MenuGroup menuGroup = createAndSaveMenuGroup(); + Product product = createAndSaveProduct(); + Menu request = createMenuRequest(menuGroup, product); + + // when + ResultActions result = mockMvc.perform(post("/api/menus") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andExpect(jsonPath("$.id").exists()) + .andExpect(jsonPath("$.name").value(request.getName())) + .andExpect(jsonPath("$.price").value(request.getPrice().intValue())) + .andExpect(jsonPath("$.menuGroup").exists()) + .andExpect(jsonPath("$.menuProducts").isNotEmpty()); + } + + @Test + @DisplayName("메뉴 상품 목록이 비어있으면 400 상태코드를 반환한다") + void create_menuRequest_with_emptyProducts() throws Exception { + // given + MenuGroup menuGroup = createAndSaveMenuGroup(); + Menu request = new Menu("김치찌개", BigDecimal.valueOf(8000), true, null, menuGroup, + menuGroup.getId()); + + // when + ResultActions result = mockMvc.perform(post("/api/menus") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("메뉴의 가격을 변경한다") + void change_menuPrice() throws Exception { + // given + Menu menu = createAndSaveMenu(true); + menu.setPrice(BigDecimal.valueOf(8001)); + + // when + ResultActions result = mockMvc.perform(put("/api/menus/{menuId}/price", menu.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(menu))); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(menu.getId().toString())) + .andExpect(jsonPath("$.price").value(8001)); + } + + @Test + @DisplayName("변경하려는 메뉴 가격이 음수이면 400 상태코드를 반환한다") + void change_menuPrice_with_negativePrice() throws Exception { + // given + Menu savedMenu = createAndSaveMenu(true); + Menu request = new Menu(); + request.setPrice(BigDecimal.valueOf(-1)); + + // when + ResultActions result = mockMvc.perform(put("/api/menus/{menuId}/price", savedMenu.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("메뉴를 표시 상태로 변경한다") + void display_menu() throws Exception { + // given + Menu savedMenu = createAndSaveMenu(false); + + // when + ResultActions result = mockMvc.perform(put("/api/menus/{menuId}/display", savedMenu.getId())); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(savedMenu.getId().toString())) + .andExpect(jsonPath("$.displayed").value(true)); + } + + @Test + @DisplayName("메뉴를 숨김 상태로 변경한다") + void hide_menu() throws Exception { + // given + Menu savedMenu = createAndSaveMenu(true); + + // when + ResultActions result = mockMvc.perform(put("/api/menus/{menuId}/hide", savedMenu.getId())); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(savedMenu.getId().toString())) + .andExpect(jsonPath("$.displayed").value(false)); + } + + @Test + @DisplayName("모든 메뉴를 조회한다") + void find_allMenus() throws Exception { + // given + createAndSaveMenu(true); + createAndSaveMenu(true); + + // when + ResultActions result = mockMvc.perform(get("/api/menus")); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$.length()").value(2)); + } + + private Menu createMenuRequest(MenuGroup menuGroup, Product product) { + MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); + return new Menu("김치찌개", BigDecimal.valueOf(8000), true, List.of(menuProduct), menuGroup, + menuGroup.getId()); + } + + private MenuGroup createAndSaveMenuGroup() { + return menuGroupRepository.save(createMenuGroup()); + } + + private Product createAndSaveProduct() { + return productRepository.save(createProduct("김치", 5000)); + } + + private Menu createAndSaveMenu(boolean displayed) { + MenuGroup menuGroup = createAndSaveMenuGroup(); + Product product = createAndSaveProduct(); + MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); + Menu menu = new Menu("김치찌개", BigDecimal.valueOf(8000), displayed, List.of(menuProduct), menuGroup, + menuGroup.getId()); + return menuRepository.save(menu); + } +} diff --git a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java index 7bef51af1..b2788abff 100644 --- a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java @@ -1,398 +1,331 @@ package kitchenpos.order.common.application; -import static kitchenpos.Fixtures.INVALID_ID; -import static kitchenpos.Fixtures.menu; -import static kitchenpos.Fixtures.menuProduct; -import static kitchenpos.Fixtures.order; -import static kitchenpos.Fixtures.orderTable; +import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; +import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; +import static kitchenpos.TestFixtureFactory.createOrder; +import static kitchenpos.TestFixtureFactory.createOrderLineItem; +import static kitchenpos.TestFixtureFactory.createOrderWithDeliveryType; +import static kitchenpos.TestFixtureFactory.createOrderWithEatInType; +import static kitchenpos.TestFixtureFactory.createOrderWithTakeOutType; +import static kitchenpos.TestFixtureFactory.createUsingOrderTable; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.Collections; import java.util.List; -import java.util.Random; +import java.util.Optional; import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; -import kitchenpos.menu.infra.persistence.InMemoryMenuRepository; -import kitchenpos.order.common.infra.persistence.InMemoryOrderRepository; import kitchenpos.order.common.model.Order; -import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.model.OrderType; import kitchenpos.order.common.repository.OrderRepository; -import kitchenpos.order.deliveryorder.infra.external.FakeKitchenridersClient; +import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; -import kitchenpos.order.eatinorder.infra.persistence.InMemoryOrderTableRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.EnumSource; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; class OrderServiceTest { + + private OrderService orderService; private OrderRepository orderRepository; private MenuRepository menuRepository; private OrderTableRepository orderTableRepository; - private FakeKitchenridersClient kitchenridersClient; - private OrderService orderService; + private KitchenridersClient kitchenridersClient; @BeforeEach void setUp() { - orderRepository = new InMemoryOrderRepository(); - menuRepository = new InMemoryMenuRepository(); - orderTableRepository = new InMemoryOrderTableRepository(); - kitchenridersClient = new FakeKitchenridersClient(); + orderRepository = mock(OrderRepository.class); + menuRepository = mock(MenuRepository.class); + orderTableRepository = mock(OrderTableRepository.class); + kitchenridersClient = mock(KitchenridersClient.class); orderService = new OrderService(orderRepository, menuRepository, orderTableRepository, kitchenridersClient); } - @DisplayName("1개 이상의 등록된 메뉴로 배달 주문을 등록할 수 있다.") - @Test - void createDeliveryOrder() { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); - final Order expected = createOrderRequest( - OrderType.DELIVERY, "서울시 송파구 위례성대로 2", createOrderLineItemRequest(menuId, 19_000L, 3L) - ); - final Order actual = orderService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getType()).isEqualTo(expected.getType()), - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), - () -> assertThat(actual.getOrderDateTime()).isNotNull(), - () -> assertThat(actual.getOrderLineItems()).hasSize(1), - () -> assertThat(actual.getDeliveryAddress()).isEqualTo(expected.getDeliveryAddress()) - ); - } - - @DisplayName("1개 이상의 등록된 메뉴로 포장 주문을 등록할 수 있다.") - @Test - void createTakeoutOrder() { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); - final Order expected = createOrderRequest(OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, 3L)); - final Order actual = orderService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getType()).isEqualTo(expected.getType()), - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), - () -> assertThat(actual.getOrderDateTime()).isNotNull(), - () -> assertThat(actual.getOrderLineItems()).hasSize(1) - ); - } - - @DisplayName("1개 이상의 등록된 메뉴로 매장 주문을 등록할 수 있다.") - @Test - void createEatInOrder() { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); - final UUID orderTableId = orderTableRepository.save(orderTable(true, 4)).getId(); - final Order expected = createOrderRequest(OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, 3L)); - final Order actual = orderService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getType()).isEqualTo(expected.getType()), - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), - () -> assertThat(actual.getOrderDateTime()).isNotNull(), - () -> assertThat(actual.getOrderLineItems()).hasSize(1), - () -> assertThat(actual.getOrderTable().getId()).isEqualTo(expected.getOrderTableId()) - ); - } - - @DisplayName("주문 유형이 올바르지 않으면 등록할 수 없다.") - @NullSource - @ParameterizedTest - void create(final OrderType type) { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); - final Order expected = createOrderRequest(type, createOrderLineItemRequest(menuId, 19_000L, 3L)); - assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("메뉴가 없으면 등록할 수 없다.") - @MethodSource("orderLineItems") - @ParameterizedTest - void create(final List orderLineItems) { - final Order expected = createOrderRequest(OrderType.TAKEOUT, orderLineItems); - assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - private static List orderLineItems() { - return Arrays.asList( - null, - Arguments.of(Collections.emptyList()), - Arguments.of(Arrays.asList(createOrderLineItemRequest(INVALID_ID, 19_000L, 3L))) - ); - } - - @DisplayName("매장 주문은 주문 항목의 수량이 0 미만일 수 있다.") - @ValueSource(longs = -1L) - @ParameterizedTest - void createEatInOrder(final long quantity) { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); - final UUID orderTableId = orderTableRepository.save(orderTable(true, 4)).getId(); - final Order expected = createOrderRequest( - OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, quantity) - ); - assertDoesNotThrow(() -> orderService.create(expected)); - } - - @DisplayName("매장 주문을 제외한 주문의 경우 주문 항목의 수량은 0 이상이어야 한다.") - @ValueSource(longs = -1L) - @ParameterizedTest - void createWithoutEatInOrder(final long quantity) { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); - final Order expected = createOrderRequest( - OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, quantity) - ); - assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("배달 주소가 올바르지 않으면 배달 주문을 등록할 수 없다.") - @NullAndEmptySource - @ParameterizedTest - void create(final String deliveryAddress) { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); - final Order expected = createOrderRequest( - OrderType.DELIVERY, deliveryAddress, createOrderLineItemRequest(menuId, 19_000L, 3L) - ); - assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("빈 테이블에는 매장 주문을 등록할 수 없다.") - @Test - void createEmptyTableEatInOrder() { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); - final UUID orderTableId = orderTableRepository.save(orderTable(false, 0)).getId(); - final Order expected = createOrderRequest( - OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, 3L) - ); - assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("숨겨진 메뉴는 주문할 수 없다.") - @Test - void createNotDisplayedMenuOrder() { - final UUID menuId = menuRepository.save(menu(19_000L, false, menuProduct())).getId(); - final Order expected = createOrderRequest(OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, 3L)); - assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("주문한 메뉴의 가격은 실제 메뉴 가격과 일치해야 한다.") - @Test - void createNotMatchedMenuPriceOrder() { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); - final Order expected = createOrderRequest(OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 16_000L, 3L)); - assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("주문을 접수한다.") - @Test - void accept() { - final UUID orderId = orderRepository.save(order(OrderStatus.WAITING, orderTable(true, 4))).getId(); - final Order actual = orderService.accept(orderId); - assertThat(actual.getStatus()).isEqualTo(OrderStatus.ACCEPTED); - } - - @DisplayName("접수 대기 중인 주문만 접수할 수 있다.") - @EnumSource(value = OrderStatus.class, names = "WAITING", mode = EnumSource.Mode.EXCLUDE) - @ParameterizedTest - void accept(final OrderStatus status) { - final UUID orderId = orderRepository.save(order(status, orderTable(true, 4))).getId(); - assertThatThrownBy(() -> orderService.accept(orderId)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("배달 주문을 접수되면 배달 대행사를 호출한다.") - @Test - void acceptDeliveryOrder() { - final UUID orderId = orderRepository.save(order(OrderStatus.WAITING, "서울시 송파구 위례성대로 2")).getId(); - final Order actual = orderService.accept(orderId); - assertAll( - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.ACCEPTED), - () -> assertThat(kitchenridersClient.getOrderId()).isEqualTo(orderId), - () -> assertThat(kitchenridersClient.getDeliveryAddress()).isEqualTo("서울시 송파구 위례성대로 2") - ); - } - - @DisplayName("주문을 서빙한다.") - @Test - void serve() { - final UUID orderId = orderRepository.save(order(OrderStatus.ACCEPTED)).getId(); - final Order actual = orderService.serve(orderId); - assertThat(actual.getStatus()).isEqualTo(OrderStatus.SERVED); - } - - @DisplayName("접수된 주문만 서빙할 수 있다.") - @EnumSource(value = OrderStatus.class, names = "ACCEPTED", mode = EnumSource.Mode.EXCLUDE) - @ParameterizedTest - void serve(final OrderStatus status) { - final UUID orderId = orderRepository.save(order(status)).getId(); - assertThatThrownBy(() -> orderService.serve(orderId)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("주문을 배달한다.") - @Test - void startDelivery() { - final UUID orderId = orderRepository.save(order(OrderStatus.SERVED, "서울시 송파구 위례성대로 2")).getId(); - final Order actual = orderService.startDelivery(orderId); - assertThat(actual.getStatus()).isEqualTo(OrderStatus.DELIVERING); - } - - @DisplayName("배달 주문만 배달할 수 있다.") - @Test - void startDeliveryWithoutDeliveryOrder() { - final UUID orderId = orderRepository.save(order(OrderStatus.SERVED)).getId(); - assertThatThrownBy(() -> orderService.startDelivery(orderId)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("서빙된 주문만 배달할 수 있다.") - @EnumSource(value = OrderStatus.class, names = "SERVED", mode = EnumSource.Mode.EXCLUDE) - @ParameterizedTest - void startDelivery(final OrderStatus status) { - final UUID orderId = orderRepository.save(order(status, "서울시 송파구 위례성대로 2")).getId(); - assertThatThrownBy(() -> orderService.startDelivery(orderId)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("주문을 배달 완료한다.") - @Test - void completeDelivery() { - final UUID orderId = orderRepository.save(order(OrderStatus.DELIVERING, "서울시 송파구 위례성대로 2")).getId(); - final Order actual = orderService.completeDelivery(orderId); - assertThat(actual.getStatus()).isEqualTo(OrderStatus.DELIVERED); - } - - @DisplayName("배달 중인 주문만 배달 완료할 수 있다.") - @EnumSource(value = OrderStatus.class, names = "DELIVERING", mode = EnumSource.Mode.EXCLUDE) - @ParameterizedTest - void completeDelivery(final OrderStatus status) { - final UUID orderId = orderRepository.save(order(status, "서울시 송파구 위례성대로 2")).getId(); - assertThatThrownBy(() -> orderService.completeDelivery(orderId)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("주문을 완료한다.") - @Test - void complete() { - final Order expected = orderRepository.save(order(OrderStatus.DELIVERED, "서울시 송파구 위례성대로 2")); - final Order actual = orderService.complete(expected.getId()); - assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED); - } - - @DisplayName("배달 주문의 경우 배달 완료된 주문만 완료할 수 있다.") - @EnumSource(value = OrderStatus.class, names = "DELIVERED", mode = EnumSource.Mode.EXCLUDE) - @ParameterizedTest - void completeDeliveryOrder(final OrderStatus status) { - final UUID orderId = orderRepository.save(order(status, "서울시 송파구 위례성대로 2")).getId(); - assertThatThrownBy(() -> orderService.complete(orderId)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("포장 및 매장 주문의 경우 서빙된 주문만 완료할 수 있다.") - @EnumSource(value = OrderStatus.class, names = "SERVED", mode = EnumSource.Mode.EXCLUDE) - @ParameterizedTest - void completeTakeoutAndEatInOrder(final OrderStatus status) { - final UUID orderId = orderRepository.save(order(status)).getId(); - assertThatThrownBy(() -> orderService.complete(orderId)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("주문 테이블의 모든 매장 주문이 완료되면 빈 테이블로 설정한다.") - @Test - void completeEatInOrder() { - final OrderTable orderTable = orderTableRepository.save(orderTable(true, 4)); - final Order expected = orderRepository.save(order(OrderStatus.SERVED, orderTable)); - final Order actual = orderService.complete(expected.getId()); - assertAll( - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().isOccupied()).isFalse(), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().getNumberOfGuests()).isEqualTo(0) - ); - } - - @DisplayName("완료되지 않은 매장 주문이 있는 주문 테이블은 빈 테이블로 설정하지 않는다.") - @Test - void completeNotTable() { - final OrderTable orderTable = orderTableRepository.save(orderTable(true, 4)); - orderRepository.save(order(OrderStatus.ACCEPTED, orderTable)); - final Order expected = orderRepository.save(order(OrderStatus.SERVED, orderTable)); - final Order actual = orderService.complete(expected.getId()); - assertAll( - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().isOccupied()).isTrue(), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().getNumberOfGuests()).isEqualTo(4) - ); - } - - @DisplayName("주문의 목록을 조회할 수 있다.") - @Test - void findAll() { - final OrderTable orderTable = orderTableRepository.save(orderTable(true, 4)); - orderRepository.save(order(OrderStatus.SERVED, orderTable)); - orderRepository.save(order(OrderStatus.DELIVERED, "서울시 송파구 위례성대로 2")); - final List actual = orderService.findAll(); - assertThat(actual).hasSize(2); - } - - private Order createOrderRequest( - final OrderType type, - final String deliveryAddress, - final OrderLineItem... orderLineItems - ) { - final Order order = new Order(); - order.setType(type); - order.setDeliveryAddress(deliveryAddress); - order.setOrderLineItems(Arrays.asList(orderLineItems)); - return order; - } - - private Order createOrderRequest(final OrderType orderType, final OrderLineItem... orderLineItems) { - return createOrderRequest(orderType, Arrays.asList(orderLineItems)); - } - - private Order createOrderRequest(final OrderType orderType, final List orderLineItems) { - final Order order = new Order(); - order.setType(orderType); - order.setOrderLineItems(orderLineItems); - return order; - } - - private Order createOrderRequest( - final OrderType type, - final UUID orderTableId, - final OrderLineItem... orderLineItems - ) { - final Order order = new Order(); - order.setType(type); - order.setOrderTableId(orderTableId); - order.setOrderLineItems(Arrays.asList(orderLineItems)); - return order; - } - - private static OrderLineItem createOrderLineItemRequest(final UUID menuId, final long price, final long quantity) { - final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setSeq(new Random().nextLong()); - orderLineItem.setMenuId(menuId); - orderLineItem.setPrice(BigDecimal.valueOf(price)); - orderLineItem.setQuantity(quantity); - return orderLineItem; + private Order createOrderRequestWithOccupiedTable(OrderType type, OrderStatus orderStatus, Menu menu, + String address) { + OrderTable orderTable = createUsingOrderTable(); + return createOrder(createOrderLineItem(menu), orderTable, type, + orderStatus, address); + } + + private Order createOrderRequestWithEmptyTable(OrderType type, OrderStatus orderStatus, Menu menu, + String address) { + OrderTable orderTable = createEmptyOrderTable(); + return createOrder(createOrderLineItem(menu), orderTable, type, + orderStatus, address); + } + + @Nested + @DisplayName("공통 주문 관련") + class CommonOrder { + + @Test + @DisplayName("주문은 하나 이상의 주문 내역으로 생성할 수 있다") + void create_order() { + // given + Menu menu = createMenuWithProductAndGroup(); + Order request = createOrderRequestWithEmptyTable(OrderType.DELIVERY, OrderStatus.WAITING, menu, "서울"); + when(menuRepository.findAllByIdIn(anyList())).thenReturn(List.of(menu)); + when(menuRepository.findById(any())).thenReturn(Optional.of(menu)); + when(orderRepository.save(any())).thenAnswer(invocation -> invocation.getArgument(0)); + + // when + Order result = orderService.create(request); + + // then + assertThat(result.getOrderLineItems()).hasSize(1); + } + + @Test + @DisplayName("게시되지 않은 메뉴 주문 시 예외가 발생한다.") + void menu_name_exception() { + // given + Menu menu = createMenuWithProductAndGroup(false); + Order request = createOrderRequestWithEmptyTable(OrderType.DELIVERY, OrderStatus.WAITING, menu, "서울"); + when(menuRepository.findAllByIdIn(anyList())).thenReturn(List.of(menu)); + when(menuRepository.findById(any())).thenReturn(Optional.of(menu)); + + // when // then + assertThatThrownBy(() -> orderService.create(request)) + .isInstanceOf(IllegalStateException.class); + } + } + + @Nested + @DisplayName("배달 주문") + class DeliveryOrder { + + @Test + @DisplayName("배달 주문 시 주소가 없으면 예외가 발생한다.") + void delivery_address_exception() { + // given + Menu menu = createMenuWithProductAndGroup(); + Order request = createOrderRequestWithEmptyTable(OrderType.DELIVERY, OrderStatus.SERVED, menu, null); + when(menuRepository.findAllByIdIn(anyList())).thenReturn(List.of(menu)); + when(menuRepository.findById(any(UUID.class))).thenReturn(Optional.of(menu)); + + // when // then + assertThatThrownBy(() -> orderService.create(request)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("배달 주문 접수 시 배달 요청을 한다") + void delivery_success() { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrder(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, OrderType.DELIVERY, + OrderStatus.WAITING, "서울"); + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when + orderService.accept(order.getId()); + + // then + verify(kitchenridersClient).requestDelivery(any(), any(), any()); + } + + @ParameterizedTest + @EnumSource(value = OrderStatus.class, names = {"ACCEPTED", "SERVED", "DELIVERING", "DELIVERED", "COMPLETED"}) + @DisplayName("대기 중이 아닌 주문 시 예외가 발생한다.") + void accept_exception(OrderStatus status) { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrderWithDeliveryType(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, status); + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when // then + assertThatThrownBy(() -> orderService.accept(order.getId())) + .isInstanceOf(IllegalStateException.class); + } + + @Test + @DisplayName("대기 중인 주문만 접수할 수 있다") + void accept_success() { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrderWithDeliveryType(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, OrderStatus.WAITING); + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when + Order result = orderService.accept(order.getId()); + + // then + assertThat(result.getStatus()).isEqualTo(OrderStatus.ACCEPTED); + } + + @Test + @DisplayName("배달 주문은 배달 상태와 배달 완료일 때 주문을 완료할 수 있다") + void complete_order() { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrderWithDeliveryType(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, OrderStatus.DELIVERED); + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when + Order result = orderService.complete(order.getId()); + + // then + assertThat(result.getStatus()).isEqualTo(OrderStatus.COMPLETED); + } + } + + @Nested + @DisplayName("포장 주문") + class TakeOutOrder { + + @ParameterizedTest + @EnumSource(value = OrderStatus.class, names = {"ACCEPTED", "SERVED", "DELIVERING", "DELIVERED", "COMPLETED"}) + @DisplayName("대기 중이 아닌 주문 시 예외가 발생한다.") + void accept_exception(OrderStatus status) { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrderWithTakeOutType(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, status); + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when // then + assertThatThrownBy(() -> orderService.accept(order.getId())) + .isInstanceOf(IllegalStateException.class); + } + + @Test + @DisplayName("대기 중인 주문만 접수할 수 있다") + void accept_success() { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrderWithTakeOutType(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, OrderStatus.WAITING); + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when + Order result = orderService.accept(order.getId()); + + // then + assertThat(result.getStatus()).isEqualTo(OrderStatus.ACCEPTED); + } + + @Test + @DisplayName("포장 주문은 서빙이 완료 되면 주문을 완료할 수 있다") + void complete_order() { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrderWithTakeOutType(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, OrderStatus.SERVED); + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when + Order result = orderService.complete(order.getId()); + + // then + assertThat(result.getStatus()).isEqualTo(OrderStatus.COMPLETED); + } + + // 어떤 경우 든 통과함! + // 포장 주문 기능 추가 시 여기에 추가 + } + + @Nested + @DisplayName("매장 주문") + class EatInOrder { + + @Test + @DisplayName("이용 중이지 않은 테이블에서 주문 시 예외가 발생한다.") + void not_occupied_table_order_exception() { + // given + Menu menu = createMenuWithProductAndGroup(); + OrderTable orderTable = createEmptyOrderTable(); + Order request = createOrderRequestWithOccupiedTable(OrderType.EAT_IN, OrderStatus.WAITING, menu, "서울"); + request.setOrderTable(orderTable); + when(menuRepository.findAllByIdIn(anyList())).thenReturn(List.of(menu)); + when(menuRepository.findById(any())).thenReturn(Optional.of(menu)); + when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); + + // when // then + assertThatThrownBy(() -> orderService.create(request)) + .isInstanceOf(IllegalStateException.class); + } + + @Test + @DisplayName("매장 식사 주문 완료 시 다른 주문이 없으면 테이블을 비운다") + void clear_table_with_complete_status() { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrderWithEatInType(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, OrderStatus.SERVED); + order.setOrderTable(orderTable); + + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + when(orderRepository.existsByOrderTableAndStatusNot(any(), any())).thenReturn(false); + + // when + orderService.complete(order.getId()); + + // then + assertThat(orderTable.isOccupied()).isFalse(); + assertThat(orderTable.getNumberOfGuests()).isZero(); + } + + @ParameterizedTest + @EnumSource(value = OrderStatus.class, names = {"ACCEPTED", "SERVED", "DELIVERING", "DELIVERED", "COMPLETED"}) + @DisplayName("대기 중이 아닌 주문 시 예외가 발생한다.") + void accept_exception(OrderStatus status) { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrderWithEatInType(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, status); + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when // then + assertThatThrownBy(() -> orderService.accept(order.getId())) + .isInstanceOf(IllegalStateException.class); + } + + @Test + @DisplayName("대기 중인 주문만 접수할 수 있다") + void accept_success() { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrderWithEatInType(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, OrderStatus.WAITING); + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when + Order result = orderService.accept(order.getId()); + + // then + assertThat(result.getStatus()).isEqualTo(OrderStatus.ACCEPTED); + } + + @Test + @DisplayName("매장 주문은 서빙이 완료 되면 주문을 완료할 수 있다") + void complete_order() { + // given + OrderTable orderTable = createUsingOrderTable(); + Order order = createOrderWithEatInType(createOrderLineItem(createMenuWithProductAndGroup()), + orderTable, OrderStatus.SERVED); + when(orderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when + Order result = orderService.complete(order.getId()); + + // then + assertThat(result.getStatus()).isEqualTo(OrderStatus.COMPLETED); + } } } diff --git a/src/test/java/kitchenpos/order/common/infra/persistence/InMemoryOrderRepository.java b/src/test/java/kitchenpos/order/common/infra/persistence/InMemoryOrderRepository.java deleted file mode 100644 index a26de70e1..000000000 --- a/src/test/java/kitchenpos/order/common/infra/persistence/InMemoryOrderRepository.java +++ /dev/null @@ -1,39 +0,0 @@ -package kitchenpos.order.common.infra.persistence; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import kitchenpos.order.common.model.Order; -import kitchenpos.order.common.model.OrderStatus; -import kitchenpos.order.common.repository.OrderRepository; -import kitchenpos.order.eatinorder.domain.model.OrderTable; - -public class InMemoryOrderRepository implements OrderRepository { - private final Map orders = new HashMap<>(); - - @Override - public Order save(final Order order) { - orders.put(order.getId(), order); - return order; - } - - @Override - public Optional findById(final UUID id) { - return Optional.ofNullable(orders.get(id)); - } - - @Override - public List findAll() { - return new ArrayList<>(orders.values()); - } - - @Override - public boolean existsByOrderTableAndStatusNot(final OrderTable orderTable, final OrderStatus status) { - return orders.values() - .stream() - .anyMatch(order -> order.getOrderTable().equals(orderTable) && order.getStatus() != status); - } -} diff --git a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java new file mode 100644 index 000000000..43b4bdca7 --- /dev/null +++ b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java @@ -0,0 +1,230 @@ +package kitchenpos.order.common.ui; + +import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createOrderLineItem; +import static kitchenpos.TestFixtureFactory.createOrderWithDeliveryType; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.repository.MenuGroupRepository; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.common.model.OrderType; +import kitchenpos.order.common.repository.OrderRepository; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class OrderRestControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private OrderRepository orderRepository; + @Autowired + private OrderTableRepository orderTableRepository; + @Autowired + private MenuRepository menuRepository; + @Autowired + private MenuGroupRepository menuGroupRepository; + @Autowired + private ProductRepository productRepository; + + @Test + @DisplayName("주문을 생성한다.") + void create_success() throws Exception { + // given + Order request = createOrderRequestWithDeliveryType(); + + // when + ResultActions result = mockMvc.perform(post("/api/orders") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andExpect(jsonPath("$.id").exists()) + .andExpect(jsonPath("$.orderLineItems").isArray()) + .andExpect(jsonPath("$.status").value("WAITING")); + } + + @Test + @DisplayName("주문 상태가 주문 대기 중이라면 주문을 수락할 수 있다.") + void accept_success() throws Exception { + // given + Order savedOrder = createAndSaveOrderWithDeliveryType(); + + // when + ResultActions result = mockMvc.perform(put("/api/orders/{orderId}/accept", savedOrder.getId())); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.status").value("ACCEPTED")); + } + + @Test + @DisplayName("주문 상태가 접수 완료라면 서빙할 수 있다.") + void serve_success() throws Exception { + // given + Order savedOrder = createAndSaveOrderWithDeliveryType(); + savedOrder.setStatus(OrderStatus.ACCEPTED); + + // when + ResultActions result = mockMvc.perform(put("/api/orders/{orderId}/serve", savedOrder.getId())); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.status").value("SERVED")); + } + + @Test + @DisplayName("주문 상태가 서빙 완료라면 배달을 시작할 수 있다.") + void startDelivery_success() throws Exception { + // given + Order savedOrder = createAndSaveOrderWithDeliveryType(); + savedOrder.setStatus(OrderStatus.SERVED); + + // when + ResultActions result = mockMvc.perform(put("/api/orders/{orderId}/start-delivery", savedOrder.getId())); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.status").value("DELIVERING")); + } + + @Test + @DisplayName("주문 상태가 배달 중이라면 배달을 완료할 수 있다.") + void completeDelivery_success() throws Exception { + // given + Order savedOrder = createAndSaveOrderWithDeliveryType(); + savedOrder.setStatus(OrderStatus.DELIVERING); + + // when + ResultActions result = mockMvc.perform(put("/api/orders/{orderId}/complete-delivery", savedOrder.getId())); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.status").value("DELIVERED")); + } + + @ParameterizedTest + @CsvSource(value = { + "DELIVERY, DELIVERED, COMPLETED", + "TAKEOUT, SERVED, COMPLETED", + "EAT_IN, SERVED, COMPLETED", + }) + @DisplayName("주문 종류와 상태에 따라 주문을 완료할 수 있다.") + void complete_success(OrderType orderType, OrderStatus orderStatus, OrderStatus expected) throws Exception { + // given + Order savedOrder = createAndSaveOrderWithDeliveryType(); + savedOrder.setType(orderType); + savedOrder.setStatus(orderStatus); + + // when + ResultActions result = mockMvc.perform(put("/api/orders/{orderId}/complete", savedOrder.getId())); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.status").value(expected.toString())); + } + + @Test + @DisplayName("전체 주문을 조회한다.") + void findAll_success() throws Exception { + // given + createAndSaveOrderWithDeliveryType(); + createAndSaveOrderWithDeliveryType(); + + // when + ResultActions result = mockMvc.perform(get("/api/orders")); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$.length()").value(2)); + } + + private Order createOrderRequestWithDeliveryType() { + MenuGroup menuGroup = createAndSaveMenuGroup(); + Product product = createAndSaveProduct(); + Menu menu = createAndSaveMenu(menuGroup, product); + + OrderLineItem orderLineItem = createOrderLineItem(menu); + OrderTable orderTable = createAndSaveOrderWithDeliveryTypeTable(); + + return createOrderWithDeliveryType(orderLineItem, orderTable, OrderStatus.WAITING); + } + + private Order createAndSaveOrderWithDeliveryType() { + MenuGroup menuGroup = createAndSaveMenuGroup(); + Product product = createAndSaveProduct(); + Menu menu = createAndSaveMenu(menuGroup, product); + + OrderLineItem orderLineItem = createOrderLineItem(menu); + OrderTable orderTable = createAndSaveOrderWithDeliveryTypeTable(); + + Order order = createOrderWithDeliveryType(orderLineItem, orderTable, OrderStatus.WAITING); + return orderRepository.save(order); + } + + private OrderTable createAndSaveOrderWithDeliveryTypeTable() { + OrderTable orderTable = createEmptyOrderTable(); + orderTableRepository.save(orderTable); + return orderTable; + } + + private Menu createAndSaveMenu(MenuGroup menuGroup, Product product) { + Menu menu = createMenu(menuGroup, product); + menuRepository.save(menu); + return menu; + } + + private Product createAndSaveProduct() { + Product product = createProduct("김치", 4000); + productRepository.save(product); + return product; + } + + private MenuGroup createAndSaveMenuGroup() { + MenuGroup menuGroup = createMenuGroup(); + menuGroupRepository.save(menuGroup); + return menuGroup; + } +} diff --git a/src/test/java/kitchenpos/order/deliveryorder/infra/external/FakeKitchenridersClient.java b/src/test/java/kitchenpos/order/deliveryorder/infra/external/FakeKitchenridersClient.java deleted file mode 100644 index 808733387..000000000 --- a/src/test/java/kitchenpos/order/deliveryorder/infra/external/FakeKitchenridersClient.java +++ /dev/null @@ -1,29 +0,0 @@ -package kitchenpos.order.deliveryorder.infra.external; - -import java.math.BigDecimal; -import java.util.UUID; - -public class FakeKitchenridersClient implements KitchenridersClient { - private UUID orderId; - private BigDecimal amount; - private String deliveryAddress; - - @Override - public void requestDelivery(final UUID orderId, final BigDecimal amount, final String deliveryAddress) { - this.orderId = orderId; - this.amount = amount; - this.deliveryAddress = deliveryAddress; - } - - public UUID getOrderId() { - return orderId; - } - - public BigDecimal getAmount() { - return amount; - } - - public String getDeliveryAddress() { - return deliveryAddress; - } -} diff --git a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index dc691b7ac..0a46ac769 100644 --- a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -1,135 +1,175 @@ package kitchenpos.order.eatinorder.application; -import static kitchenpos.Fixtures.order; -import static kitchenpos.Fixtures.orderTable; +import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; +import static kitchenpos.TestFixtureFactory.createUsingOrderTable; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.util.List; -import java.util.UUID; -import kitchenpos.order.common.infra.persistence.InMemoryOrderRepository; +import java.util.Optional; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.repository.OrderRepository; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; -import kitchenpos.order.eatinorder.infra.persistence.InMemoryOrderTableRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.junit.jupiter.params.provider.ValueSource; class OrderTableServiceTest { + + private OrderTableService orderTableService; private OrderTableRepository orderTableRepository; private OrderRepository orderRepository; - private OrderTableService orderTableService; @BeforeEach void setUp() { - orderTableRepository = new InMemoryOrderTableRepository(); - orderRepository = new InMemoryOrderRepository(); + orderTableRepository = mock(OrderTableRepository.class); + orderRepository = mock(OrderRepository.class); orderTableService = new OrderTableService(orderTableRepository, orderRepository); } - @DisplayName("주문 테이블을 등록할 수 있다.") @Test + @DisplayName("매장 테이블을 만들 수 있다") void create() { - final OrderTable expected = createOrderTableRequest("1번"); - final OrderTable actual = orderTableService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()), - () -> assertThat(actual.getNumberOfGuests()).isZero(), - () -> assertThat(actual.isOccupied()).isFalse() - ); + // given + OrderTable request = createOrderTableRequest(); + when(orderTableRepository.save(any(OrderTable.class))) + .thenAnswer(invocation -> invocation.getArgument(0)); + + // when + OrderTable created = orderTableService.create(request); + + // then + assertThat(created.getId()).isNotNull(); + assertThat(created.getName()).isEqualTo("1번 테이블"); + assertThat(created.getNumberOfGuests()).isZero(); + assertThat(created.isOccupied()).isFalse(); } - @DisplayName("주문 테이블의 이름이 올바르지 않으면 등록할 수 없다.") - @NullAndEmptySource @ParameterizedTest - void create(final String name) { - final OrderTable expected = createOrderTableRequest(name); - assertThatThrownBy(() -> orderTableService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + @NullAndEmptySource + @DisplayName("매장 테이블 이름이 없으면 예외가 발생한다.") + void orderTable_name_exception(String name) { + // given + OrderTable request = new OrderTable(name, 0, false); + + // when // then + assertThatThrownBy(() -> orderTableService.create(request)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("전체 매장 테이블을 볼 수 있다") + void find_all() { + // given + List orderTables = List.of( + createEmptyOrderTable(), + createUsingOrderTable() + ); + when(orderTableRepository.findAll()).thenReturn(orderTables); + + // when + List found = orderTableService.findAll(); + + // then + assertThat(found).hasSize(2); } - @DisplayName("빈 테이블을 해지할 수 있다.") @Test + @DisplayName("빈 테이블을 이용할 수 있다") void sit() { - final UUID orderTableId = orderTableRepository.save(orderTable(false, 0)).getId(); - final OrderTable actual = orderTableService.sit(orderTableId); - assertThat(actual.isOccupied()).isTrue(); + // given + OrderTable orderTable = createEmptyOrderTable(); + when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); + + // when + OrderTable occupied = orderTableService.sit(orderTable.getId()); + + // then + assertThat(occupied.isOccupied()).isTrue(); } - @DisplayName("빈 테이블로 설정할 수 있다.") @Test + @DisplayName("모든 주문이 완료되면 테이블을 정리할 수 있다") void clear() { - final UUID orderTableId = orderTableRepository.save(orderTable(true, 4)).getId(); - final OrderTable actual = orderTableService.clear(orderTableId); - assertAll( - () -> assertThat(actual.getNumberOfGuests()).isZero(), - () -> assertThat(actual.isOccupied()).isFalse() - ); + // given + OrderTable orderTable = createUsingOrderTable(); + + when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); + when(orderRepository.existsByOrderTableAndStatusNot(any(), any())).thenReturn(false); + + // when + OrderTable cleared = orderTableService.clear(orderTable.getId()); + + // then + assertThat(cleared.isOccupied()).isFalse(); + assertThat(cleared.getNumberOfGuests()).isZero(); } - @DisplayName("완료되지 않은 주문이 있는 주문 테이블은 빈 테이블로 설정할 수 없다.") @Test - void clearWithUncompletedOrders() { - final OrderTable orderTable = orderTableRepository.save(orderTable(true, 4)); - final UUID orderTableId = orderTable.getId(); - orderRepository.save(order(OrderStatus.ACCEPTED, orderTable)); - assertThatThrownBy(() -> orderTableService.clear(orderTableId)) - .isInstanceOf(IllegalStateException.class); + @DisplayName("주문이 완료되지 않은 테이블을 정리할 시 예외가 발생한다.") + void orderTable_occupied_exception() { + // given + OrderTable orderTable = createUsingOrderTable(); + when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); + when(orderRepository.existsByOrderTableAndStatusNot(any(), eq(OrderStatus.COMPLETED))).thenReturn(true); + + // when // then + assertThatThrownBy(() -> orderTableService.clear(orderTable.getId())) + .isInstanceOf(IllegalStateException.class); } - @DisplayName("방문한 손님 수를 변경할 수 있다.") @Test - void changeNumberOfGuests() { - final UUID orderTableId = orderTableRepository.save(orderTable(true, 0)).getId(); - final OrderTable expected = changeNumberOfGuestsRequest(4); - final OrderTable actual = orderTableService.changeNumberOfGuests(orderTableId, expected); - assertThat(actual.getNumberOfGuests()).isEqualTo(4); - } + @DisplayName("테이블에 손님이 있는 경우에만 앉아 있는 손님의 수를 변경할 수 있다") + void change_numberOfGuests() { + // given + OrderTable orderTable = createUsingOrderTable(); + orderTable.setNumberOfGuests(4); - @DisplayName("방문한 손님 수가 올바르지 않으면 변경할 수 없다.") - @ValueSource(ints = -1) - @ParameterizedTest - void changeNumberOfGuests(final int numberOfGuests) { - final UUID orderTableId = orderTableRepository.save(orderTable(true, 0)).getId(); - final OrderTable expected = changeNumberOfGuestsRequest(numberOfGuests); - assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTableId, expected)) - .isInstanceOf(IllegalArgumentException.class); + when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); + + // when + OrderTable changed = orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable); + + // then + assertThat(changed.getNumberOfGuests()).isEqualTo(4); } - @DisplayName("빈 테이블은 방문한 손님 수를 변경할 수 없다.") @Test - void changeNumberOfGuestsInEmptyTable() { - final UUID orderTableId = orderTableRepository.save(orderTable(false, 0)).getId(); - final OrderTable expected = changeNumberOfGuestsRequest(4); - assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTableId, expected)) - .isInstanceOf(IllegalStateException.class); + @DisplayName("빈 테이블의 손님 수 변경 시 예외가 발생한다.") + void change_numberOfGuests_not_occupied_exception() { + // given + OrderTable orderTable = createEmptyOrderTable(); + orderTable.setNumberOfGuests(4); + + when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); + + // when // then + assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable)) + .isInstanceOf(IllegalStateException.class); } - @DisplayName("주문 테이블의 목록을 조회할 수 있다.") @Test - void findAll() { - orderTableRepository.save(orderTable()); - final List actual = orderTableService.findAll(); - assertThat(actual).hasSize(1); - } + @DisplayName("손님 수를 음수로 변경하면 예외가 발생한다..") + void change_numberOfGuests_negative_number_exception() { + // given + OrderTable orderTable = createUsingOrderTable(); + orderTable.setNumberOfGuests(-1); + + when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); - private OrderTable createOrderTableRequest(final String name) { - final OrderTable orderTable = new OrderTable(); - orderTable.setName(name); - return orderTable; + // when // then + assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable)) + .isInstanceOf(IllegalArgumentException.class); } - private OrderTable changeNumberOfGuestsRequest(final int numberOfGuests) { - final OrderTable orderTable = new OrderTable(); - orderTable.setNumberOfGuests(numberOfGuests); - return orderTable; + private OrderTable createOrderTableRequest() { + return new OrderTable("1번 테이블", 0, false); } } diff --git a/src/test/java/kitchenpos/order/eatinorder/infra/persistence/InMemoryOrderTableRepository.java b/src/test/java/kitchenpos/order/eatinorder/infra/persistence/InMemoryOrderTableRepository.java deleted file mode 100644 index 990542d2b..000000000 --- a/src/test/java/kitchenpos/order/eatinorder/infra/persistence/InMemoryOrderTableRepository.java +++ /dev/null @@ -1,30 +0,0 @@ -package kitchenpos.order.eatinorder.infra.persistence; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import kitchenpos.order.eatinorder.domain.model.OrderTable; -import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; - -public class InMemoryOrderTableRepository implements OrderTableRepository { - private final Map orderTables = new HashMap<>(); - - @Override - public OrderTable save(final OrderTable orderTable) { - orderTables.put(orderTable.getId(), orderTable); - return orderTable; - } - - @Override - public Optional findById(final UUID id) { - return Optional.ofNullable(orderTables.get(id)); - } - - @Override - public List findAll() { - return new ArrayList<>(orderTables.values()); - } -} diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java new file mode 100644 index 000000000..59e0774c1 --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java @@ -0,0 +1,135 @@ +package kitchenpos.order.eatinorder.ui; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class OrderTableRestControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private OrderTableRepository orderTableRepository; + + @Test + @DisplayName("주문 테이블을 생성한다") + void create_orderTable() throws Exception { + // given + OrderTable request = createOrderTableRequest(0); + + // when + ResultActions perform = mockMvc.perform(post("/api/order-tables") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + perform.andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andExpect(jsonPath("$.id").exists()) + .andExpect(jsonPath("$.numberOfGuests").value(0)) + .andExpect(jsonPath("$.occupied").value(false)); + } + + @Test + @DisplayName("주문 테이블을 착석 상태로 변경한다") + void sit_orderTable() throws Exception { + // given + OrderTable orderTable = createAndSaveOrderTable(4); + + // when + ResultActions perform = mockMvc.perform(put("/api/order-tables/{orderTableId}/sit", orderTable.getId())); + + // then + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(orderTable.getId().toString())) + .andExpect(jsonPath("$.occupied").value(true)); + } + + @Test + @DisplayName("주문 테이블을 빈 상태로 변경한다") + void clear_orderTable() throws Exception { + // given + OrderTable orderTable = createAndSaveOrderTable(4); + orderTable.setOccupied(true); + orderTableRepository.save(orderTable); + + // when + ResultActions perform = mockMvc.perform(put("/api/order-tables/{orderTableId}/clear", orderTable.getId())); + + // then + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(orderTable.getId().toString())) + .andExpect(jsonPath("$.occupied").value(false)) + .andExpect(jsonPath("$.numberOfGuests").value(0)); + } + + @Test + @DisplayName("주문 테이블의 손님 수를 변경한다") + void change_numberOfGuests() throws Exception { + // given + OrderTable orderTable = createAndSaveOrderTable(4); + orderTable.setOccupied(true); + orderTableRepository.save(orderTable); + + OrderTable request = createOrderTableRequest(6); + + // when + ResultActions perform = mockMvc.perform( + put("/api/order-tables/{orderTableId}/number-of-guests", orderTable.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(orderTable.getId().toString())) + .andExpect(jsonPath("$.numberOfGuests").value(6)); + } + + @Test + @DisplayName("전체 주문 테이블을 조회한다") + void find_allOrderTables() throws Exception { + // given + createAndSaveOrderTable(4); + createAndSaveOrderTable(6); + + // when + ResultActions perform = mockMvc.perform(get("/api/order-tables")); + + // then + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$.length()").value(2)); + } + + private OrderTable createOrderTableRequest(int numberOfGuests) { + return new OrderTable("1번 테이블", numberOfGuests, false); + } + + private OrderTable createAndSaveOrderTable(int numberOfGuests) { + OrderTable orderTable = new OrderTable("1번 테이블", numberOfGuests, false); + return orderTableRepository.save(orderTable); + } +} diff --git a/src/test/java/kitchenpos/product/application/ProductServiceTest.java b/src/test/java/kitchenpos/product/application/ProductServiceTest.java index 18f5cf1b5..dbee65925 100644 --- a/src/test/java/kitchenpos/product/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/product/application/ProductServiceTest.java @@ -1,133 +1,134 @@ package kitchenpos.product.application; -import static kitchenpos.Fixtures.menu; -import static kitchenpos.Fixtures.menuProduct; -import static kitchenpos.Fixtures.product; +import static kitchenpos.TestFixtureFactory.createProduct; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.math.BigDecimal; import java.util.List; -import java.util.UUID; +import java.util.Optional; import kitchenpos.common.application.PurgomalumClient; -import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.menu.domain.service.MarginValidator; +import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; -import kitchenpos.menu.infra.persistence.InMemoryMenuRepository; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; -import kitchenpos.product.infra.persistence.InMemoryProductRepository; +import kitchenpos.TestFixtureFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; class ProductServiceTest { + + private ProductService productService; private ProductRepository productRepository; private MenuRepository menuRepository; private PurgomalumClient purgomalumClient; - private ProductService productService; @BeforeEach void setUp() { - productRepository = new InMemoryProductRepository(); - menuRepository = new InMemoryMenuRepository(); - purgomalumClient = new FakePurgomalumClient(); - productService = new ProductService(productRepository, menuRepository, purgomalumClient); + productRepository = mock(ProductRepository.class); + menuRepository = mock(MenuRepository.class); + purgomalumClient = mock(PurgomalumClient.class); + ProductNameCreationService productNameCreationService = new ProductNameCreationService(purgomalumClient); + MarginValidator marginValidator = new MarginValidator(menuRepository); + productService = new ProductService(productRepository, productNameCreationService, marginValidator); } - @DisplayName("상품을 등록할 수 있다.") @Test + @DisplayName("상품을 등록할 수 있다") void create() { - final Product expected = createProductRequest("후라이드", 16_000L); - final Product actual = productService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()), - () -> assertThat(actual.getPrice()).isEqualTo(expected.getPrice()) - ); - } + // given + Product request = createProductRequest("김치", 5000); + when(purgomalumClient.containsProfanity(any())).thenReturn(false); + when(productRepository.save(any(Product.class))).thenAnswer(invocation -> invocation.getArgument(0)); - @DisplayName("상품의 가격이 올바르지 않으면 등록할 수 없다.") - @ValueSource(strings = "-1000") - @NullSource - @ParameterizedTest - void create(final BigDecimal price) { - final Product expected = createProductRequest("후라이드", price); - assertThatThrownBy(() -> productService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } + // when + Product result = productService.create(request); - @DisplayName("상품의 이름이 올바르지 않으면 등록할 수 없다.") - @ValueSource(strings = {"비속어", "욕설이 포함된 이름"}) - @NullSource - @ParameterizedTest - void create(final String name) { - final Product expected = createProductRequest(name, 16_000L); - assertThatThrownBy(() -> productService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + // then + assertThat(result.getId()).isNotNull(); + assertThat(result.getInnerName()).isEqualTo("김치"); + assertThat(result.getInnerPrice()).isEqualTo(BigDecimal.valueOf(5000)); } - @DisplayName("상품의 가격을 변경할 수 있다.") @Test - void changePrice() { - final UUID productId = productRepository.save(product("후라이드", 16_000L)).getId(); - final Product expected = changePriceRequest(15_000L); - final Product actual = productService.changePrice(productId, expected); - assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); + @DisplayName("상품 가격은 0원 미만이면 예외가 발생한다.") + void product_price_exception() { + // when // then + assertThatThrownBy(() -> productService.create(createProductRequest("김치", -1000))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("가격을 채워주세요!"); } - @DisplayName("상품의 가격이 올바르지 않으면 변경할 수 없다.") - @ValueSource(strings = "-1000") - @NullSource - @ParameterizedTest - void changePrice(final BigDecimal price) { - final UUID productId = productRepository.save(product("후라이드", 16_000L)).getId(); - final Product expected = changePriceRequest(price); - assertThatThrownBy(() -> productService.changePrice(productId, expected)) - .isInstanceOf(IllegalArgumentException.class); + @Test + @DisplayName("상품 이름에 비속어를 넣으면 예외가 발생한다.") + void product_name_exception() { + // given + Product request = createProductRequest("fuck", 5000); + when(purgomalumClient.containsProfanity("fuck")).thenReturn(true); + + // when // then + assertThatThrownBy(() -> productService.create(request)) + .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("상품의 가격이 변경될 때 메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 크면 메뉴가 숨겨진다.") @Test - void changePriceInMenu() { - final Product product = productRepository.save(product("후라이드", 16_000L)); - final Menu menu = menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); - productService.changePrice(product.getId(), changePriceRequest(8_000L)); - assertThat(menuRepository.findById(menu.getId()).get().isDisplayed()).isFalse(); + @DisplayName("상품의 가격을 변경할 수 있다") + void change_price() { + // given + Product product = createProduct("김치", 5000); + Product request = createProductRequest("김치", 6000); + when(productRepository.findById(any())).thenReturn(Optional.of(product)); + when(menuRepository.findAllByProductId(any())).thenReturn(List.of()); + + // when + Product result = productService.changePrice(product.getId(), request); + + // then + assertThat(result.getInnerPrice()).isEqualTo(BigDecimal.valueOf(6000)); } - @DisplayName("상품의 목록을 조회할 수 있다.") @Test - void findAll() { - productRepository.save(product("후라이드", 16_000L)); - productRepository.save(product("양념치킨", 16_000L)); - final List actual = productService.findAll(); - assertThat(actual).hasSize(2); - } + @DisplayName("상품 가격이 변하면 메뉴의 판매 가격이 재료 가격의 총합보다 낮은 메뉴는 게시가 중단된다") + void change_price_exception() { + // given + Product product = createProduct("김치", 5000); + Menu menu = TestFixtureFactory.createMenuWithProductAndGroup("김치찌개", 7000, product); + Product request = createProductRequest("김치", 8000); - private Product createProductRequest(final String name, final long price) { - return createProductRequest(name, BigDecimal.valueOf(price)); - } + when(productRepository.findById(any())).thenReturn(Optional.of(product)); + when(menuRepository.findAllByProductId(any())).thenReturn(List.of(menu)); + + // when + productService.changePrice(product.getId(), request); - private Product createProductRequest(final String name, final BigDecimal price) { - final Product product = new Product(); - product.setName(name); - product.setPrice(price); - return product; + // then + assertThat(menu.isDisplayed()).isFalse(); } - private Product changePriceRequest(final long price) { - return changePriceRequest(BigDecimal.valueOf(price)); + @Test + @DisplayName("전체 상품을 조회할 수 있다") + void find_all() { + // given + List products = List.of( + createProduct("김치", 5000), + createProduct("된장", 3000) + ); + when(productRepository.findAll()).thenReturn(products); + + // when + List result = productService.findAll(); + + // then + assertThat(result).hasSize(2); } - private Product changePriceRequest(final BigDecimal price) { - final Product product = new Product(); - product.setPrice(price); - return product; + private Product createProductRequest(String name, long price) { + return createProduct(name, price); } } diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java new file mode 100644 index 000000000..8c51742bb --- /dev/null +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java @@ -0,0 +1,35 @@ +package kitchenpos.product.domain.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import kitchenpos.common.application.PurgomalumClient; +import kitchenpos.common.infra.external.FakePurgomalumClient; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ProductNameCreationServiceTest { + + private ProductNameCreationService productNameCreationService; + private PurgomalumClient purgomalumClient; + + @BeforeEach + void setUp() { + purgomalumClient = new FakePurgomalumClient(); + productNameCreationService = new ProductNameCreationService(purgomalumClient); + } + + @Test + @DisplayName("이름에 비속어가 있으면 예외를 던집니다.") + void validate_name_exception() { + // given + String name = "비속어"; + FakePurgomalumClient fakePurgomalumClient = (FakePurgomalumClient) purgomalumClient; + fakePurgomalumClient.setProfanity(true); + + // when // then + assertThatThrownBy(() -> productNameCreationService.createName(name)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("이름에 비속어가 존재합니다. 비속어를 제외해주세요!"); + } +} diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java new file mode 100644 index 000000000..2a095279d --- /dev/null +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java @@ -0,0 +1,20 @@ +package kitchenpos.product.domain.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +class ProductNameTest { + + @ParameterizedTest + @NullAndEmptySource + @DisplayName("이름은 비어있거나, null이면 예외가 발생한다.") + void create_name_exception(String name) { + // when // then + assertThatThrownBy(() -> new ProductName(name)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("이름을 채워주세요!"); + } +} diff --git a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java new file mode 100644 index 000000000..b32ff84c6 --- /dev/null +++ b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java @@ -0,0 +1,28 @@ +package kitchenpos.product.domain.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.math.BigDecimal; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +class ProductPriceTest { + + @DisplayName("가격은 비어있거나 null이면 예외가 발생한다") + @ParameterizedTest + @MethodSource("invalidPriceProvider") + void create_price_exception(BigDecimal value) { + assertThatThrownBy(() -> new ProductPrice(value)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("가격을 채워주세요!"); + } + + private static Stream invalidPriceProvider() { + return Stream.of( + null, + BigDecimal.valueOf(-1) + ); + } +} diff --git a/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java b/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java new file mode 100644 index 000000000..06aa7523c --- /dev/null +++ b/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java @@ -0,0 +1,43 @@ +package kitchenpos.product.infra.persistence; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; + +public class FakeProductRepository implements ProductRepository { + + private final Map storage; + + public FakeProductRepository(Map storage) { + this.storage = storage; + } + + @Override + public List findAllByIdIn(List ids) { + return new ArrayList<>(storage.values().stream() + .filter(p -> ids.contains(p.getId())) + .toList()); + } + + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(storage.get(id)); + } + + @Override + public Product save(Product product) { + UUID id = UUID.randomUUID(); + product.setId(id); + storage.put(id, product); + return product; + } + + @Override + public List findAll() { + return new ArrayList<>(storage.values()); + } +} diff --git a/src/test/java/kitchenpos/product/infra/persistence/InMemoryProductRepository.java b/src/test/java/kitchenpos/product/infra/persistence/InMemoryProductRepository.java deleted file mode 100644 index d96ec2e56..000000000 --- a/src/test/java/kitchenpos/product/infra/persistence/InMemoryProductRepository.java +++ /dev/null @@ -1,38 +0,0 @@ -package kitchenpos.product.infra.persistence; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import kitchenpos.product.domain.model.Product; -import kitchenpos.product.domain.repository.ProductRepository; - -public class InMemoryProductRepository implements ProductRepository { - private final Map products = new HashMap<>(); - - @Override - public Product save(final Product product) { - products.put(product.getId(), product); - return product; - } - - @Override - public Optional findById(final UUID id) { - return Optional.ofNullable(products.get(id)); - } - - @Override - public List findAll() { - return new ArrayList<>(products.values()); - } - - @Override - public List findAllByIdIn(final List ids) { - return products.values() - .stream() - .filter(product -> ids.contains(product.getId())) - .toList(); - } -} diff --git a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java new file mode 100644 index 000000000..52ff06ea8 --- /dev/null +++ b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java @@ -0,0 +1,101 @@ +package kitchenpos.product.ui; + +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.math.BigDecimal; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class ProductRestControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private ProductRepository productRepository; + + @Test + @DisplayName("상품을 생성한다") + void create_product() throws Exception { + // given + Product request = createAndSaveProduct("김치", 5000); + + // when + ResultActions result = mockMvc.perform(post("/api/products") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andExpect(jsonPath("$.id").exists()) + .andExpect(jsonPath("$.name.value").value("김치")) + .andExpect(jsonPath("$.price.value").value(5000)); + } + + @Test + @DisplayName("상품의 가격을 변경한다") + void change_productPrice() throws Exception { + // given + Product request = createAndSaveProduct("김치", 5000); + request.changePrice(BigDecimal.valueOf(6000)); + + // when + ResultActions result = mockMvc.perform( + MockMvcRequestBuilders.put("/api/products/{productId}/price", request.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(request.getId().toString())) + .andExpect(jsonPath("$.price.value").value(6000)); + } + + @Test + @DisplayName("상품 목록을 조회한다") + void find_allProducts() throws Exception { + // given + createAndSaveProduct("김치", 5000); + createAndSaveProduct("호박", 1000); + + // when + ResultActions result = mockMvc.perform(get("/api/products")); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$.length()").value(2)); + } + + private Product createProductRequest() { + return createProduct("김치", 5000); + } + + private Product createAndSaveProduct(String name, int price) { + Product product = createProduct(name, price); + return productRepository.save(product); + } +} From 69ead3e4cde1e7aaed5ce5cda980f94bd039ea03 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Wed, 19 Feb 2025 09:16:35 +0900 Subject: [PATCH 03/71] =?UTF-8?q?[Step2]=202=EB=8B=A8=EA=B3=84=20-=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81(=EB=A9=94=EB=89=B4)=20(#34?= =?UTF-8?q?1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(kitchen pos) : InMemoryProductRepository 패키지 구조 옮기기 * refactor(kitchen pos) : sql script 가 작동하도록 DeliveryOrder 주석 처리 * feat(kitchen pos) : 첫번째 미션에서 수행한 테스트 코드 다시 가져오기 * fix(kitchen pos) : 레거시 코드의 마진이 남지 않는 문제 코드 수정 * fix(kitchen pos) : ControllerTest 들이 pathVariable을 잘 인식하도록 문자열 추가 * feat(kitchen pos) : 첫번째 미션에 존재하는 Menu name 빈 문자열 검증 로직 추가 * feat(kitchen pos) : 예외를 처리할 수 있도록 ExceptionHandler 추가 * style(kitchen pos) : import 문 최적화 및 정렬 * feat(kitchen pos) : 이름 생성 객체 추가 * feat(kitchen pos) : 가격 생성 객체 추가 * feat(kitchen pos) : NameCreationService 추가 및 NameCreationService 만 Name 생성 책임을 가질 수 있도록 protected 접근 제어자 사용 * refactor(kitchen pos) : Name, Price, NameCreationService 코드에 적용 * refactor(kitchen pos) : Name, Price Embeddable 설정 및 기본 생성자 null 초기화 * feat(kitchen pos) : Name, Price equals & hashcode 추가 * feat(kitchen pos) : 마진을 검증하는 MarginValidator 생성 및 적용 * refactor(kitchen pos) : MarginValidator -> ProductServiceTest 에 적용 * refactor(kitchen pos) : import 문 최적화 및 필요없는 종속성 로컬 변수로 수정하기 * chore(kitchen pos) : 첫번째 미션에서 가져온 테스트 코드 패키지 구조 변경 * fix(kitchen pos) : ProductRestControllerTest 실패 해결 ~> jsonPath expression 수정 * fix(kitchen pos) : 필요 없는 애노테이션 제거 * refactor(kitchen pos) : Name -> ProductName, Menu -> ProductMenu * refactor(kitchen pos) : NameCreationService -> ProductNameCreationService * refactor(kitchen pos) : MarginValidator 가 MenuRepository에 강하게 의존하고 있어 패키지 이동 * feat(kitchen pos) : MenuName 생성 * feat(kitchen pos) : MenuPrice 생성 * feat(kitchen pos) : MenuGroupName 생성 * refactor(kitchen pos) : MenuGroupService 리팩토링 * refactor(kitchen pos) : setDisplayed -> changeDisplay * refactor(kitchen pos) : MenuPrice, MenuName 코드에 적용하기 * refactor(kitchen pos) : MarginValidator 적용하기 * feat(kitchen pos) : MenuProductQuantity 생성 * refactor(kitchen pos) : MenuProductQuantity 적용하기 * feat(kitchen pos) : Menu 에 메뉴 그룹 및 메뉴 상품 존재 검증 로직 추가 * test(kitchen pos) : Menu 검증 로직 추가로 인한 테스트 수정 * feat(kitchen pos) : MenuProductValidator 생성 * refactor(kitchen pos) : MenuProductValidator 적용하기 * refactor(kitchen pos) : MenuService 리팩토링 * feat(kitchen pos) : MenuNameCreationService, MenuGroupNameCreationService 생성 * refactor(kitchen pos) : MenuNameCreationService 및 MenuGroupNameCreationService 적용 * style (kitchen pos) : 사용되지 않는 import 문 제거 * Revert "style (kitchen pos) : 사용되지 않는 import 문 제거" This reverts commit 3421e433a866241214c5b098494f95f4a6145f6d. * chore(kitchen pos) : InMemoryProductRepository 패키지 구조 옮기기 * refactor(kitchen pos) : sql script 가 작동하도록 DeliveryOrder 주석 처리 * feat(kitchen pos) : 첫번째 미션에서 수행한 테스트 코드 다시 가져오기 * style(kitchen pos) : import 문 최적화 및 정렬 * feat(kitchen pos) : 이름 생성 객체 추가 * feat(kitchen pos) : 가격 생성 객체 추가 * feat(kitchen pos) : NameCreationService 추가 및 NameCreationService 만 Name 생성 책임을 가질 수 있도록 protected 접근 제어자 사용 * refactor(kitchen pos) : Name, Price, NameCreationService 코드에 적용 * refactor(kitchen pos) : Name, Price Embeddable 설정 및 기본 생성자 null 초기화 * feat(kitchen pos) : Name, Price equals & hashcode 추가 * feat(kitchen pos) : 마진을 검증하는 MarginValidator 생성 및 적용 * refactor(kitchen pos) : MarginValidator -> ProductServiceTest 에 적용 * refactor(kitchen pos) : import 문 최적화 및 필요없는 종속성 로컬 변수로 수정하기 * chore(kitchen pos) : 첫번째 미션에서 가져온 테스트 코드 패키지 구조 변경 * fix(kitchen pos) : ProductRestControllerTest 실패 해결 ~> jsonPath expression 수정 * fix(kitchen pos) : 필요 없는 애노테이션 제거 * refactor(kitchen pos) : Name -> ProductName, Menu -> ProductMenu * refactor(kitchen pos) : NameCreationService -> ProductNameCreationService * refactor(kitchen pos) : MarginValidator 가 MenuRepository에 강하게 의존하고 있어 패키지 이동 * feat(kitchen pos) : MenuName 생성 * feat(kitchen pos) : MenuPrice 생성 * feat(kitchen pos) : MenuGroupName 생성 * refactor(kitchen pos) : MenuGroupService 리팩토링 * refactor(kitchen pos) : setDisplayed -> changeDisplay * refactor(kitchen pos) : MenuPrice, MenuName 코드에 적용하기 * refactor(kitchen pos) : MarginValidator 적용하기 * feat(kitchen pos) : MenuProductQuantity 생성 * refactor(kitchen pos) : MenuProductQuantity 적용하기 * feat(kitchen pos) : Menu 에 메뉴 그룹 및 메뉴 상품 존재 검증 로직 추가 * test(kitchen pos) : Menu 검증 로직 추가로 인한 테스트 수정 * feat(kitchen pos) : MenuProductValidator 생성 * refactor(kitchen pos) : MenuProductValidator 적용하기 * refactor(kitchen pos) : MenuService 리팩토링 * feat(kitchen pos) : MenuNameCreationService, MenuGroupNameCreationService 생성 * refactor(kitchen pos) : MenuNameCreationService 및 MenuGroupNameCreationService 적용 * style (kitchen pos) : 사용되지 않는 import 문 제거 * Revert "style (kitchen pos) : 사용되지 않는 import 문 제거" This reverts commit 3421e433a866241214c5b098494f95f4a6145f6d. * merge (kitchen pos) : upstream step1 conflict resolve * docs(kitchen pos) : 요구사항에 메뉴 카테고리 비속어 검증 추가 * refactor(kitchen pos) : MenuService 메뉴를 게시하기 전에 마진을 검증하도록 수정 --- README.md | 8 +- .../menu/application/MenuGroupService.java | 15 +- .../menu/application/MenuService.java | 135 +++++++----------- .../kitchenpos/menu/domain/model/Menu.java | 71 ++++++--- .../menu/domain/model/MenuGroup.java | 25 ++-- .../menu/domain/model/MenuGroupName.java | 49 +++++++ .../model/MenuGroupNameCreationService.java | 21 +++ .../menu/domain/model/MenuName.java | 50 +++++++ .../domain/model/MenuNameCreationService.java | 21 +++ .../menu/domain/model/MenuPrice.java | 50 +++++++ .../menu/domain/model/MenuProduct.java | 29 ++-- .../domain/model/MenuProductQuantity.java | 45 ++++++ .../menu/domain/service/MarginValidator.java | 11 +- .../domain/service/MenuProductValidator.java | 30 ++++ .../common/application/OrderService.java | 4 +- .../product/domain/model/ProductName.java | 4 +- .../model/ProductNameCreationService.java | 4 +- .../product/domain/model/ProductPrice.java | 4 +- .../java/kitchenpos/TestFixtureFactory.java | 17 ++- .../application/MenuGroupServiceTest.java | 11 +- .../menu/application/MenuServiceTest.java | 57 +++++--- .../MenuGroupNameCreationServiceTest.java | 35 +++++ .../menu/domain/model/MenuGroupNameTest.java | 20 +++ .../model/MenuNameCreationServiceTest.java | 35 +++++ .../menu/domain/model/MenuNameTest.java | 20 +++ .../menu/domain/model/MenuPriceTest.java | 28 ++++ .../domain/model/MenuProductQuantityTest.java | 21 +++ .../menu/domain/model/MenuTest.java | 75 ++++++++++ .../domain/service/MarginValidatorTest.java | 21 +++ .../service/MenuProductValidatorTest.java | 58 ++++++++ .../menu/ui/MenuGroupRestControllerTest.java | 30 ++-- .../menu/ui/MenuRestControllerTest.java | 76 +++++----- .../common/ui/OrderRestControllerTest.java | 6 +- .../application/ProductServiceTest.java | 2 +- .../model/ProductNameCreationServiceTest.java | 2 +- .../product/domain/model/ProductNameTest.java | 2 +- .../domain/model/ProductPriceTest.java | 6 +- .../product/ui/ProductRestControllerTest.java | 4 - 38 files changed, 851 insertions(+), 251 deletions(-) create mode 100644 src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java create mode 100644 src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java create mode 100644 src/main/java/kitchenpos/menu/domain/model/MenuName.java create mode 100644 src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java create mode 100644 src/main/java/kitchenpos/menu/domain/model/MenuPrice.java create mode 100644 src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java create mode 100644 src/main/java/kitchenpos/menu/domain/service/MenuProductValidator.java create mode 100644 src/test/java/kitchenpos/menu/domain/model/MenuGroupNameCreationServiceTest.java create mode 100644 src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java create mode 100644 src/test/java/kitchenpos/menu/domain/model/MenuNameCreationServiceTest.java create mode 100644 src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java create mode 100644 src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java create mode 100644 src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java create mode 100644 src/test/java/kitchenpos/menu/domain/model/MenuTest.java create mode 100644 src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java diff --git a/README.md b/README.md index ff8c2e40f..f69c3d0b1 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ docker compose -p kitchenpos up -d - 메뉴 그룹을 등록할 수 있다. - 메뉴 그룹의 이름이 올바르지 않으면 등록할 수 없다. - 메뉴 그룹의 이름은 비워 둘 수 없다. + - 메뉴 그룹의 이름에는 비속어가 포함될 수 없다. - 메뉴 그룹의 목록을 조회할 수 있다. ### 메뉴 @@ -117,9 +118,10 @@ docker compose -p kitchenpos up -d ### 2. 카테고리(menu-group) 요구 사항 - - [] : 카테고리는 이름을 가지고 있다. - - [] : 전체 카테고리를 볼 수 있다. - - [] : 카테고리를 등록할 수 있다. + - [] : 메뉴 카테고리는 이름을 가지고 있다. + - [] : 전체 메뉴 카테고리를 볼 수 있다. + - [] : 메뉴 카테고리를 등록할 수 있다. + - [] : 메뉴 카테고리에는 비속어를 넣을 수 없다. ### 3. 상품(product) 요구 사항 diff --git a/src/main/java/kitchenpos/menu/application/MenuGroupService.java b/src/main/java/kitchenpos/menu/application/MenuGroupService.java index a65f345f6..cd8d0eb51 100644 --- a/src/main/java/kitchenpos/menu/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menu/application/MenuGroupService.java @@ -1,9 +1,10 @@ package kitchenpos.menu.application; import java.util.List; -import java.util.Objects; import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuGroupName; +import kitchenpos.menu.domain.model.MenuGroupNameCreationService; import kitchenpos.menu.domain.repository.MenuGroupRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -11,20 +12,18 @@ @Service public class MenuGroupService { private final MenuGroupRepository menuGroupRepository; + private final MenuGroupNameCreationService menuGroupNameCreationService; - public MenuGroupService(final MenuGroupRepository menuGroupRepository) { + public MenuGroupService(final MenuGroupRepository menuGroupRepository, MenuGroupNameCreationService menuGroupNameCreationService) { this.menuGroupRepository = menuGroupRepository; + this.menuGroupNameCreationService = menuGroupNameCreationService; } @Transactional public MenuGroup create(final MenuGroup request) { final String name = request.getName(); - if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(); - } - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(UUID.randomUUID()); - menuGroup.setName(name); + MenuGroupName menuGroupName = menuGroupNameCreationService.createName(name); + final MenuGroup menuGroup = new MenuGroup(menuGroupName, UUID.randomUUID()); return menuGroupRepository.save(menuGroup); } diff --git a/src/main/java/kitchenpos/menu/application/MenuService.java b/src/main/java/kitchenpos/menu/application/MenuService.java index 1fa1611ac..9dcdceafe 100644 --- a/src/main/java/kitchenpos/menu/application/MenuService.java +++ b/src/main/java/kitchenpos/menu/application/MenuService.java @@ -1,17 +1,17 @@ package kitchenpos.menu.application; import java.math.BigDecimal; -import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; -import java.util.Objects; import java.util.UUID; +import java.util.stream.Collectors; + import kitchenpos.common.application.PurgomalumClient; -import kitchenpos.menu.domain.model.Menu; -import kitchenpos.menu.domain.model.MenuGroup; -import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.menu.domain.model.*; import kitchenpos.menu.domain.repository.MenuGroupRepository; import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.domain.service.MarginValidator; +import kitchenpos.menu.domain.service.MenuProductValidator; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.springframework.stereotype.Service; @@ -19,98 +19,75 @@ @Service public class MenuService { + private static final String NONE_MARGIN_EXCEPTION = "마진이 남지 않습니다! 마진을 남기게 만들어주세요!"; + private final MenuRepository menuRepository; private final MenuGroupRepository menuGroupRepository; private final ProductRepository productRepository; - private final PurgomalumClient purgomalumClient; + private final MarginValidator marginValidator; + private final MenuProductValidator menuProductValidator; + private final MenuNameCreationService menuNameCreationService; public MenuService( final MenuRepository menuRepository, final MenuGroupRepository menuGroupRepository, final ProductRepository productRepository, - final PurgomalumClient purgomalumClient + MarginValidator marginValidator, + MenuProductValidator menuProductValidator, + MenuNameCreationService menuNameCreationService ) { this.menuRepository = menuRepository; this.menuGroupRepository = menuGroupRepository; this.productRepository = productRepository; - this.purgomalumClient = purgomalumClient; + this.marginValidator = marginValidator; + this.menuProductValidator = menuProductValidator; + this.menuNameCreationService = menuNameCreationService; } @Transactional public Menu create(final Menu request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } + final BigDecimal price = request.getInnerPrice(); final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) .orElseThrow(NoSuchElementException::new); + final List menuProductRequests = request.getMenuProducts(); - if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) { - throw new IllegalArgumentException(); - } - final List products = productRepository.findAllByIdIn( - menuProductRequests.stream() - .map(MenuProduct::getProductId) - .toList() - ); - if (products.size() != menuProductRequests.size()) { - throw new IllegalArgumentException(); - } - final List menuProducts = new ArrayList<>(); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProductRequest : menuProductRequests) { - final long quantity = menuProductRequest.getQuantity(); - if (quantity < 0) { - throw new IllegalArgumentException(); - } - final Product product = productRepository.findById(menuProductRequest.getProductId()) - .orElseThrow(NoSuchElementException::new); - sum = sum.add( - product.getInnerPrice() - .multiply(BigDecimal.valueOf(quantity)) - ); - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setProduct(product); - menuProduct.setQuantity(quantity); - menuProducts.add(menuProduct); - } - if (price.compareTo(sum) < 0) { - throw new IllegalArgumentException(); - } - final String name = request.getName(); - if (Objects.isNull(name) || name.isEmpty() || purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(); - } - final Menu menu = new Menu(); - menu.setId(UUID.randomUUID()); - menu.setName(name); - menu.setPrice(price); - menu.setMenuGroup(menuGroup); - menu.setDisplayed(request.isDisplayed()); - menu.setMenuProducts(menuProducts); + menuProductValidator.validateMenuProduct(menuProductRequests); + final List menuProducts = createMenuProductsByRequest(menuProductRequests); + + final String name = request.getInnerName(); + MenuName menuName = menuNameCreationService.createName(name); + + final Menu menu = new Menu(UUID.randomUUID(), menuName, new MenuPrice(price), menuGroup, request.isDisplayed(), menuProducts, menuGroup.getId()); + validateMargin(menu); + return menuRepository.save(menu); } + private List createMenuProductsByRequest(List menuProductRequests) { + return menuProductRequests.stream().map(this::createMenuProductByRequest).toList(); + } + + private MenuProduct createMenuProductByRequest(MenuProduct request) { + final long quantity = request.getInnerQuantity(); + final Product product = productRepository.findById(request.getProductId()) + .orElseThrow(NoSuchElementException::new); + return new MenuProduct(product, new MenuProductQuantity(quantity), product.getId()); + } + + private void validateMargin(Menu menu) { + boolean hasMargin = marginValidator.checkMargin(menu); + if (!hasMargin) { + throw new IllegalStateException(NONE_MARGIN_EXCEPTION); + } + } + @Transactional public Menu changePrice(final UUID menuId, final Menu request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } + final BigDecimal price = request.getInnerPrice(); final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getInnerPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (price.compareTo(sum) < 0) { - throw new IllegalArgumentException(); - } - menu.setPrice(price); + menu.changePrice(price); + validateMargin(menu); return menu; } @@ -118,18 +95,8 @@ public Menu changePrice(final UUID menuId, final Menu request) { public Menu display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getInnerPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (menu.getPrice().compareTo(sum) < 0) { - throw new IllegalStateException(); - } - menu.setDisplayed(true); + validateMargin(menu); + menu.changeDisplay(true); return menu; } @@ -137,7 +104,7 @@ public Menu display(final UUID menuId) { public Menu hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); - menu.setDisplayed(false); + menu.changeDisplay(false); return menu; } diff --git a/src/main/java/kitchenpos/menu/domain/model/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java index 48432c41e..b92a216f4 100644 --- a/src/main/java/kitchenpos/menu/domain/model/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -2,6 +2,7 @@ import jakarta.persistence.CascadeType; import jakarta.persistence.Column; +import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.ForeignKey; import jakarta.persistence.Id; @@ -12,20 +13,24 @@ import jakarta.persistence.Transient; import java.math.BigDecimal; import java.util.List; +import java.util.NoSuchElementException; import java.util.UUID; @Table(name = "menu") @Entity public class Menu { + private static final String MENU_PRODUCTS_EXISTS_EXCEPTION = "메뉴 상품이 존재하지 않습니다!"; + private static final String MENU_GROUP_EXISTS_EXCEPTION = "메뉴 그룹이 존재하지 않습니다!"; + @Column(name = "id", columnDefinition = "binary(16)") @Id private UUID id; - @Column(name = "name", nullable = false) - private String name; + @Embedded + private MenuName name; - @Column(name = "price", nullable = false) - private BigDecimal price; + @Embedded + private MenuPrice price; @ManyToOne(optional = false) @JoinColumn( @@ -53,21 +58,41 @@ public class Menu { public Menu() { } - public Menu(UUID id, String name, BigDecimal price, boolean displayed, List menuProducts, - MenuGroup menuGroup, - UUID menuGroupId) { + public Menu(UUID id, MenuName name, MenuPrice price, MenuGroup menuGroup, boolean displayed, + List menuProducts, UUID menuGroupId) { + validateMenuGroupExists(menuGroup); + validateMenuProductsExists(menuProducts); this.id = id; this.name = name; this.price = price; + this.menuGroup = menuGroup; this.displayed = displayed; this.menuProducts = menuProducts; - this.menuGroup = menuGroup; this.menuGroupId = menuGroupId; } + public Menu(UUID id, String name, BigDecimal price, boolean displayed, List menuProducts, + MenuGroup menuGroup, + UUID menuGroupId) { + this(id, new MenuName(name), new MenuPrice(price), menuGroup, displayed, menuProducts, menuGroupId); + } + public Menu(String name, BigDecimal price, boolean displayed, List menuProducts, MenuGroup menuGroup, UUID menuGroupId) { - this(UUID.randomUUID(), name, price, displayed, menuProducts, menuGroup, menuGroupId); + this(UUID.randomUUID(), new MenuName(name), new MenuPrice(price), menuGroup, displayed, menuProducts, + menuGroupId); + } + + private void validateMenuGroupExists(MenuGroup menuGroup) { + if (menuGroup == null) { + throw new NoSuchElementException(MENU_GROUP_EXISTS_EXCEPTION); + } + } + + private void validateMenuProductsExists(List menuProducts) { + if (menuProducts == null || menuProducts.isEmpty()) { + throw new NoSuchElementException(MENU_PRODUCTS_EXISTS_EXCEPTION); + } } public UUID getId() { @@ -78,35 +103,39 @@ public void setId(final UUID id) { this.id = id; } - public String getName() { + public String getInnerName() { + return name.getValue(); + } + + public MenuName getName() { return name; } public void setName(final String name) { - this.name = name; + this.name = new MenuName(name); } - public BigDecimal getPrice() { + public BigDecimal getInnerPrice() { + return price.getValue(); + } + + public MenuPrice getPrice() { return price; } - public void setPrice(final BigDecimal price) { - this.price = price; + public void changePrice(final BigDecimal price) { + this.price = new MenuPrice(price); } public MenuGroup getMenuGroup() { return menuGroup; } - public void setMenuGroup(final MenuGroup menuGroup) { - this.menuGroup = menuGroup; - } - public boolean isDisplayed() { return displayed; } - public void setDisplayed(final boolean displayed) { + public void changeDisplay(final boolean displayed) { this.displayed = displayed; } @@ -118,10 +147,6 @@ public List getMenuProducts() { return menuProducts; } - public void setMenuProducts(final List menuProducts) { - this.menuProducts = menuProducts; - } - public UUID getMenuGroupId() { return menuGroupId; } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java index 92ecc5cf7..bc19fb5c3 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java @@ -1,6 +1,7 @@ package kitchenpos.menu.domain.model; import jakarta.persistence.Column; +import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; @@ -13,14 +14,16 @@ public class MenuGroup { @Id private UUID id; - @Column(name = "name", nullable = false) - private String name; + @Embedded + private MenuGroupName name; - public MenuGroup() { + public MenuGroup(MenuGroupName name, UUID id) { + this.name = name; + this.id = id; } public MenuGroup(String name, UUID id) { - this.name = name; + this.name = new MenuGroupName(name); this.id = id; } @@ -28,6 +31,14 @@ public MenuGroup(String name) { this(name, UUID.randomUUID()); } + public MenuGroup(MenuGroupName name) { + this(name, UUID.randomUUID()); + } + + protected MenuGroup() { + + } + public UUID getId() { return id; } @@ -37,10 +48,6 @@ public void setId(final UUID id) { } public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; + return name.getValue(); } } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java new file mode 100644 index 000000000..8f501066a --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java @@ -0,0 +1,49 @@ +package kitchenpos.menu.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import java.util.Objects; + +@Embeddable +public class MenuGroupName { + private static final String MENU_CATEGORY_NAME_CREATION_EXCEPTION = "메뉴 카테고리 이름을 채워주세요!"; + + @Column(name = "name", nullable = false) + private final String value; + + protected MenuGroupName(String value) { + validateMenuGroupName(value); + this.value = value; + } + + private void validateMenuGroupName(String value) { + if (Objects.isNull(value) || value.isEmpty()) { + throw new IllegalArgumentException(MENU_CATEGORY_NAME_CREATION_EXCEPTION); + } + } + + protected MenuGroupName() { + this.value = null; + } + + public String getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MenuGroupName that = (MenuGroupName) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } +} diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java new file mode 100644 index 000000000..486a3c10e --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java @@ -0,0 +1,21 @@ +package kitchenpos.menu.domain.model; + +import kitchenpos.common.application.PurgomalumClient; +import org.springframework.stereotype.Service; + +@Service +public class MenuGroupNameCreationService { + private static final String MENU_GROUP_NAME_VALIDATION_EXCEPTION = "메뉴 카테고리 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"; + private final PurgomalumClient purgomalumClient; + + public MenuGroupNameCreationService(PurgomalumClient purgomalumClient) { + this.purgomalumClient = purgomalumClient; + } + + public MenuGroupName createName(String name) { + if (purgomalumClient.containsProfanity(name)) { + throw new IllegalArgumentException(MENU_GROUP_NAME_VALIDATION_EXCEPTION); + } + return new MenuGroupName(name); + } +} diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuName.java b/src/main/java/kitchenpos/menu/domain/model/MenuName.java new file mode 100644 index 000000000..5cabc4a60 --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/model/MenuName.java @@ -0,0 +1,50 @@ +package kitchenpos.menu.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; + +import java.util.Objects; + +@Embeddable +public class MenuName { + private static final String MENU_NAME_CREATION_EXCEPTION = "메뉴 이름을 채워주세요!"; + + @Column(name = "name", nullable = false) + private final String value; + + protected MenuName(String value) { + validateName(value); + this.value = value; + } + + protected MenuName() { + this.value = null; + } + + private void validateName(String name) { + if (Objects.isNull(name) || name.isEmpty()) { + throw new IllegalArgumentException(MENU_NAME_CREATION_EXCEPTION); + } + } + + public String getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MenuName menuName = (MenuName) o; + return Objects.equals(value, menuName.value); + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } +} diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java b/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java new file mode 100644 index 000000000..d835c92e0 --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java @@ -0,0 +1,21 @@ +package kitchenpos.menu.domain.model; + +import kitchenpos.common.application.PurgomalumClient; +import org.springframework.stereotype.Service; + +@Service +public class MenuNameCreationService { + private static final String MENU_NAME_VALIDATION_EXCEPTION = "메뉴 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"; + private final PurgomalumClient purgomalumClient; + + public MenuNameCreationService(PurgomalumClient purgomalumClient) { + this.purgomalumClient = purgomalumClient; + } + + public MenuName createName(String name) { + if (purgomalumClient.containsProfanity(name)) { + throw new IllegalArgumentException(MENU_NAME_VALIDATION_EXCEPTION); + } + return new MenuName(name); + } +} diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java new file mode 100644 index 000000000..08ef01e29 --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java @@ -0,0 +1,50 @@ +package kitchenpos.menu.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import java.math.BigDecimal; +import java.util.Objects; + +@Embeddable +public class MenuPrice { + private static final String MENU_PRICE_CREATION_EXCEPTION = "메뉴 가격을 채워주세요!"; + + @Column(name = "price", nullable = false) + private final BigDecimal value; + + public MenuPrice(BigDecimal value) { + validatePrice(value); + this.value = value; + } + + protected MenuPrice() { + this.value = null; + } + + private void validatePrice(BigDecimal value) { + if (Objects.isNull(value) || value.compareTo(BigDecimal.ZERO) < 0) { + throw new IllegalArgumentException(MENU_PRICE_CREATION_EXCEPTION); + } + } + + public BigDecimal getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MenuPrice menuPrice = (MenuPrice) o; + return Objects.equals(value, menuPrice.value); + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } +} diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java index b065b1394..5e6fa5d25 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java @@ -1,6 +1,7 @@ package kitchenpos.menu.domain.model; import jakarta.persistence.Column; +import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.ForeignKey; import jakarta.persistence.GeneratedValue; @@ -29,8 +30,8 @@ public class MenuProduct { ) private Product product; - @Column(name = "quantity", nullable = false) - private long quantity; + @Embedded + private MenuProductQuantity quantity; @Transient private UUID productId; @@ -38,18 +39,14 @@ public class MenuProduct { public MenuProduct() { } - public MenuProduct(long quantity, Product product, UUID productId) { - this.quantity = quantity; + public MenuProduct(Product product, MenuProductQuantity quantity, UUID productId) { this.product = product; + this.quantity = quantity; this.productId = productId; } - public Long getSeq() { - return seq; - } - - public void setSeq(final Long seq) { - this.seq = seq; + public MenuProduct(long quantity, Product product, UUID productId) { + this(product, new MenuProductQuantity(quantity), productId); } public Product getProduct() { @@ -60,19 +57,11 @@ public void setProduct(final Product product) { this.product = product; } - public long getQuantity() { - return quantity; - } - - public void setQuantity(final long quantity) { - this.quantity = quantity; + public long getInnerQuantity() { + return quantity.getValue(); } public UUID getProductId() { return productId; } - - public void setProductId(final UUID productId) { - this.productId = productId; - } } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java new file mode 100644 index 000000000..9734d1ce6 --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java @@ -0,0 +1,45 @@ +package kitchenpos.menu.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; + +import java.util.Objects; + +@Embeddable +public class MenuProductQuantity { + private static final String MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION = "메뉴 상품의 수량은 0보다 커야 합니다!"; + + @Column(name = "quantity", nullable = false) + private final Long value; + + public MenuProductQuantity(long value) { + validateMenuProductQuantity(value); + this.value = value; + } + + private void validateMenuProductQuantity(long value) { + if (value <= 0) { + throw new IllegalArgumentException(MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION); + } + } + + protected MenuProductQuantity() { + this.value = null; + } + + public Long getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + MenuProductQuantity that = (MenuProductQuantity) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } +} diff --git a/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java b/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java index 825cd78bd..bd240fb7b 100644 --- a/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java +++ b/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.util.List; + import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuProduct; import kitchenpos.menu.domain.repository.MenuRepository; @@ -24,17 +25,19 @@ public void checkMargin(Product product) { } } - private void checkMargin(Menu menu) { + public boolean checkMargin(Menu menu) { BigDecimal sum = BigDecimal.ZERO; for (final MenuProduct menuProduct : menu.getMenuProducts()) { sum = sum.add( menuProduct.getProduct() .getInnerPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) + .multiply(BigDecimal.valueOf(menuProduct.getInnerQuantity())) ); } - if (menu.getPrice().compareTo(sum) < 0) { - menu.changeDisplay(); + if (menu.getInnerPrice().compareTo(sum) < 0) { + menu.changeDisplay(false); + return false; } + return true; } } diff --git a/src/main/java/kitchenpos/menu/domain/service/MenuProductValidator.java b/src/main/java/kitchenpos/menu/domain/service/MenuProductValidator.java new file mode 100644 index 000000000..adce2949f --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/service/MenuProductValidator.java @@ -0,0 +1,30 @@ +package kitchenpos.menu.domain.service; + +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class MenuProductValidator { + private static final String MENU_PRODUCT_VALIDATION_EXCEPTION = "메뉴 상품에 들어갈 상품 수와 실제 상품 수가 다릅니다!"; + + private final ProductRepository productRepository; + + public MenuProductValidator(ProductRepository productRepository) { + this.productRepository = productRepository; + } + + public void validateMenuProduct(List menuProducts) { + final List products = productRepository.findAllByIdIn( + menuProducts.stream() + .map(MenuProduct::getProductId) + .toList() + ); + if (products.size() != menuProducts.size()) { + throw new IllegalArgumentException(MENU_PRODUCT_VALIDATION_EXCEPTION); + } + } +} diff --git a/src/main/java/kitchenpos/order/common/application/OrderService.java b/src/main/java/kitchenpos/order/common/application/OrderService.java index 76af7bb1e..7d5c00d3c 100644 --- a/src/main/java/kitchenpos/order/common/application/OrderService.java +++ b/src/main/java/kitchenpos/order/common/application/OrderService.java @@ -70,7 +70,7 @@ public Order create(final Order request) { if (!menu.isDisplayed()) { throw new IllegalStateException(); } - if (menu.getPrice().compareTo(orderLineItemRequest.getPrice()) != 0) { + if (menu.getInnerPrice().compareTo(orderLineItemRequest.getPrice()) != 0) { throw new IllegalArgumentException(); } final OrderLineItem orderLineItem = new OrderLineItem(); @@ -113,7 +113,7 @@ public Order accept(final UUID orderId) { BigDecimal sum = BigDecimal.ZERO; for (final OrderLineItem orderLineItem : order.getOrderLineItems()) { sum = orderLineItem.getMenu() - .getPrice() + .getInnerPrice() .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())); } kitchenridersClient.requestDelivery(orderId, sum, order.getDeliveryAddress()); diff --git a/src/main/java/kitchenpos/product/domain/model/ProductName.java b/src/main/java/kitchenpos/product/domain/model/ProductName.java index 4e51e2619..0e2c9effb 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductName.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductName.java @@ -6,7 +6,7 @@ @Embeddable public class ProductName { - private static final String NAME_CREATION_EXCEPTION = "이름을 채워주세요!"; + private static final String PRODUCT_NAME_CREATION_EXCEPTION = "상품 이름을 채워주세요!"; @Column(name = "name", nullable = false) private final String value; @@ -22,7 +22,7 @@ protected ProductName() { private void validateName(String name) { if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(NAME_CREATION_EXCEPTION); + throw new IllegalArgumentException(PRODUCT_NAME_CREATION_EXCEPTION); } } diff --git a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java index afaaa9361..c722e6594 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java @@ -5,7 +5,7 @@ @Service public class ProductNameCreationService { - private static final String NAME_VALIDATION_EXCEPTION = "이름에 비속어가 존재합니다. 비속어를 제외해주세요!"; + private static final String PRODUCT_NAME_VALIDATION_EXCEPTION = "상품 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"; private final PurgomalumClient purgomalumClient; public ProductNameCreationService(PurgomalumClient purgomalumClient) { @@ -14,7 +14,7 @@ public ProductNameCreationService(PurgomalumClient purgomalumClient) { public ProductName createName(String name) { if (purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(NAME_VALIDATION_EXCEPTION); + throw new IllegalArgumentException(PRODUCT_NAME_VALIDATION_EXCEPTION); } return new ProductName(name); } diff --git a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java index 5a4ad559d..af7fa556a 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java @@ -7,7 +7,7 @@ @Embeddable public class ProductPrice { - private static final String PRICE_CREATION_EXCEPTION = "가격을 채워주세요!"; + private static final String PRODUCT_PRICE_CREATION_EXCEPTION = "상품 가격을 채워주세요!"; @Column(name = "price", nullable = false) private final BigDecimal value; @@ -23,7 +23,7 @@ protected ProductPrice() { private void validatePrice(BigDecimal value) { if (Objects.isNull(value) || value.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(PRICE_CREATION_EXCEPTION); + throw new IllegalArgumentException(PRODUCT_PRICE_CREATION_EXCEPTION); } } diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 8d84647ae..121598c39 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -3,11 +3,10 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; -import kitchenpos.product.domain.model.ProductName; -import kitchenpos.product.domain.model.ProductNameCreationService; -import kitchenpos.product.domain.model.ProductPrice; +import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuGroupNameCreationService; import kitchenpos.menu.domain.model.MenuProduct; import kitchenpos.order.common.model.Order; import kitchenpos.order.common.model.OrderLineItem; @@ -15,12 +14,17 @@ import kitchenpos.order.common.model.OrderType; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.product.domain.model.Product; -import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.product.domain.model.ProductName; +import kitchenpos.product.domain.model.ProductNameCreationService; +import kitchenpos.product.domain.model.ProductPrice; public class TestFixtureFactory { public static MenuGroup createMenuGroup() { - return new MenuGroup("한식"); + return new MenuGroup( + new MenuGroupNameCreationService(new FakePurgomalumClient()) + .createName("한식") + ); } public static Product createProduct(BigDecimal value) { @@ -30,7 +34,8 @@ public static Product createProduct(BigDecimal value) { } private static ProductName createName(String value) { - ProductNameCreationService productNameCreationService = new ProductNameCreationService(new FakePurgomalumClient()); + ProductNameCreationService productNameCreationService = new ProductNameCreationService( + new FakePurgomalumClient()); return productNameCreationService.createName(value); } diff --git a/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java index b16a0595b..a6a1b4f04 100644 --- a/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java @@ -9,7 +9,10 @@ import java.util.Arrays; import java.util.List; + +import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuGroupNameCreationService; import kitchenpos.menu.domain.repository.MenuGroupRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -25,7 +28,8 @@ class MenuGroupServiceTest { @BeforeEach void setUp() { menuGroupRepository = mock(MenuGroupRepository.class); - menuGroupService = new MenuGroupService(menuGroupRepository); + MenuGroupNameCreationService menuGroupNameCreationService = new MenuGroupNameCreationService(new FakePurgomalumClient()); + menuGroupService = new MenuGroupService(menuGroupRepository, menuGroupNameCreationService); } @Test @@ -50,11 +54,8 @@ void create_menuGroup() { @NullAndEmptySource @DisplayName("메뉴 그룹 이름이 null이거나 비어있으면 예외가 발생한다") void create_MenuGroup_fail(String name) { - // given - MenuGroup request = new MenuGroup(name); - // when // then - assertThatThrownBy(() -> menuGroupService.create(request)) + assertThatThrownBy(() -> menuGroupService.create(new MenuGroup(name))) .isInstanceOf(IllegalArgumentException.class); } diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 0067873d4..8ec64db66 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -9,12 +9,16 @@ import java.util.HashMap; import java.util.List; import java.util.NoSuchElementException; + import kitchenpos.common.application.PurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuNameCreationService; import kitchenpos.menu.domain.model.MenuProduct; import kitchenpos.menu.domain.repository.MenuGroupRepository; import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.domain.service.MarginValidator; +import kitchenpos.menu.domain.service.MenuProductValidator; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import kitchenpos.menu.infra.persistence.FakeMenuGroupRepository; @@ -41,7 +45,10 @@ void setUp() { menuGroupRepository = new FakeMenuGroupRepository(new HashMap<>()); productRepository = new FakeProductRepository(new HashMap<>()); purgomalumClient = new FakePurgomalumClient(); - menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalumClient); + MarginValidator marginValidator = new MarginValidator(menuRepository); + MenuProductValidator menuProductValidator = new MenuProductValidator(productRepository); + MenuNameCreationService menuNameCreationService = new MenuNameCreationService(purgomalumClient); + menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, marginValidator, menuProductValidator, menuNameCreationService); } @Test @@ -59,8 +66,8 @@ void create_menu() { // then assertThat(created.getId()).isNotNull(); - assertThat(created.getName()).isEqualTo("김치찌개"); - assertThat(created.getPrice()).isEqualTo(BigDecimal.valueOf(8000)); + assertThat(created.getInnerName()).isEqualTo("김치찌개"); + assertThat(created.getInnerPrice()).isEqualTo(BigDecimal.valueOf(8000)); MenuGroup actualMenuGroup = created.getMenuGroup(); assertThat(actualMenuGroup.getName()).isEqualTo("한식"); assertThat(menuRepository.findAll().size()).isEqualTo(1); @@ -72,11 +79,10 @@ void menu_price_exception() { // given MenuGroup menuGroup = createMenuGroup(); Product product = createProduct(BigDecimal.valueOf(5000)); - Menu request = createMenuRequest("김치찌개", -1000, menuGroup, - product); // when // then - assertThatThrownBy(() -> menuService.create(request)) + assertThatThrownBy(() -> menuService.create(createMenuRequest("김치찌개", -1000, menuGroup, + product))) .isInstanceOf(IllegalArgumentException.class); } @@ -89,12 +95,10 @@ void menu_name_exists_exception(String name) { menuGroupRepository.save(menuGroup); Product product = createProduct(BigDecimal.valueOf(5000)); productRepository.save(product); - Menu request = createMenuRequest(name, 8000, menuGroup, - product); // when // then - assertThatThrownBy(() -> menuService.create(request)) - .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> menuService.create(createMenuRequest(name, 8000, menuGroup, + product))).isInstanceOf(IllegalArgumentException.class); } @Test @@ -122,14 +126,17 @@ void menu_name_profanity_exception() { void menu_group_exception() { // given Product product = createProduct(BigDecimal.valueOf(5000)); - MenuGroup menuGroup = null; MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); - Menu request = new Menu("김치찌개", BigDecimal.valueOf(8000), true, List.of(menuProduct), menuGroup, - null); + MenuGroup menuGroup = null; // when // then - assertThatThrownBy(() -> menuService.create(request)) - .isInstanceOf(NoSuchElementException.class); + assertThatThrownBy(() -> { + Menu request = new Menu("김치찌개", BigDecimal.valueOf(8000), true, List.of(menuProduct), menuGroup, + null); + menuService.create(request); + }) + .isInstanceOf(NoSuchElementException.class) + .hasMessage("메뉴 그룹이 존재하지 않습니다!"); } @Test @@ -141,11 +148,13 @@ void create_menu_with_menuPrice_andTotalPrice_exception() { Product product = createProduct(BigDecimal.valueOf(10000)); productRepository.save(product); Menu request = createMenuRequest("김치찌개", 8000, menuGroup, product); - request.setPrice(BigDecimal.valueOf(8000)); // when // then - assertThatThrownBy(() -> menuService.create(request)) - .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> { + request.changePrice(BigDecimal.valueOf(8000)); + menuService.create(request); + }).isInstanceOf(IllegalStateException.class) + .hasMessage("마진이 남지 않습니다! 마진을 남기게 만들어주세요!"); } @Test @@ -155,13 +164,13 @@ void change_price() { Menu menu = createMenuWithProductAndGroup(); menuRepository.save(menu); Menu request = new Menu(); - request.setPrice(BigDecimal.valueOf(12000)); + request.changePrice(BigDecimal.valueOf(12000)); // when Menu updated = menuService.changePrice(menu.getId(), request); // then - assertThat(updated.getPrice()).isEqualTo(BigDecimal.valueOf(12000)); + assertThat(updated.getInnerPrice()).isEqualTo(BigDecimal.valueOf(12000)); } @Test @@ -171,11 +180,13 @@ void change_price_with_menuPrice_andTotalPrice_exception() { Menu menu = createMenuWithProductAndGroup(); menuRepository.save(menu); Menu request = new Menu(); - request.setPrice(BigDecimal.valueOf(4000)); // when // then - assertThatThrownBy(() -> menuService.changePrice(menu.getId(), request)) - .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> { + request.changePrice(BigDecimal.valueOf(4000)); + menuService.changePrice(menu.getId(), request); + }).isInstanceOf(IllegalStateException.class) + .hasMessage("마진이 남지 않습니다! 마진을 남기게 만들어주세요!"); } @Test diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameCreationServiceTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameCreationServiceTest.java new file mode 100644 index 000000000..98b07175b --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameCreationServiceTest.java @@ -0,0 +1,35 @@ +package kitchenpos.menu.domain.model; + +import kitchenpos.common.application.PurgomalumClient; +import kitchenpos.common.infra.external.FakePurgomalumClient; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class MenuGroupNameCreationServiceTest { + + private MenuGroupNameCreationService menuGroupNameCreationService; + private PurgomalumClient purgomalumClient; + + @BeforeEach + void setUp() { + purgomalumClient = new FakePurgomalumClient(); + menuGroupNameCreationService = new MenuGroupNameCreationService(purgomalumClient); + } + + @Test + @DisplayName("이름에 비속어가 있으면 예외를 던집니다.") + void validate_name_exception() { + // given + String name = "비속어"; + FakePurgomalumClient fakePurgomalumClient = (FakePurgomalumClient) purgomalumClient; + fakePurgomalumClient.setProfanity(true); + + // when // then + assertThatThrownBy(() -> menuGroupNameCreationService.createName(name)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 카테고리 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"); + } +} diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java new file mode 100644 index 000000000..a67cd4a8f --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java @@ -0,0 +1,20 @@ +package kitchenpos.menu.domain.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +class MenuGroupNameTest { + + @ParameterizedTest + @NullAndEmptySource + @DisplayName("메뉴 카테고리 이름은 비어있거나 null인 경우 예외를 던진다.") + void create_name_exception(String value) { + // when // then + assertThatThrownBy(() -> new MenuGroupName(value)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 카테고리 이름을 채워주세요!"); + } +} diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuNameCreationServiceTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuNameCreationServiceTest.java new file mode 100644 index 000000000..255149e87 --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/model/MenuNameCreationServiceTest.java @@ -0,0 +1,35 @@ +package kitchenpos.menu.domain.model; + +import kitchenpos.common.application.PurgomalumClient; +import kitchenpos.common.infra.external.FakePurgomalumClient; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class MenuNameCreationServiceTest { + + private MenuNameCreationService menuNameCreationService; + private PurgomalumClient purgomalumClient; + + @BeforeEach + void setUp() { + purgomalumClient = new FakePurgomalumClient(); + menuNameCreationService = new MenuNameCreationService(purgomalumClient); + } + + @Test + @DisplayName("이름에 비속어가 있으면 예외를 던집니다.") + void validate_name_exception() { + // given + String name = "비속어"; + FakePurgomalumClient fakePurgomalumClient = (FakePurgomalumClient) purgomalumClient; + fakePurgomalumClient.setProfanity(true); + + // when // then + assertThatThrownBy(() -> menuNameCreationService.createName(name)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"); + } +} diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java new file mode 100644 index 000000000..9a0e8e68e --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java @@ -0,0 +1,20 @@ +package kitchenpos.menu.domain.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +class MenuNameTest { + + @ParameterizedTest + @NullAndEmptySource + @DisplayName("메뉴 이름이 비어있거나 null인 경우 예외를 던진다. ") + void create_menu_name_exception(String value) { + // when // then + assertThatThrownBy(() -> new MenuName(value)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 이름을 채워주세요!"); + } +} diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java new file mode 100644 index 000000000..be7163a68 --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java @@ -0,0 +1,28 @@ +package kitchenpos.menu.domain.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.math.BigDecimal; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +class MenuPriceTest { + + @DisplayName("가격은 비어있거나 null이면 예외가 발생한다") + @ParameterizedTest + @MethodSource("invalidMenuPriceProvider") + void create_price_exception(BigDecimal value) { + assertThatThrownBy(() -> new MenuPrice(value)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 가격을 채워주세요!"); + } + + private static Stream invalidMenuPriceProvider() { + return Stream.of( + null, + BigDecimal.valueOf(-1) + ); + } +} diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java new file mode 100644 index 000000000..166d6b8a1 --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java @@ -0,0 +1,21 @@ +package kitchenpos.menu.domain.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class MenuProductQuantityTest { + + @Test + @DisplayName("메뉴 상품의 수량이 1 이상이 아니면 예외를 던진다.") + void create_menu_product_quantity_exception() { + // given + int quantity = 0; + + // when // then + assertThatThrownBy(() -> new MenuProductQuantity(quantity)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 상품의 수량은 0보다 커야 합니다!"); + } +} \ No newline at end of file diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuTest.java new file mode 100644 index 000000000..9f9850917 --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/model/MenuTest.java @@ -0,0 +1,75 @@ +package kitchenpos.menu.domain.model; + +import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.model.ProductName; +import kitchenpos.product.domain.model.ProductNameCreationService; +import kitchenpos.product.domain.model.ProductPrice; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import java.math.BigDecimal; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import java.util.stream.Stream; + +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class MenuTest { + + @Test + @DisplayName("메뉴가 생성될 때, 메뉴 그룹이 포함되지 않으면 예외가 발생한다.") + void validate_menu_group_exists_exception() { + // given + ProductName productName = new ProductNameCreationService(new FakePurgomalumClient()).createName("배추"); + Product product = new Product(productName, new ProductPrice(BigDecimal.ONE), UUID.randomUUID()); + MenuProduct menuProduct = new MenuProduct( + product, + new MenuProductQuantity(1), + UUID.randomUUID() + ); + + // when // then + assertThatThrownBy(() -> new Menu( + UUID.randomUUID(), + new MenuName("김치"), + new MenuPrice(BigDecimal.ONE), + null, + false, + List.of(menuProduct), + UUID.randomUUID() + )).isInstanceOf(NoSuchElementException.class) + .hasMessage("메뉴 그룹이 존재하지 않습니다!"); + } + + @ParameterizedTest + @MethodSource("invalidMenuProductProvider") + @DisplayName("메뉴가 생성될 때, 메뉴 상품들이 포함되지 않으면 예외가 발생한다.") + void validate_menu_products_exists_exception(List menuProducts) { + // given + MenuGroup menuGroup = createMenuGroup(); + + // when // then + assertThatThrownBy(() -> new Menu( + UUID.randomUUID(), + new MenuName("김치"), + new MenuPrice(BigDecimal.ONE), + menuGroup, + false, + menuProducts, + menuGroup.getId() + )).isInstanceOf(NoSuchElementException.class) + .hasMessage("메뉴 상품이 존재하지 않습니다!"); + } + + private static Stream> invalidMenuProductProvider() { + return Stream.of( + null, + List.of() + ); + } +} \ No newline at end of file diff --git a/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java b/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java index 3619ce41b..48b16c63c 100644 --- a/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java +++ b/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java @@ -8,6 +8,7 @@ import java.math.BigDecimal; import java.util.HashMap; import java.util.UUID; + import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.product.domain.model.Product; @@ -15,6 +16,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.thymeleaf.engine.IterationStatusVar; class MarginValidatorTest { @@ -46,4 +48,23 @@ void check_margin_by_product() { assertThat(soup.isDisplayed()).isEqualTo(false); assertThat(cake.isDisplayed()).isEqualTo(true); } + + @Test + @DisplayName("메뉴의 마진을 검증하고, 마진 여부를 알려준다.") + void check_margin_by_menu() { + Product product = createProduct(BigDecimal.valueOf(2000)); + Menu soup = createMenu(createMenuGroup(), product, 5); + + HashMap storage = new HashMap<>(); + storage.put(UUID.randomUUID(), soup); + menuRepository = new FakeMenuRepository(storage); + + // when + MarginValidator marginValidator = new MarginValidator(menuRepository); + boolean result = marginValidator.checkMargin(soup); + + // then + assertThat(soup.isDisplayed()).isEqualTo(false); + assertThat(result).isEqualTo(false); + } } diff --git a/src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java b/src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java new file mode 100644 index 000000000..c2349a65d --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java @@ -0,0 +1,58 @@ +package kitchenpos.menu.domain.service; + +import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.menu.domain.model.MenuProductQuantity; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.model.ProductNameCreationService; +import kitchenpos.product.domain.model.ProductPrice; +import kitchenpos.product.domain.repository.ProductRepository; +import kitchenpos.product.infra.persistence.FakeProductRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class MenuProductValidatorTest { + + private MenuProductValidator menuProductValidator; + private ProductRepository productRepository; + private ProductNameCreationService productNameCreationService; + + @BeforeEach + void setUp() { + productRepository = new FakeProductRepository(new HashMap<>()); + menuProductValidator = new MenuProductValidator(productRepository); + productNameCreationService = new ProductNameCreationService(new FakePurgomalumClient()); + } + + @Test + @DisplayName("메뉴 상품과 이에 포함된 상품이 존재하는지 확인하고, 없으면 예외를 던진다.") + void validate_menu_product_exception() { + // given + UUID id1 = UUID.randomUUID(); + UUID id2 = UUID.randomUUID(); + UUID id3 = UUID.randomUUID(); + Product 배추 = new Product(productNameCreationService.createName("배추"), new ProductPrice(BigDecimal.ONE), id1); + Product 고춧가루 = new Product(productNameCreationService.createName("고춧가루"), new ProductPrice(BigDecimal.ONE), id2); + Product non = new Product(productNameCreationService.createName("non"), new ProductPrice(BigDecimal.ONE), id3); + + productRepository.save(배추); + productRepository.save(고춧가루); + productRepository.save(non); + + MenuProduct 배추들 = new MenuProduct(배추, new MenuProductQuantity(1), id1); + MenuProduct 고춧가루들 = new MenuProduct(고춧가루, new MenuProductQuantity(3), id2); + + // when // then + assertThatThrownBy(() -> menuProductValidator.validateMenuProduct(List.of(배추들, 고춧가루들))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 상품에 들어갈 상품 수와 실제 상품 수가 다릅니다!"); + } +} \ No newline at end of file diff --git a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java index 69b672ad3..d45b63a8a 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java @@ -1,12 +1,20 @@ package kitchenpos.menu.ui; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.fasterxml.jackson.databind.ObjectMapper; + +import java.util.UUID; + +import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuGroupName; +import kitchenpos.menu.domain.model.MenuGroupNameCreationService; +import kitchenpos.menu.domain.model.MenuNameCreationService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -32,7 +40,8 @@ class MenuGroupRestControllerTest { @DisplayName("메뉴 그룹을 생성한다.") void create_success() throws Exception { // given - MenuGroup request = new MenuGroup("한식"); + MenuGroupNameCreationService menuGroupNameCreationService = new MenuGroupNameCreationService(new FakePurgomalumClient()); + MenuGroup request = new MenuGroup(menuGroupNameCreationService.createName("한식")); // when ResultActions result = mockMvc.perform(post("/api/menu-groups") @@ -49,16 +58,17 @@ void create_success() throws Exception { @ParameterizedTest @NullAndEmptySource @DisplayName("메뉴 그룹 이름이 비어있으면 400 상태코드를 반환한다") - void create_fail(String name) throws Exception { + void create_fail(String name) { // given - MenuGroup request = new MenuGroup(name); - - // when - ResultActions result = mockMvc.perform(post("/api/menu-groups") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))); + assertThatThrownBy(() -> { + MenuGroup request = new MenuGroup(name); + // when + ResultActions result = mockMvc.perform(post("/api/menu-groups") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); - // then - result.andExpect(status().isBadRequest()); + // then + result.andExpect(status().isBadRequest()); + }).isInstanceOf(IllegalArgumentException.class); } } diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java index c31c99629..67a825d8d 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -1,17 +1,6 @@ package kitchenpos.menu.ui; -import static kitchenpos.TestFixtureFactory.createMenuGroup; -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - import com.fasterxml.jackson.databind.ObjectMapper; -import java.math.BigDecimal; -import java.util.List; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuProduct; @@ -29,6 +18,16 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.List; +import java.util.NoSuchElementException; + +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + @SpringBootTest @AutoConfigureMockMvc @Transactional @@ -66,8 +65,8 @@ void create_menu_success() throws Exception { result.andExpect(status().isCreated()) .andExpect(header().exists("Location")) .andExpect(jsonPath("$.id").exists()) - .andExpect(jsonPath("$.name").value(request.getName())) - .andExpect(jsonPath("$.price").value(request.getPrice().intValue())) + .andExpect(jsonPath("$.name.value").value("김치찌개")) + .andExpect(jsonPath("$.price.value").value(8000)) .andExpect(jsonPath("$.menuGroup").exists()) .andExpect(jsonPath("$.menuProducts").isNotEmpty()); } @@ -77,16 +76,19 @@ void create_menu_success() throws Exception { void create_menuRequest_with_emptyProducts() throws Exception { // given MenuGroup menuGroup = createAndSaveMenuGroup(); - Menu request = new Menu("김치찌개", BigDecimal.valueOf(8000), true, null, menuGroup, - menuGroup.getId()); - - // when - ResultActions result = mockMvc.perform(post("/api/menus") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))); - - // then - result.andExpect(status().isBadRequest()); + assertThatThrownBy(() -> { + Menu request = new Menu("김치찌개", BigDecimal.valueOf(8000), true, null, menuGroup, + menuGroup.getId()); + + // when + ResultActions result = mockMvc.perform(post("/api/menus") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isBadRequest()); + }).isInstanceOf(NoSuchElementException.class) + .hasMessage("메뉴 상품이 존재하지 않습니다!"); } @Test @@ -94,7 +96,7 @@ void create_menuRequest_with_emptyProducts() throws Exception { void change_menuPrice() throws Exception { // given Menu menu = createAndSaveMenu(true); - menu.setPrice(BigDecimal.valueOf(8001)); + menu.changePrice(BigDecimal.valueOf(8001)); // when ResultActions result = mockMvc.perform(put("/api/menus/{menuId}/price", menu.getId()) @@ -104,7 +106,7 @@ void change_menuPrice() throws Exception { // then result.andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(menu.getId().toString())) - .andExpect(jsonPath("$.price").value(8001)); + .andExpect(jsonPath("$.price.value").value(8001)); } @Test @@ -112,16 +114,20 @@ void change_menuPrice() throws Exception { void change_menuPrice_with_negativePrice() throws Exception { // given Menu savedMenu = createAndSaveMenu(true); - Menu request = new Menu(); - request.setPrice(BigDecimal.valueOf(-1)); - - // when - ResultActions result = mockMvc.perform(put("/api/menus/{menuId}/price", savedMenu.getId()) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))); - - // then - result.andExpect(status().isBadRequest()); + assertThatThrownBy(() -> { + Menu request = new Menu(); + request.changePrice(BigDecimal.valueOf(-1)); + + // when + ResultActions result = mockMvc.perform(put("/api/menus/{menuId}/price", savedMenu.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isBadRequest()); + }) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 가격을 채워주세요!"); } @Test diff --git a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java index 43b4bdca7..d2e69eb01 100644 --- a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java @@ -187,7 +187,7 @@ private Order createOrderRequestWithDeliveryType() { Menu menu = createAndSaveMenu(menuGroup, product); OrderLineItem orderLineItem = createOrderLineItem(menu); - OrderTable orderTable = createAndSaveOrderWithDeliveryTypeTable(); + OrderTable orderTable = createAndSaveOrderTable(); return createOrderWithDeliveryType(orderLineItem, orderTable, OrderStatus.WAITING); } @@ -198,13 +198,13 @@ private Order createAndSaveOrderWithDeliveryType() { Menu menu = createAndSaveMenu(menuGroup, product); OrderLineItem orderLineItem = createOrderLineItem(menu); - OrderTable orderTable = createAndSaveOrderWithDeliveryTypeTable(); + OrderTable orderTable = createAndSaveOrderTable(); Order order = createOrderWithDeliveryType(orderLineItem, orderTable, OrderStatus.WAITING); return orderRepository.save(order); } - private OrderTable createAndSaveOrderWithDeliveryTypeTable() { + private OrderTable createAndSaveOrderTable() { OrderTable orderTable = createEmptyOrderTable(); orderTableRepository.save(orderTable); return orderTable; diff --git a/src/test/java/kitchenpos/product/application/ProductServiceTest.java b/src/test/java/kitchenpos/product/application/ProductServiceTest.java index dbee65925..4605e8681 100644 --- a/src/test/java/kitchenpos/product/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/product/application/ProductServiceTest.java @@ -62,7 +62,7 @@ void product_price_exception() { // when // then assertThatThrownBy(() -> productService.create(createProductRequest("김치", -1000))) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("가격을 채워주세요!"); + .hasMessage("상품 가격을 채워주세요!"); } @Test diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java index 8c51742bb..1040fbd19 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java @@ -30,6 +30,6 @@ void validate_name_exception() { // when // then assertThatThrownBy(() -> productNameCreationService.createName(name)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("이름에 비속어가 존재합니다. 비속어를 제외해주세요!"); + .hasMessage("상품 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"); } } diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java index 2a095279d..69238f2c8 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java @@ -15,6 +15,6 @@ void create_name_exception(String name) { // when // then assertThatThrownBy(() -> new ProductName(name)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("이름을 채워주세요!"); + .hasMessage("상품 이름을 채워주세요!"); } } diff --git a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java index b32ff84c6..8b324f466 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java @@ -12,14 +12,14 @@ class ProductPriceTest { @DisplayName("가격은 비어있거나 null이면 예외가 발생한다") @ParameterizedTest - @MethodSource("invalidPriceProvider") + @MethodSource("invalidProductPriceProvider") void create_price_exception(BigDecimal value) { assertThatThrownBy(() -> new ProductPrice(value)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("가격을 채워주세요!"); + .hasMessage("상품 가격을 채워주세요!"); } - private static Stream invalidPriceProvider() { + private static Stream invalidProductPriceProvider() { return Stream.of( null, BigDecimal.valueOf(-1) diff --git a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java index 52ff06ea8..39e98c4eb 100644 --- a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java +++ b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java @@ -90,10 +90,6 @@ void find_allProducts() throws Exception { .andExpect(jsonPath("$.length()").value(2)); } - private Product createProductRequest() { - return createProduct("김치", 5000); - } - private Product createAndSaveProduct(String name, int price) { Product product = createProduct(name, price); return productRepository.save(product); From 83ad1f39f2ed7f6b9f94541cbe700d77ee1d7cfd Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Sun, 16 Feb 2025 15:52:35 +0900 Subject: [PATCH 04/71] squash!(kitchen pos) : rebase squash --- .../kitchenpos/menu/domain/model/Menu.java | 7 +++ .../menu/domain/model/MenuGroup.java | 3 +- .../product/domain/model/Product.java | 9 ++++ .../menu/application/MenuServiceTest.java | 2 +- .../persistence/FakeProductRepository.java | 43 +++++++++++++++++++ .../menu/ui/MenuRestControllerTest.java | 2 + 6 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 src/test/java/kitchenpos/menu/infra/persistence/FakeProductRepository.java diff --git a/src/main/java/kitchenpos/menu/domain/model/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java index b92a216f4..dc1ed6d89 100644 --- a/src/main/java/kitchenpos/menu/domain/model/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -58,6 +58,13 @@ public class Menu { public Menu() { } + public Menu(UUID id, String name, BigDecimal price, boolean displayed) { + this.id = id; + this.name = new MenuName(name); + this.price = new MenuPrice(price); + this.displayed = displayed; + } + public Menu(UUID id, MenuName name, MenuPrice price, MenuGroup menuGroup, boolean displayed, List menuProducts, UUID menuGroupId) { validateMenuGroupExists(menuGroup); diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java index bc19fb5c3..a800e42cc 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java @@ -5,6 +5,8 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; + +import java.util.Objects; import java.util.UUID; @Table(name = "menu_group") @@ -36,7 +38,6 @@ public MenuGroup(MenuGroupName name) { } protected MenuGroup() { - } public UUID getId() { diff --git a/src/main/java/kitchenpos/product/domain/model/Product.java b/src/main/java/kitchenpos/product/domain/model/Product.java index c4f37931e..ccd04f1d9 100644 --- a/src/main/java/kitchenpos/product/domain/model/Product.java +++ b/src/main/java/kitchenpos/product/domain/model/Product.java @@ -5,6 +5,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; + import java.math.BigDecimal; import java.util.UUID; @@ -35,6 +36,14 @@ protected Product() { } + public Product(String name, BigDecimal price, UUID id) { + this(new ProductName(name), new ProductPrice(price), id); + } + + public Product(String name, BigDecimal price) { + this(name, price, UUID.randomUUID()); + } + public UUID getId() { return id; } diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 8ec64db66..28dc2ba28 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -23,8 +23,8 @@ import kitchenpos.product.domain.repository.ProductRepository; import kitchenpos.menu.infra.persistence.FakeMenuGroupRepository; import kitchenpos.menu.infra.persistence.FakeMenuRepository; -import kitchenpos.product.infra.persistence.FakeProductRepository; import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.product.infra.persistence.FakeProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeProductRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeProductRepository.java new file mode 100644 index 000000000..06aa7523c --- /dev/null +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeProductRepository.java @@ -0,0 +1,43 @@ +package kitchenpos.product.infra.persistence; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; + +public class FakeProductRepository implements ProductRepository { + + private final Map storage; + + public FakeProductRepository(Map storage) { + this.storage = storage; + } + + @Override + public List findAllByIdIn(List ids) { + return new ArrayList<>(storage.values().stream() + .filter(p -> ids.contains(p.getId())) + .toList()); + } + + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(storage.get(id)); + } + + @Override + public Product save(Product product) { + UUID id = UUID.randomUUID(); + product.setId(id); + storage.put(id, product); + return product; + } + + @Override + public List findAll() { + return new ArrayList<>(storage.values()); + } +} diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java index 67a825d8d..9bb3543a7 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -21,6 +21,7 @@ import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; +import java.util.UUID; import static kitchenpos.TestFixtureFactory.createMenuGroup; import static kitchenpos.TestFixtureFactory.createProduct; @@ -55,6 +56,7 @@ void create_menu_success() throws Exception { MenuGroup menuGroup = createAndSaveMenuGroup(); Product product = createAndSaveProduct(); Menu request = createMenuRequest(menuGroup, product); +// Menu request = new Menu(UUID.randomUUID(), "김치찌개", BigDecimal.valueOf(8000), true); // when ResultActions result = mockMvc.perform(post("/api/menus") From 7b1ea72fd1f9653bd80e7f693b71d13fd896b832 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 13:35:19 +0900 Subject: [PATCH 05/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20menu=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=98=88=EC=99=B8=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20enum=EC=9C=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/application/MenuService.java | 18 +++++++------- .../kitchenpos/menu/domain/model/Menu.java | 11 +++++---- .../menu/domain/model/MenuGroupName.java | 6 ++--- .../model/MenuGroupNameCreationService.java | 5 ++-- .../menu/domain/model/MenuName.java | 6 ++--- .../domain/model/MenuNameCreationService.java | 5 ++-- .../menu/domain/model/MenuPrice.java | 6 ++--- .../domain/model/MenuProductQuantity.java | 6 ++--- .../menu/exception/MenuExceptionMessage.java | 24 +++++++++++++++++++ 9 files changed, 56 insertions(+), 31 deletions(-) create mode 100644 src/main/java/kitchenpos/menu/exception/MenuExceptionMessage.java diff --git a/src/main/java/kitchenpos/menu/application/MenuService.java b/src/main/java/kitchenpos/menu/application/MenuService.java index 9dcdceafe..833af23f6 100644 --- a/src/main/java/kitchenpos/menu/application/MenuService.java +++ b/src/main/java/kitchenpos/menu/application/MenuService.java @@ -1,12 +1,5 @@ package kitchenpos.menu.application; -import java.math.BigDecimal; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; -import java.util.stream.Collectors; - -import kitchenpos.common.application.PurgomalumClient; import kitchenpos.menu.domain.model.*; import kitchenpos.menu.domain.repository.MenuGroupRepository; import kitchenpos.menu.domain.repository.MenuRepository; @@ -17,10 +10,15 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + +import static kitchenpos.menu.exception.MenuExceptionMessage.NONE_MARGIN_EXCEPTION; + @Service public class MenuService { - private static final String NONE_MARGIN_EXCEPTION = "마진이 남지 않습니다! 마진을 남기게 만들어주세요!"; - private final MenuRepository menuRepository; private final MenuGroupRepository menuGroupRepository; private final ProductRepository productRepository; @@ -77,7 +75,7 @@ private MenuProduct createMenuProductByRequest(MenuProduct request) { private void validateMargin(Menu menu) { boolean hasMargin = marginValidator.checkMargin(menu); if (!hasMargin) { - throw new IllegalStateException(NONE_MARGIN_EXCEPTION); + throw new IllegalStateException(NONE_MARGIN_EXCEPTION.getMessage()); } } diff --git a/src/main/java/kitchenpos/menu/domain/model/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java index dc1ed6d89..26836b10c 100644 --- a/src/main/java/kitchenpos/menu/domain/model/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -11,17 +11,18 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import jakarta.persistence.Transient; + import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_EXISTS_EXCEPTION; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCTS_EXISTS_EXCEPTION; + @Table(name = "menu") @Entity public class Menu { - private static final String MENU_PRODUCTS_EXISTS_EXCEPTION = "메뉴 상품이 존재하지 않습니다!"; - private static final String MENU_GROUP_EXISTS_EXCEPTION = "메뉴 그룹이 존재하지 않습니다!"; - @Column(name = "id", columnDefinition = "binary(16)") @Id private UUID id; @@ -92,13 +93,13 @@ public Menu(String name, BigDecimal price, boolean displayed, List private void validateMenuGroupExists(MenuGroup menuGroup) { if (menuGroup == null) { - throw new NoSuchElementException(MENU_GROUP_EXISTS_EXCEPTION); + throw new NoSuchElementException(MENU_GROUP_EXISTS_EXCEPTION.getMessage()); } } private void validateMenuProductsExists(List menuProducts) { if (menuProducts == null || menuProducts.isEmpty()) { - throw new NoSuchElementException(MENU_PRODUCTS_EXISTS_EXCEPTION); + throw new NoSuchElementException(MENU_PRODUCTS_EXISTS_EXCEPTION.getMessage()); } } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java index 8f501066a..195fa10dc 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java @@ -4,10 +4,10 @@ import jakarta.persistence.Embeddable; import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; + @Embeddable public class MenuGroupName { - private static final String MENU_CATEGORY_NAME_CREATION_EXCEPTION = "메뉴 카테고리 이름을 채워주세요!"; - @Column(name = "name", nullable = false) private final String value; @@ -18,7 +18,7 @@ protected MenuGroupName(String value) { private void validateMenuGroupName(String value) { if (Objects.isNull(value) || value.isEmpty()) { - throw new IllegalArgumentException(MENU_CATEGORY_NAME_CREATION_EXCEPTION); + throw new IllegalArgumentException(MENU_CATEGORY_NAME_CREATION_EXCEPTION.getMessage()); } } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java index 486a3c10e..bf1db1139 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java @@ -3,9 +3,10 @@ import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_NAME_VALIDATION_EXCEPTION; + @Service public class MenuGroupNameCreationService { - private static final String MENU_GROUP_NAME_VALIDATION_EXCEPTION = "메뉴 카테고리 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"; private final PurgomalumClient purgomalumClient; public MenuGroupNameCreationService(PurgomalumClient purgomalumClient) { @@ -14,7 +15,7 @@ public MenuGroupNameCreationService(PurgomalumClient purgomalumClient) { public MenuGroupName createName(String name) { if (purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(MENU_GROUP_NAME_VALIDATION_EXCEPTION); + throw new IllegalArgumentException(MENU_GROUP_NAME_VALIDATION_EXCEPTION.getMessage()); } return new MenuGroupName(name); } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuName.java b/src/main/java/kitchenpos/menu/domain/model/MenuName.java index 5cabc4a60..85a406409 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuName.java @@ -5,10 +5,10 @@ import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; + @Embeddable public class MenuName { - private static final String MENU_NAME_CREATION_EXCEPTION = "메뉴 이름을 채워주세요!"; - @Column(name = "name", nullable = false) private final String value; @@ -23,7 +23,7 @@ protected MenuName() { private void validateName(String name) { if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(MENU_NAME_CREATION_EXCEPTION); + throw new IllegalArgumentException(MENU_NAME_CREATION_EXCEPTION.getMessage()); } } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java b/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java index d835c92e0..e62aca753 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java @@ -3,9 +3,10 @@ import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_VALIDATION_EXCEPTION; + @Service public class MenuNameCreationService { - private static final String MENU_NAME_VALIDATION_EXCEPTION = "메뉴 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"; private final PurgomalumClient purgomalumClient; public MenuNameCreationService(PurgomalumClient purgomalumClient) { @@ -14,7 +15,7 @@ public MenuNameCreationService(PurgomalumClient purgomalumClient) { public MenuName createName(String name) { if (purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(MENU_NAME_VALIDATION_EXCEPTION); + throw new IllegalArgumentException(MENU_NAME_VALIDATION_EXCEPTION.getMessage()); } return new MenuName(name); } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java index 08ef01e29..705bca1b4 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java @@ -5,10 +5,10 @@ import java.math.BigDecimal; import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRICE_CREATION_EXCEPTION; + @Embeddable public class MenuPrice { - private static final String MENU_PRICE_CREATION_EXCEPTION = "메뉴 가격을 채워주세요!"; - @Column(name = "price", nullable = false) private final BigDecimal value; @@ -23,7 +23,7 @@ protected MenuPrice() { private void validatePrice(BigDecimal value) { if (Objects.isNull(value) || value.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(MENU_PRICE_CREATION_EXCEPTION); + throw new IllegalArgumentException(MENU_PRICE_CREATION_EXCEPTION.getMessage()); } } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java index 9734d1ce6..8c789ec52 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java @@ -5,10 +5,10 @@ import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; + @Embeddable public class MenuProductQuantity { - private static final String MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION = "메뉴 상품의 수량은 0보다 커야 합니다!"; - @Column(name = "quantity", nullable = false) private final Long value; @@ -19,7 +19,7 @@ public MenuProductQuantity(long value) { private void validateMenuProductQuantity(long value) { if (value <= 0) { - throw new IllegalArgumentException(MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION); + throw new IllegalArgumentException(MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION.getMessage()); } } diff --git a/src/main/java/kitchenpos/menu/exception/MenuExceptionMessage.java b/src/main/java/kitchenpos/menu/exception/MenuExceptionMessage.java new file mode 100644 index 000000000..a4e29192c --- /dev/null +++ b/src/main/java/kitchenpos/menu/exception/MenuExceptionMessage.java @@ -0,0 +1,24 @@ +package kitchenpos.menu.exception; + +public enum MenuExceptionMessage { + + NONE_MARGIN_EXCEPTION("마진이 남지 않습니다! 마진을 남기게 만들어주세요!"), + MENU_PRODUCTS_EXISTS_EXCEPTION("메뉴 상품이 존재하지 않습니다!"), + MENU_GROUP_EXISTS_EXCEPTION("메뉴 그룹이 존재하지 않습니다!"), + MENU_CATEGORY_NAME_CREATION_EXCEPTION("메뉴 카테고리 이름을 채워주세요!"), + MENU_GROUP_NAME_VALIDATION_EXCEPTION("메뉴 카테고리 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"), + MENU_NAME_CREATION_EXCEPTION("메뉴 이름을 채워주세요!"), + MENU_NAME_VALIDATION_EXCEPTION("메뉴 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"), + MENU_PRICE_CREATION_EXCEPTION("메뉴 가격을 채워주세요!"), + MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION("메뉴 상품의 수량은 0보다 커야 합니다!"); + + private final String message; + + MenuExceptionMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} From 76c385891a272732ffe8d561fc27ab2a1339ccda Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 13:40:35 +0900 Subject: [PATCH 06/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20product=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=98=88=EC=99=B8=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20enum=EC=9C=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/domain/model/ProductName.java | 7 +-- .../model/ProductNameCreationService.java | 5 ++- .../product/domain/model/ProductPrice.java | 7 +-- .../exception/ProductExceptionMessage.java | 18 ++++++++ .../persistence/FakeProductRepository.java | 43 ------------------- 5 files changed, 29 insertions(+), 51 deletions(-) create mode 100644 src/main/java/kitchenpos/product/exception/ProductExceptionMessage.java delete mode 100644 src/test/java/kitchenpos/menu/infra/persistence/FakeProductRepository.java diff --git a/src/main/java/kitchenpos/product/domain/model/ProductName.java b/src/main/java/kitchenpos/product/domain/model/ProductName.java index 0e2c9effb..5b92e20de 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductName.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductName.java @@ -2,12 +2,13 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.util.Objects; +import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_NAME_CREATION_EXCEPTION; + @Embeddable public class ProductName { - private static final String PRODUCT_NAME_CREATION_EXCEPTION = "상품 이름을 채워주세요!"; - @Column(name = "name", nullable = false) private final String value; @@ -22,7 +23,7 @@ protected ProductName() { private void validateName(String name) { if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(PRODUCT_NAME_CREATION_EXCEPTION); + throw new IllegalArgumentException(PRODUCT_NAME_CREATION_EXCEPTION.getMessage()); } } diff --git a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java index c722e6594..b31fff18e 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java @@ -3,9 +3,10 @@ import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; +import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_NAME_VALIDATION_EXCEPTION; + @Service public class ProductNameCreationService { - private static final String PRODUCT_NAME_VALIDATION_EXCEPTION = "상품 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"; private final PurgomalumClient purgomalumClient; public ProductNameCreationService(PurgomalumClient purgomalumClient) { @@ -14,7 +15,7 @@ public ProductNameCreationService(PurgomalumClient purgomalumClient) { public ProductName createName(String name) { if (purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(PRODUCT_NAME_VALIDATION_EXCEPTION); + throw new IllegalArgumentException(PRODUCT_NAME_VALIDATION_EXCEPTION.getMessage()); } return new ProductName(name); } diff --git a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java index af7fa556a..8792d99a5 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java @@ -2,13 +2,14 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.math.BigDecimal; import java.util.Objects; +import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_PRICE_CREATION_EXCEPTION; + @Embeddable public class ProductPrice { - private static final String PRODUCT_PRICE_CREATION_EXCEPTION = "상품 가격을 채워주세요!"; - @Column(name = "price", nullable = false) private final BigDecimal value; @@ -23,7 +24,7 @@ protected ProductPrice() { private void validatePrice(BigDecimal value) { if (Objects.isNull(value) || value.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(PRODUCT_PRICE_CREATION_EXCEPTION); + throw new IllegalArgumentException(PRODUCT_PRICE_CREATION_EXCEPTION.getMessage()); } } diff --git a/src/main/java/kitchenpos/product/exception/ProductExceptionMessage.java b/src/main/java/kitchenpos/product/exception/ProductExceptionMessage.java new file mode 100644 index 000000000..22dbbd247 --- /dev/null +++ b/src/main/java/kitchenpos/product/exception/ProductExceptionMessage.java @@ -0,0 +1,18 @@ +package kitchenpos.product.exception; + +public enum ProductExceptionMessage { + + PRODUCT_NAME_CREATION_EXCEPTION("상품 이름을 채워주세요!"), + PRODUCT_NAME_VALIDATION_EXCEPTION("상품 이름에 비속어가 존재합니다. 비속어를 제외해주세요!"), + PRODUCT_PRICE_CREATION_EXCEPTION("상품 가격을 채워주세요!"); + + private final String message; + + ProductExceptionMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeProductRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeProductRepository.java deleted file mode 100644 index 06aa7523c..000000000 --- a/src/test/java/kitchenpos/menu/infra/persistence/FakeProductRepository.java +++ /dev/null @@ -1,43 +0,0 @@ -package kitchenpos.product.infra.persistence; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import kitchenpos.product.domain.model.Product; -import kitchenpos.product.domain.repository.ProductRepository; - -public class FakeProductRepository implements ProductRepository { - - private final Map storage; - - public FakeProductRepository(Map storage) { - this.storage = storage; - } - - @Override - public List findAllByIdIn(List ids) { - return new ArrayList<>(storage.values().stream() - .filter(p -> ids.contains(p.getId())) - .toList()); - } - - @Override - public Optional findById(UUID id) { - return Optional.ofNullable(storage.get(id)); - } - - @Override - public Product save(Product product) { - UUID id = UUID.randomUUID(); - product.setId(id); - storage.put(id, product); - return product; - } - - @Override - public List findAll() { - return new ArrayList<>(storage.values()); - } -} From be6ef084bd16ce2244df7a5129bf5b70a51fd836 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 14:19:24 +0900 Subject: [PATCH 07/71] =?UTF-8?q?feat(kitchen=20pos)=20:=20OrderTableName?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/OrderTableName.java | 45 +++++++++++++++++++ .../exception/EatInOrderExceptionMessage.java | 15 +++++++ .../domain/model/OrderTableNameTest.java | 21 +++++++++ 3 files changed, 81 insertions(+) create mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java create mode 100644 src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableNameTest.java diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java new file mode 100644 index 000000000..e81c7b4a0 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java @@ -0,0 +1,45 @@ +package kitchenpos.order.eatinorder.domain.model; + +import jakarta.persistence.Embeddable; +import kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage; + +import java.util.Objects; + +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.ORDER_TABLE_NAME_CREATION_EXCEPTION; + +@Embeddable +public class OrderTableName { + + private final String value; + + protected OrderTableName() { + this.value = null; + } + + public OrderTableName(String value) { + validateOrderTableName(value); + this.value = value; + } + + private void validateOrderTableName(String value) { + if (Objects.isNull(value) || value.isEmpty()) { + throw new IllegalArgumentException(ORDER_TABLE_NAME_CREATION_EXCEPTION.getMessage()); + } + } + + public String getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + OrderTableName that = (OrderTableName) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } +} diff --git a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java new file mode 100644 index 000000000..d8d14616d --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java @@ -0,0 +1,15 @@ +package kitchenpos.order.eatinorder.exception; + +public enum EatInOrderExceptionMessage { + ORDER_TABLE_NAME_CREATION_EXCEPTION("주문 테이블 이름을 채워주세요!"); + + private final String message; + + EatInOrderExceptionMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableNameTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableNameTest.java new file mode 100644 index 000000000..2914aa75b --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableNameTest.java @@ -0,0 +1,21 @@ +package kitchenpos.order.eatinorder.domain.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class OrderTableNameTest { + + @ParameterizedTest + @NullAndEmptySource + @DisplayName("주문 테이블의 이름이 비어있거나, null이면 예외를 던진다.") + void create_order_table_name_exception(String name) { + // when // then + assertThatThrownBy(() -> new OrderTableName(name)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("주문 테이블 이름을 채워주세요!"); + } + +} \ No newline at end of file From 780f002d71fa3ff8ffc58a98b3283c955e77d56f Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 14:46:56 +0900 Subject: [PATCH 08/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20OrderTable?= =?UTF-8?q?=20=EC=A0=90=EC=9C=A0=20=ED=95=B4=EC=A0=9C=20=EB=B0=8F=20?= =?UTF-8?q?=EC=86=90=EB=8B=98=20=EC=88=98=20=EB=B3=80=EA=B2=BD=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=20=EC=A3=BC=EB=AC=B8=20=ED=85=8C=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/application/OrderService.java | 2 +- .../application/OrderTableService.java | 25 ++------- .../eatinorder/domain/model/OrderTable.java | 56 ++++++++++++++----- .../domain/model/OrderTableName.java | 2 + .../exception/EatInOrderExceptionMessage.java | 6 +- .../application/OrderTableServiceTest.java | 28 +++++----- 6 files changed, 71 insertions(+), 48 deletions(-) diff --git a/src/main/java/kitchenpos/order/common/application/OrderService.java b/src/main/java/kitchenpos/order/common/application/OrderService.java index 7d5c00d3c..18ec76e08 100644 --- a/src/main/java/kitchenpos/order/common/application/OrderService.java +++ b/src/main/java/kitchenpos/order/common/application/OrderService.java @@ -178,7 +178,7 @@ public Order complete(final UUID orderId) { if (type == OrderType.EAT_IN) { final OrderTable orderTable = order.getOrderTable(); if (!orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { - orderTable.setNumberOfGuests(0); + orderTable.changeNumberOfGuests(0); orderTable.setOccupied(false); } } diff --git a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index c78070fb9..30853ecb7 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -2,11 +2,12 @@ import java.util.List; import java.util.NoSuchElementException; -import java.util.Objects; import java.util.UUID; + import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.repository.OrderRepository; import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.model.OrderTableName; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,15 +24,8 @@ public OrderTableService(final OrderTableRepository orderTableRepository, final @Transactional public OrderTable create(final OrderTable request) { - final String name = request.getName(); - if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(); - } - final OrderTable orderTable = new OrderTable(); - orderTable.setId(UUID.randomUUID()); - orderTable.setName(name); - orderTable.setNumberOfGuests(0); - orderTable.setOccupied(false); + final String name = request.getInnerName(); + final OrderTable orderTable = new OrderTable(UUID.randomUUID(), new OrderTableName(name)); return orderTableRepository.save(orderTable); } @@ -50,23 +44,16 @@ public OrderTable clear(final UUID orderTableId) { if (orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { throw new IllegalStateException(); } - orderTable.setNumberOfGuests(0); - orderTable.setOccupied(false); + orderTable.releaseTable(); return orderTable; } @Transactional public OrderTable changeNumberOfGuests(final UUID orderTableId, final OrderTable request) { final int numberOfGuests = request.getNumberOfGuests(); - if (numberOfGuests < 0) { - throw new IllegalArgumentException(); - } final OrderTable orderTable = orderTableRepository.findById(orderTableId) .orElseThrow(NoSuchElementException::new); - if (!orderTable.isOccupied()) { - throw new IllegalStateException(); - } - orderTable.setNumberOfGuests(numberOfGuests); + orderTable.changeNumberOfGuests(numberOfGuests); return orderTable; } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java index 9064050d7..f8718ee77 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java @@ -1,11 +1,13 @@ package kitchenpos.order.eatinorder.domain.model; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; +import jakarta.persistence.*; +import kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage; + import java.util.UUID; +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EMPTY_ORDER_TABLE_EXCEPTION; +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.NUMBER_OF_GUESTS_EXCEPTION; + @Table(name = "order_table") @Entity public class OrderTable { @@ -13,8 +15,8 @@ public class OrderTable { @Id private UUID id; - @Column(name = "name", nullable = false) - private String name; + @Enumerated + private OrderTableName name; @Column(name = "number_of_guests", nullable = false) private int numberOfGuests; @@ -25,17 +27,32 @@ public class OrderTable { public OrderTable() { } - public OrderTable(UUID id, String name, int numberOfGuests, boolean occupied) { + public OrderTable(UUID id, OrderTableName name, int numberOfGuests, boolean occupied) { + validateNumberOfGuests(numberOfGuests); this.id = id; this.name = name; this.numberOfGuests = numberOfGuests; this.occupied = occupied; } + public OrderTable(UUID id, OrderTableName name) { + this(id, name, 0, false); + } + + public OrderTable(UUID id, String name, int numberOfGuests, boolean occupied) { + this(id, new OrderTableName(name), numberOfGuests, occupied); + } + public OrderTable(String name, int numberOfGuests, boolean occupied) { this(UUID.randomUUID(), name, numberOfGuests, occupied); } + private void validateNumberOfGuests(int numberOfGuests) { + if (numberOfGuests < 0) { + throw new IllegalArgumentException(NUMBER_OF_GUESTS_EXCEPTION.getMessage()); + } + } + public UUID getId() { return id; } @@ -44,22 +61,35 @@ public void setId(final UUID id) { this.id = id; } - public String getName() { - return name; + public String getInnerName() { + return name.getValue(); } - public void setName(final String name) { - this.name = name; - } +// public void setName(final String name) { +// this.name = name; +// } public int getNumberOfGuests() { return numberOfGuests; } - public void setNumberOfGuests(final int numberOfGuests) { + public void changeNumberOfGuests(final int numberOfGuests) { + validateTableIsEmpty(); + validateNumberOfGuests(numberOfGuests); this.numberOfGuests = numberOfGuests; } + private void validateTableIsEmpty() { + if (!isOccupied()) { + throw new IllegalStateException(EMPTY_ORDER_TABLE_EXCEPTION.getMessage()); + } + } + + public void releaseTable() { + this.numberOfGuests = 0; + this.occupied = false; + } + public boolean isOccupied() { return occupied; } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java index e81c7b4a0..3df2f98c3 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java @@ -1,5 +1,6 @@ package kitchenpos.order.eatinorder.domain.model; +import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage; @@ -10,6 +11,7 @@ @Embeddable public class OrderTableName { + @Column(name = "name", nullable = false) private final String value; protected OrderTableName() { diff --git a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java index d8d14616d..cf791a334 100644 --- a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java +++ b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java @@ -1,7 +1,11 @@ package kitchenpos.order.eatinorder.exception; public enum EatInOrderExceptionMessage { - ORDER_TABLE_NAME_CREATION_EXCEPTION("주문 테이블 이름을 채워주세요!"); + ORDER_TABLE_NAME_CREATION_EXCEPTION("주문 테이블 이름을 채워주세요!"), + EMPTY_ORDER_TABLE_EXCEPTION("주문 테이블이 비어있습니다!"), + NUMBER_OF_GUESTS_EXCEPTION("손님 수가 음수일 수 없습니다!") + ; + private final String message; diff --git a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index 0a46ac769..a8ea21084 100644 --- a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.Optional; + import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.repository.OrderRepository; import kitchenpos.order.eatinorder.domain.model.OrderTable; @@ -47,7 +48,7 @@ void create() { // then assertThat(created.getId()).isNotNull(); - assertThat(created.getName()).isEqualTo("1번 테이블"); + assertThat(created.getInnerName()).isEqualTo("1번 테이블"); assertThat(created.getNumberOfGuests()).isZero(); assertThat(created.isOccupied()).isFalse(); } @@ -56,11 +57,8 @@ void create() { @NullAndEmptySource @DisplayName("매장 테이블 이름이 없으면 예외가 발생한다.") void orderTable_name_exception(String name) { - // given - OrderTable request = new OrderTable(name, 0, false); - // when // then - assertThatThrownBy(() -> orderTableService.create(request)) + assertThatThrownBy(() -> orderTableService.create(new OrderTable(name, 0, false))) .isInstanceOf(IllegalArgumentException.class); } @@ -130,7 +128,7 @@ void orderTable_occupied_exception() { void change_numberOfGuests() { // given OrderTable orderTable = createUsingOrderTable(); - orderTable.setNumberOfGuests(4); + orderTable.changeNumberOfGuests(4); when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); @@ -146,13 +144,14 @@ void change_numberOfGuests() { void change_numberOfGuests_not_occupied_exception() { // given OrderTable orderTable = createEmptyOrderTable(); - orderTable.setNumberOfGuests(4); - when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); // when // then - assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable)) - .isInstanceOf(IllegalStateException.class); + assertThatThrownBy(() -> { + orderTable.changeNumberOfGuests(4); + orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable); + }).isInstanceOf(IllegalStateException.class) + .hasMessage("주문 테이블이 비어있습니다!"); } @Test @@ -160,13 +159,14 @@ void change_numberOfGuests_not_occupied_exception() { void change_numberOfGuests_negative_number_exception() { // given OrderTable orderTable = createUsingOrderTable(); - orderTable.setNumberOfGuests(-1); - when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); // when // then - assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable)) - .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> { + orderTable.changeNumberOfGuests(-1); + orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessage("손님 수가 음수일 수 없습니다!"); } private OrderTable createOrderTableRequest() { From 90f3cc3cd3936e3f9b8caf2efd4144294d00ac77 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 15:08:26 +0900 Subject: [PATCH 09/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20OrderTable?= =?UTF-8?q?=20=EC=A0=90=EC=9C=A0=20=ED=95=B4=EC=A0=9C=20=EB=B0=8F=20?= =?UTF-8?q?=EC=86=90=EB=8B=98=20=EC=88=98=20=EB=B3=80=EA=B2=BD=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/application/OrderService.java | 3 +- .../application/OrderTableService.java | 2 +- .../eatinorder/domain/model/OrderTable.java | 53 ++++++++++--------- .../ui/OrderTableRestControllerTest.java | 4 +- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/main/java/kitchenpos/order/common/application/OrderService.java b/src/main/java/kitchenpos/order/common/application/OrderService.java index 18ec76e08..5a16b8f3b 100644 --- a/src/main/java/kitchenpos/order/common/application/OrderService.java +++ b/src/main/java/kitchenpos/order/common/application/OrderService.java @@ -178,8 +178,7 @@ public Order complete(final UUID orderId) { if (type == OrderType.EAT_IN) { final OrderTable orderTable = order.getOrderTable(); if (!orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { - orderTable.changeNumberOfGuests(0); - orderTable.setOccupied(false); + orderTable.releaseTable(); } } return order; diff --git a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index 30853ecb7..bd11578c6 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -33,7 +33,7 @@ public OrderTable create(final OrderTable request) { public OrderTable sit(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) .orElseThrow(NoSuchElementException::new); - orderTable.setOccupied(true); + orderTable.occupyTable(); return orderTable; } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java index f8718ee77..a46469cdc 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java @@ -1,7 +1,6 @@ package kitchenpos.order.eatinorder.domain.model; import jakarta.persistence.*; -import kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage; import java.util.UUID; @@ -53,33 +52,13 @@ private void validateNumberOfGuests(int numberOfGuests) { } } - public UUID getId() { - return id; - } - - public void setId(final UUID id) { - this.id = id; - } - - public String getInnerName() { - return name.getValue(); - } - -// public void setName(final String name) { -// this.name = name; -// } - - public int getNumberOfGuests() { - return numberOfGuests; - } - public void changeNumberOfGuests(final int numberOfGuests) { - validateTableIsEmpty(); + validateTableIsOccupied(); validateNumberOfGuests(numberOfGuests); this.numberOfGuests = numberOfGuests; } - private void validateTableIsEmpty() { + private void validateTableIsOccupied() { if (!isOccupied()) { throw new IllegalStateException(EMPTY_ORDER_TABLE_EXCEPTION.getMessage()); } @@ -90,11 +69,35 @@ public void releaseTable() { this.occupied = false; } + public void occupyTable() { + this.occupied = true; + } + public boolean isOccupied() { return occupied; } - public void setOccupied(final boolean occupied) { - this.occupied = occupied; + public UUID getId() { + return id; + } + + public void setId(final UUID id) { + this.id = id; + } + + public String getInnerName() { + return name.getValue(); } + + public int getNumberOfGuests() { + return numberOfGuests; + } + +// public void setOccupied(final boolean occupied) { +// this.occupied = occupied; +// } + +// public void setName(final String name) { +// this.name = name; +// } } diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java index 59e0774c1..553c4451f 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java @@ -73,7 +73,7 @@ void sit_orderTable() throws Exception { void clear_orderTable() throws Exception { // given OrderTable orderTable = createAndSaveOrderTable(4); - orderTable.setOccupied(true); + orderTable.occupyTable(); orderTableRepository.save(orderTable); // when @@ -91,7 +91,7 @@ void clear_orderTable() throws Exception { void change_numberOfGuests() throws Exception { // given OrderTable orderTable = createAndSaveOrderTable(4); - orderTable.setOccupied(true); + orderTable.occupyTable(); orderTableRepository.save(orderTable); OrderTable request = createOrderTableRequest(6); From cfd3f5623e716134abe1917b1a5ed28cf3e23d16 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 15:42:29 +0900 Subject: [PATCH 10/71] =?UTF-8?q?test(kitchen=20pos)=20:=20OrderTable=20ch?= =?UTF-8?q?angeNumberOfGuests=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/OrderTableTest.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java new file mode 100644 index 000000000..252316fc3 --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java @@ -0,0 +1,49 @@ +package kitchenpos.order.eatinorder.domain.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class OrderTableTest { + + @Test + @DisplayName("주문 테이블이 비어있을 때, 테이블을 점유하는 손님 수를 변경하면 예외를 던진다.") + void change_number_of_guests_empty_order_table_exception() { + // given + OrderTable orderTable = new OrderTable(UUID.randomUUID(), new OrderTableName("1번 테이블")); + + // when // then + assertThatThrownBy(() -> orderTable.changeNumberOfGuests(2)) + .isInstanceOf(IllegalStateException.class) + .hasMessage("주문 테이블이 비어있습니다!"); + } + + @Test + @DisplayName("주문 테이블을 점유하는 손님 수를 음수로 변경하면 예외를 던진다.") + void change_number_of_guests_guest_number_exception() { + // given + OrderTable orderTable = new OrderTable(UUID.randomUUID(), new OrderTableName("1번 테이블"), 1, true); + + // when // then + assertThatThrownBy(() -> orderTable.changeNumberOfGuests(-1)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("손님 수가 음수일 수 없습니다!"); + } + + @Test + @DisplayName("주문 테이블을 손님이 점유하고 있을 때, 손님 수를 변경할 수 있다.") + void change_number_of_guests_success() { + // given + OrderTable orderTable = new OrderTable(UUID.randomUUID(), new OrderTableName("1번 테이블"), 1, true); + + // when + orderTable.changeNumberOfGuests(3); + + // then + assertThat(orderTable.getNumberOfGuests()).isEqualTo(3); + } +} \ No newline at end of file From 80f72176f849dccd643c35adef41300479c009c6 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 16:05:52 +0900 Subject: [PATCH 11/71] =?UTF-8?q?feat=20&=20fix(kitchen=20pos)=20:=20EatIn?= =?UTF-8?q?Order=20Order=EB=A5=BC=20=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=A7=8C=EB=93=A4=EA=B3=A0,=20=EC=BB=B4=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorder/domain/model/EatInOrder.java | 120 ++++++++++++++++ .../domain/model/EatInOrderFlow.java | 2 + .../repository/EatInOrderRepository.java | 15 ++ .../persistence/JpaEatInOrderRepository.java | 8 +- .../eatinorder/service/EatInOrderService.java | 132 ++++++++++++++++++ 5 files changed, 276 insertions(+), 1 deletion(-) diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index 1230a5bea..ee6a370c8 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -1,4 +1,124 @@ package kitchenpos.order.eatinorder.domain.model; + +import jakarta.persistence.*; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.common.model.OrderType; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +@Table(name = "eat_in_orders") +@Entity public class EatInOrder { + @Column(name = "id", columnDefinition = "binary(16)") + @Id + private UUID id; + + @Column(name = "type", nullable = false, columnDefinition = "varchar(255)") + @Enumerated(EnumType.STRING) + private OrderType type; + + @Column(name = "status", nullable = false, columnDefinition = "varchar(255)") + @Enumerated(EnumType.STRING) + private EatInOrderStatus status; + + @Column(name = "order_date_time", nullable = false) + private LocalDateTime orderDateTime; + + @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @JoinColumn( + name = "order_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") + ) + private List orderLineItems; + + @ManyToOne + @JoinColumn( + name = "order_table_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_orders_to_order_table") + ) + private OrderTable orderTable; + + @Transient + private UUID orderTableId; + + public EatInOrder() { + } + + public EatInOrder(UUID id, OrderType type, EatInOrderStatus status, LocalDateTime orderDateTime, + List orderLineItems, OrderTable orderTable, UUID orderTableId) { + this.id = id; + this.type = type; + this.status = status; + this.orderDateTime = orderDateTime; + this.orderLineItems = orderLineItems; + this.orderTable = orderTable; + this.orderTableId = orderTableId; + } + + public EatInOrder(OrderType type, EatInOrderStatus status, LocalDateTime orderDateTime, + List orderLineItems, OrderTable orderTable, UUID orderTableId) { + this(UUID.randomUUID(), type, status, orderDateTime, orderLineItems, orderTable, orderTableId); + } + + public UUID getId() { + return id; + } + + public void setId(final UUID id) { + this.id = id; + } + + public OrderType getType() { + return type; + } + + public void setType(final OrderType type) { + this.type = type; + } + + public EatInOrderStatus getStatus() { + return status; + } + + public void setStatus(final EatInOrderStatus status) { + this.status = status; + } + + public LocalDateTime getOrderDateTime() { + return orderDateTime; + } + + public void setOrderDateTime(final LocalDateTime orderDateTime) { + this.orderDateTime = orderDateTime; + } + + public List getOrderLineItems() { + return orderLineItems; + } + + public void setOrderLineItems(final List orderLineItems) { + this.orderLineItems = orderLineItems; + } + + public OrderTable getOrderTable() { + return orderTable; + } + + public void setOrderTable(final OrderTable orderTable) { + this.orderTable = orderTable; + } + + public UUID getOrderTableId() { + return orderTableId; + } + + public void setOrderTableId(final UUID orderTableId) { + this.orderTableId = orderTableId; + } } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java index a5ca8dee8..57d03210c 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java @@ -1,4 +1,6 @@ package kitchenpos.order.eatinorder.domain.model; public class EatInOrderFlow { + + } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java b/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java index 8e2cc2396..1cd6c9275 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java @@ -1,4 +1,19 @@ package kitchenpos.order.eatinorder.domain.repository; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; +import kitchenpos.order.eatinorder.domain.model.OrderTable; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + public interface EatInOrderRepository { + Optional findById(UUID eatInOrderId); + + EatInOrder save(EatInOrder eatInOrder); + + boolean existsByOrderTableAndStatusNot(OrderTable orderTable, EatInOrderStatus eatInOrderStatus); + + List findAll(); } diff --git a/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java b/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java index 08c8626e6..f3af44d10 100644 --- a/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java @@ -1,4 +1,10 @@ package kitchenpos.order.eatinorder.infra.persistence; -public interface JpaEatInOrderRepository { +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface JpaEatInOrderRepository extends EatInOrderRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index d0bc5dd95..f95c79fce 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -1,4 +1,136 @@ package kitchenpos.order.eatinorder.service; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.common.model.OrderType; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; + +@Service public class EatInOrderService { + private final EatInOrderRepository eatInOrderRepository; + private final MenuRepository menuRepository; + private final OrderTableRepository orderTableRepository; + + public EatInOrderService( + final EatInOrderRepository eatInOrderRepository, + final MenuRepository menuRepository, + final OrderTableRepository orderTableRepository + ) { + this.eatInOrderRepository = eatInOrderRepository; + this.menuRepository = menuRepository; + this.orderTableRepository = orderTableRepository; + } + + @Transactional + public EatInOrder create(final EatInOrder request) { + final OrderType type = request.getType(); + if (Objects.isNull(type)) { + throw new IllegalArgumentException(); + } + final List orderLineItemRequests = request.getOrderLineItems(); + if (Objects.isNull(orderLineItemRequests) || orderLineItemRequests.isEmpty()) { + throw new IllegalArgumentException(); + } + final List menus = menuRepository.findAllByIdIn( + orderLineItemRequests.stream() + .map(OrderLineItem::getMenuId) + .toList() + ); + if (menus.size() != orderLineItemRequests.size()) { + throw new IllegalArgumentException(); + } + final List orderLineItems = new ArrayList<>(); + for (final OrderLineItem orderLineItemRequest : orderLineItemRequests) { + final long quantity = orderLineItemRequest.getQuantity(); + if (type != OrderType.EAT_IN) { + if (quantity < 0) { + throw new IllegalArgumentException(); + } + } + final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) + .orElseThrow(NoSuchElementException::new); + if (!menu.isDisplayed()) { + throw new IllegalStateException(); + } + if (menu.getInnerPrice().compareTo(orderLineItemRequest.getPrice()) != 0) { + throw new IllegalArgumentException(); + } + final OrderLineItem orderLineItem = new OrderLineItem(); + orderLineItem.setMenu(menu); + orderLineItem.setQuantity(quantity); + orderLineItems.add(orderLineItem); + } + EatInOrder eatInOrder = new EatInOrder(); + eatInOrder.setId(UUID.randomUUID()); + eatInOrder.setType(type); + eatInOrder.setStatus(EatInOrderStatus.WAITING); + eatInOrder.setOrderDateTime(LocalDateTime.now()); + eatInOrder.setOrderLineItems(orderLineItems); + if (type == OrderType.EAT_IN) { + final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) + .orElseThrow(NoSuchElementException::new); + if (!orderTable.isOccupied()) { + throw new IllegalStateException(); + } + eatInOrder.setOrderTable(orderTable); + } + return eatInOrderRepository.save(eatInOrder); + } + + @Transactional + public EatInOrder accept(final UUID orderId) { + final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) + .orElseThrow(NoSuchElementException::new); + if (eatInOrder.getStatus() != EatInOrderStatus.WAITING) { + throw new IllegalStateException(); + } + eatInOrder.setStatus(EatInOrderStatus.ACCEPTED); + return eatInOrder; + } + + @Transactional + public EatInOrder serve(final UUID orderId) { + final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) + .orElseThrow(NoSuchElementException::new); + if (eatInOrder.getStatus() != EatInOrderStatus.ACCEPTED) { + throw new IllegalStateException(); + } + eatInOrder.setStatus(EatInOrderStatus.SERVED); + return eatInOrder; + } + + @Transactional + public EatInOrder complete(final UUID orderId) { + final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) + .orElseThrow(NoSuchElementException::new); + final OrderType type = eatInOrder.getType(); + final EatInOrderStatus status = eatInOrder.getStatus(); + if (status != EatInOrderStatus.SERVED) { + throw new IllegalStateException(); + } + + eatInOrder.setStatus(EatInOrderStatus.COMPLETED); + + final OrderTable orderTable = eatInOrder.getOrderTable(); + if (!eatInOrderRepository.existsByOrderTableAndStatusNot(orderTable, EatInOrderStatus.COMPLETED)) { + orderTable.releaseTable(); + } + + return eatInOrder; + } + + @Transactional(readOnly = true) + public List findAll() { + return eatInOrderRepository.findAll(); + } } From 5e6d963a1abd652a4b07da322e46a01f196effb3 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 16:10:10 +0900 Subject: [PATCH 12/71] =?UTF-8?q?remove(kitchen=20pos)=20:=20EatInOrder=20?= =?UTF-8?q?=EC=97=90=20=ED=95=84=EC=9A=94=20=EC=97=86=EB=8A=94=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=20=EC=9C=A0=ED=98=95=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorder/domain/model/EatInOrder.java | 20 ++----------- .../eatinorder/service/EatInOrderService.java | 29 +++++++------------ 2 files changed, 14 insertions(+), 35 deletions(-) diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index ee6a370c8..e0b41bac9 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -3,7 +3,6 @@ import jakarta.persistence.*; import kitchenpos.order.common.model.OrderLineItem; -import kitchenpos.order.common.model.OrderType; import java.time.LocalDateTime; import java.util.List; @@ -16,10 +15,6 @@ public class EatInOrder { @Id private UUID id; - @Column(name = "type", nullable = false, columnDefinition = "varchar(255)") - @Enumerated(EnumType.STRING) - private OrderType type; - @Column(name = "status", nullable = false, columnDefinition = "varchar(255)") @Enumerated(EnumType.STRING) private EatInOrderStatus status; @@ -50,10 +45,9 @@ public class EatInOrder { public EatInOrder() { } - public EatInOrder(UUID id, OrderType type, EatInOrderStatus status, LocalDateTime orderDateTime, + public EatInOrder(UUID id, EatInOrderStatus status, LocalDateTime orderDateTime, List orderLineItems, OrderTable orderTable, UUID orderTableId) { this.id = id; - this.type = type; this.status = status; this.orderDateTime = orderDateTime; this.orderLineItems = orderLineItems; @@ -61,9 +55,9 @@ public EatInOrder(UUID id, OrderType type, EatInOrderStatus status, LocalDateTim this.orderTableId = orderTableId; } - public EatInOrder(OrderType type, EatInOrderStatus status, LocalDateTime orderDateTime, + public EatInOrder(EatInOrderStatus status, LocalDateTime orderDateTime, List orderLineItems, OrderTable orderTable, UUID orderTableId) { - this(UUID.randomUUID(), type, status, orderDateTime, orderLineItems, orderTable, orderTableId); + this(UUID.randomUUID(), status, orderDateTime, orderLineItems, orderTable, orderTableId); } public UUID getId() { @@ -74,14 +68,6 @@ public void setId(final UUID id) { this.id = id; } - public OrderType getType() { - return type; - } - - public void setType(final OrderType type) { - this.type = type; - } - public EatInOrderStatus getStatus() { return status; } diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index f95c79fce..2b1871f79 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -3,7 +3,6 @@ import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.OrderLineItem; -import kitchenpos.order.common.model.OrderType; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; @@ -33,10 +32,6 @@ public EatInOrderService( @Transactional public EatInOrder create(final EatInOrder request) { - final OrderType type = request.getType(); - if (Objects.isNull(type)) { - throw new IllegalArgumentException(); - } final List orderLineItemRequests = request.getOrderLineItems(); if (Objects.isNull(orderLineItemRequests) || orderLineItemRequests.isEmpty()) { throw new IllegalArgumentException(); @@ -52,11 +47,11 @@ public EatInOrder create(final EatInOrder request) { final List orderLineItems = new ArrayList<>(); for (final OrderLineItem orderLineItemRequest : orderLineItemRequests) { final long quantity = orderLineItemRequest.getQuantity(); - if (type != OrderType.EAT_IN) { - if (quantity < 0) { - throw new IllegalArgumentException(); - } + + if (quantity < 0) { + throw new IllegalArgumentException(); } + final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) .orElseThrow(NoSuchElementException::new); if (!menu.isDisplayed()) { @@ -72,18 +67,17 @@ public EatInOrder create(final EatInOrder request) { } EatInOrder eatInOrder = new EatInOrder(); eatInOrder.setId(UUID.randomUUID()); - eatInOrder.setType(type); eatInOrder.setStatus(EatInOrderStatus.WAITING); eatInOrder.setOrderDateTime(LocalDateTime.now()); eatInOrder.setOrderLineItems(orderLineItems); - if (type == OrderType.EAT_IN) { - final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) - .orElseThrow(NoSuchElementException::new); - if (!orderTable.isOccupied()) { - throw new IllegalStateException(); - } - eatInOrder.setOrderTable(orderTable); + + final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) + .orElseThrow(NoSuchElementException::new); + if (!orderTable.isOccupied()) { + throw new IllegalStateException(); } + eatInOrder.setOrderTable(orderTable); + return eatInOrderRepository.save(eatInOrder); } @@ -113,7 +107,6 @@ public EatInOrder serve(final UUID orderId) { public EatInOrder complete(final UUID orderId) { final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - final OrderType type = eatInOrder.getType(); final EatInOrderStatus status = eatInOrder.getStatus(); if (status != EatInOrderStatus.SERVED) { throw new IllegalStateException(); From e3a8c8fb8b732d8b4ab7721c40eabbd233fa2ab5 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Wed, 19 Feb 2025 21:33:54 +0900 Subject: [PATCH 13/71] =?UTF-8?q?fix(kitchen=20pos)=20:=20EatInOrder=20Ent?= =?UTF-8?q?ity=20=EC=83=9D=EC=84=B1=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=20=EB=A7=A4=ED=95=91=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/order/common/model/Order.java | 2 +- .../eatinorder/domain/model/EatInOrder.java | 24 +++-- .../domain/model/EatInOrderLineItem.java | 91 +++++++++++++++++++ 3 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java diff --git a/src/main/java/kitchenpos/order/common/model/Order.java b/src/main/java/kitchenpos/order/common/model/Order.java index ff4edfb13..ebb66a594 100644 --- a/src/main/java/kitchenpos/order/common/model/Order.java +++ b/src/main/java/kitchenpos/order/common/model/Order.java @@ -38,7 +38,7 @@ public class Order { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( name = "order_id", - nullable = false, +// nullable = false, columnDefinition = "binary(16)", foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") ) diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index e0b41bac9..a3bff9bda 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -1,12 +1,22 @@ package kitchenpos.order.eatinorder.domain.model; -import jakarta.persistence.*; -import kitchenpos.order.common.model.OrderLineItem; - +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import kitchenpos.order.common.model.OrderLineItem; @Table(name = "eat_in_orders") @Entity @@ -24,10 +34,10 @@ public class EatInOrder { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( - name = "order_id", - nullable = false, + name = "eat_in_order_id", +// nullable = false, columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") + foreignKey = @ForeignKey(name = "fk_order_line_item_to_eat_in_orders") ) private List orderLineItems; @@ -35,7 +45,7 @@ public class EatInOrder { @JoinColumn( name = "order_table_id", columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_orders_to_order_table") + foreignKey = @ForeignKey(name = "fk_eat_in_orders_to_order_table") ) private OrderTable orderTable; diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java new file mode 100644 index 000000000..e93c60b1d --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java @@ -0,0 +1,91 @@ +//package kitchenpos.order.eatinorder.domain.model; +// +//import jakarta.persistence.Column; +//import jakarta.persistence.Entity; +//import jakarta.persistence.ForeignKey; +//import jakarta.persistence.GeneratedValue; +//import jakarta.persistence.GenerationType; +//import jakarta.persistence.Id; +//import jakarta.persistence.JoinColumn; +//import jakarta.persistence.ManyToOne; +//import jakarta.persistence.Table; +//import jakarta.persistence.Transient; +//import java.math.BigDecimal; +//import java.util.UUID; +//import kitchenpos.menu.domain.model.Menu; +// +//@Table(name = "eat_in_order_line_item") +//@Entity +//public class EatInOrderLineItem { +// @Column(name = "seq") +// @GeneratedValue(strategy = GenerationType.IDENTITY) +// @Id +// private Long seq; +// +// @ManyToOne(optional = false) +// @JoinColumn( +// name = "menu_id", +// columnDefinition = "binary(16)", +// foreignKey = @ForeignKey(name = "fk_eat_in_order_line_item_to_menu") +// ) +// private Menu menu; +// +// @Column(name = "quantity", nullable = false) +// private long quantity; +// +// @Transient +// private UUID menuId; +// +// @Transient +// private BigDecimal price; +// +// public EatInOrderLineItem() { +// } +// +// public EatInOrderLineItem(Menu menu, long quantity, UUID menuId, BigDecimal price) { +// this.menu = menu; +// this.quantity = quantity; +// this.menuId = menuId; +// this.price = price; +// } +// +// public Long getSeq() { +// return seq; +// } +// +// public void setSeq(final Long seq) { +// this.seq = seq; +// } +// +// public Menu getMenu() { +// return menu; +// } +// +// public void setMenu(final Menu menu) { +// this.menu = menu; +// } +// +// public long getQuantity() { +// return quantity; +// } +// +// public void setQuantity(final long quantity) { +// this.quantity = quantity; +// } +// +// public UUID getMenuId() { +// return menuId; +// } +// +// public void setMenuId(final UUID menuId) { +// this.menuId = menuId; +// } +// +// public BigDecimal getPrice() { +// return price; +// } +// +// public void setPrice(final BigDecimal price) { +// this.price = price; +// } +//} From 08bee5cca428a457215f6c4b4b7ab77cc0d0864a Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Wed, 19 Feb 2025 22:45:40 +0900 Subject: [PATCH 14/71] =?UTF-8?q?feat&refactor(kitchen=20pos)=20:=20EatInO?= =?UTF-8?q?rder,=20OrderLineItem=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/application/OrderService.java | 4 +- .../OrderLineItemExceptionMessage.java | 17 ++++ .../order/common/model/OrderLineItem.java | 29 +++++- .../eatinorder/domain/model/EatInOrder.java | 18 ++-- .../domain/model/EatInOrderLineItem.java | 91 ------------------- .../eatinorder/domain/model/OrderTable.java | 2 +- .../exception/EatInOrderExceptionMessage.java | 5 +- .../eatinorder/service/EatInOrderService.java | 64 ++++++------- .../common/application/OrderServiceTest.java | 8 +- 9 files changed, 92 insertions(+), 146 deletions(-) create mode 100644 src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java delete mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java diff --git a/src/main/java/kitchenpos/order/common/application/OrderService.java b/src/main/java/kitchenpos/order/common/application/OrderService.java index 5a16b8f3b..88994b97d 100644 --- a/src/main/java/kitchenpos/order/common/application/OrderService.java +++ b/src/main/java/kitchenpos/order/common/application/OrderService.java @@ -74,8 +74,8 @@ public Order create(final Order request) { throw new IllegalArgumentException(); } final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setMenu(menu); - orderLineItem.setQuantity(quantity); + orderLineItem.addMenu(menu); + orderLineItem.addQuantity(quantity); orderLineItems.add(orderLineItem); } Order order = new Order(); diff --git a/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java b/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java new file mode 100644 index 000000000..db63e6f0c --- /dev/null +++ b/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java @@ -0,0 +1,17 @@ +package kitchenpos.order.common.exception; + +public enum OrderLineItemExceptionMessage { + ORDER_LINE_ITEM_QUANTITY_EXCEPTION("주문 내역의 메뉴 수량이 비어있습니다!"), + ORDER_LINE_ITEM_MENU_DISPLAY_EXCEPTION("주문 내역의 메뉴가 게시되어 있지 않습니다!"), + ORDER_LINE_ITEM_PRICE_EXCEPTION("주문 내역의 가격이 메뉴의 가격과 다릅니다!") +; + private final String message; + + OrderLineItemExceptionMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java index ecd62fb3c..6b60c81d0 100644 --- a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java +++ b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java @@ -1,5 +1,9 @@ package kitchenpos.order.common.model; +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_MENU_DISPLAY_EXCEPTION; +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_PRICE_EXCEPTION; +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_QUANTITY_EXCEPTION; + import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.ForeignKey; @@ -43,12 +47,33 @@ public OrderLineItem() { } public OrderLineItem(Menu menu, long quantity, UUID menuId, BigDecimal price) { + validateQuantity(quantity); + validateMenuDisplay(menu); + validatePrice(menu, price); this.menu = menu; this.quantity = quantity; this.menuId = menuId; this.price = price; } + private void validateQuantity(long quantity) { + if (quantity <= 0) { + throw new IllegalArgumentException(ORDER_LINE_ITEM_QUANTITY_EXCEPTION.getMessage()); + } + } + + private void validateMenuDisplay(Menu menu) { + if (!menu.isDisplayed()) { + throw new IllegalStateException(ORDER_LINE_ITEM_MENU_DISPLAY_EXCEPTION.getMessage()); + } + } + + private void validatePrice(Menu menu, BigDecimal price) { + if (menu.getInnerPrice().compareTo(price) != 0) { + throw new IllegalArgumentException(ORDER_LINE_ITEM_PRICE_EXCEPTION.getMessage()); + } + } + public Long getSeq() { return seq; } @@ -61,7 +86,7 @@ public Menu getMenu() { return menu; } - public void setMenu(final Menu menu) { + public void addMenu(final Menu menu) { this.menu = menu; } @@ -69,7 +94,7 @@ public long getQuantity() { return quantity; } - public void setQuantity(final long quantity) { + public void addQuantity(final long quantity) { this.quantity = quantity; } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index a3bff9bda..70c33692f 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -1,6 +1,8 @@ package kitchenpos.order.eatinorder.domain.model; +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION; + import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -15,6 +17,7 @@ import jakarta.persistence.Transient; import java.time.LocalDateTime; import java.util.List; +import java.util.Objects; import java.util.UUID; import kitchenpos.order.common.model.OrderLineItem; @@ -56,18 +59,18 @@ public EatInOrder() { } public EatInOrder(UUID id, EatInOrderStatus status, LocalDateTime orderDateTime, - List orderLineItems, OrderTable orderTable, UUID orderTableId) { + List orderLineItems) { + validateOrderLineItemIsEmpty(orderLineItems); this.id = id; this.status = status; this.orderDateTime = orderDateTime; this.orderLineItems = orderLineItems; - this.orderTable = orderTable; - this.orderTableId = orderTableId; } - public EatInOrder(EatInOrderStatus status, LocalDateTime orderDateTime, - List orderLineItems, OrderTable orderTable, UUID orderTableId) { - this(UUID.randomUUID(), status, orderDateTime, orderLineItems, orderTable, orderTableId); + private void validateOrderLineItemIsEmpty(List orderLineItems) { + if (Objects.isNull(orderLineItems) || orderLineItems.isEmpty()) { + throw new IllegalArgumentException(EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION.getMessage()); + } } public UUID getId() { @@ -106,7 +109,8 @@ public OrderTable getOrderTable() { return orderTable; } - public void setOrderTable(final OrderTable orderTable) { + public void occupyOrderTable(final OrderTable orderTable) { + orderTable.validateTableIsOccupied(); this.orderTable = orderTable; } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java deleted file mode 100644 index e93c60b1d..000000000 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java +++ /dev/null @@ -1,91 +0,0 @@ -//package kitchenpos.order.eatinorder.domain.model; -// -//import jakarta.persistence.Column; -//import jakarta.persistence.Entity; -//import jakarta.persistence.ForeignKey; -//import jakarta.persistence.GeneratedValue; -//import jakarta.persistence.GenerationType; -//import jakarta.persistence.Id; -//import jakarta.persistence.JoinColumn; -//import jakarta.persistence.ManyToOne; -//import jakarta.persistence.Table; -//import jakarta.persistence.Transient; -//import java.math.BigDecimal; -//import java.util.UUID; -//import kitchenpos.menu.domain.model.Menu; -// -//@Table(name = "eat_in_order_line_item") -//@Entity -//public class EatInOrderLineItem { -// @Column(name = "seq") -// @GeneratedValue(strategy = GenerationType.IDENTITY) -// @Id -// private Long seq; -// -// @ManyToOne(optional = false) -// @JoinColumn( -// name = "menu_id", -// columnDefinition = "binary(16)", -// foreignKey = @ForeignKey(name = "fk_eat_in_order_line_item_to_menu") -// ) -// private Menu menu; -// -// @Column(name = "quantity", nullable = false) -// private long quantity; -// -// @Transient -// private UUID menuId; -// -// @Transient -// private BigDecimal price; -// -// public EatInOrderLineItem() { -// } -// -// public EatInOrderLineItem(Menu menu, long quantity, UUID menuId, BigDecimal price) { -// this.menu = menu; -// this.quantity = quantity; -// this.menuId = menuId; -// this.price = price; -// } -// -// public Long getSeq() { -// return seq; -// } -// -// public void setSeq(final Long seq) { -// this.seq = seq; -// } -// -// public Menu getMenu() { -// return menu; -// } -// -// public void setMenu(final Menu menu) { -// this.menu = menu; -// } -// -// public long getQuantity() { -// return quantity; -// } -// -// public void setQuantity(final long quantity) { -// this.quantity = quantity; -// } -// -// public UUID getMenuId() { -// return menuId; -// } -// -// public void setMenuId(final UUID menuId) { -// this.menuId = menuId; -// } -// -// public BigDecimal getPrice() { -// return price; -// } -// -// public void setPrice(final BigDecimal price) { -// this.price = price; -// } -//} diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java index a46469cdc..529a482fb 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java @@ -58,7 +58,7 @@ public void changeNumberOfGuests(final int numberOfGuests) { this.numberOfGuests = numberOfGuests; } - private void validateTableIsOccupied() { + public void validateTableIsOccupied() { if (!isOccupied()) { throw new IllegalStateException(EMPTY_ORDER_TABLE_EXCEPTION.getMessage()); } diff --git a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java index cf791a334..072fa71aa 100644 --- a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java +++ b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java @@ -3,9 +3,8 @@ public enum EatInOrderExceptionMessage { ORDER_TABLE_NAME_CREATION_EXCEPTION("주문 테이블 이름을 채워주세요!"), EMPTY_ORDER_TABLE_EXCEPTION("주문 테이블이 비어있습니다!"), - NUMBER_OF_GUESTS_EXCEPTION("손님 수가 음수일 수 없습니다!") - ; - + NUMBER_OF_GUESTS_EXCEPTION("손님 수가 음수일 수 없습니다!"), + EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION("매장 주문에 주문 내역이 비어있습니다!"); private final String message; diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index 2b1871f79..010a590ec 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -1,5 +1,10 @@ package kitchenpos.order.eatinorder.service; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.OrderLineItem; @@ -11,9 +16,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; -import java.util.*; - @Service public class EatInOrderService { private final EatInOrderRepository eatInOrderRepository; @@ -33,9 +35,20 @@ public EatInOrderService( @Transactional public EatInOrder create(final EatInOrder request) { final List orderLineItemRequests = request.getOrderLineItems(); - if (Objects.isNull(orderLineItemRequests) || orderLineItemRequests.isEmpty()) { - throw new IllegalArgumentException(); - } + validateOrderLineItemMenuIsExists(orderLineItemRequests); + + final List orderLineItems = createOrderLineItemsByRequest(orderLineItemRequests); + EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), EatInOrderStatus.WAITING, LocalDateTime.now(), + orderLineItems); + + final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) + .orElseThrow(NoSuchElementException::new); + eatInOrder.occupyOrderTable(orderTable); + + return eatInOrderRepository.save(eatInOrder); + } + + private void validateOrderLineItemMenuIsExists(List orderLineItemRequests) { final List menus = menuRepository.findAllByIdIn( orderLineItemRequests.stream() .map(OrderLineItem::getMenuId) @@ -44,41 +57,18 @@ public EatInOrder create(final EatInOrder request) { if (menus.size() != orderLineItemRequests.size()) { throw new IllegalArgumentException(); } - final List orderLineItems = new ArrayList<>(); - for (final OrderLineItem orderLineItemRequest : orderLineItemRequests) { - final long quantity = orderLineItemRequest.getQuantity(); - - if (quantity < 0) { - throw new IllegalArgumentException(); - } + } - final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) + private List createOrderLineItemsByRequest(List orderLineItemRequests) { + final List orderLineItems = new ArrayList<>(); + for (final OrderLineItem itemRq : orderLineItemRequests) { + final Menu menu = menuRepository.findById(itemRq.getMenuId()) .orElseThrow(NoSuchElementException::new); - if (!menu.isDisplayed()) { - throw new IllegalStateException(); - } - if (menu.getInnerPrice().compareTo(orderLineItemRequest.getPrice()) != 0) { - throw new IllegalArgumentException(); - } - final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setMenu(menu); - orderLineItem.setQuantity(quantity); + final OrderLineItem orderLineItem = new OrderLineItem(menu, itemRq.getQuantity(), menu.getId(), + itemRq.getPrice()); orderLineItems.add(orderLineItem); } - EatInOrder eatInOrder = new EatInOrder(); - eatInOrder.setId(UUID.randomUUID()); - eatInOrder.setStatus(EatInOrderStatus.WAITING); - eatInOrder.setOrderDateTime(LocalDateTime.now()); - eatInOrder.setOrderLineItems(orderLineItems); - - final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) - .orElseThrow(NoSuchElementException::new); - if (!orderTable.isOccupied()) { - throw new IllegalStateException(); - } - eatInOrder.setOrderTable(orderTable); - - return eatInOrderRepository.save(eatInOrder); + return orderLineItems; } @Transactional diff --git a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java index b2788abff..963a42bd7 100644 --- a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java @@ -92,13 +92,15 @@ void create_order() { void menu_name_exception() { // given Menu menu = createMenuWithProductAndGroup(false); - Order request = createOrderRequestWithEmptyTable(OrderType.DELIVERY, OrderStatus.WAITING, menu, "서울"); when(menuRepository.findAllByIdIn(anyList())).thenReturn(List.of(menu)); when(menuRepository.findById(any())).thenReturn(Optional.of(menu)); // when // then - assertThatThrownBy(() -> orderService.create(request)) - .isInstanceOf(IllegalStateException.class); + assertThatThrownBy(() -> { + Order request = createOrderRequestWithEmptyTable(OrderType.DELIVERY, OrderStatus.WAITING, menu, "서울"); + orderService.create(request); + }).isInstanceOf(IllegalStateException.class) + .hasMessage("주문 내역의 메뉴가 게시되어 있지 않습니다!"); } } From 5d03daa1a2cf36cf8d9e4f3071bda89ff39120bd Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Wed, 19 Feb 2025 22:55:41 +0900 Subject: [PATCH 15/71] =?UTF-8?q?docs&test(kitchen=20pos)=20:=20OrderLineI?= =?UTF-8?q?tem=20=EC=9A=94=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++ .../order/common/model/OrderLineItemTest.java | 48 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java diff --git a/README.md b/README.md index f69c3d0b1..f39202405 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,9 @@ docker compose -p kitchenpos up -d - [] : 주문 내역은 주문 검증을 할 수 있다. - [] : 주문 내역에는 메뉴와 수량, 가격으로 이루어져 있다. + - [] : 주문 내역의 메뉴 수량은 1 이상이어야 한다. + - [] : 주문 내역의 메뉴는 게시 상태여야 한다. + - [] : 주문 시점의 가격과 메뉴의 가격은 동일해야 한다. ### 6. 매장 테이블(order-table) 요구 사항 diff --git a/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java b/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java new file mode 100644 index 000000000..375cf6478 --- /dev/null +++ b/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java @@ -0,0 +1,48 @@ +package kitchenpos.order.common.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.math.BigDecimal; +import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class OrderLineItemTest { + + @Test + @DisplayName("주문 내역의 메뉴 수량은 0 이하면 예외를 던진다.") + void validate_order_line_item_quantity() { + // given + Menu menu = new Menu(UUID.randomUUID(), "김치", BigDecimal.ONE, true); + + // when // then + assertThatThrownBy(() -> new OrderLineItem(menu, 0, menu.getId(), BigDecimal.ONE)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("주문 내역의 메뉴 수량이 비어있습니다!"); + } + + @Test + @DisplayName("주문 내역의 메뉴가 게시 상태가 아니면 예외를 던진다.") + void validate_order_line_item_menu_display() { + // given + Menu menu = new Menu(UUID.randomUUID(), "김치", BigDecimal.ONE, false); + + // when // then + assertThatThrownBy(() -> new OrderLineItem(menu, 1, menu.getId(), BigDecimal.ONE)) + .isInstanceOf(IllegalStateException.class) + .hasMessage("주문 내역의 메뉴가 게시되어 있지 않습니다!"); + } + + @Test + @DisplayName("주문 내역의 가격과 메뉴의 가격이 다르면 예외를 던진다.") + void validate_order_line_item_price() { + // given + Menu menu = new Menu(UUID.randomUUID(), "김치", BigDecimal.TEN, true); + + // when // then + assertThatThrownBy(() -> new OrderLineItem(menu, 1, menu.getId(), BigDecimal.ONE)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("주문 내역의 가격이 메뉴의 가격과 다릅니다!"); + } +} From 553ce8ec23392058eba23a894ba353d91d844bfd Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 20 Feb 2025 00:16:45 +0900 Subject: [PATCH 16/71] =?UTF-8?q?refactor=20&=20test(kitchen=20pos)=20:=20?= =?UTF-8?q?EatInOrderService=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorder/domain/model/EatInOrder.java | 48 ++++-- .../domain/model/EatInOrderFlow.java | 24 ++- .../domain/model/EatInOrderStatus.java | 2 +- .../exception/EatInOrderExceptionMessage.java | 3 +- .../eatinorder/service/EatInOrderService.java | 22 +-- .../common/application/OrderServiceTest.java | 99 +----------- .../service/EatInOrderServiceTest.java | 143 ++++++++++++++++++ 7 files changed, 220 insertions(+), 121 deletions(-) create mode 100644 src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index 70c33692f..16677a71f 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -2,11 +2,11 @@ import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION; +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_FLOW_EXCEPTION; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import jakarta.persistence.ForeignKey; import jakarta.persistence.Id; @@ -28,9 +28,9 @@ public class EatInOrder { @Id private UUID id; - @Column(name = "status", nullable = false, columnDefinition = "varchar(255)") - @Enumerated(EnumType.STRING) - private EatInOrderStatus status; +// @Column(name = "status", nullable = false, columnDefinition = "varchar(255)") +// @Enumerated(EnumType.STRING) +// private EatInOrderStatus status; @Column(name = "order_date_time", nullable = false) private LocalDateTime orderDateTime; @@ -52,19 +52,33 @@ public class EatInOrder { ) private OrderTable orderTable; + @Enumerated + private EatInOrderFlow eatInOrderFlow; + @Transient private UUID orderTableId; public EatInOrder() { } - public EatInOrder(UUID id, EatInOrderStatus status, LocalDateTime orderDateTime, + public EatInOrder(UUID id, LocalDateTime orderDateTime, + List orderLineItems, EatInOrderFlow eatInOrderFlow) { + validateOrderLineItemIsEmpty(orderLineItems); + this.id = id; +// this.status = status; + this.orderDateTime = orderDateTime; + this.orderLineItems = orderLineItems; + this.eatInOrderFlow = eatInOrderFlow; + } + + public EatInOrder(UUID id, LocalDateTime orderDateTime, List orderLineItems) { validateOrderLineItemIsEmpty(orderLineItems); this.id = id; - this.status = status; +// this.status = status; this.orderDateTime = orderDateTime; this.orderLineItems = orderLineItems; + this.eatInOrderFlow = EatInOrderFlow.WAITING; } private void validateOrderLineItemIsEmpty(List orderLineItems) { @@ -73,6 +87,13 @@ private void validateOrderLineItemIsEmpty(List orderLineItems) { } } + public void validateOrderFlow(EatInOrderStatus orderStatus) { + if (!eatInOrderFlow.validateOrderStatus(orderStatus)) { + throw new IllegalStateException(EAT_IN_ORDER_FLOW_EXCEPTION.getMessage()); + } + this.eatInOrderFlow = EatInOrderFlow.findByOrderStatus(orderStatus); + } + public UUID getId() { return id; } @@ -81,12 +102,17 @@ public void setId(final UUID id) { this.id = id; } - public EatInOrderStatus getStatus() { - return status; - } +// public EatInOrderStatus getStatus() { +// return status; +// } +// +// public void setStatus(final EatInOrderStatus status) { +// this.status = status; +// } + - public void setStatus(final EatInOrderStatus status) { - this.status = status; + public EatInOrderFlow getEatInOrderFlow() { + return eatInOrderFlow; } public LocalDateTime getOrderDateTime() { diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java index 57d03210c..99bef7a20 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java @@ -1,6 +1,28 @@ package kitchenpos.order.eatinorder.domain.model; -public class EatInOrderFlow { +import java.util.Arrays; +public enum EatInOrderFlow { + WAITING(EatInOrderStatus.NONE), + ACCEPTED(EatInOrderStatus.WAITING), + SERVED(EatInOrderStatus.ACCEPTED), + COMPLETED(EatInOrderStatus.SERVED); + private final EatInOrderStatus previousOrderStatus; + + EatInOrderFlow(EatInOrderStatus previousOrderStatus) { + this.previousOrderStatus = previousOrderStatus; + } + + public boolean validateOrderStatus(EatInOrderStatus nextOrderStatus) { + EatInOrderFlow nextOrderFlow = findByOrderStatus(nextOrderStatus); + return this.name().equals(nextOrderFlow.previousOrderStatus.name()); + } + + public static EatInOrderFlow findByOrderStatus(EatInOrderStatus nextOrderStatus) { + return Arrays.stream(values()) + .filter(flow -> flow.name().equals(nextOrderStatus.name())) + .findFirst() + .orElseThrow(); + } } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderStatus.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderStatus.java index d2e925cc4..e4faddea0 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderStatus.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderStatus.java @@ -1,5 +1,5 @@ package kitchenpos.order.eatinorder.domain.model; public enum EatInOrderStatus { - WAITING, ACCEPTED, SERVED, DELIVERING, DELIVERED, COMPLETED + NONE, WAITING, ACCEPTED, SERVED, COMPLETED } diff --git a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java index 072fa71aa..c7bf71bd0 100644 --- a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java +++ b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java @@ -4,7 +4,8 @@ public enum EatInOrderExceptionMessage { ORDER_TABLE_NAME_CREATION_EXCEPTION("주문 테이블 이름을 채워주세요!"), EMPTY_ORDER_TABLE_EXCEPTION("주문 테이블이 비어있습니다!"), NUMBER_OF_GUESTS_EXCEPTION("손님 수가 음수일 수 없습니다!"), - EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION("매장 주문에 주문 내역이 비어있습니다!"); + EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION("매장 주문에 주문 내역이 비어있습니다!"), + EAT_IN_ORDER_FLOW_EXCEPTION("잘못된 매장 주문 순서입니다. 주문 순서를 지켜주세요!"); private final String message; diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index 010a590ec..ded43adf3 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -9,6 +9,7 @@ import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; @@ -38,8 +39,8 @@ public EatInOrder create(final EatInOrder request) { validateOrderLineItemMenuIsExists(orderLineItemRequests); final List orderLineItems = createOrderLineItemsByRequest(orderLineItemRequests); - EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), EatInOrderStatus.WAITING, LocalDateTime.now(), - orderLineItems); + EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), + orderLineItems, EatInOrderFlow.WAITING); final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) .orElseThrow(NoSuchElementException::new); @@ -75,10 +76,7 @@ private List createOrderLineItemsByRequest(List or public EatInOrder accept(final UUID orderId) { final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - if (eatInOrder.getStatus() != EatInOrderStatus.WAITING) { - throw new IllegalStateException(); - } - eatInOrder.setStatus(EatInOrderStatus.ACCEPTED); + eatInOrder.validateOrderFlow(EatInOrderStatus.ACCEPTED); return eatInOrder; } @@ -86,10 +84,7 @@ public EatInOrder accept(final UUID orderId) { public EatInOrder serve(final UUID orderId) { final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - if (eatInOrder.getStatus() != EatInOrderStatus.ACCEPTED) { - throw new IllegalStateException(); - } - eatInOrder.setStatus(EatInOrderStatus.SERVED); + eatInOrder.validateOrderFlow(EatInOrderStatus.SERVED); return eatInOrder; } @@ -97,12 +92,7 @@ public EatInOrder serve(final UUID orderId) { public EatInOrder complete(final UUID orderId) { final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - final EatInOrderStatus status = eatInOrder.getStatus(); - if (status != EatInOrderStatus.SERVED) { - throw new IllegalStateException(); - } - - eatInOrder.setStatus(EatInOrderStatus.COMPLETED); + eatInOrder.validateOrderFlow(EatInOrderStatus.COMPLETED); final OrderTable orderTable = eatInOrder.getOrderTable(); if (!eatInOrderRepository.existsByOrderTableAndStatusNot(orderTable, EatInOrderStatus.COMPLETED)) { diff --git a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java index 963a42bd7..af45c00ed 100644 --- a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java @@ -16,18 +16,24 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.model.OrderType; import kitchenpos.order.common.repository.OrderRepository; import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.service.EatInOrderService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -106,7 +112,7 @@ void menu_name_exception() { @Nested @DisplayName("배달 주문") - class DeliveryOrder { + class DeliveryOrderTest { @Test @DisplayName("배달 주문 시 주소가 없으면 예외가 발생한다.") @@ -189,7 +195,7 @@ void complete_order() { @Nested @DisplayName("포장 주문") - class TakeOutOrder { + class TakeOutOrderTest { @ParameterizedTest @EnumSource(value = OrderStatus.class, names = {"ACCEPTED", "SERVED", "DELIVERING", "DELIVERED", "COMPLETED"}) @@ -241,93 +247,4 @@ void complete_order() { // 어떤 경우 든 통과함! // 포장 주문 기능 추가 시 여기에 추가 } - - @Nested - @DisplayName("매장 주문") - class EatInOrder { - - @Test - @DisplayName("이용 중이지 않은 테이블에서 주문 시 예외가 발생한다.") - void not_occupied_table_order_exception() { - // given - Menu menu = createMenuWithProductAndGroup(); - OrderTable orderTable = createEmptyOrderTable(); - Order request = createOrderRequestWithOccupiedTable(OrderType.EAT_IN, OrderStatus.WAITING, menu, "서울"); - request.setOrderTable(orderTable); - when(menuRepository.findAllByIdIn(anyList())).thenReturn(List.of(menu)); - when(menuRepository.findById(any())).thenReturn(Optional.of(menu)); - when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); - - // when // then - assertThatThrownBy(() -> orderService.create(request)) - .isInstanceOf(IllegalStateException.class); - } - - @Test - @DisplayName("매장 식사 주문 완료 시 다른 주문이 없으면 테이블을 비운다") - void clear_table_with_complete_status() { - // given - OrderTable orderTable = createUsingOrderTable(); - Order order = createOrderWithEatInType(createOrderLineItem(createMenuWithProductAndGroup()), - orderTable, OrderStatus.SERVED); - order.setOrderTable(orderTable); - - when(orderRepository.findById(any())).thenReturn(Optional.of(order)); - when(orderRepository.existsByOrderTableAndStatusNot(any(), any())).thenReturn(false); - - // when - orderService.complete(order.getId()); - - // then - assertThat(orderTable.isOccupied()).isFalse(); - assertThat(orderTable.getNumberOfGuests()).isZero(); - } - - @ParameterizedTest - @EnumSource(value = OrderStatus.class, names = {"ACCEPTED", "SERVED", "DELIVERING", "DELIVERED", "COMPLETED"}) - @DisplayName("대기 중이 아닌 주문 시 예외가 발생한다.") - void accept_exception(OrderStatus status) { - // given - OrderTable orderTable = createUsingOrderTable(); - Order order = createOrderWithEatInType(createOrderLineItem(createMenuWithProductAndGroup()), - orderTable, status); - when(orderRepository.findById(any())).thenReturn(Optional.of(order)); - - // when // then - assertThatThrownBy(() -> orderService.accept(order.getId())) - .isInstanceOf(IllegalStateException.class); - } - - @Test - @DisplayName("대기 중인 주문만 접수할 수 있다") - void accept_success() { - // given - OrderTable orderTable = createUsingOrderTable(); - Order order = createOrderWithEatInType(createOrderLineItem(createMenuWithProductAndGroup()), - orderTable, OrderStatus.WAITING); - when(orderRepository.findById(any())).thenReturn(Optional.of(order)); - - // when - Order result = orderService.accept(order.getId()); - - // then - assertThat(result.getStatus()).isEqualTo(OrderStatus.ACCEPTED); - } - - @Test - @DisplayName("매장 주문은 서빙이 완료 되면 주문을 완료할 수 있다") - void complete_order() { - // given - OrderTable orderTable = createUsingOrderTable(); - Order order = createOrderWithEatInType(createOrderLineItem(createMenuWithProductAndGroup()), - orderTable, OrderStatus.SERVED); - when(orderRepository.findById(any())).thenReturn(Optional.of(order)); - - // when - Order result = orderService.complete(order.getId()); - - // then - assertThat(result.getStatus()).isEqualTo(OrderStatus.COMPLETED); - } - } } diff --git a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java new file mode 100644 index 000000000..91123e4de --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java @@ -0,0 +1,143 @@ +package kitchenpos.order.eatinorder.service; + +import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; +import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; +import static kitchenpos.TestFixtureFactory.createUsingOrderTable; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; +import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class EatInOrderServiceTest { + + private EatInOrderService eatInOrderService; + private EatInOrderRepository eatInOrderRepository; + private MenuRepository menuRepository; + private OrderTableRepository orderTableRepository; + + @BeforeEach + void setUp() { + eatInOrderRepository = mock(EatInOrderRepository.class); + menuRepository = mock(MenuRepository.class); + orderTableRepository = mock(OrderTableRepository.class); + eatInOrderService = new EatInOrderService(eatInOrderRepository, menuRepository, orderTableRepository); + } + + @Test + @DisplayName("이용 중이지 않은 테이블에서 주문 시 예외가 발생한다.") + void not_occupied_table_order_exception() { + // given + Menu menu = createMenuWithProductAndGroup(); + OrderTable orderTable = createEmptyOrderTable(); + EatInOrder request = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.WAITING); + + when(menuRepository.findAllByIdIn(anyList())).thenReturn(List.of(menu)); + when(menuRepository.findById(any())).thenReturn(Optional.of(menu)); + when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); + + // when // then + assertThatThrownBy(() -> eatInOrderService.create(request)) + .isInstanceOf(IllegalStateException.class); + } + + @Test + @DisplayName("매장 식사 주문 완료 시 다른 주문이 없으면 테이블을 비운다") + void clear_table_with_complete_status() { + // given + Menu menu = createMenuWithProductAndGroup(); + OrderTable orderTable = createUsingOrderTable(); + EatInOrder order = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.SERVED); + order.occupyOrderTable(orderTable); + + when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(order)); + when(eatInOrderRepository.existsByOrderTableAndStatusNot(any(), any())).thenReturn(false); + + // when + eatInOrderService.complete(order.getId()); + + // then + assertThat(orderTable.isOccupied()).isFalse(); + assertThat(orderTable.getNumberOfGuests()).isZero(); + } + + @ParameterizedTest + @EnumSource(value = EatInOrderFlow.class, names = {"ACCEPTED", "SERVED", "COMPLETED"}) + @DisplayName("대기 중이 아닌 주문 시 예외가 발생한다.") + void accept_exception(EatInOrderFlow flow) { + // given + Menu menu = createMenuWithProductAndGroup(); + OrderTable orderTable = createUsingOrderTable(); + EatInOrder order = createEatInOrderRequestWithEmptyTable(menu, flow); + order.occupyOrderTable(orderTable); + when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when // then + assertThatThrownBy(() -> eatInOrderService.accept(order.getId())) + .isInstanceOf(IllegalStateException.class); + } + + @Test + @DisplayName("대기 중인 주문만 접수할 수 있다") + void accept_success() { + // given + Menu menu = createMenuWithProductAndGroup(); + OrderTable orderTable = createUsingOrderTable(); + EatInOrder order = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.WAITING); + order.occupyOrderTable(orderTable); + when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when + EatInOrder result = eatInOrderService.accept(order.getId()); + + // then + assertThat(result.getEatInOrderFlow()).isEqualTo(EatInOrderFlow.ACCEPTED); + } + + @Test + @DisplayName("매장 주문은 서빙이 완료 되면 주문을 완료할 수 있다") + void complete_order() { + // given + Menu menu = createMenuWithProductAndGroup(); + OrderTable orderTable = createUsingOrderTable(); + EatInOrder order = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.SERVED); + order.occupyOrderTable(orderTable); + when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(order)); + + // when + EatInOrder result = eatInOrderService.complete(order.getId()); + + // then + assertThat(result.getEatInOrderFlow()).isEqualTo(EatInOrderFlow.COMPLETED); + } + + private EatInOrder createEatInOrderRequestWithEmptyTable(Menu menu, + EatInOrderFlow eatInOrderFlow) { + return new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), + List.of(new OrderLineItem(menu, 1, menu.getId(), BigDecimal.valueOf(8000))), eatInOrderFlow); + } +} From 9acec4d6261ab0a32a4d362b6700dc3b64027f8c Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 20 Feb 2025 00:24:51 +0900 Subject: [PATCH 17/71] =?UTF-8?q?test(kitchen=20pos)=20:=20EatInOrderFlow?= =?UTF-8?q?=20test=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/EatInOrderFlowTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java new file mode 100644 index 000000000..c426f563c --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java @@ -0,0 +1,50 @@ +package kitchenpos.order.eatinorder.domain.model; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; + +class EatInOrderFlowTest { + + @ParameterizedTest + @EnumSource(value = EatInOrderStatus.class, names = {"ACCEPTED", "SERVED", "COMPLETED"}) + @DisplayName("주문 상태에 해당하는 매장 주문 순서를 찾는다") + void find_eat_in_order_flow(EatInOrderStatus orderStatus) { + // when + EatInOrderFlow result = EatInOrderFlow.findByOrderStatus(orderStatus); + + // then + assertThat(result.name()).isEqualTo(orderStatus.name()); + } + + @ParameterizedTest + @MethodSource("provideOrderStatusTransitions") + @DisplayName("매장 주문 상태 변경이 올바른 흐름인지 검증한다") + void validate_eat_in_order_status(EatInOrderFlow currentFlow, EatInOrderStatus nextStatus, boolean expected) { + // when + boolean result = currentFlow.validateOrderStatus(nextStatus); + + // then + assertThat(result).isEqualTo(expected); + } + + private static Stream provideOrderStatusTransitions() { + return Stream.of( + Arguments.of(EatInOrderFlow.WAITING, EatInOrderStatus.ACCEPTED, true), + Arguments.of(EatInOrderFlow.ACCEPTED, EatInOrderStatus.SERVED, true), + Arguments.of(EatInOrderFlow.SERVED, EatInOrderStatus.COMPLETED, true), + + Arguments.of(EatInOrderFlow.WAITING, EatInOrderStatus.SERVED, false), + Arguments.of(EatInOrderFlow.WAITING, EatInOrderStatus.COMPLETED, false), + Arguments.of(EatInOrderFlow.ACCEPTED, EatInOrderStatus.COMPLETED, false), + Arguments.of(EatInOrderFlow.SERVED, EatInOrderStatus.ACCEPTED, false) + ); + } +} From 69d60529a56f6b153946f13b1443d42730fde11f Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 20 Feb 2025 00:35:28 +0900 Subject: [PATCH 18/71] =?UTF-8?q?test(kitchen=20pos)=20:=20EatInOrder=20pr?= =?UTF-8?q?ocessOrderFlow=20test=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorder/domain/model/EatInOrder.java | 2 +- .../eatinorder/service/EatInOrderService.java | 6 +-- .../java/kitchenpos/TestFixtureFactory.java | 9 +++++ .../domain/model/EatInOrderTest.java | 40 +++++++++++++++++++ .../service/EatInOrderServiceTest.java | 7 +--- 5 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index 16677a71f..d0f2f01d3 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -87,7 +87,7 @@ private void validateOrderLineItemIsEmpty(List orderLineItems) { } } - public void validateOrderFlow(EatInOrderStatus orderStatus) { + public void processOrderFlow(EatInOrderStatus orderStatus) { if (!eatInOrderFlow.validateOrderStatus(orderStatus)) { throw new IllegalStateException(EAT_IN_ORDER_FLOW_EXCEPTION.getMessage()); } diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index ded43adf3..4a83dd49f 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -76,7 +76,7 @@ private List createOrderLineItemsByRequest(List or public EatInOrder accept(final UUID orderId) { final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - eatInOrder.validateOrderFlow(EatInOrderStatus.ACCEPTED); + eatInOrder.processOrderFlow(EatInOrderStatus.ACCEPTED); return eatInOrder; } @@ -84,7 +84,7 @@ public EatInOrder accept(final UUID orderId) { public EatInOrder serve(final UUID orderId) { final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - eatInOrder.validateOrderFlow(EatInOrderStatus.SERVED); + eatInOrder.processOrderFlow(EatInOrderStatus.SERVED); return eatInOrder; } @@ -92,7 +92,7 @@ public EatInOrder serve(final UUID orderId) { public EatInOrder complete(final UUID orderId) { final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - eatInOrder.validateOrderFlow(EatInOrderStatus.COMPLETED); + eatInOrder.processOrderFlow(EatInOrderStatus.COMPLETED); final OrderTable orderTable = eatInOrder.getOrderTable(); if (!eatInOrderRepository.existsByOrderTableAndStatusNot(orderTable, EatInOrderStatus.COMPLETED)) { diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 121598c39..3e5c8c3ce 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -3,6 +3,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; +import java.util.UUID; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; @@ -12,6 +13,8 @@ import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.model.OrderType; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.model.ProductName; @@ -116,4 +119,10 @@ public static Order createOrder(OrderLineItem orderLineItem, OrderTable orderTab public static OrderLineItem createOrderLineItem(Menu menu) { return new OrderLineItem(menu, 2, menu.getId(), BigDecimal.valueOf(8000)); } + + public static EatInOrder createEatInOrderRequestWithEmptyTable(Menu menu, + EatInOrderFlow eatInOrderFlow) { + return new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), + List.of(new OrderLineItem(menu, 1, menu.getId(), BigDecimal.valueOf(8000))), eatInOrderFlow); + } } diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java new file mode 100644 index 000000000..29135a81d --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java @@ -0,0 +1,40 @@ +package kitchenpos.order.eatinorder.domain.model; + +import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; +import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import kitchenpos.menu.domain.model.Menu; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class EatInOrderTest { + + @Test + @DisplayName("다음 매장 주문 순서를 요청하면 주문 순서를 검증하고 주문 순서를 변경한다.") + void process_order_flow() { + // given + Menu menu = createMenuWithProductAndGroup(); + EatInOrder eatInOrder = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.WAITING); + + // when + eatInOrder.processOrderFlow(EatInOrderStatus.ACCEPTED); + + // then + assertThat(eatInOrder.getEatInOrderFlow().name()).isEqualTo(EatInOrderStatus.ACCEPTED.name()); + } + + @Test + @DisplayName("주문 순서가 맞지 않으면 예외를 던진다.") + void process_order_flow_exception() { + // given + Menu menu = createMenuWithProductAndGroup(); + EatInOrder eatInOrder = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.ACCEPTED); + + // when // then + assertThatThrownBy(() -> eatInOrder.processOrderFlow(EatInOrderStatus.COMPLETED)) + .isInstanceOf(IllegalStateException.class) + .hasMessage("잘못된 매장 주문 순서입니다. 주문 순서를 지켜주세요!"); + } +} diff --git a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java index 91123e4de..bcc76feee 100644 --- a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java @@ -1,5 +1,6 @@ package kitchenpos.order.eatinorder.service; +import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; import static kitchenpos.TestFixtureFactory.createUsingOrderTable; @@ -134,10 +135,4 @@ void complete_order() { // then assertThat(result.getEatInOrderFlow()).isEqualTo(EatInOrderFlow.COMPLETED); } - - private EatInOrder createEatInOrderRequestWithEmptyTable(Menu menu, - EatInOrderFlow eatInOrderFlow) { - return new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), - List.of(new OrderLineItem(menu, 1, menu.getId(), BigDecimal.valueOf(8000))), eatInOrderFlow); - } } From fe29b83bcb1933698e00fa1a6cffb4a7d0758e9f Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 20 Feb 2025 00:40:30 +0900 Subject: [PATCH 19/71] =?UTF-8?q?fix(kitchen=20pos)=20:=20EatInOrderReposi?= =?UTF-8?q?tory=20existsByOrderTableAndEatInOrderFlowNot=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=20~>=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=ED=95=84=EB=93=9C=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/EatInOrderRepository.java | 3 +- .../eatinorder/service/EatInOrderService.java | 2 +- src/main/resources/application.properties | 4 +- .../V1__Initialize_project_tables.sql | 184 +++++++++--------- .../db/migration/V2__Insert_default_data.sql | 160 +++++++-------- .../service/EatInOrderServiceTest.java | 2 +- 6 files changed, 178 insertions(+), 177 deletions(-) diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java b/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java index 1cd6c9275..c6f03d4b8 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java @@ -1,6 +1,7 @@ package kitchenpos.order.eatinorder.domain.repository; import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; @@ -13,7 +14,7 @@ public interface EatInOrderRepository { EatInOrder save(EatInOrder eatInOrder); - boolean existsByOrderTableAndStatusNot(OrderTable orderTable, EatInOrderStatus eatInOrderStatus); + boolean existsByOrderTableAndEatInOrderFlowNot(OrderTable orderTable, EatInOrderFlow eatInOrderFlow); List findAll(); } diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index 4a83dd49f..27b806605 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -95,7 +95,7 @@ public EatInOrder complete(final UUID orderId) { eatInOrder.processOrderFlow(EatInOrderStatus.COMPLETED); final OrderTable orderTable = eatInOrder.getOrderTable(); - if (!eatInOrderRepository.existsByOrderTableAndStatusNot(orderTable, EatInOrderStatus.COMPLETED)) { + if (!eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(orderTable, EatInOrderFlow.COMPLETED)) { orderTable.releaseTable(); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 00c2ec53b..347ad9039 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,8 @@ spring.datasource.password=password spring.datasource.url=jdbc:mysql://localhost:33306/kitchenpos spring.datasource.username=user -spring.flyway.enabled=true -spring.jpa.hibernate.ddl-auto=update +spring.flyway.enabled=false +spring.jpa.hibernate.ddl-auto=create spring.jpa.properties.hibernate.format_sql=true spring.jpa.show-sql=true logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE diff --git a/src/main/resources/db/migration/V1__Initialize_project_tables.sql b/src/main/resources/db/migration/V1__Initialize_project_tables.sql index 748371dbb..ad716b517 100644 --- a/src/main/resources/db/migration/V1__Initialize_project_tables.sql +++ b/src/main/resources/db/migration/V1__Initialize_project_tables.sql @@ -1,92 +1,92 @@ -create table menu -( - id binary(16) not null, - displayed bit not null, - name varchar(255) not null, - price decimal(19, 2) not null, - menu_group_id binary(16) not null, - primary key (id) -) engine = InnoDB; - -create table menu_group -( - id binary(16) not null, - name varchar(255) not null, - primary key (id) -) engine = InnoDB; - -create table menu_product -( - seq bigint not null auto_increment, - quantity bigint not null, - product_id binary(16) not null, - menu_id binary(16) not null, - primary key (seq) -) engine = InnoDB; - -create table order_line_item -( - seq bigint not null auto_increment, - quantity bigint not null, - menu_id binary(16) not null, - order_id binary(16) not null, - primary key (seq) -) engine = InnoDB; - -create table order_table -( - id binary(16) not null, - occupied bit not null, - name varchar(255) not null, - number_of_guests integer not null, - primary key (id) -) engine = InnoDB; - -create table orders -( - id binary(16) not null, - delivery_address varchar(255), - order_date_time datetime(6) not null, - status varchar(255) not null, - type varchar(255) not null, - order_table_id binary(16), - primary key (id) -) engine = InnoDB; - -create table product -( - id binary(16) not null, - name varchar(255) not null, - price decimal(19, 2) not null, - primary key (id) -) engine = InnoDB; - -alter table menu - add constraint fk_menu_to_menu_group - foreign key (menu_group_id) - references menu_group (id); - -alter table menu_product - add constraint fk_menu_product_to_product - foreign key (product_id) - references product (id); - -alter table menu_product - add constraint fk_menu_product_to_menu - foreign key (menu_id) - references menu (id); - -alter table order_line_item - add constraint fk_order_line_item_to_menu - foreign key (menu_id) - references menu (id); - -alter table order_line_item - add constraint fk_order_line_item_to_orders - foreign key (order_id) - references orders (id); - -alter table orders - add constraint fk_orders_to_order_table - foreign key (order_table_id) - references order_table (id); +-- create table menu +-- ( +-- id binary(16) not null, +-- displayed bit not null, +-- name varchar(255) not null, +-- price decimal(19, 2) not null, +-- menu_group_id binary(16) not null, +-- primary key (id) +-- ) engine = InnoDB; +-- +-- create table menu_group +-- ( +-- id binary(16) not null, +-- name varchar(255) not null, +-- primary key (id) +-- ) engine = InnoDB; +-- +-- create table menu_product +-- ( +-- seq bigint not null auto_increment, +-- quantity bigint not null, +-- product_id binary(16) not null, +-- menu_id binary(16) not null, +-- primary key (seq) +-- ) engine = InnoDB; +-- +-- create table order_line_item +-- ( +-- seq bigint not null auto_increment, +-- quantity bigint not null, +-- menu_id binary(16) not null, +-- order_id binary(16) not null, +-- primary key (seq) +-- ) engine = InnoDB; +-- +-- create table order_table +-- ( +-- id binary(16) not null, +-- occupied bit not null, +-- name varchar(255) not null, +-- number_of_guests integer not null, +-- primary key (id) +-- ) engine = InnoDB; +-- +-- create table orders +-- ( +-- id binary(16) not null, +-- delivery_address varchar(255), +-- order_date_time datetime(6) not null, +-- status varchar(255) not null, +-- type varchar(255) not null, +-- order_table_id binary(16), +-- primary key (id) +-- ) engine = InnoDB; +-- +-- create table product +-- ( +-- id binary(16) not null, +-- name varchar(255) not null, +-- price decimal(19, 2) not null, +-- primary key (id) +-- ) engine = InnoDB; +-- +-- alter table menu +-- add constraint fk_menu_to_menu_group +-- foreign key (menu_group_id) +-- references menu_group (id); +-- +-- alter table menu_product +-- add constraint fk_menu_product_to_product +-- foreign key (product_id) +-- references product (id); +-- +-- alter table menu_product +-- add constraint fk_menu_product_to_menu +-- foreign key (menu_id) +-- references menu (id); +-- +-- alter table order_line_item +-- add constraint fk_order_line_item_to_menu +-- foreign key (menu_id) +-- references menu (id); +-- +-- alter table order_line_item +-- add constraint fk_order_line_item_to_orders +-- foreign key (order_id) +-- references orders (id); +-- +-- alter table orders +-- add constraint fk_orders_to_order_table +-- foreign key (order_table_id) +-- references order_table (id); diff --git a/src/main/resources/db/migration/V2__Insert_default_data.sql b/src/main/resources/db/migration/V2__Insert_default_data.sql index 59ca0714f..c1826b67a 100644 --- a/src/main/resources/db/migration/V2__Insert_default_data.sql +++ b/src/main/resources/db/migration/V2__Insert_default_data.sql @@ -1,80 +1,80 @@ -insert into product (id, name, price) -values (x'3b52824434f7406bbb7e690912f66b10', '후라이드', 16000); -insert into product (id, name, price) -values (x'c5ee925c3dbb4941b825021446f24446', '양념치킨', 16000); -insert into product (id, name, price) -values (x'625c6fc4145d408f8dd533c16ba26064', '반반치킨', 16000); -insert into product (id, name, price) -values (x'4721ee722ff3417fade3acd0a804605b', '통구이', 16000); -insert into product (id, name, price) -values (x'0ac16db71b024a87b9c1e7d8f226c48d', '간장치킨', 17000); -insert into product (id, name, price) -values (x'7de4b8affa0f4391aaa9c61ea9b40f83', '순살치킨', 17000); - -insert into menu_group (id, name) -values (x'f1860abc2ea1411bbd4abaa44f0d5580', '두마리메뉴'); -insert into menu_group (id, name) -values (x'cbc75faefeb04bb18be2cb8ce5d8fded', '한마리메뉴'); -insert into menu_group (id, name) -values (x'5e9879b761124791a4cef22e94af8752', '순살파닭두마리메뉴'); -insert into menu_group (id, name) -values (x'd9bc21accc104593b5064a40e0170e02', '신메뉴'); - -insert into menu (id, displayed, name, price, menu_group_id) -values (x'f59b1e1cb145440aaa6f6095a0e2d63b', true, '후라이드치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -insert into menu (id, displayed, name, price, menu_group_id) -values (x'e1254913860846aab23aa07c1dcbc648', true, '양념치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -insert into menu (id, displayed, name, price, menu_group_id) -values (x'191fa247b5f34b51b175e65db523f754', true, '반반치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -insert into menu (id, displayed, name, price, menu_group_id) -values (x'33e558df7d934622b50efcc4282cd184', true, '통구이', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -insert into menu (id, displayed, name, price, menu_group_id) -values (x'b9c670b04ef5409083496868df1c7d62', true, '간장치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -insert into menu (id, displayed, name, price, menu_group_id) -values (x'a64af6cac34d4cd882fe454abf512d1f', true, '순살치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); - -insert into menu_product (quantity, product_id, menu_id) -values (1, x'3b52824434f7406bbb7e690912f66b10', x'f59b1e1cb145440aaa6f6095a0e2d63b'); -insert into menu_product (quantity, product_id, menu_id) -values (1, x'c5ee925c3dbb4941b825021446f24446', x'e1254913860846aab23aa07c1dcbc648'); -insert into menu_product (quantity, product_id, menu_id) -values (1, x'625c6fc4145d408f8dd533c16ba26064', x'191fa247b5f34b51b175e65db523f754'); -insert into menu_product (quantity, product_id, menu_id) -values (1, x'4721ee722ff3417fade3acd0a804605b', x'33e558df7d934622b50efcc4282cd184'); -insert into menu_product (quantity, product_id, menu_id) -values (1, x'0ac16db71b024a87b9c1e7d8f226c48d', x'b9c670b04ef5409083496868df1c7d62'); -insert into menu_product (quantity, product_id, menu_id) -values (1, x'7de4b8affa0f4391aaa9c61ea9b40f83', x'a64af6cac34d4cd882fe454abf512d1f'); - -insert into order_table (id, occupied, name, number_of_guests) -values (x'8d71004329b6420e8452233f5a035520', false, '1번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'6ab59e8106eb441684e99faabc87c9ca', false, '2번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'ae92335ccd264626b7979e4ae8c4efbd', false, '3번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'a9858d4b80d0428881f48f41596a23fb', false, '4번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'3faec3ab5217405daaa2804f87697f84', false, '5번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'815b8395a2ad4e3589dc74c3b2191478', false, '6번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'7ce8b3a235454542ab9cb3d493bbd4fb', false, '7번', 0); -insert into order_table (id, occupied, name, number_of_guests) -values (x'7bdb1ffde36e4e2b94e3d2c14d391ef3', false, '8번', 0); - -insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) -values (x'69d78f383bff457cbb7226319c985fd8', '서울시 송파구 위례성대로 2', '2021-07-27', 'WAITING', 'DELIVERY', null); -insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) -values (x'98da3d3859e04dacbbaeebf6560a43bd', null, '2021-07-27', 'COMPLETED', 'EAT_IN', - x'8d71004329b6420e8452233f5a035520'); -insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) -values (x'd7cc15b3e32c4bc8b440d3067b35522e', null, '2021-07-27', 'COMPLETED', 'EAT_IN', - x'8d71004329b6420e8452233f5a035520'); - -insert into order_line_item (quantity, menu_id, order_id) -values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'69d78f383bff457cbb7226319c985fd8'); -insert into order_line_item (quantity, menu_id, order_id) -values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'98da3d3859e04dacbbaeebf6560a43bd'); -insert into order_line_item (quantity, menu_id, order_id) -values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'd7cc15b3e32c4bc8b440d3067b35522e'); +# insert into product (id, name, price) +# values (x'3b52824434f7406bbb7e690912f66b10', '후라이드', 16000); +# insert into product (id, name, price) +# values (x'c5ee925c3dbb4941b825021446f24446', '양념치킨', 16000); +# insert into product (id, name, price) +# values (x'625c6fc4145d408f8dd533c16ba26064', '반반치킨', 16000); +# insert into product (id, name, price) +# values (x'4721ee722ff3417fade3acd0a804605b', '통구이', 16000); +# insert into product (id, name, price) +# values (x'0ac16db71b024a87b9c1e7d8f226c48d', '간장치킨', 17000); +# insert into product (id, name, price) +# values (x'7de4b8affa0f4391aaa9c61ea9b40f83', '순살치킨', 17000); +# +# insert into menu_group (id, name) +# values (x'f1860abc2ea1411bbd4abaa44f0d5580', '두마리메뉴'); +# insert into menu_group (id, name) +# values (x'cbc75faefeb04bb18be2cb8ce5d8fded', '한마리메뉴'); +# insert into menu_group (id, name) +# values (x'5e9879b761124791a4cef22e94af8752', '순살파닭두마리메뉴'); +# insert into menu_group (id, name) +# values (x'd9bc21accc104593b5064a40e0170e02', '신메뉴'); +# +# insert into menu (id, displayed, name, price, menu_group_id) +# values (x'f59b1e1cb145440aaa6f6095a0e2d63b', true, '후라이드치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +# insert into menu (id, displayed, name, price, menu_group_id) +# values (x'e1254913860846aab23aa07c1dcbc648', true, '양념치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +# insert into menu (id, displayed, name, price, menu_group_id) +# values (x'191fa247b5f34b51b175e65db523f754', true, '반반치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +# insert into menu (id, displayed, name, price, menu_group_id) +# values (x'33e558df7d934622b50efcc4282cd184', true, '통구이', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +# insert into menu (id, displayed, name, price, menu_group_id) +# values (x'b9c670b04ef5409083496868df1c7d62', true, '간장치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +# insert into menu (id, displayed, name, price, menu_group_id) +# values (x'a64af6cac34d4cd882fe454abf512d1f', true, '순살치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); +# +# insert into menu_product (quantity, product_id, menu_id) +# values (1, x'3b52824434f7406bbb7e690912f66b10', x'f59b1e1cb145440aaa6f6095a0e2d63b'); +# insert into menu_product (quantity, product_id, menu_id) +# values (1, x'c5ee925c3dbb4941b825021446f24446', x'e1254913860846aab23aa07c1dcbc648'); +# insert into menu_product (quantity, product_id, menu_id) +# values (1, x'625c6fc4145d408f8dd533c16ba26064', x'191fa247b5f34b51b175e65db523f754'); +# insert into menu_product (quantity, product_id, menu_id) +# values (1, x'4721ee722ff3417fade3acd0a804605b', x'33e558df7d934622b50efcc4282cd184'); +# insert into menu_product (quantity, product_id, menu_id) +# values (1, x'0ac16db71b024a87b9c1e7d8f226c48d', x'b9c670b04ef5409083496868df1c7d62'); +# insert into menu_product (quantity, product_id, menu_id) +# values (1, x'7de4b8affa0f4391aaa9c61ea9b40f83', x'a64af6cac34d4cd882fe454abf512d1f'); +# +# insert into order_table (id, occupied, name, number_of_guests) +# values (x'8d71004329b6420e8452233f5a035520', false, '1번', 0); +# insert into order_table (id, occupied, name, number_of_guests) +# values (x'6ab59e8106eb441684e99faabc87c9ca', false, '2번', 0); +# insert into order_table (id, occupied, name, number_of_guests) +# values (x'ae92335ccd264626b7979e4ae8c4efbd', false, '3번', 0); +# insert into order_table (id, occupied, name, number_of_guests) +# values (x'a9858d4b80d0428881f48f41596a23fb', false, '4번', 0); +# insert into order_table (id, occupied, name, number_of_guests) +# values (x'3faec3ab5217405daaa2804f87697f84', false, '5번', 0); +# insert into order_table (id, occupied, name, number_of_guests) +# values (x'815b8395a2ad4e3589dc74c3b2191478', false, '6번', 0); +# insert into order_table (id, occupied, name, number_of_guests) +# values (x'7ce8b3a235454542ab9cb3d493bbd4fb', false, '7번', 0); +# insert into order_table (id, occupied, name, number_of_guests) +# values (x'7bdb1ffde36e4e2b94e3d2c14d391ef3', false, '8번', 0); +# +# insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +# values (x'69d78f383bff457cbb7226319c985fd8', '서울시 송파구 위례성대로 2', '2021-07-27', 'WAITING', 'DELIVERY', null); +# insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +# values (x'98da3d3859e04dacbbaeebf6560a43bd', null, '2021-07-27', 'COMPLETED', 'EAT_IN', +# x'8d71004329b6420e8452233f5a035520'); +# insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +# values (x'd7cc15b3e32c4bc8b440d3067b35522e', null, '2021-07-27', 'COMPLETED', 'EAT_IN', +# x'8d71004329b6420e8452233f5a035520'); +# +# insert into order_line_item (quantity, menu_id, order_id) +# values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'69d78f383bff457cbb7226319c985fd8'); +# insert into order_line_item (quantity, menu_id, order_id) +# values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'98da3d3859e04dacbbaeebf6560a43bd'); +# insert into order_line_item (quantity, menu_id, order_id) +# values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'd7cc15b3e32c4bc8b440d3067b35522e'); diff --git a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java index bcc76feee..3051b7a04 100644 --- a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java @@ -76,7 +76,7 @@ void clear_table_with_complete_status() { order.occupyOrderTable(orderTable); when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(order)); - when(eatInOrderRepository.existsByOrderTableAndStatusNot(any(), any())).thenReturn(false); + when(eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(any(), any())).thenReturn(false); // when eatInOrderService.complete(order.getId()); From 3f0036068b537c64265ba382e54aa7ff54717c9a Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 20 Feb 2025 00:42:49 +0900 Subject: [PATCH 20/71] =?UTF-8?q?feat(kitchen=20pos)=20:=20EatInOrderFlow?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/eatinorder/domain/model/EatInOrderFlow.java | 4 +++- .../eatinorder/exception/EatInOrderExceptionMessage.java | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java index 99bef7a20..5cf5402aa 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java @@ -1,5 +1,7 @@ package kitchenpos.order.eatinorder.domain.model; +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION; + import java.util.Arrays; public enum EatInOrderFlow { @@ -23,6 +25,6 @@ public static EatInOrderFlow findByOrderStatus(EatInOrderStatus nextOrderStatus) return Arrays.stream(values()) .filter(flow -> flow.name().equals(nextOrderStatus.name())) .findFirst() - .orElseThrow(); + .orElseThrow(() -> new IllegalArgumentException(EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION.getMessage())); } } diff --git a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java index c7bf71bd0..5f3500109 100644 --- a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java +++ b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java @@ -5,7 +5,8 @@ public enum EatInOrderExceptionMessage { EMPTY_ORDER_TABLE_EXCEPTION("주문 테이블이 비어있습니다!"), NUMBER_OF_GUESTS_EXCEPTION("손님 수가 음수일 수 없습니다!"), EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION("매장 주문에 주문 내역이 비어있습니다!"), - EAT_IN_ORDER_FLOW_EXCEPTION("잘못된 매장 주문 순서입니다. 주문 순서를 지켜주세요!"); + EAT_IN_ORDER_FLOW_EXCEPTION("잘못된 매장 주문 순서입니다. 주문 순서를 지켜주세요!"), + EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION("매장 주문 상태에 맞는 주문 순서를 찾을 수 없습니다."); private final String message; From f3e12ad180e439f37e3ddf4f21b1fff63b00c3cc Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 20 Feb 2025 01:12:34 +0900 Subject: [PATCH 21/71] =?UTF-8?q?fix(kitchen=20pos)=20:=20JsonCreator=20?= =?UTF-8?q?=EB=B0=8F=20JsonValue=EB=A1=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=A7=81=EB=A0=AC=ED=99=94=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20Con?= =?UTF-8?q?troller=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=8B=A4=ED=8C=A8=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/domain/model/MenuGroupName.java | 8 ++++++-- .../kitchenpos/menu/domain/model/MenuName.java | 11 +++++++---- .../kitchenpos/menu/domain/model/MenuPrice.java | 4 ++++ .../kitchenpos/menu/domain/model/MenuProduct.java | 4 ++++ .../menu/domain/model/MenuProductQuantity.java | 13 +++++++++---- .../order/eatinorder/domain/model/OrderTable.java | 6 +++++- .../menu/ui/MenuRestControllerTest.java | 15 +++++++-------- 7 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java index 195fa10dc..4f5d3bd49 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java @@ -1,16 +1,19 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; - @Embeddable public class MenuGroupName { @Column(name = "name", nullable = false) private final String value; + @JsonCreator protected MenuGroupName(String value) { validateMenuGroupName(value); this.value = value; @@ -26,6 +29,7 @@ protected MenuGroupName() { this.value = null; } + @JsonValue public String getValue() { return value; } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuName.java b/src/main/java/kitchenpos/menu/domain/model/MenuName.java index 85a406409..90954dc8a 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuName.java @@ -1,18 +1,20 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; - @Embeddable public class MenuName { @Column(name = "name", nullable = false) private final String value; - protected MenuName(String value) { + @JsonCreator + public MenuName(String value) { validateName(value); this.value = value; } @@ -27,6 +29,7 @@ private void validateName(String name) { } } + @JsonValue public String getValue() { return value; } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java index 705bca1b4..6406adaa9 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java @@ -1,5 +1,7 @@ package kitchenpos.menu.domain.model; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import java.math.BigDecimal; @@ -12,6 +14,7 @@ public class MenuPrice { @Column(name = "price", nullable = false) private final BigDecimal value; + @JsonCreator public MenuPrice(BigDecimal value) { validatePrice(value); this.value = value; @@ -27,6 +30,7 @@ private void validatePrice(BigDecimal value) { } } + @JsonValue public BigDecimal getValue() { return value; } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java index 5e6fa5d25..09e095bb1 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java @@ -64,4 +64,8 @@ public long getInnerQuantity() { public UUID getProductId() { return productId; } + + public MenuProductQuantity getQuantity() { + return quantity; + } } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java index 8c789ec52..97e5b3211 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java @@ -1,17 +1,19 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; - @Embeddable public class MenuProductQuantity { @Column(name = "quantity", nullable = false) private final Long value; + @JsonCreator public MenuProductQuantity(long value) { validateMenuProductQuantity(value); this.value = value; @@ -27,13 +29,16 @@ protected MenuProductQuantity() { this.value = null; } + @JsonValue public Long getValue() { return value; } @Override public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; + if (o == null || getClass() != o.getClass()) { + return false; + } MenuProductQuantity that = (MenuProductQuantity) o; return Objects.equals(value, that.value); } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java index 529a482fb..dd632af29 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java @@ -93,7 +93,11 @@ public int getNumberOfGuests() { return numberOfGuests; } -// public void setOccupied(final boolean occupied) { + public OrderTableName getName() { + return name; + } + + // public void setOccupied(final boolean occupied) { // this.occupied = occupied; // } diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java index 9bb3543a7..c791e1f8d 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -27,6 +27,7 @@ import static kitchenpos.TestFixtureFactory.createProduct; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @SpringBootTest @@ -53,10 +54,7 @@ class MenuRestControllerTest { @DisplayName("메뉴를 생성한다") void create_menu_success() throws Exception { // given - MenuGroup menuGroup = createAndSaveMenuGroup(); - Product product = createAndSaveProduct(); - Menu request = createMenuRequest(menuGroup, product); -// Menu request = new Menu(UUID.randomUUID(), "김치찌개", BigDecimal.valueOf(8000), true); + Menu request = createMenuRequest(createAndSaveMenuGroup(), createAndSaveProduct()); // when ResultActions result = mockMvc.perform(post("/api/menus") @@ -67,10 +65,11 @@ void create_menu_success() throws Exception { result.andExpect(status().isCreated()) .andExpect(header().exists("Location")) .andExpect(jsonPath("$.id").exists()) - .andExpect(jsonPath("$.name.value").value("김치찌개")) - .andExpect(jsonPath("$.price.value").value(8000)) + .andExpect(jsonPath("$.name").value("김치찌개")) + .andExpect(jsonPath("$.price").value(8000)) .andExpect(jsonPath("$.menuGroup").exists()) - .andExpect(jsonPath("$.menuProducts").isNotEmpty()); + .andExpect(jsonPath("$.menuProducts").isNotEmpty()) + .andDo(print()); } @Test @@ -108,7 +107,7 @@ void change_menuPrice() throws Exception { // then result.andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(menu.getId().toString())) - .andExpect(jsonPath("$.price.value").value(8001)); + .andExpect(jsonPath("$.price").value(8001)); } @Test From 2cf1193d4554e8364989a591973fc589212fc7e7 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Thu, 20 Feb 2025 14:11:00 +0900 Subject: [PATCH 22/71] =?UTF-8?q?feat(kitchen=20pos)=20:=20EatInOrderRestC?= =?UTF-8?q?ontroller=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorder/ui/EatInOrderController.java | 4 -- .../ui/EatInOrderRestController.java | 55 +++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) delete mode 100644 src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderController.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderController.java b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderController.java deleted file mode 100644 index 419d1327b..000000000 --- a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderController.java +++ /dev/null @@ -1,4 +0,0 @@ -package kitchenpos.order.eatinorder.ui; - -public class EatInOrderController { -} diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java new file mode 100644 index 000000000..aef84c5e8 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java @@ -0,0 +1,55 @@ +package kitchenpos.order.eatinorder.ui; + +import java.net.URI; +import java.util.List; +import java.util.UUID; + +import kitchenpos.order.common.application.OrderService; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.service.EatInOrderService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequestMapping("/api/eatInOrder") +@RestController +public class EatInOrderRestController { + private final EatInOrderService eatInOrderService; + + public EatInOrderRestController(final EatInOrderService eatInOrderService) { + this.eatInOrderService = eatInOrderService; + } + + @PostMapping + public ResponseEntity create(@RequestBody final EatInOrder request) { + final EatInOrder response = eatInOrderService.create(request); + return ResponseEntity.created(URI.create("/api/orders/" + response.getId())) + .body(response); + } + + @PutMapping("/{eatInOrderId}/accept") + public ResponseEntity accept(@PathVariable("eatInOrderId") final UUID eatInOrderId) { + return ResponseEntity.ok(eatInOrderService.accept(eatInOrderId)); + } + + @PutMapping("/{eatInOrderId}/serve") + public ResponseEntity serve(@PathVariable("eatInOrderId") final UUID eatInOrderId) { + return ResponseEntity.ok(eatInOrderService.serve(eatInOrderId)); + } + + @PutMapping("/{eatInOrderId}/complete") + public ResponseEntity complete(@PathVariable("eatInOrderId") final UUID eatInOrderId) { + return ResponseEntity.ok(eatInOrderService.complete(eatInOrderId)); + } + + @GetMapping + public ResponseEntity> findAll() { + return ResponseEntity.ok(eatInOrderService.findAll()); + } +} From f031dfc8398beff1cd30a126f6967bdd7cd90752 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Thu, 20 Feb 2025 14:37:45 +0900 Subject: [PATCH 23/71] =?UTF-8?q?test(kitchen=20pos)=20:=20EatInOrderRestC?= =?UTF-8?q?ontroller=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorder/domain/model/EatInOrder.java | 1 + .../java/kitchenpos/TestFixtureFactory.java | 2 +- .../ui/EatInOrderRestControllerTest.java | 202 ++++++++++++++++++ 3 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index d0f2f01d3..1733e0919 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -138,6 +138,7 @@ public OrderTable getOrderTable() { public void occupyOrderTable(final OrderTable orderTable) { orderTable.validateTableIsOccupied(); this.orderTable = orderTable; + this.orderTableId = orderTable.getId(); } public UUID getOrderTableId() { diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 3e5c8c3ce..be5c27c4f 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -85,7 +85,7 @@ public static OrderTable createEmptyOrderTable() { } public static OrderTable createUsingOrderTable() { - return new OrderTable("사용 중인 테이블", 4, true); + return new OrderTable(UUID.randomUUID(), "사용 중인 테이블", 4, true); } public static Product createProduct(String name, long price) { diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java new file mode 100644 index 000000000..f7762d609 --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java @@ -0,0 +1,202 @@ +package kitchenpos.order.eatinorder.ui; + +import com.fasterxml.jackson.databind.ObjectMapper; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.repository.MenuGroupRepository; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +import static kitchenpos.TestFixtureFactory.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class EatInOrderRestControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private EatInOrderRepository eatInOrderRepository; + @Autowired + private OrderTableRepository orderTableRepository; + @Autowired + private MenuRepository menuRepository; + @Autowired + private MenuGroupRepository menuGroupRepository; + @Autowired + private ProductRepository productRepository; + + @Test + @DisplayName("주문을 생성한다.") + void create_success() throws Exception { + // given + EatInOrder request = createEatInOrderRequest(); + + // when + ResultActions result = mockMvc.perform(post("/api/eatInOrder") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))); + + // then + result.andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andExpect(jsonPath("$.id").exists()) + .andExpect(jsonPath("$.orderLineItems").isArray()) + .andExpect(jsonPath("$.eatInOrderFlow").value(EatInOrderFlow.WAITING.toString())) + .andDo(print()); + } + + @Test + @DisplayName("주문 상태가 주문 대기 중이라면 주문을 수락할 수 있다.") + void accept_success() throws Exception { + // given + EatInOrder savedOrder = createAndSaveEatInOrder(); + + // when + ResultActions result = mockMvc.perform(put("/api/eatInOrder/{eatInOrderId}/accept", savedOrder.getId())); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.eatInOrderFlow").value(EatInOrderFlow.ACCEPTED.toString())); + } + + @Test + @DisplayName("주문 상태가 접수 완료라면 서빙할 수 있다.") + void serve_success() throws Exception { + // given + EatInOrder savedOrder = createAndSaveEatInOrder(EatInOrderFlow.ACCEPTED); + + // when + ResultActions result = mockMvc.perform(put("/api/eatInOrder/{eatInOrderId}/serve", savedOrder.getId())); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.eatInOrderFlow").value(EatInOrderFlow.SERVED.toString())); + } + + @Test + @DisplayName("주문 종류와 상태에 따라 주문을 완료할 수 있다.") + void complete_success() throws Exception { + // given + EatInOrder savedOrder = createAndSaveEatInOrder(EatInOrderFlow.SERVED); + + // when + ResultActions result = mockMvc.perform(put("/api/eatInOrder/{eatInOrderId}/complete", savedOrder.getId())); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.eatInOrderFlow").value(EatInOrderFlow.COMPLETED.toString())); + } + + @Test + @DisplayName("전체 주문을 조회한다.") + void findAll_success() throws Exception { + // given + createAndSaveEatInOrder(); + createAndSaveEatInOrder(); + + // when + ResultActions result = mockMvc.perform(get("/api/eatInOrder")); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$.length()").value(2)); + } + + private EatInOrder createEatInOrderRequest() { + MenuGroup menuGroup = createAndSaveMenuGroup(); + Product product = createAndSaveProduct(); + Menu menu = createAndSaveMenu(menuGroup, product); + + OrderLineItem orderLineItem = createOrderLineItem(menu); + OrderTable orderTable = createAndSaveUsingOrderTable(); + + return createEatInOrder(orderLineItem, orderTable, EatInOrderFlow.WAITING); + } + + private EatInOrder createAndSaveEatInOrder() { + MenuGroup menuGroup = createAndSaveMenuGroup(); + Product product = createAndSaveProduct(); + Menu menu = createAndSaveMenu(menuGroup, product); + + OrderLineItem orderLineItem = createOrderLineItem(menu); + OrderTable orderTable = createAndSaveUsingOrderTable(); + + EatInOrder eatInOrder = createEatInOrder(orderLineItem, orderTable, EatInOrderFlow.WAITING); + return eatInOrderRepository.save(eatInOrder); + } + + private EatInOrder createAndSaveEatInOrder(EatInOrderFlow flow) { + MenuGroup menuGroup = createAndSaveMenuGroup(); + Product product = createAndSaveProduct(); + Menu menu = createAndSaveMenu(menuGroup, product); + + OrderLineItem orderLineItem = createOrderLineItem(menu); + OrderTable orderTable = createAndSaveUsingOrderTable(); + + EatInOrder eatInOrder = createEatInOrder(orderLineItem, orderTable, flow); + return eatInOrderRepository.save(eatInOrder); + } + + private EatInOrder createEatInOrder(OrderLineItem orderLineItem, OrderTable orderTable, EatInOrderFlow flow) { + EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), List.of(orderLineItem), flow); + eatInOrder.occupyOrderTable(orderTable); + return eatInOrder; + } + + private OrderTable createAndSaveUsingOrderTable() { + OrderTable orderTable = createUsingOrderTable(); + orderTableRepository.save(orderTable); + return orderTable; + } + + private Menu createAndSaveMenu(MenuGroup menuGroup, Product product) { + Menu menu = createMenu(menuGroup, product); + menuRepository.save(menu); + return menu; + } + + private Product createAndSaveProduct() { + Product product = createProduct("김치", 4000); + productRepository.save(product); + return product; + } + + private MenuGroup createAndSaveMenuGroup() { + MenuGroup menuGroup = createMenuGroup(); + menuGroupRepository.save(menuGroup); + return menuGroup; + } +} \ No newline at end of file From 2b09973c229496afdc51ee992a11ca0eb653bc9b Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Thu, 20 Feb 2025 14:38:38 +0900 Subject: [PATCH 24/71] =?UTF-8?q?style(kitchen=20pos)=20:=20import=20?= =?UTF-8?q?=EB=AC=B8=20=EC=B5=9C=EC=A0=81=ED=99=94=20=EB=B0=8F=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../external/DefaultPurgomalumClient.java | 3 +- .../menu/application/MenuGroupService.java | 5 +- .../kitchenpos/menu/domain/model/Menu.java | 12 +-- .../menu/domain/model/MenuGroup.java | 7 +- .../menu/domain/model/MenuGroupName.java | 5 +- .../menu/domain/model/MenuName.java | 5 +- .../menu/domain/model/MenuPrice.java | 1 + .../menu/domain/model/MenuProduct.java | 15 +--- .../domain/model/MenuProductQuantity.java | 5 +- .../repository/MenuGroupRepository.java | 3 +- .../domain/repository/MenuRepository.java | 3 +- .../menu/domain/service/MarginValidator.java | 6 +- .../persistence/JpaMenuGroupRepository.java | 3 +- .../infra/persistence/JpaMenuRepository.java | 5 +- .../menu/ui/MenuGroupRestController.java | 11 +-- .../menu/ui/MenuRestController.java | 15 ++-- .../common/application/OrderService.java | 11 +-- .../OrderLineItemExceptionMessage.java | 3 +- .../infra/persistence/JpaOrderRepository.java | 3 +- .../persistence/JpaOrderTableRepository.java | 3 +- .../kitchenpos/order/common/model/Order.java | 16 +--- .../order/common/model/OrderLineItem.java | 20 ++--- .../common/repository/OrderRepository.java | 7 +- .../order/common/ui/OrderRestController.java | 15 ++-- .../infra/adaptor/RiderAdaptor.java | 3 +- .../external/DefaultKitchenridersClient.java | 3 +- .../application/OrderTableService.java | 8 +- .../eatinorder/domain/model/EatInOrder.java | 19 ++-- .../domain/model/EatInOrderFlow.java | 4 +- .../domain/model/OrderTableName.java | 1 - .../repository/EatInOrderRepository.java | 1 - .../repository/OrderTableRepository.java | 3 +- .../eatinorder/service/EatInOrderService.java | 11 +-- .../ui/EatInOrderRestController.java | 18 ++-- .../ui/OrderTableRestController.java | 15 ++-- .../product/application/ProductService.java | 11 +-- .../product/domain/model/Product.java | 6 +- .../domain/repository/ProductRepository.java | 3 +- .../persistence/JpaProductRepository.java | 3 +- .../product/ui/ProductRestController.java | 15 ++-- .../db/migration/V2__Insert_default_data.sql | 90 ++++++++++++------- .../java/kitchenpos/TestFixtureFactory.java | 9 +- .../application/MenuGroupServiceTest.java | 18 ++-- .../menu/application/MenuServiceTest.java | 26 +++--- .../menu/domain/model/MenuGroupNameTest.java | 4 +- .../menu/domain/model/MenuNameTest.java | 4 +- .../menu/domain/model/MenuPriceTest.java | 9 +- .../domain/service/MarginValidatorTest.java | 19 ++-- .../persistence/FakeMenuGroupRepository.java | 7 +- .../infra/persistence/FakeMenuRepository.java | 7 +- .../menu/ui/MenuGroupRestControllerTest.java | 15 +--- .../menu/ui/MenuRestControllerTest.java | 1 - .../common/application/OrderServiceTest.java | 36 +++----- .../order/common/model/OrderLineItemTest.java | 9 +- .../common/ui/OrderRestControllerTest.java | 17 +--- .../application/OrderTableServiceTest.java | 22 +++-- .../domain/model/EatInOrderFlowTest.java | 9 +- .../domain/model/EatInOrderTest.java | 8 +- .../service/EatInOrderServiceTest.java | 29 +++--- .../ui/OrderTableRestControllerTest.java | 10 +-- .../application/ProductServiceTest.java | 27 +++--- .../model/ProductNameCreationServiceTest.java | 4 +- .../product/domain/model/ProductNameTest.java | 4 +- .../domain/model/ProductPriceTest.java | 9 +- .../persistence/FakeProductRepository.java | 7 +- .../product/ui/ProductRestControllerTest.java | 15 ++-- 66 files changed, 311 insertions(+), 410 deletions(-) diff --git a/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java index a4d421c88..f409428a5 100644 --- a/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java @@ -1,12 +1,13 @@ package kitchenpos.common.infra.external; -import java.net.URI; import kitchenpos.common.application.PurgomalumClient; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import java.net.URI; + @Component public class DefaultPurgomalumClient implements PurgomalumClient { private final RestTemplate restTemplate; diff --git a/src/main/java/kitchenpos/menu/application/MenuGroupService.java b/src/main/java/kitchenpos/menu/application/MenuGroupService.java index cd8d0eb51..9da080b83 100644 --- a/src/main/java/kitchenpos/menu/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menu/application/MenuGroupService.java @@ -1,7 +1,5 @@ package kitchenpos.menu.application; -import java.util.List; -import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuGroupName; import kitchenpos.menu.domain.model.MenuGroupNameCreationService; @@ -9,6 +7,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.UUID; + @Service public class MenuGroupService { private final MenuGroupRepository menuGroupRepository; diff --git a/src/main/java/kitchenpos/menu/domain/model/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java index 26836b10c..ee8f847d7 100644 --- a/src/main/java/kitchenpos/menu/domain/model/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -1,16 +1,6 @@ package kitchenpos.menu.domain.model; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; +import jakarta.persistence.*; import java.math.BigDecimal; import java.util.List; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java index a800e42cc..3f5679f84 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java @@ -1,12 +1,7 @@ package kitchenpos.menu.domain.model; -import jakarta.persistence.Column; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; +import jakarta.persistence.*; -import java.util.Objects; import java.util.UUID; @Table(name = "menu_group") diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java index 4f5d3bd49..0ea292f6f 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java @@ -1,13 +1,14 @@ package kitchenpos.menu.domain.model; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; + @Embeddable public class MenuGroupName { @Column(name = "name", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuName.java b/src/main/java/kitchenpos/menu/domain/model/MenuName.java index 90954dc8a..8cf9ab92c 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuName.java @@ -1,13 +1,14 @@ package kitchenpos.menu.domain.model; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; + @Embeddable public class MenuName { @Column(name = "name", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java index 6406adaa9..89b7193d3 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.math.BigDecimal; import java.util.Objects; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java index 09e095bb1..32381f96f 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java @@ -1,19 +1,10 @@ package kitchenpos.menu.domain.model; -import jakarta.persistence.Column; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; -import java.util.UUID; +import jakarta.persistence.*; import kitchenpos.product.domain.model.Product; +import java.util.UUID; + @Table(name = "menu_product") @Entity public class MenuProduct { diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java index 97e5b3211..ae3e47dfb 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java @@ -1,13 +1,14 @@ package kitchenpos.menu.domain.model; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; + @Embeddable public class MenuProductQuantity { @Column(name = "quantity", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java index cfb05d515..672d57be1 100644 --- a/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java @@ -1,9 +1,10 @@ package kitchenpos.menu.domain.repository; +import kitchenpos.menu.domain.model.MenuGroup; + import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.menu.domain.model.MenuGroup; public interface MenuGroupRepository { MenuGroup save(MenuGroup menuGroup); diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java index f83243f3d..9c9c73489 100644 --- a/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java @@ -1,9 +1,10 @@ package kitchenpos.menu.domain.repository; +import kitchenpos.menu.domain.model.Menu; + import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.menu.domain.model.Menu; public interface MenuRepository { Menu save(Menu menu); diff --git a/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java b/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java index bd240fb7b..17698484f 100644 --- a/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java +++ b/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java @@ -1,14 +1,14 @@ package kitchenpos.menu.domain.service; -import java.math.BigDecimal; -import java.util.List; - import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuProduct; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.product.domain.model.Product; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.List; + @Service public class MarginValidator { diff --git a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java index 13d3e1fdb..4b4e02a61 100644 --- a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java @@ -1,9 +1,10 @@ package kitchenpos.menu.infra.persistence; -import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.UUID; + public interface JpaMenuGroupRepository extends MenuGroupRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java index 9f9ec4437..451b0148d 100644 --- a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java @@ -1,13 +1,14 @@ package kitchenpos.menu.infra.persistence; -import java.util.List; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.List; +import java.util.UUID; + public interface JpaMenuRepository extends MenuRepository, JpaRepository { @Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId") @Override diff --git a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java index bc89f2359..e94edeb35 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java @@ -1,15 +1,12 @@ package kitchenpos.menu.ui; -import java.net.URI; -import java.util.List; import kitchenpos.menu.application.MenuGroupService; import kitchenpos.menu.domain.model.MenuGroup; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; +import java.util.List; @RequestMapping("/api/menu-groups") @RestController diff --git a/src/main/java/kitchenpos/menu/ui/MenuRestController.java b/src/main/java/kitchenpos/menu/ui/MenuRestController.java index f0d7c8f41..e3105012c 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuRestController.java @@ -1,18 +1,13 @@ package kitchenpos.menu.ui; -import java.net.URI; -import java.util.List; -import java.util.UUID; import kitchenpos.menu.application.MenuService; import kitchenpos.menu.domain.model.Menu; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; +import java.util.List; +import java.util.UUID; @RequestMapping("/api/menus") @RestController diff --git a/src/main/java/kitchenpos/order/common/application/OrderService.java b/src/main/java/kitchenpos/order/common/application/OrderService.java index 88994b97d..8fe986a59 100644 --- a/src/main/java/kitchenpos/order/common/application/OrderService.java +++ b/src/main/java/kitchenpos/order/common/application/OrderService.java @@ -1,12 +1,5 @@ package kitchenpos.order.common.application; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.Order; @@ -20,6 +13,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; + @Service public class OrderService { private final OrderRepository orderRepository; diff --git a/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java b/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java index db63e6f0c..a85e84c56 100644 --- a/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java +++ b/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java @@ -3,8 +3,7 @@ public enum OrderLineItemExceptionMessage { ORDER_LINE_ITEM_QUANTITY_EXCEPTION("주문 내역의 메뉴 수량이 비어있습니다!"), ORDER_LINE_ITEM_MENU_DISPLAY_EXCEPTION("주문 내역의 메뉴가 게시되어 있지 않습니다!"), - ORDER_LINE_ITEM_PRICE_EXCEPTION("주문 내역의 가격이 메뉴의 가격과 다릅니다!") -; + ORDER_LINE_ITEM_PRICE_EXCEPTION("주문 내역의 가격이 메뉴의 가격과 다릅니다!"); private final String message; OrderLineItemExceptionMessage(String message) { diff --git a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java index 22b55e7a9..1ede0e32b 100644 --- a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java +++ b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java @@ -1,9 +1,10 @@ package kitchenpos.order.common.infra.persistence; -import java.util.UUID; import kitchenpos.order.common.model.Order; import kitchenpos.order.common.repository.OrderRepository; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.UUID; + public interface JpaOrderRepository extends OrderRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java index 975ca8c6c..33a42afb5 100644 --- a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java @@ -1,9 +1,10 @@ package kitchenpos.order.common.infra.persistence; -import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.UUID; + public interface JpaOrderTableRepository extends OrderTableRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/order/common/model/Order.java b/src/main/java/kitchenpos/order/common/model/Order.java index ebb66a594..67a8c3db5 100644 --- a/src/main/java/kitchenpos/order/common/model/Order.java +++ b/src/main/java/kitchenpos/order/common/model/Order.java @@ -1,21 +1,11 @@ package kitchenpos.order.common.model; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; +import jakarta.persistence.*; +import kitchenpos.order.eatinorder.domain.model.OrderTable; + import java.time.LocalDateTime; import java.util.List; import java.util.UUID; -import kitchenpos.order.eatinorder.domain.model.OrderTable; @Table(name = "orders") @Entity diff --git a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java index 6b60c81d0..010256051 100644 --- a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java +++ b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java @@ -1,22 +1,12 @@ package kitchenpos.order.common.model; -import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_MENU_DISPLAY_EXCEPTION; -import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_PRICE_EXCEPTION; -import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_QUANTITY_EXCEPTION; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; +import jakarta.persistence.*; +import kitchenpos.menu.domain.model.Menu; + import java.math.BigDecimal; import java.util.UUID; -import kitchenpos.menu.domain.model.Menu; + +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.*; @Table(name = "order_line_item") @Entity diff --git a/src/main/java/kitchenpos/order/common/repository/OrderRepository.java b/src/main/java/kitchenpos/order/common/repository/OrderRepository.java index 843816c3c..b8f156360 100644 --- a/src/main/java/kitchenpos/order/common/repository/OrderRepository.java +++ b/src/main/java/kitchenpos/order/common/repository/OrderRepository.java @@ -1,12 +1,13 @@ package kitchenpos.order.common.repository; -import java.util.List; -import java.util.Optional; -import java.util.UUID; import kitchenpos.order.common.model.Order; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + public interface OrderRepository { Order save(Order order); diff --git a/src/main/java/kitchenpos/order/common/ui/OrderRestController.java b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java index 7fa233224..365952ffe 100644 --- a/src/main/java/kitchenpos/order/common/ui/OrderRestController.java +++ b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java @@ -1,18 +1,13 @@ package kitchenpos.order.common.ui; -import java.net.URI; -import java.util.List; -import java.util.UUID; import kitchenpos.order.common.application.OrderService; import kitchenpos.order.common.model.Order; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; +import java.util.List; +import java.util.UUID; @RequestMapping("/api/orders") @RestController diff --git a/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java b/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java index faf88dabd..3eebc04b4 100644 --- a/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java @@ -1,10 +1,11 @@ package kitchenpos.order.deliveryorder.infra.adaptor; -import java.math.BigDecimal; import kitchenpos.order.deliveryorder.domain.model.DeliveryOrder; import kitchenpos.order.deliveryorder.domain.port.RiderPort; import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; +import java.math.BigDecimal; + public class RiderAdaptor implements RiderPort { private KitchenridersClient kitchenridersClient; diff --git a/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java b/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java index 580d076a1..276ad9840 100644 --- a/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java @@ -1,8 +1,9 @@ package kitchenpos.order.deliveryorder.infra.external; +import org.springframework.stereotype.Component; + import java.math.BigDecimal; import java.util.UUID; -import org.springframework.stereotype.Component; @Component public class DefaultKitchenridersClient implements KitchenridersClient { diff --git a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index bd11578c6..8bcfc3712 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -1,9 +1,5 @@ package kitchenpos.order.eatinorder.application; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; - import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.repository.OrderRepository; import kitchenpos.order.eatinorder.domain.model.OrderTable; @@ -12,6 +8,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + @Service public class OrderTableService { private final OrderTableRepository orderTableRepository; diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index 1733e0919..394e93725 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -1,25 +1,16 @@ package kitchenpos.order.eatinorder.domain.model; -import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION; -import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_FLOW_EXCEPTION; +import jakarta.persistence.*; +import kitchenpos.order.common.model.OrderLineItem; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Enumerated; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; import java.time.LocalDateTime; import java.util.List; import java.util.Objects; import java.util.UUID; -import kitchenpos.order.common.model.OrderLineItem; + +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION; +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_FLOW_EXCEPTION; @Table(name = "eat_in_orders") @Entity diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java index 5cf5402aa..b0ca26fa8 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java @@ -1,9 +1,9 @@ package kitchenpos.order.eatinorder.domain.model; -import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION; - import java.util.Arrays; +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION; + public enum EatInOrderFlow { WAITING(EatInOrderStatus.NONE), ACCEPTED(EatInOrderStatus.WAITING), diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java index 3df2f98c3..daa327fdd 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java @@ -2,7 +2,6 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; -import kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage; import java.util.Objects; diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java b/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java index c6f03d4b8..54e9ca611 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java @@ -2,7 +2,6 @@ import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; -import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; import java.util.List; diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java b/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java index 86a420535..f2f2a36b9 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java @@ -1,9 +1,10 @@ package kitchenpos.order.eatinorder.domain.repository; +import kitchenpos.order.eatinorder.domain.model.OrderTable; + import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.order.eatinorder.domain.model.OrderTable; public interface OrderTableRepository { OrderTable save(OrderTable orderTable); diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index 27b806605..17d0e2dfe 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -1,10 +1,5 @@ package kitchenpos.order.eatinorder.service; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.OrderLineItem; @@ -17,6 +12,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + @Service public class EatInOrderService { private final EatInOrderRepository eatInOrderRepository; diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java index aef84c5e8..789209c0f 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java @@ -1,21 +1,13 @@ package kitchenpos.order.eatinorder.ui; -import java.net.URI; -import java.util.List; -import java.util.UUID; - -import kitchenpos.order.common.application.OrderService; -import kitchenpos.order.common.model.Order; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.service.EatInOrderService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; +import java.util.List; +import java.util.UUID; @RequestMapping("/api/eatInOrder") @RestController diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java index ca215b771..07f959b5b 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java @@ -1,18 +1,13 @@ package kitchenpos.order.eatinorder.ui; -import java.net.URI; -import java.util.List; -import java.util.UUID; import kitchenpos.order.eatinorder.application.OrderTableService; import kitchenpos.order.eatinorder.domain.model.OrderTable; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; +import java.util.List; +import java.util.UUID; @RequestMapping("/api/order-tables") @RestController diff --git a/src/main/java/kitchenpos/product/application/ProductService.java b/src/main/java/kitchenpos/product/application/ProductService.java index 16a0afcf5..7d4b5ad2e 100644 --- a/src/main/java/kitchenpos/product/application/ProductService.java +++ b/src/main/java/kitchenpos/product/application/ProductService.java @@ -1,18 +1,19 @@ package kitchenpos.product.application; -import java.math.BigDecimal; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; import kitchenpos.menu.domain.service.MarginValidator; +import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.model.ProductName; import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.product.domain.model.ProductPrice; -import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + @Service public class ProductService { private final ProductRepository productRepository; diff --git a/src/main/java/kitchenpos/product/domain/model/Product.java b/src/main/java/kitchenpos/product/domain/model/Product.java index ccd04f1d9..66282ba24 100644 --- a/src/main/java/kitchenpos/product/domain/model/Product.java +++ b/src/main/java/kitchenpos/product/domain/model/Product.java @@ -1,10 +1,6 @@ package kitchenpos.product.domain.model; -import jakarta.persistence.Column; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; +import jakarta.persistence.*; import java.math.BigDecimal; import java.util.UUID; diff --git a/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java b/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java index b54094985..f619bbcb0 100644 --- a/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java +++ b/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java @@ -1,9 +1,10 @@ package kitchenpos.product.domain.repository; +import kitchenpos.product.domain.model.Product; + import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.product.domain.model.Product; public interface ProductRepository { Product save(Product product); diff --git a/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java index a519bd5b2..ffbf2c003 100644 --- a/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java +++ b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java @@ -1,9 +1,10 @@ package kitchenpos.product.infra.persistence; -import java.util.UUID; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.UUID; + public interface JpaProductRepository extends ProductRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/product/ui/ProductRestController.java b/src/main/java/kitchenpos/product/ui/ProductRestController.java index c5f061243..5cd8b4f26 100644 --- a/src/main/java/kitchenpos/product/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/product/ui/ProductRestController.java @@ -1,18 +1,13 @@ package kitchenpos.product.ui; -import java.net.URI; -import java.util.List; -import java.util.UUID; import kitchenpos.product.application.ProductService; import kitchenpos.product.domain.model.Product; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; +import java.util.List; +import java.util.UUID; @RequestMapping("/api/products") @RestController diff --git a/src/main/resources/db/migration/V2__Insert_default_data.sql b/src/main/resources/db/migration/V2__Insert_default_data.sql index c1826b67a..cb38b9086 100644 --- a/src/main/resources/db/migration/V2__Insert_default_data.sql +++ b/src/main/resources/db/migration/V2__Insert_default_data.sql @@ -1,80 +1,110 @@ -# insert into product (id, name, price) +# +insert into product (id, name, price) # values (x'3b52824434f7406bbb7e690912f66b10', '후라이드', 16000); -# insert into product (id, name, price) +# +insert into product (id, name, price) # values (x'c5ee925c3dbb4941b825021446f24446', '양념치킨', 16000); -# insert into product (id, name, price) +# +insert into product (id, name, price) # values (x'625c6fc4145d408f8dd533c16ba26064', '반반치킨', 16000); -# insert into product (id, name, price) +# +insert into product (id, name, price) # values (x'4721ee722ff3417fade3acd0a804605b', '통구이', 16000); -# insert into product (id, name, price) +# +insert into product (id, name, price) # values (x'0ac16db71b024a87b9c1e7d8f226c48d', '간장치킨', 17000); -# insert into product (id, name, price) +# +insert into product (id, name, price) # values (x'7de4b8affa0f4391aaa9c61ea9b40f83', '순살치킨', 17000); # # insert into menu_group (id, name) # values (x'f1860abc2ea1411bbd4abaa44f0d5580', '두마리메뉴'); -# insert into menu_group (id, name) +# +insert into menu_group (id, name) # values (x'cbc75faefeb04bb18be2cb8ce5d8fded', '한마리메뉴'); -# insert into menu_group (id, name) +# +insert into menu_group (id, name) # values (x'5e9879b761124791a4cef22e94af8752', '순살파닭두마리메뉴'); -# insert into menu_group (id, name) +# +insert into menu_group (id, name) # values (x'd9bc21accc104593b5064a40e0170e02', '신메뉴'); # # insert into menu (id, displayed, name, price, menu_group_id) # values (x'f59b1e1cb145440aaa6f6095a0e2d63b', true, '후라이드치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -# insert into menu (id, displayed, name, price, menu_group_id) +# +insert into menu (id, displayed, name, price, menu_group_id) # values (x'e1254913860846aab23aa07c1dcbc648', true, '양념치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -# insert into menu (id, displayed, name, price, menu_group_id) +# +insert into menu (id, displayed, name, price, menu_group_id) # values (x'191fa247b5f34b51b175e65db523f754', true, '반반치킨', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -# insert into menu (id, displayed, name, price, menu_group_id) +# +insert into menu (id, displayed, name, price, menu_group_id) # values (x'33e558df7d934622b50efcc4282cd184', true, '통구이', 16000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -# insert into menu (id, displayed, name, price, menu_group_id) +# +insert into menu (id, displayed, name, price, menu_group_id) # values (x'b9c670b04ef5409083496868df1c7d62', true, '간장치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); -# insert into menu (id, displayed, name, price, menu_group_id) +# +insert into menu (id, displayed, name, price, menu_group_id) # values (x'a64af6cac34d4cd882fe454abf512d1f', true, '순살치킨', 17000, x'cbc75faefeb04bb18be2cb8ce5d8fded'); # # insert into menu_product (quantity, product_id, menu_id) # values (1, x'3b52824434f7406bbb7e690912f66b10', x'f59b1e1cb145440aaa6f6095a0e2d63b'); -# insert into menu_product (quantity, product_id, menu_id) +# +insert into menu_product (quantity, product_id, menu_id) # values (1, x'c5ee925c3dbb4941b825021446f24446', x'e1254913860846aab23aa07c1dcbc648'); -# insert into menu_product (quantity, product_id, menu_id) +# +insert into menu_product (quantity, product_id, menu_id) # values (1, x'625c6fc4145d408f8dd533c16ba26064', x'191fa247b5f34b51b175e65db523f754'); -# insert into menu_product (quantity, product_id, menu_id) +# +insert into menu_product (quantity, product_id, menu_id) # values (1, x'4721ee722ff3417fade3acd0a804605b', x'33e558df7d934622b50efcc4282cd184'); -# insert into menu_product (quantity, product_id, menu_id) +# +insert into menu_product (quantity, product_id, menu_id) # values (1, x'0ac16db71b024a87b9c1e7d8f226c48d', x'b9c670b04ef5409083496868df1c7d62'); -# insert into menu_product (quantity, product_id, menu_id) +# +insert into menu_product (quantity, product_id, menu_id) # values (1, x'7de4b8affa0f4391aaa9c61ea9b40f83', x'a64af6cac34d4cd882fe454abf512d1f'); # # insert into order_table (id, occupied, name, number_of_guests) # values (x'8d71004329b6420e8452233f5a035520', false, '1번', 0); -# insert into order_table (id, occupied, name, number_of_guests) +# +insert into order_table (id, occupied, name, number_of_guests) # values (x'6ab59e8106eb441684e99faabc87c9ca', false, '2번', 0); -# insert into order_table (id, occupied, name, number_of_guests) +# +insert into order_table (id, occupied, name, number_of_guests) # values (x'ae92335ccd264626b7979e4ae8c4efbd', false, '3번', 0); -# insert into order_table (id, occupied, name, number_of_guests) +# +insert into order_table (id, occupied, name, number_of_guests) # values (x'a9858d4b80d0428881f48f41596a23fb', false, '4번', 0); -# insert into order_table (id, occupied, name, number_of_guests) +# +insert into order_table (id, occupied, name, number_of_guests) # values (x'3faec3ab5217405daaa2804f87697f84', false, '5번', 0); -# insert into order_table (id, occupied, name, number_of_guests) +# +insert into order_table (id, occupied, name, number_of_guests) # values (x'815b8395a2ad4e3589dc74c3b2191478', false, '6번', 0); -# insert into order_table (id, occupied, name, number_of_guests) +# +insert into order_table (id, occupied, name, number_of_guests) # values (x'7ce8b3a235454542ab9cb3d493bbd4fb', false, '7번', 0); -# insert into order_table (id, occupied, name, number_of_guests) +# +insert into order_table (id, occupied, name, number_of_guests) # values (x'7bdb1ffde36e4e2b94e3d2c14d391ef3', false, '8번', 0); # # insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) # values (x'69d78f383bff457cbb7226319c985fd8', '서울시 송파구 위례성대로 2', '2021-07-27', 'WAITING', 'DELIVERY', null); -# insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +# +insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) # values (x'98da3d3859e04dacbbaeebf6560a43bd', null, '2021-07-27', 'COMPLETED', 'EAT_IN', # x'8d71004329b6420e8452233f5a035520'); -# insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) +# +insert into orders (id, delivery_address, order_date_time, status, type, order_table_id) # values (x'd7cc15b3e32c4bc8b440d3067b35522e', null, '2021-07-27', 'COMPLETED', 'EAT_IN', # x'8d71004329b6420e8452233f5a035520'); # # insert into order_line_item (quantity, menu_id, order_id) # values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'69d78f383bff457cbb7226319c985fd8'); -# insert into order_line_item (quantity, menu_id, order_id) +# +insert into order_line_item (quantity, menu_id, order_id) # values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'98da3d3859e04dacbbaeebf6560a43bd'); -# insert into order_line_item (quantity, menu_id, order_id) +# +insert into order_line_item (quantity, menu_id, order_id) # values (1, x'f59b1e1cb145440aaa6f6095a0e2d63b', x'd7cc15b3e32c4bc8b440d3067b35522e'); diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index be5c27c4f..92346e206 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -1,9 +1,5 @@ package kitchenpos; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.UUID; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; @@ -21,6 +17,11 @@ import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.product.domain.model.ProductPrice; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + public class TestFixtureFactory { public static MenuGroup createMenuGroup() { diff --git a/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java index a6a1b4f04..254f86806 100644 --- a/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java @@ -1,15 +1,5 @@ package kitchenpos.menu.application; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.util.Arrays; -import java.util.List; - import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuGroupNameCreationService; @@ -20,6 +10,14 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + class MenuGroupServiceTest { private MenuGroupService menuGroupService; diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 28dc2ba28..abc885619 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -1,16 +1,7 @@ package kitchenpos.menu.application; -import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.List; -import java.util.NoSuchElementException; - import kitchenpos.common.application.PurgomalumClient; +import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuNameCreationService; @@ -19,11 +10,10 @@ import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.menu.domain.service.MarginValidator; import kitchenpos.menu.domain.service.MenuProductValidator; -import kitchenpos.product.domain.model.Product; -import kitchenpos.product.domain.repository.ProductRepository; import kitchenpos.menu.infra.persistence.FakeMenuGroupRepository; import kitchenpos.menu.infra.persistence.FakeMenuRepository; -import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; import kitchenpos.product.infra.persistence.FakeProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -31,6 +21,16 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.NoSuchElementException; + +import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class MenuServiceTest { private MenuService menuService; diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java index a67cd4a8f..4067bdea1 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.menu.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class MenuGroupNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java index 9a0e8e68e..9bdcebae8 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.menu.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class MenuNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java index be7163a68..f4c3b08f7 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java @@ -1,13 +1,14 @@ package kitchenpos.menu.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.math.BigDecimal; -import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import java.math.BigDecimal; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class MenuPriceTest { @DisplayName("가격은 비어있거나 null이면 예외가 발생한다") diff --git a/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java b/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java index 48b16c63c..058b1965b 100644 --- a/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java +++ b/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java @@ -1,22 +1,19 @@ package kitchenpos.menu.domain.service; -import static kitchenpos.TestFixtureFactory.createMenu; -import static kitchenpos.TestFixtureFactory.createMenuGroup; -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.assertj.core.api.Assertions.assertThat; - -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.UUID; - import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; -import kitchenpos.product.domain.model.Product; import kitchenpos.menu.infra.persistence.FakeMenuRepository; +import kitchenpos.product.domain.model.Product; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.thymeleaf.engine.IterationStatusVar; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.UUID; + +import static kitchenpos.TestFixtureFactory.*; +import static org.assertj.core.api.Assertions.assertThat; class MarginValidatorTest { diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java index 0a3bc55b3..71055a8a2 100644 --- a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java @@ -1,13 +1,10 @@ package kitchenpos.menu.infra.persistence; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; +import java.util.*; + public class FakeMenuGroupRepository implements MenuGroupRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java index 68cd85e5d..594eff172 100644 --- a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java @@ -1,13 +1,10 @@ package kitchenpos.menu.infra.persistence; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; +import java.util.*; + public class FakeMenuRepository implements MenuRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java index d45b63a8a..f6115d1d3 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java @@ -1,20 +1,9 @@ package kitchenpos.menu.ui; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - import com.fasterxml.jackson.databind.ObjectMapper; - -import java.util.UUID; - import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.MenuGroup; -import kitchenpos.menu.domain.model.MenuGroupName; import kitchenpos.menu.domain.model.MenuGroupNameCreationService; -import kitchenpos.menu.domain.model.MenuNameCreationService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -26,6 +15,10 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + @SpringBootTest @AutoConfigureMockMvc class MenuGroupRestControllerTest { diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java index c791e1f8d..a1f3c4e38 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -21,7 +21,6 @@ import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; -import java.util.UUID; import static kitchenpos.TestFixtureFactory.createMenuGroup; import static kitchenpos.TestFixtureFactory.createProduct; diff --git a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java index af45c00ed..a8fca032d 100644 --- a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java @@ -1,39 +1,14 @@ package kitchenpos.order.common.application; -import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; -import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; -import static kitchenpos.TestFixtureFactory.createOrder; -import static kitchenpos.TestFixtureFactory.createOrderLineItem; -import static kitchenpos.TestFixtureFactory.createOrderWithDeliveryType; -import static kitchenpos.TestFixtureFactory.createOrderWithEatInType; -import static kitchenpos.TestFixtureFactory.createOrderWithTakeOutType; -import static kitchenpos.TestFixtureFactory.createUsingOrderTable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyList; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.Order; -import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.model.OrderType; import kitchenpos.order.common.repository.OrderRepository; import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; -import kitchenpos.order.eatinorder.domain.model.EatInOrder; -import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; -import kitchenpos.order.eatinorder.service.EatInOrderService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -41,6 +16,17 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static kitchenpos.TestFixtureFactory.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.*; + class OrderServiceTest { private OrderService orderService; diff --git a/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java b/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java index 375cf6478..aca63a338 100644 --- a/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java +++ b/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java @@ -1,13 +1,14 @@ package kitchenpos.order.common.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.math.BigDecimal; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.math.BigDecimal; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class OrderLineItemTest { @Test diff --git a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java index d2e69eb01..e9d42abe2 100644 --- a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java @@ -1,18 +1,5 @@ package kitchenpos.order.common.ui; -import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; -import static kitchenpos.TestFixtureFactory.createMenu; -import static kitchenpos.TestFixtureFactory.createMenuGroup; -import static kitchenpos.TestFixtureFactory.createOrderLineItem; -import static kitchenpos.TestFixtureFactory.createOrderWithDeliveryType; -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - import com.fasterxml.jackson.databind.ObjectMapper; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; @@ -39,6 +26,10 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; +import static kitchenpos.TestFixtureFactory.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + @SpringBootTest @AutoConfigureMockMvc @Transactional diff --git a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index a8ea21084..f8adc5bc6 100644 --- a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -1,17 +1,5 @@ package kitchenpos.order.eatinorder.application; -import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; -import static kitchenpos.TestFixtureFactory.createUsingOrderTable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.List; -import java.util.Optional; - import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.repository.OrderRepository; import kitchenpos.order.eatinorder.domain.model.OrderTable; @@ -22,6 +10,16 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import java.util.List; +import java.util.Optional; + +import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; +import static kitchenpos.TestFixtureFactory.createUsingOrderTable; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + class OrderTableServiceTest { private OrderTableService orderTableService; diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java index c426f563c..506b48f21 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java @@ -1,16 +1,15 @@ package kitchenpos.order.eatinorder.domain.model; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + class EatInOrderFlowTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java index 29135a81d..b48458f9a 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java @@ -1,14 +1,14 @@ package kitchenpos.order.eatinorder.domain.model; +import kitchenpos.menu.domain.model.Menu; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import kitchenpos.menu.domain.model.Menu; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - class EatInOrderTest { @Test diff --git a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java index 3051b7a04..8875a2210 100644 --- a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java @@ -1,27 +1,9 @@ package kitchenpos.order.eatinorder.service; -import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; -import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; -import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; -import static kitchenpos.TestFixtureFactory.createUsingOrderTable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyList; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; -import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; -import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; @@ -33,6 +15,17 @@ import org.junit.jupiter.params.provider.EnumSource; import org.mockito.junit.jupiter.MockitoExtension; +import java.util.List; +import java.util.Optional; + +import static kitchenpos.TestFixtureFactory.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + @ExtendWith(MockitoExtension.class) class EatInOrderServiceTest { diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java index 553c4451f..c05a0ff0e 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java @@ -1,12 +1,5 @@ package kitchenpos.order.eatinorder.ui; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - import com.fasterxml.jackson.databind.ObjectMapper; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; @@ -20,6 +13,9 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + @SpringBootTest @AutoConfigureMockMvc @Transactional diff --git a/src/test/java/kitchenpos/product/application/ProductServiceTest.java b/src/test/java/kitchenpos/product/application/ProductServiceTest.java index 4605e8681..e3dbe3bc8 100644 --- a/src/test/java/kitchenpos/product/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/product/application/ProductServiceTest.java @@ -1,27 +1,28 @@ package kitchenpos.product.application; -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.math.BigDecimal; -import java.util.List; -import java.util.Optional; +import kitchenpos.TestFixtureFactory; import kitchenpos.common.application.PurgomalumClient; -import kitchenpos.menu.domain.service.MarginValidator; -import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.domain.service.MarginValidator; import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.product.domain.repository.ProductRepository; -import kitchenpos.TestFixtureFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.math.BigDecimal; +import java.util.List; +import java.util.Optional; + +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + class ProductServiceTest { private ProductService productService; diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java index 1040fbd19..1cfff05b6 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java @@ -1,13 +1,13 @@ package kitchenpos.product.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - import kitchenpos.common.application.PurgomalumClient; import kitchenpos.common.infra.external.FakePurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class ProductNameCreationServiceTest { private ProductNameCreationService productNameCreationService; diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java index 69238f2c8..525b5f170 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.product.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class ProductNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java index 8b324f466..dc7e0c15a 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java @@ -1,13 +1,14 @@ package kitchenpos.product.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.math.BigDecimal; -import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import java.math.BigDecimal; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class ProductPriceTest { @DisplayName("가격은 비어있거나 null이면 예외가 발생한다") diff --git a/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java b/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java index 06aa7523c..34e2327d9 100644 --- a/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java +++ b/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java @@ -1,13 +1,10 @@ package kitchenpos.product.infra.persistence; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; +import java.util.*; + public class FakeProductRepository implements ProductRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java index 39e98c4eb..a7e1aa31a 100644 --- a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java +++ b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java @@ -1,14 +1,6 @@ package kitchenpos.product.ui; -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - import com.fasterxml.jackson.databind.ObjectMapper; -import java.math.BigDecimal; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.junit.jupiter.api.DisplayName; @@ -22,6 +14,13 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; + +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + @SpringBootTest @AutoConfigureMockMvc @Transactional From 66cfde5f2020767113e032a07b76a7b149cb1097 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Sun, 23 Feb 2025 10:50:53 +0900 Subject: [PATCH 25/71] =?UTF-8?q?remove(kitchen=20pos)=20:=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=97=86=EB=8A=94=20getter,=20setter=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/order/common/model/Order.java | 8 ---- .../order/common/model/OrderLineItem.java | 12 ------ .../domain/model/DeliveryOrderFlow.java | 4 -- .../eatinorder/domain/model/EatInOrder.java | 41 ------------------- .../eatinorder/domain/model/OrderTable.java | 8 ---- .../product/domain/model/Product.java | 8 ---- 6 files changed, 81 deletions(-) diff --git a/src/main/java/kitchenpos/order/common/model/Order.java b/src/main/java/kitchenpos/order/common/model/Order.java index ebb66a594..fb29c3bc2 100644 --- a/src/main/java/kitchenpos/order/common/model/Order.java +++ b/src/main/java/kitchenpos/order/common/model/Order.java @@ -102,10 +102,6 @@ public void setStatus(final OrderStatus status) { this.status = status; } - public LocalDateTime getOrderDateTime() { - return orderDateTime; - } - public void setOrderDateTime(final LocalDateTime orderDateTime) { this.orderDateTime = orderDateTime; } @@ -137,8 +133,4 @@ public void setOrderTable(final OrderTable orderTable) { public UUID getOrderTableId() { return orderTableId; } - - public void setOrderTableId(final UUID orderTableId) { - this.orderTableId = orderTableId; - } } diff --git a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java index 6b60c81d0..38fc23846 100644 --- a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java +++ b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java @@ -74,14 +74,6 @@ private void validatePrice(Menu menu, BigDecimal price) { } } - public Long getSeq() { - return seq; - } - - public void setSeq(final Long seq) { - this.seq = seq; - } - public Menu getMenu() { return menu; } @@ -102,10 +94,6 @@ public UUID getMenuId() { return menuId; } - public void setMenuId(final UUID menuId) { - this.menuId = menuId; - } - public BigDecimal getPrice() { return price; } diff --git a/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderFlow.java b/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderFlow.java index 458ff375b..36181def6 100644 --- a/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderFlow.java +++ b/src/main/java/kitchenpos/order/deliveryorder/domain/model/DeliveryOrderFlow.java @@ -17,10 +17,6 @@ public enum DeliveryOrderFlow { this.previousStatus = previousStatus; } - public static DeliveryOrderFlow from(DeliveryOrderStatus status) { - return valueOf(status.name()); - } - public boolean validateOrderStatus(DeliveryOrderStatus nextOrderStatus) { DeliveryOrderFlow nextStatus = Arrays.stream(values()) .filter(v -> v.nextStatus == nextOrderStatus) diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index d0f2f01d3..ed3df30c3 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -28,17 +28,12 @@ public class EatInOrder { @Id private UUID id; -// @Column(name = "status", nullable = false, columnDefinition = "varchar(255)") -// @Enumerated(EnumType.STRING) -// private EatInOrderStatus status; - @Column(name = "order_date_time", nullable = false) private LocalDateTime orderDateTime; @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( name = "eat_in_order_id", -// nullable = false, columnDefinition = "binary(16)", foreignKey = @ForeignKey(name = "fk_order_line_item_to_eat_in_orders") ) @@ -65,22 +60,11 @@ public EatInOrder(UUID id, LocalDateTime orderDateTime, List orderLineItems, EatInOrderFlow eatInOrderFlow) { validateOrderLineItemIsEmpty(orderLineItems); this.id = id; -// this.status = status; this.orderDateTime = orderDateTime; this.orderLineItems = orderLineItems; this.eatInOrderFlow = eatInOrderFlow; } - public EatInOrder(UUID id, LocalDateTime orderDateTime, - List orderLineItems) { - validateOrderLineItemIsEmpty(orderLineItems); - this.id = id; -// this.status = status; - this.orderDateTime = orderDateTime; - this.orderLineItems = orderLineItems; - this.eatInOrderFlow = EatInOrderFlow.WAITING; - } - private void validateOrderLineItemIsEmpty(List orderLineItems) { if (Objects.isNull(orderLineItems) || orderLineItems.isEmpty()) { throw new IllegalArgumentException(EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION.getMessage()); @@ -102,35 +86,14 @@ public void setId(final UUID id) { this.id = id; } -// public EatInOrderStatus getStatus() { -// return status; -// } -// -// public void setStatus(final EatInOrderStatus status) { -// this.status = status; -// } - - public EatInOrderFlow getEatInOrderFlow() { return eatInOrderFlow; } - public LocalDateTime getOrderDateTime() { - return orderDateTime; - } - - public void setOrderDateTime(final LocalDateTime orderDateTime) { - this.orderDateTime = orderDateTime; - } - public List getOrderLineItems() { return orderLineItems; } - public void setOrderLineItems(final List orderLineItems) { - this.orderLineItems = orderLineItems; - } - public OrderTable getOrderTable() { return orderTable; } @@ -143,8 +106,4 @@ public void occupyOrderTable(final OrderTable orderTable) { public UUID getOrderTableId() { return orderTableId; } - - public void setOrderTableId(final UUID orderTableId) { - this.orderTableId = orderTableId; - } } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java index dd632af29..e87e81dae 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java @@ -96,12 +96,4 @@ public int getNumberOfGuests() { public OrderTableName getName() { return name; } - - // public void setOccupied(final boolean occupied) { -// this.occupied = occupied; -// } - -// public void setName(final String name) { -// this.name = name; -// } } diff --git a/src/main/java/kitchenpos/product/domain/model/Product.java b/src/main/java/kitchenpos/product/domain/model/Product.java index ccd04f1d9..7c699c888 100644 --- a/src/main/java/kitchenpos/product/domain/model/Product.java +++ b/src/main/java/kitchenpos/product/domain/model/Product.java @@ -60,10 +60,6 @@ public ProductName getName() { return name; } -// public void setName(final String name) { -// this.name = name; -// } - public BigDecimal getInnerPrice() { return price.getValue(); } @@ -75,8 +71,4 @@ public ProductPrice getPrice() { public void changePrice(BigDecimal price) { this.price = new ProductPrice(price); } - -// public void setPrice(final BigDecimal price) { -// this.price = price; -// } } From f87a3c66581a391c6c4811842d5d87b310b5cf69 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Sun, 23 Feb 2025 13:17:48 +0900 Subject: [PATCH 26/71] =?UTF-8?q?feat=20&=20refactor(kitchen=20pos)=20:=20?= =?UTF-8?q?OrderLineItemValidator=20=EB=B0=8F=20EatInOrderFactory=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20&=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OrderLineItemExceptionMessage.java | 5 +- .../common/model/OrderLineItemValidator.java | 37 ++++++++++++ .../eatinorder/domain/model/EatInOrder.java | 1 + .../domain/model/EatInOrderFactory.java | 34 +++++++++++ .../eatinorder/service/EatInOrderService.java | 37 +++--------- .../infra/persistence/FakeMenuRepository.java | 9 --- .../model/OrderLineItemValidatorTest.java | 60 +++++++++++++++++++ .../domain/model/EatInOrderFactoryTest.java | 49 +++++++++++++++ .../persistence/FakeOrderTableRepository.java | 36 +++++++++++ .../service/EatInOrderServiceTest.java | 13 ++-- 10 files changed, 235 insertions(+), 46 deletions(-) create mode 100644 src/main/java/kitchenpos/order/common/model/OrderLineItemValidator.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java create mode 100644 src/test/java/kitchenpos/order/common/model/OrderLineItemValidatorTest.java create mode 100644 src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactoryTest.java create mode 100644 src/test/java/kitchenpos/order/eatinorder/infra/persistence/FakeOrderTableRepository.java diff --git a/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java b/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java index db63e6f0c..945ca0378 100644 --- a/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java +++ b/src/main/java/kitchenpos/order/common/exception/OrderLineItemExceptionMessage.java @@ -3,8 +3,9 @@ public enum OrderLineItemExceptionMessage { ORDER_LINE_ITEM_QUANTITY_EXCEPTION("주문 내역의 메뉴 수량이 비어있습니다!"), ORDER_LINE_ITEM_MENU_DISPLAY_EXCEPTION("주문 내역의 메뉴가 게시되어 있지 않습니다!"), - ORDER_LINE_ITEM_PRICE_EXCEPTION("주문 내역의 가격이 메뉴의 가격과 다릅니다!") -; + ORDER_LINE_ITEM_PRICE_EXCEPTION("주문 내역의 가격이 메뉴의 가격과 다릅니다!"), + ORDER_LINE_ITEM_INCORRECT_MENU_INFO_EXCEPTION("주문 내역의 메뉴 정보가 올바르지 않습니다."); + private final String message; OrderLineItemExceptionMessage(String message) { diff --git a/src/main/java/kitchenpos/order/common/model/OrderLineItemValidator.java b/src/main/java/kitchenpos/order/common/model/OrderLineItemValidator.java new file mode 100644 index 000000000..86d85a0e4 --- /dev/null +++ b/src/main/java/kitchenpos/order/common/model/OrderLineItemValidator.java @@ -0,0 +1,37 @@ +package kitchenpos.order.common.model; + +import java.util.List; +import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.order.common.exception.OrderLineItemExceptionMessage; +import org.springframework.stereotype.Service; + +@Service +public class OrderLineItemValidator { + + private final MenuRepository menuRepository; + + public OrderLineItemValidator(MenuRepository menuRepository) { + this.menuRepository = menuRepository; + } + + public void validate(List orderLineItems) { + final List menuIds = findMenuIdsBy(orderLineItems); + final List menus = menuRepository.findAllByIdIn(menuIds); + validateMenuExists(orderLineItems, menus); + } + + private List findMenuIdsBy(List orderLineItems) { + return orderLineItems.stream() + .map(OrderLineItem::getMenuId) + .toList(); + } + + private void validateMenuExists(List orderLineItems, List menus) { + if (menus.size() != orderLineItems.size()) { + throw new IllegalArgumentException( + OrderLineItemExceptionMessage.ORDER_LINE_ITEM_INCORRECT_MENU_INFO_EXCEPTION.getMessage()); + } + } +} diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index ed3df30c3..0e36cba6d 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -101,6 +101,7 @@ public OrderTable getOrderTable() { public void occupyOrderTable(final OrderTable orderTable) { orderTable.validateTableIsOccupied(); this.orderTable = orderTable; + this.orderTableId = orderTable.getId(); } public UUID getOrderTableId() { diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java new file mode 100644 index 000000000..de8379a5d --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java @@ -0,0 +1,34 @@ +package kitchenpos.order.eatinorder.domain.model; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import kitchenpos.order.common.model.OrderLineItemValidator; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import org.springframework.stereotype.Service; + +@Service +public class EatInOrderFactory { + + private final OrderLineItemValidator orderLineItemValidator; + private final OrderTableRepository orderTableRepository; + + public EatInOrderFactory(OrderLineItemValidator orderLineItemValidator, OrderTableRepository orderTableRepository) { + this.orderLineItemValidator = orderLineItemValidator; + this.orderTableRepository = orderTableRepository; + } + + public EatInOrder create(List orderLineItems, UUID orderTableId) { + orderLineItemValidator.validate(orderLineItems); + + EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), + orderLineItems, EatInOrderFlow.WAITING); + + final OrderTable orderTable = orderTableRepository.findById(orderTableId) + .orElseThrow(NoSuchElementException::new); + eatInOrder.occupyOrderTable(orderTable); + return eatInOrder; + } +} diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index 27b806605..2ce841223 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -1,6 +1,5 @@ package kitchenpos.order.eatinorder.service; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; @@ -9,11 +8,11 @@ import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFactory; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; -import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,48 +20,28 @@ public class EatInOrderService { private final EatInOrderRepository eatInOrderRepository; private final MenuRepository menuRepository; - private final OrderTableRepository orderTableRepository; + private final EatInOrderFactory eatInOrderFactory; public EatInOrderService( final EatInOrderRepository eatInOrderRepository, final MenuRepository menuRepository, - final OrderTableRepository orderTableRepository + final EatInOrderFactory eatInOrderFactory ) { this.eatInOrderRepository = eatInOrderRepository; this.menuRepository = menuRepository; - this.orderTableRepository = orderTableRepository; + this.eatInOrderFactory = eatInOrderFactory; } @Transactional public EatInOrder create(final EatInOrder request) { - final List orderLineItemRequests = request.getOrderLineItems(); - validateOrderLineItemMenuIsExists(orderLineItemRequests); - - final List orderLineItems = createOrderLineItemsByRequest(orderLineItemRequests); - EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), - orderLineItems, EatInOrderFlow.WAITING); - - final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) - .orElseThrow(NoSuchElementException::new); - eatInOrder.occupyOrderTable(orderTable); - + final List orderLineItems = toOrderLineItems(request.getOrderLineItems()); + EatInOrder eatInOrder = eatInOrderFactory.create(orderLineItems, request.getOrderTableId()); return eatInOrderRepository.save(eatInOrder); } - private void validateOrderLineItemMenuIsExists(List orderLineItemRequests) { - final List menus = menuRepository.findAllByIdIn( - orderLineItemRequests.stream() - .map(OrderLineItem::getMenuId) - .toList() - ); - if (menus.size() != orderLineItemRequests.size()) { - throw new IllegalArgumentException(); - } - } - - private List createOrderLineItemsByRequest(List orderLineItemRequests) { + private List toOrderLineItems(List request) { final List orderLineItems = new ArrayList<>(); - for (final OrderLineItem itemRq : orderLineItemRequests) { + for (final OrderLineItem itemRq : request) { final Menu menu = menuRepository.findById(itemRq.getMenuId()) .orElseThrow(NoSuchElementException::new); final OrderLineItem orderLineItem = new OrderLineItem(menu, itemRq.getQuantity(), menu.getId(), diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java index 68cd85e5d..56b6c4ace 100644 --- a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java @@ -48,13 +48,4 @@ public List findAllByProductId(UUID productId) { .anyMatch(menuProduct -> menuProduct.getProductId().equals(productId))) .toList(); } - - public List saveAll(List menus) { - for (Menu menu : menus) { - UUID id = UUID.randomUUID(); - menu.setId(id); - storage.put(id, menu); - } - return new ArrayList<>(storage.values()); - } } diff --git a/src/test/java/kitchenpos/order/common/model/OrderLineItemValidatorTest.java b/src/test/java/kitchenpos/order/common/model/OrderLineItemValidatorTest.java new file mode 100644 index 000000000..c4c425a82 --- /dev/null +++ b/src/test/java/kitchenpos/order/common/model/OrderLineItemValidatorTest.java @@ -0,0 +1,60 @@ +package kitchenpos.order.common.model; + +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createProduct; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.infra.persistence.FakeMenuRepository; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class OrderLineItemValidatorTest { + + @Test + @DisplayName("주문 내역의 메뉴의 id 정보가 올바르지 않으면 예외를 던진다.") + void validate_another_id_exception() { + // given + MenuRepository menuRepository = new FakeMenuRepository(new HashMap<>()); + OrderLineItemValidator orderLineItemValidator = new OrderLineItemValidator(menuRepository); + + Menu firstMenu = createMenu(createMenuGroup(), createProduct(BigDecimal.valueOf(2000))); + Menu secondMenu = createMenu(createMenuGroup(), createProduct(BigDecimal.valueOf(3000))); + menuRepository.save(firstMenu); + menuRepository.save(secondMenu); + + OrderLineItem orderLineItem1 = new OrderLineItem(secondMenu, 2, secondMenu.getId(), BigDecimal.valueOf(8000)); + OrderLineItem orderLineItem2 = new OrderLineItem(secondMenu, 3, secondMenu.getId(), BigDecimal.valueOf(8000)); + + // when // then + Assertions.assertThatThrownBy(() -> orderLineItemValidator.validate(List.of(orderLineItem1, orderLineItem2))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("주문 내역의 메뉴 정보가 올바르지 않습니다."); + } + + @Test + @DisplayName("주문 내역의 중복 메뉴 존재 시 예외를 던진다.") + void validate_same_menu_exception() { + // given + MenuRepository menuRepository = new FakeMenuRepository(new HashMap<>()); + OrderLineItemValidator orderLineItemValidator = new OrderLineItemValidator(menuRepository); + + Menu firstMenu = createMenu(createMenuGroup(), createProduct(BigDecimal.valueOf(2000))); + Menu secondMenu = createMenu(createMenuGroup(), createProduct(BigDecimal.valueOf(3000))); + menuRepository.save(firstMenu); + menuRepository.save(secondMenu); + + OrderLineItem orderLineItem1 = new OrderLineItem(firstMenu, 2, secondMenu.getId(), BigDecimal.valueOf(8000)); + OrderLineItem orderLineItem2 = new OrderLineItem(secondMenu, 3, secondMenu.getId(), BigDecimal.valueOf(8000)); + + // when // then + Assertions.assertThatThrownBy(() -> orderLineItemValidator.validate(List.of(orderLineItem1, orderLineItem2))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("주문 내역의 메뉴 정보가 올바르지 않습니다."); + } +} diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactoryTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactoryTest.java new file mode 100644 index 000000000..4ef055f97 --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactoryTest.java @@ -0,0 +1,49 @@ +package kitchenpos.order.eatinorder.domain.model; + +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.infra.persistence.FakeMenuRepository; +import kitchenpos.order.common.model.OrderLineItemValidator; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.infra.persistence.FakeOrderTableRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class EatInOrderFactoryTest { + + @Test + @DisplayName("주문 내역과 매장 테이블 정보로 매장 주문을 생성한다.") + void create() { + // given + MenuRepository menuRepository = new FakeMenuRepository(new HashMap<>()); + OrderLineItemValidator orderLineItemValidator = new OrderLineItemValidator(menuRepository); + OrderTableRepository orderTableRepository = new FakeOrderTableRepository(new HashMap<>()); + EatInOrderFactory eatInOrderFactory = new EatInOrderFactory(orderLineItemValidator, orderTableRepository); + + Menu firstMenu = createMenu(createMenuGroup(), createProduct(BigDecimal.valueOf(2000))); + menuRepository.save(firstMenu); + + OrderTable orderTable = orderTableRepository.save(new OrderTable("1번 테이블", 3, true)); + UUID orderTableId = orderTable.getId(); + + OrderLineItem orderLineItem = new OrderLineItem(firstMenu, 2, firstMenu.getId(), BigDecimal.valueOf(8000)); + + // when + EatInOrder eatInOrder = eatInOrderFactory.create(List.of(orderLineItem), orderTableId); + + // then + assertThat(eatInOrder.getEatInOrderFlow()).isEqualTo(EatInOrderFlow.WAITING); + assertThat(eatInOrder.getOrderTableId()).isEqualTo(orderTableId); + assertThat(eatInOrder.getOrderLineItems()).isEqualTo(List.of(orderLineItem)); + } +} diff --git a/src/test/java/kitchenpos/order/eatinorder/infra/persistence/FakeOrderTableRepository.java b/src/test/java/kitchenpos/order/eatinorder/infra/persistence/FakeOrderTableRepository.java new file mode 100644 index 000000000..eabd39915 --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/infra/persistence/FakeOrderTableRepository.java @@ -0,0 +1,36 @@ +package kitchenpos.order.eatinorder.infra.persistence; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; + +public class FakeOrderTableRepository implements OrderTableRepository { + + private final Map storage; + + public FakeOrderTableRepository(Map storage) { + this.storage = storage; + } + + @Override + public OrderTable save(OrderTable orderTable) { + UUID id = UUID.randomUUID(); + orderTable.setId(id); + storage.put(id, orderTable); + return orderTable; + } + + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(storage.get(id)); + } + + @Override + public List findAll() { + return new ArrayList<>(storage.values()); + } +} diff --git a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java index 3051b7a04..1d75a50f8 100644 --- a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java @@ -11,17 +11,14 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.List; import java.util.Optional; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; -import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFactory; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; -import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; +import kitchenpos.order.common.model.OrderLineItemValidator; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; @@ -40,13 +37,17 @@ class EatInOrderServiceTest { private EatInOrderRepository eatInOrderRepository; private MenuRepository menuRepository; private OrderTableRepository orderTableRepository; + private OrderLineItemValidator orderLineItemValidator; + private EatInOrderFactory eatInOrderFactory; @BeforeEach void setUp() { eatInOrderRepository = mock(EatInOrderRepository.class); menuRepository = mock(MenuRepository.class); orderTableRepository = mock(OrderTableRepository.class); - eatInOrderService = new EatInOrderService(eatInOrderRepository, menuRepository, orderTableRepository); + orderLineItemValidator = new OrderLineItemValidator(menuRepository); + eatInOrderFactory = new EatInOrderFactory(orderLineItemValidator, orderTableRepository); + eatInOrderService = new EatInOrderService(eatInOrderRepository, menuRepository, eatInOrderFactory); } @Test From 98e192444f18b78dbd2b62e9732c8475e7e1bd07 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Sun, 23 Feb 2025 14:01:23 +0900 Subject: [PATCH 27/71] =?UTF-8?q?feat(kitchen=20pos)=20:=20OrderTableOccup?= =?UTF-8?q?ationManager=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/OrderTableOccupationManager.java | 21 ++++++++ .../OrderTableOccupationManagerTest.java | 54 +++++++++++++++++++ .../persistence/FakeEatInOrderRepository.java | 47 ++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java create mode 100644 src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java create mode 100644 src/test/java/kitchenpos/order/eatinorder/infra/persistence/FakeEatInOrderRepository.java diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java b/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java new file mode 100644 index 000000000..14faabb96 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java @@ -0,0 +1,21 @@ +package kitchenpos.order.eatinorder.domain.service; + +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; +import org.springframework.stereotype.Service; + +@Service +public class OrderTableOccupationManager { + private final EatInOrderRepository eatInOrderRepository; + + public OrderTableOccupationManager(EatInOrderRepository eatInOrderRepository) { + this.eatInOrderRepository = eatInOrderRepository; + } + + public void release(OrderTable orderTable) { + if (!eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(orderTable, EatInOrderFlow.COMPLETED)) { + orderTable.releaseTable(); + } + } +} diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java new file mode 100644 index 000000000..61766e82d --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java @@ -0,0 +1,54 @@ +package kitchenpos.order.eatinorder.domain.service; + +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createOrderLineItem; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; +import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; +import kitchenpos.order.eatinorder.infra.persistence.FakeEatInOrderRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class OrderTableOccupationManagerTest { + + @Test + @DisplayName("매장 주문이 완료 되면 테이블의 점유 상태를 해지한다.") + void release() { + // given + EatInOrderRepository eatInOrderRepository = new FakeEatInOrderRepository(new HashMap<>()); + OrderTableOccupationManager manager = new OrderTableOccupationManager(eatInOrderRepository); + + OrderTable orderTable = new OrderTable(UUID.randomUUID(), "1번 테이블", 3, true); + EatInOrder eatInOrder = createCompleteEatInOrder(orderTable); + + eatInOrderRepository.save(eatInOrder); + + // when + manager.release(orderTable); + + // then + assertThat(orderTable.isOccupied()).isEqualTo(false); + assertThat(orderTable.getNumberOfGuests()).isEqualTo(0); + } + + private EatInOrder createCompleteEatInOrder(OrderTable orderTable) { + List orderLineItems = List.of(createOrderLineItem(createMenu(createMenuGroup(), createProduct( + BigDecimal.TWO), 3))); + EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), + orderLineItems, + EatInOrderFlow.COMPLETED); + eatInOrder.occupyOrderTable(orderTable); + return eatInOrder; + } +} diff --git a/src/test/java/kitchenpos/order/eatinorder/infra/persistence/FakeEatInOrderRepository.java b/src/test/java/kitchenpos/order/eatinorder/infra/persistence/FakeEatInOrderRepository.java new file mode 100644 index 000000000..258c6de2e --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/infra/persistence/FakeEatInOrderRepository.java @@ -0,0 +1,47 @@ +package kitchenpos.order.eatinorder.infra.persistence; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; + +public class FakeEatInOrderRepository implements EatInOrderRepository { + private final Map storage; + + public FakeEatInOrderRepository(Map storage) { + this.storage = storage; + } + + @Override + public Optional findById(UUID eatInOrderId) { + return Optional.of(storage.get(eatInOrderId)); + } + + @Override + public EatInOrder save(EatInOrder eatInOrder) { + UUID eatInOrderId = UUID.randomUUID(); + eatInOrder.setId(eatInOrderId); + storage.put(eatInOrderId, eatInOrder); + return eatInOrder; + } + + @Override + public boolean existsByOrderTableAndEatInOrderFlowNot(OrderTable orderTable, EatInOrderFlow eatInOrderFlow) { + Optional eatInOrder = storage.values().stream() + .filter(s -> s.getOrderTable() == orderTable) + .findFirst(); + return eatInOrder + .filter(flow -> flow.getEatInOrderFlow() != eatInOrderFlow) + .isPresent(); + } + + @Override + public List findAll() { + return new ArrayList<>(storage.values()); + } +} From 6907f2d7dada9f563031f8a5f6987bcaae375df7 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Sun, 23 Feb 2025 15:06:21 +0900 Subject: [PATCH 28/71] =?UTF-8?q?feat=20&=20test(kitchen=20pos)=20:=20EatI?= =?UTF-8?q?nOrder=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=95=A0=EA=B7=B8?= =?UTF-8?q?=EB=9F=AC=EA=B1=B0=ED=8A=B8=20=EC=84=A4=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=B0=9C=ED=96=89=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=A0=81=EC=9A=A9,=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorder/domain/model/EatInOrder.java | 7 +- .../domain/model/ReleaseOrderTableEvent.java | 4 ++ .../service/OrderTableOccupationManager.java | 6 +- .../eatinorder/service/EatInOrderService.java | 7 -- .../domain/model/EatInOrderMockTest.java | 65 +++++++++++++++++++ .../OrderTableOccupationManagerTest.java | 4 +- .../service/EatInOrderServiceTest.java | 33 ++++++++-- 7 files changed, 110 insertions(+), 16 deletions(-) create mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/model/ReleaseOrderTableEvent.java create mode 100644 src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderMockTest.java diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index 0e36cba6d..ed1ddc48d 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -20,10 +20,11 @@ import java.util.Objects; import java.util.UUID; import kitchenpos.order.common.model.OrderLineItem; +import org.springframework.data.domain.AbstractAggregateRoot; @Table(name = "eat_in_orders") @Entity -public class EatInOrder { +public class EatInOrder extends AbstractAggregateRoot { @Column(name = "id", columnDefinition = "binary(16)") @Id private UUID id; @@ -76,6 +77,10 @@ public void processOrderFlow(EatInOrderStatus orderStatus) { throw new IllegalStateException(EAT_IN_ORDER_FLOW_EXCEPTION.getMessage()); } this.eatInOrderFlow = EatInOrderFlow.findByOrderStatus(orderStatus); + + if (this.eatInOrderFlow == EatInOrderFlow.COMPLETED) { + registerEvent(new ReleaseOrderTableEvent(this.orderTable)); + } } public UUID getId() { diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/ReleaseOrderTableEvent.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/ReleaseOrderTableEvent.java new file mode 100644 index 000000000..918c9af15 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/ReleaseOrderTableEvent.java @@ -0,0 +1,4 @@ +package kitchenpos.order.eatinorder.domain.model; + +public record ReleaseOrderTableEvent(OrderTable orderTable) { +} diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java b/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java index 14faabb96..09b1d598e 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java @@ -2,7 +2,9 @@ import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.model.ReleaseOrderTableEvent; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; @Service @@ -13,7 +15,9 @@ public OrderTableOccupationManager(EatInOrderRepository eatInOrderRepository) { this.eatInOrderRepository = eatInOrderRepository; } - public void release(OrderTable orderTable) { + @EventListener + public void release(ReleaseOrderTableEvent event) { + OrderTable orderTable = event.orderTable(); if (!eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(orderTable, EatInOrderFlow.COMPLETED)) { orderTable.releaseTable(); } diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index 2ce841223..b9e4fb306 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -9,9 +9,7 @@ import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFactory; -import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; -import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -73,11 +71,6 @@ public EatInOrder complete(final UUID orderId) { .orElseThrow(NoSuchElementException::new); eatInOrder.processOrderFlow(EatInOrderStatus.COMPLETED); - final OrderTable orderTable = eatInOrder.getOrderTable(); - if (!eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(orderTable, EatInOrderFlow.COMPLETED)) { - orderTable.releaseTable(); - } - return eatInOrder; } diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderMockTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderMockTest.java new file mode 100644 index 000000000..c0f6deadf --- /dev/null +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderMockTest.java @@ -0,0 +1,65 @@ +package kitchenpos.order.eatinorder.domain.model; + +import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; +import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; +import static kitchenpos.TestFixtureFactory.createUsingOrderTable; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import kitchenpos.menu.domain.model.Menu; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.AbstractAggregateRoot; +import org.springframework.test.util.ReflectionTestUtils; + +@ExtendWith(MockitoExtension.class) +class EatInOrderMockTest { + + @Test + @DisplayName("매장 주문이 완료되었다면, 주문 테이블 점유 해제 이벤트를 발행한다.") + void publish() { + // given + Menu menu = createMenuWithProductAndGroup(); + EatInOrder eatInOrder = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.SERVED); + OrderTable usingOrderTable = createUsingOrderTable(); + eatInOrder.occupyOrderTable(usingOrderTable); + + // when + eatInOrder.processOrderFlow(EatInOrderStatus.COMPLETED); + + // then + List events = getEvents(eatInOrder); + assertThat(events) + .hasSize(1) + .hasOnlyElementsOfType(ReleaseOrderTableEvent.class); + } + + @Test + @DisplayName("완료되지 않은 매장 주문은 주문 테이블 점유 해제 이벤트를 발행하지 않는다.") + void not_publish() { + // given + Menu menu = createMenuWithProductAndGroup(); + EatInOrder eatInOrder = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.ACCEPTED); + OrderTable usingOrderTable = createUsingOrderTable(); + eatInOrder.occupyOrderTable(usingOrderTable); + + // when + eatInOrder.processOrderFlow(EatInOrderStatus.SERVED); + + // then + List events = getEvents(eatInOrder); + assertThat(events) + .hasSize(0) + .hasOnlyElementsOfType(ReleaseOrderTableEvent.class); + } + + private List getEvents(EatInOrder order) { + return (List) ReflectionTestUtils.getField( + order, + AbstractAggregateRoot.class, + "domainEvents" + ); + } +} diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java index 61766e82d..3edb7b4a5 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java @@ -15,6 +15,7 @@ import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.model.ReleaseOrderTableEvent; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import kitchenpos.order.eatinorder.infra.persistence.FakeEatInOrderRepository; import org.junit.jupiter.api.DisplayName; @@ -31,11 +32,12 @@ void release() { OrderTable orderTable = new OrderTable(UUID.randomUUID(), "1번 테이블", 3, true); EatInOrder eatInOrder = createCompleteEatInOrder(orderTable); + ReleaseOrderTableEvent event = new ReleaseOrderTableEvent(orderTable); eatInOrderRepository.save(eatInOrder); // when - manager.release(orderTable); + manager.release(event); // then assertThat(orderTable.isOccupied()).isEqualTo(false); diff --git a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java index 1d75a50f8..a2e0bb5f9 100644 --- a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java @@ -15,13 +15,15 @@ import java.util.Optional; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.order.common.model.OrderLineItemValidator; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFactory; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; -import kitchenpos.order.common.model.OrderLineItemValidator; import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.model.ReleaseOrderTableEvent; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -29,6 +31,8 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.AbstractAggregateRoot; +import org.springframework.test.util.ReflectionTestUtils; @ExtendWith(MockitoExtension.class) class EatInOrderServiceTest { @@ -37,16 +41,16 @@ class EatInOrderServiceTest { private EatInOrderRepository eatInOrderRepository; private MenuRepository menuRepository; private OrderTableRepository orderTableRepository; - private OrderLineItemValidator orderLineItemValidator; - private EatInOrderFactory eatInOrderFactory; + private OrderTableOccupationManager orderTableOccupationManager; @BeforeEach void setUp() { eatInOrderRepository = mock(EatInOrderRepository.class); menuRepository = mock(MenuRepository.class); orderTableRepository = mock(OrderTableRepository.class); - orderLineItemValidator = new OrderLineItemValidator(menuRepository); - eatInOrderFactory = new EatInOrderFactory(orderLineItemValidator, orderTableRepository); + OrderLineItemValidator orderLineItemValidator = new OrderLineItemValidator(menuRepository); + EatInOrderFactory eatInOrderFactory = new EatInOrderFactory(orderLineItemValidator, orderTableRepository); + orderTableOccupationManager = new OrderTableOccupationManager(eatInOrderRepository); eatInOrderService = new EatInOrderService(eatInOrderRepository, menuRepository, eatInOrderFactory); } @@ -67,6 +71,9 @@ void not_occupied_table_order_exception() { .isInstanceOf(IllegalStateException.class); } + /** + * 이 테스트를 어떻게 할 지 고민해봐야 함! + */ @Test @DisplayName("매장 식사 주문 완료 시 다른 주문이 없으면 테이블을 비운다") void clear_table_with_complete_status() { @@ -80,13 +87,27 @@ void clear_table_with_complete_status() { when(eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(any(), any())).thenReturn(false); // when - eatInOrderService.complete(order.getId()); + EatInOrder eatInOrder = eatInOrderService.complete(order.getId()); + orderTableOccupationManager.release(new ReleaseOrderTableEvent(orderTable)); // then + List events = getEvents(eatInOrder); + assertThat(events) + .hasSize(1) + .hasOnlyElementsOfType(ReleaseOrderTableEvent.class); + assertThat(orderTable.isOccupied()).isFalse(); assertThat(orderTable.getNumberOfGuests()).isZero(); } + private List getEvents(EatInOrder eatInOrder) { + return (List) ReflectionTestUtils.getField( + eatInOrder, + AbstractAggregateRoot.class, + "domainEvents" + ); + } + @ParameterizedTest @EnumSource(value = EatInOrderFlow.class, names = {"ACCEPTED", "SERVED", "COMPLETED"}) @DisplayName("대기 중이 아닌 주문 시 예외가 발생한다.") From ac0ec78801b55c91c77218871783303678ee897d Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Mon, 24 Feb 2025 21:51:10 +0900 Subject: [PATCH 29/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20OrderTableS?= =?UTF-8?q?ervice=20clear=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/OrderTableService.java | 23 +++++------ .../service/OrderTableOccupationManager.java | 7 +++- .../exception/EatInOrderExceptionMessage.java | 3 +- .../application/OrderTableServiceTest.java | 39 ++++++++++++++----- 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index 8bcfc3712..63148ff62 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -1,25 +1,25 @@ package kitchenpos.order.eatinorder.application; -import kitchenpos.order.common.model.OrderStatus; -import kitchenpos.order.common.repository.OrderRepository; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.model.OrderTableName; +import kitchenpos.order.eatinorder.domain.model.ReleaseOrderTableEvent; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; - @Service public class OrderTableService { private final OrderTableRepository orderTableRepository; - private final OrderRepository orderRepository; + private final OrderTableOccupationManager orderTableOccupationManager; - public OrderTableService(final OrderTableRepository orderTableRepository, final OrderRepository orderRepository) { + public OrderTableService(final OrderTableRepository orderTableRepository, + final OrderTableOccupationManager orderTableOccupationManager) { this.orderTableRepository = orderTableRepository; - this.orderRepository = orderRepository; + this.orderTableOccupationManager = orderTableOccupationManager; } @Transactional @@ -41,10 +41,7 @@ public OrderTable sit(final UUID orderTableId) { public OrderTable clear(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) .orElseThrow(NoSuchElementException::new); - if (orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { - throw new IllegalStateException(); - } - orderTable.releaseTable(); + orderTableOccupationManager.release(new ReleaseOrderTableEvent(orderTable)); return orderTable; } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java b/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java index 09b1d598e..eb43de009 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java @@ -1,5 +1,7 @@ package kitchenpos.order.eatinorder.domain.service; +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.RELEASE_ORDER_TABLE_EXCEPTION; + import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.model.ReleaseOrderTableEvent; @@ -18,8 +20,9 @@ public OrderTableOccupationManager(EatInOrderRepository eatInOrderRepository) { @EventListener public void release(ReleaseOrderTableEvent event) { OrderTable orderTable = event.orderTable(); - if (!eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(orderTable, EatInOrderFlow.COMPLETED)) { - orderTable.releaseTable(); + if (eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(orderTable, EatInOrderFlow.COMPLETED)) { + throw new IllegalStateException(RELEASE_ORDER_TABLE_EXCEPTION.getMessage()); } + orderTable.releaseTable(); } } diff --git a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java index 5f3500109..37fa6c573 100644 --- a/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java +++ b/src/main/java/kitchenpos/order/eatinorder/exception/EatInOrderExceptionMessage.java @@ -6,7 +6,8 @@ public enum EatInOrderExceptionMessage { NUMBER_OF_GUESTS_EXCEPTION("손님 수가 음수일 수 없습니다!"), EAT_IN_ORDER_EMPTY_ORDER_LINE_ITEM_EXCEPTION("매장 주문에 주문 내역이 비어있습니다!"), EAT_IN_ORDER_FLOW_EXCEPTION("잘못된 매장 주문 순서입니다. 주문 순서를 지켜주세요!"), - EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION("매장 주문 상태에 맞는 주문 순서를 찾을 수 없습니다."); + EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION("매장 주문 상태에 맞는 주문 순서를 찾을 수 없습니다."), + RELEASE_ORDER_TABLE_EXCEPTION("주문이 완료되지 않은 매장 테이블은 정리할 수 없습니다."); private final String message; diff --git a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index f8adc5bc6..6fb53bc62 100644 --- a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -1,9 +1,16 @@ package kitchenpos.order.eatinorder.application; +import java.math.BigDecimal; +import java.util.HashMap; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.repository.OrderRepository; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; +import kitchenpos.order.eatinorder.infra.persistence.FakeEatInOrderRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -13,7 +20,11 @@ import java.util.List; import java.util.Optional; +import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createProduct; import static kitchenpos.TestFixtureFactory.createUsingOrderTable; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -24,13 +35,15 @@ class OrderTableServiceTest { private OrderTableService orderTableService; private OrderTableRepository orderTableRepository; - private OrderRepository orderRepository; + private EatInOrderRepository eatInOrderRepository; + private OrderTableOccupationManager orderTableOccupationManager; @BeforeEach void setUp() { orderTableRepository = mock(OrderTableRepository.class); - orderRepository = mock(OrderRepository.class); - orderTableService = new OrderTableService(orderTableRepository, orderRepository); + eatInOrderRepository = new FakeEatInOrderRepository(new HashMap<>()); + orderTableOccupationManager = new OrderTableOccupationManager(eatInOrderRepository); + orderTableService = new OrderTableService(orderTableRepository, orderTableOccupationManager); } @Test @@ -96,16 +109,19 @@ void sit() { void clear() { // given OrderTable orderTable = createUsingOrderTable(); + EatInOrder eatInOrder = createEatInOrderRequestWithEmptyTable( + createMenu(createMenuGroup(), createProduct(BigDecimal.valueOf(1000))), EatInOrderFlow.COMPLETED); + eatInOrder.occupyOrderTable(orderTable); + eatInOrderRepository.save(eatInOrder); when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); - when(orderRepository.existsByOrderTableAndStatusNot(any(), any())).thenReturn(false); // when - OrderTable cleared = orderTableService.clear(orderTable.getId()); + OrderTable clearedOrderTable = orderTableService.clear(orderTable.getId()); // then - assertThat(cleared.isOccupied()).isFalse(); - assertThat(cleared.getNumberOfGuests()).isZero(); + assertThat(clearedOrderTable.isOccupied()).isFalse(); + assertThat(clearedOrderTable.getNumberOfGuests()).isZero(); } @Test @@ -113,12 +129,17 @@ void clear() { void orderTable_occupied_exception() { // given OrderTable orderTable = createUsingOrderTable(); + EatInOrder eatInOrder = createEatInOrderRequestWithEmptyTable( + createMenu(createMenuGroup(), createProduct(BigDecimal.valueOf(1000))), EatInOrderFlow.SERVED); + eatInOrder.occupyOrderTable(orderTable); + eatInOrderRepository.save(eatInOrder); + when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); - when(orderRepository.existsByOrderTableAndStatusNot(any(), eq(OrderStatus.COMPLETED))).thenReturn(true); // when // then assertThatThrownBy(() -> orderTableService.clear(orderTable.getId())) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class) + .hasMessage("주문이 완료되지 않은 매장 테이블은 정리할 수 없습니다."); } @Test From 9a5a39ba5f21408aadca8ffac3cbb357e707f805 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Mon, 24 Feb 2025 21:52:49 +0900 Subject: [PATCH 30/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20EatInOrderF?= =?UTF-8?q?actory=20=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=95=A0=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/eatinorder/domain/model/EatInOrderFactory.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java index de8379a5d..efdc2b60c 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java @@ -4,12 +4,12 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; -import kitchenpos.order.common.model.OrderLineItemValidator; import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.common.model.OrderLineItemValidator; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; -@Service +@Component public class EatInOrderFactory { private final OrderLineItemValidator orderLineItemValidator; From 95d2acde050a5f77083cdcc9df4df6737808e287 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:01:34 +0900 Subject: [PATCH 31/71] =?UTF-8?q?test(kitchen=20pos)=20:=20OrderTableOccup?= =?UTF-8?q?ationManager=20=EC=98=88=EC=99=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OrderTableOccupationManagerTest.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java index 3edb7b4a5..0860c8b36 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java @@ -5,6 +5,7 @@ import static kitchenpos.TestFixtureFactory.createOrderLineItem; import static kitchenpos.TestFixtureFactory.createProduct; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -31,7 +32,7 @@ void release() { OrderTableOccupationManager manager = new OrderTableOccupationManager(eatInOrderRepository); OrderTable orderTable = new OrderTable(UUID.randomUUID(), "1번 테이블", 3, true); - EatInOrder eatInOrder = createCompleteEatInOrder(orderTable); + EatInOrder eatInOrder = createEatInOrder(orderTable, EatInOrderFlow.COMPLETED); ReleaseOrderTableEvent event = new ReleaseOrderTableEvent(orderTable); eatInOrderRepository.save(eatInOrder); @@ -44,12 +45,31 @@ void release() { assertThat(orderTable.getNumberOfGuests()).isEqualTo(0); } - private EatInOrder createCompleteEatInOrder(OrderTable orderTable) { + @Test + @DisplayName("매장 주문이 완료 되지 않은 경우, 테이블 점유 상태를 해지하려 하면 예외가 발생한다.") + void release_exception() { + // given + EatInOrderRepository eatInOrderRepository = new FakeEatInOrderRepository(new HashMap<>()); + OrderTableOccupationManager manager = new OrderTableOccupationManager(eatInOrderRepository); + + OrderTable orderTable = new OrderTable(UUID.randomUUID(), "1번 테이블", 3, true); + EatInOrder eatInOrder = createEatInOrder(orderTable, EatInOrderFlow.SERVED); + ReleaseOrderTableEvent event = new ReleaseOrderTableEvent(orderTable); + + eatInOrderRepository.save(eatInOrder); + + // when // then + assertThatThrownBy(() -> manager.release(event)) + .isInstanceOf(IllegalStateException.class) + .hasMessage("주문이 완료되지 않은 매장 테이블은 정리할 수 없습니다."); + } + + private EatInOrder createEatInOrder(OrderTable orderTable, EatInOrderFlow eatInOrderFlow) { List orderLineItems = List.of(createOrderLineItem(createMenu(createMenuGroup(), createProduct( BigDecimal.TWO), 3))); EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), orderLineItems, - EatInOrderFlow.COMPLETED); + eatInOrderFlow); eatInOrder.occupyOrderTable(orderTable); return eatInOrder; } From f334fdffd3ef369a1d334df33f0b1672295f32b3 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:35:41 +0900 Subject: [PATCH 32/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20EatInOrder,?= =?UTF-8?q?=20OrderTable=20id=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EB=82=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=9E=90=EB=8F=99=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=A8=EA=B8=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/OrderTableService.java | 2 +- .../eatinorder/domain/model/EatInOrder.java | 4 +-- .../domain/model/EatInOrderFactory.java | 2 +- .../eatinorder/domain/model/OrderTable.java | 25 +++++++++---------- .../java/kitchenpos/TestFixtureFactory.java | 4 +-- .../domain/model/OrderTableTest.java | 8 +++--- .../OrderTableOccupationManagerTest.java | 6 ++--- .../ui/EatInOrderRestControllerTest.java | 4 +-- 8 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index 63148ff62..2d80b20e5 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -25,7 +25,7 @@ public OrderTableService(final OrderTableRepository orderTableRepository, @Transactional public OrderTable create(final OrderTable request) { final String name = request.getInnerName(); - final OrderTable orderTable = new OrderTable(UUID.randomUUID(), new OrderTableName(name)); + final OrderTable orderTable = new OrderTable(new OrderTableName(name)); return orderTableRepository.save(orderTable); } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java index ed1ddc48d..941a48871 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrder.java @@ -57,10 +57,10 @@ public class EatInOrder extends AbstractAggregateRoot { public EatInOrder() { } - public EatInOrder(UUID id, LocalDateTime orderDateTime, + public EatInOrder(LocalDateTime orderDateTime, List orderLineItems, EatInOrderFlow eatInOrderFlow) { validateOrderLineItemIsEmpty(orderLineItems); - this.id = id; + this.id = UUID.randomUUID(); this.orderDateTime = orderDateTime; this.orderLineItems = orderLineItems; this.eatInOrderFlow = eatInOrderFlow; diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java index efdc2b60c..ffb8b68fd 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactory.java @@ -23,7 +23,7 @@ public EatInOrderFactory(OrderLineItemValidator orderLineItemValidator, OrderTab public EatInOrder create(List orderLineItems, UUID orderTableId) { orderLineItemValidator.validate(orderLineItems); - EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), + EatInOrder eatInOrder = new EatInOrder(LocalDateTime.now(), orderLineItems, EatInOrderFlow.WAITING); final OrderTable orderTable = orderTableRepository.findById(orderTableId) diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java index e87e81dae..f5fa82f2c 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTable.java @@ -1,12 +1,15 @@ package kitchenpos.order.eatinorder.domain.model; -import jakarta.persistence.*; - -import java.util.UUID; - import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EMPTY_ORDER_TABLE_EXCEPTION; import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.NUMBER_OF_GUESTS_EXCEPTION; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.util.UUID; + @Table(name = "order_table") @Entity public class OrderTable { @@ -26,24 +29,20 @@ public class OrderTable { public OrderTable() { } - public OrderTable(UUID id, OrderTableName name, int numberOfGuests, boolean occupied) { + public OrderTable(OrderTableName name, int numberOfGuests, boolean occupied) { validateNumberOfGuests(numberOfGuests); - this.id = id; + this.id = UUID.randomUUID(); this.name = name; this.numberOfGuests = numberOfGuests; this.occupied = occupied; } - public OrderTable(UUID id, OrderTableName name) { - this(id, name, 0, false); - } - - public OrderTable(UUID id, String name, int numberOfGuests, boolean occupied) { - this(id, new OrderTableName(name), numberOfGuests, occupied); + public OrderTable(OrderTableName name) { + this(name, 0, false); } public OrderTable(String name, int numberOfGuests, boolean occupied) { - this(UUID.randomUUID(), name, numberOfGuests, occupied); + this(new OrderTableName(name), numberOfGuests, occupied); } private void validateNumberOfGuests(int numberOfGuests) { diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 92346e206..6a7c996dd 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -86,7 +86,7 @@ public static OrderTable createEmptyOrderTable() { } public static OrderTable createUsingOrderTable() { - return new OrderTable(UUID.randomUUID(), "사용 중인 테이블", 4, true); + return new OrderTable("사용 중인 테이블", 4, true); } public static Product createProduct(String name, long price) { @@ -123,7 +123,7 @@ public static OrderLineItem createOrderLineItem(Menu menu) { public static EatInOrder createEatInOrderRequestWithEmptyTable(Menu menu, EatInOrderFlow eatInOrderFlow) { - return new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), + return new EatInOrder(LocalDateTime.now(), List.of(new OrderLineItem(menu, 1, menu.getId(), BigDecimal.valueOf(8000))), eatInOrderFlow); } } diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java index 252316fc3..4f2bbb837 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java @@ -14,7 +14,7 @@ class OrderTableTest { @DisplayName("주문 테이블이 비어있을 때, 테이블을 점유하는 손님 수를 변경하면 예외를 던진다.") void change_number_of_guests_empty_order_table_exception() { // given - OrderTable orderTable = new OrderTable(UUID.randomUUID(), new OrderTableName("1번 테이블")); + OrderTable orderTable = new OrderTable(new OrderTableName("1번 테이블")); // when // then assertThatThrownBy(() -> orderTable.changeNumberOfGuests(2)) @@ -26,7 +26,7 @@ void change_number_of_guests_empty_order_table_exception() { @DisplayName("주문 테이블을 점유하는 손님 수를 음수로 변경하면 예외를 던진다.") void change_number_of_guests_guest_number_exception() { // given - OrderTable orderTable = new OrderTable(UUID.randomUUID(), new OrderTableName("1번 테이블"), 1, true); + OrderTable orderTable = new OrderTable(new OrderTableName("1번 테이블"), 1, true); // when // then assertThatThrownBy(() -> orderTable.changeNumberOfGuests(-1)) @@ -38,7 +38,7 @@ void change_number_of_guests_guest_number_exception() { @DisplayName("주문 테이블을 손님이 점유하고 있을 때, 손님 수를 변경할 수 있다.") void change_number_of_guests_success() { // given - OrderTable orderTable = new OrderTable(UUID.randomUUID(), new OrderTableName("1번 테이블"), 1, true); + OrderTable orderTable = new OrderTable(new OrderTableName("1번 테이블"), 1, true); // when orderTable.changeNumberOfGuests(3); @@ -46,4 +46,4 @@ void change_number_of_guests_success() { // then assertThat(orderTable.getNumberOfGuests()).isEqualTo(3); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java index 0860c8b36..525efab72 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java @@ -31,7 +31,7 @@ void release() { EatInOrderRepository eatInOrderRepository = new FakeEatInOrderRepository(new HashMap<>()); OrderTableOccupationManager manager = new OrderTableOccupationManager(eatInOrderRepository); - OrderTable orderTable = new OrderTable(UUID.randomUUID(), "1번 테이블", 3, true); + OrderTable orderTable = new OrderTable("1번 테이블", 3, true); EatInOrder eatInOrder = createEatInOrder(orderTable, EatInOrderFlow.COMPLETED); ReleaseOrderTableEvent event = new ReleaseOrderTableEvent(orderTable); @@ -52,7 +52,7 @@ void release_exception() { EatInOrderRepository eatInOrderRepository = new FakeEatInOrderRepository(new HashMap<>()); OrderTableOccupationManager manager = new OrderTableOccupationManager(eatInOrderRepository); - OrderTable orderTable = new OrderTable(UUID.randomUUID(), "1번 테이블", 3, true); + OrderTable orderTable = new OrderTable("1번 테이블", 3, true); EatInOrder eatInOrder = createEatInOrder(orderTable, EatInOrderFlow.SERVED); ReleaseOrderTableEvent event = new ReleaseOrderTableEvent(orderTable); @@ -67,7 +67,7 @@ void release_exception() { private EatInOrder createEatInOrder(OrderTable orderTable, EatInOrderFlow eatInOrderFlow) { List orderLineItems = List.of(createOrderLineItem(createMenu(createMenuGroup(), createProduct( BigDecimal.TWO), 3))); - EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), + EatInOrder eatInOrder = new EatInOrder(LocalDateTime.now(), orderLineItems, eatInOrderFlow); eatInOrder.occupyOrderTable(orderTable); diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java index f7762d609..c7749e7d6 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java @@ -171,7 +171,7 @@ private EatInOrder createAndSaveEatInOrder(EatInOrderFlow flow) { } private EatInOrder createEatInOrder(OrderLineItem orderLineItem, OrderTable orderTable, EatInOrderFlow flow) { - EatInOrder eatInOrder = new EatInOrder(UUID.randomUUID(), LocalDateTime.now(), List.of(orderLineItem), flow); + EatInOrder eatInOrder = new EatInOrder(LocalDateTime.now(), List.of(orderLineItem), flow); eatInOrder.occupyOrderTable(orderTable); return eatInOrder; } @@ -199,4 +199,4 @@ private MenuGroup createAndSaveMenuGroup() { menuGroupRepository.save(menuGroup); return menuGroup; } -} \ No newline at end of file +} From ccfe2d28bf20a8bd9547c4fe2752d73ef6b8b62d Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:51:51 +0900 Subject: [PATCH 33/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20Menu,=20Men?= =?UTF-8?q?uGroup,=20Product=20id=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EB=82=B4=EC=97=90=EC=84=9C=20=EC=9E=90=EB=8F=99=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=A8=EA=B8=B0?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/application/MenuGroupService.java | 2 +- .../menu/application/MenuService.java | 2 +- .../kitchenpos/menu/domain/model/Menu.java | 35 ++++++++++--------- .../menu/domain/model/MenuGroup.java | 23 +++++------- .../product/application/ProductService.java | 2 +- .../product/domain/model/Product.java | 21 +++++------ .../menu/domain/model/MenuTest.java | 6 ++-- .../service/MenuProductValidatorTest.java | 33 +++++++---------- .../order/common/model/OrderLineItemTest.java | 6 ++-- 9 files changed, 57 insertions(+), 73 deletions(-) diff --git a/src/main/java/kitchenpos/menu/application/MenuGroupService.java b/src/main/java/kitchenpos/menu/application/MenuGroupService.java index 9da080b83..c48b60453 100644 --- a/src/main/java/kitchenpos/menu/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menu/application/MenuGroupService.java @@ -24,7 +24,7 @@ public MenuGroupService(final MenuGroupRepository menuGroupRepository, MenuGroup public MenuGroup create(final MenuGroup request) { final String name = request.getName(); MenuGroupName menuGroupName = menuGroupNameCreationService.createName(name); - final MenuGroup menuGroup = new MenuGroup(menuGroupName, UUID.randomUUID()); + final MenuGroup menuGroup = new MenuGroup(menuGroupName); return menuGroupRepository.save(menuGroup); } diff --git a/src/main/java/kitchenpos/menu/application/MenuService.java b/src/main/java/kitchenpos/menu/application/MenuService.java index 833af23f6..cdea280fd 100644 --- a/src/main/java/kitchenpos/menu/application/MenuService.java +++ b/src/main/java/kitchenpos/menu/application/MenuService.java @@ -55,7 +55,7 @@ public Menu create(final Menu request) { final String name = request.getInnerName(); MenuName menuName = menuNameCreationService.createName(name); - final Menu menu = new Menu(UUID.randomUUID(), menuName, new MenuPrice(price), menuGroup, request.isDisplayed(), menuProducts, menuGroup.getId()); + final Menu menu = new Menu(menuName, new MenuPrice(price), menuGroup, request.isDisplayed(), menuProducts, menuGroup.getId()); validateMargin(menu); return menuRepository.save(menu); diff --git a/src/main/java/kitchenpos/menu/domain/model/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java index ee8f847d7..33bdfcf8f 100644 --- a/src/main/java/kitchenpos/menu/domain/model/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -1,15 +1,24 @@ package kitchenpos.menu.domain.model; -import jakarta.persistence.*; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_EXISTS_EXCEPTION; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCTS_EXISTS_EXCEPTION; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_EXISTS_EXCEPTION; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCTS_EXISTS_EXCEPTION; - @Table(name = "menu") @Entity public class Menu { @@ -49,18 +58,18 @@ public class Menu { public Menu() { } - public Menu(UUID id, String name, BigDecimal price, boolean displayed) { - this.id = id; + public Menu(String name, BigDecimal price, boolean displayed) { + this.id = UUID.randomUUID(); this.name = new MenuName(name); this.price = new MenuPrice(price); this.displayed = displayed; } - public Menu(UUID id, MenuName name, MenuPrice price, MenuGroup menuGroup, boolean displayed, + public Menu(MenuName name, MenuPrice price, MenuGroup menuGroup, boolean displayed, List menuProducts, UUID menuGroupId) { validateMenuGroupExists(menuGroup); validateMenuProductsExists(menuProducts); - this.id = id; + this.id = UUID.randomUUID(); this.name = name; this.price = price; this.menuGroup = menuGroup; @@ -69,16 +78,10 @@ public Menu(UUID id, MenuName name, MenuPrice price, MenuGroup menuGroup, boolea this.menuGroupId = menuGroupId; } - public Menu(UUID id, String name, BigDecimal price, boolean displayed, List menuProducts, + public Menu(String name, BigDecimal price, boolean displayed, List menuProducts, MenuGroup menuGroup, UUID menuGroupId) { - this(id, new MenuName(name), new MenuPrice(price), menuGroup, displayed, menuProducts, menuGroupId); - } - - public Menu(String name, BigDecimal price, boolean displayed, List menuProducts, MenuGroup menuGroup, - UUID menuGroupId) { - this(UUID.randomUUID(), new MenuName(name), new MenuPrice(price), menuGroup, displayed, menuProducts, - menuGroupId); + this(new MenuName(name), new MenuPrice(price), menuGroup, displayed, menuProducts, menuGroupId); } private void validateMenuGroupExists(MenuGroup menuGroup) { diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java index 3f5679f84..526e1ae31 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroup.java @@ -1,7 +1,10 @@ package kitchenpos.menu.domain.model; -import jakarta.persistence.*; - +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import java.util.UUID; @Table(name = "menu_group") @@ -14,22 +17,14 @@ public class MenuGroup { @Embedded private MenuGroupName name; - public MenuGroup(MenuGroupName name, UUID id) { + public MenuGroup(MenuGroupName name) { this.name = name; - this.id = id; - } - - public MenuGroup(String name, UUID id) { - this.name = new MenuGroupName(name); - this.id = id; + this.id = UUID.randomUUID(); } public MenuGroup(String name) { - this(name, UUID.randomUUID()); - } - - public MenuGroup(MenuGroupName name) { - this(name, UUID.randomUUID()); + this.name = new MenuGroupName(name); + this.id = UUID.randomUUID(); } protected MenuGroup() { diff --git a/src/main/java/kitchenpos/product/application/ProductService.java b/src/main/java/kitchenpos/product/application/ProductService.java index 7d4b5ad2e..b7982fe79 100644 --- a/src/main/java/kitchenpos/product/application/ProductService.java +++ b/src/main/java/kitchenpos/product/application/ProductService.java @@ -35,7 +35,7 @@ public Product create(final Product request) { final BigDecimal price = request.getInnerPrice(); final String name = request.getInnerName(); final ProductName validProductName = productNameCreationService.createName(name); - final Product product = new Product(validProductName, new ProductPrice(price), UUID.randomUUID()); + final Product product = new Product(validProductName, new ProductPrice(price)); return productRepository.save(product); } diff --git a/src/main/java/kitchenpos/product/domain/model/Product.java b/src/main/java/kitchenpos/product/domain/model/Product.java index 1eac55b20..9c7a8cc7a 100644 --- a/src/main/java/kitchenpos/product/domain/model/Product.java +++ b/src/main/java/kitchenpos/product/domain/model/Product.java @@ -1,7 +1,10 @@ package kitchenpos.product.domain.model; -import jakarta.persistence.*; - +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import java.math.BigDecimal; import java.util.UUID; @@ -18,26 +21,18 @@ public class Product { @Embedded private ProductPrice price; - public Product(ProductName name, ProductPrice price, UUID id) { + public Product(ProductName name, ProductPrice price) { this.name = name; this.price = price; - this.id = id; - } - - public Product(ProductName name, ProductPrice price) { - this(name, price, UUID.randomUUID()); + this.id = UUID.randomUUID(); } protected Product() { } - public Product(String name, BigDecimal price, UUID id) { - this(new ProductName(name), new ProductPrice(price), id); - } - public Product(String name, BigDecimal price) { - this(name, price, UUID.randomUUID()); + this(new ProductName(name), new ProductPrice(price)); } public UUID getId() { diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuTest.java index 9f9850917..f2f233047 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuTest.java @@ -26,7 +26,7 @@ class MenuTest { void validate_menu_group_exists_exception() { // given ProductName productName = new ProductNameCreationService(new FakePurgomalumClient()).createName("배추"); - Product product = new Product(productName, new ProductPrice(BigDecimal.ONE), UUID.randomUUID()); + Product product = new Product(productName, new ProductPrice(BigDecimal.ONE)); MenuProduct menuProduct = new MenuProduct( product, new MenuProductQuantity(1), @@ -35,7 +35,6 @@ void validate_menu_group_exists_exception() { // when // then assertThatThrownBy(() -> new Menu( - UUID.randomUUID(), new MenuName("김치"), new MenuPrice(BigDecimal.ONE), null, @@ -55,7 +54,6 @@ void validate_menu_products_exists_exception(List menuProducts) { // when // then assertThatThrownBy(() -> new Menu( - UUID.randomUUID(), new MenuName("김치"), new MenuPrice(BigDecimal.ONE), menuGroup, @@ -72,4 +70,4 @@ private static Stream> invalidMenuProductProvider() { List.of() ); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java b/src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java index c2349a65d..0903ef94d 100644 --- a/src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java +++ b/src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java @@ -1,5 +1,10 @@ package kitchenpos.menu.domain.service; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.MenuProduct; import kitchenpos.menu.domain.model.MenuProductQuantity; @@ -12,13 +17,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.List; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class MenuProductValidatorTest { private MenuProductValidator menuProductValidator; @@ -36,23 +34,18 @@ void setUp() { @DisplayName("메뉴 상품과 이에 포함된 상품이 존재하는지 확인하고, 없으면 예외를 던진다.") void validate_menu_product_exception() { // given - UUID id1 = UUID.randomUUID(); - UUID id2 = UUID.randomUUID(); - UUID id3 = UUID.randomUUID(); - Product 배추 = new Product(productNameCreationService.createName("배추"), new ProductPrice(BigDecimal.ONE), id1); - Product 고춧가루 = new Product(productNameCreationService.createName("고춧가루"), new ProductPrice(BigDecimal.ONE), id2); - Product non = new Product(productNameCreationService.createName("non"), new ProductPrice(BigDecimal.ONE), id3); + Product lettuce = new Product(productNameCreationService.createName("lettuce"), + new ProductPrice(BigDecimal.ONE)); + Product pepper = new Product(productNameCreationService.createName("pepper"), new ProductPrice(BigDecimal.ONE)); - productRepository.save(배추); - productRepository.save(고춧가루); - productRepository.save(non); + productRepository.save(lettuce); - MenuProduct 배추들 = new MenuProduct(배추, new MenuProductQuantity(1), id1); - MenuProduct 고춧가루들 = new MenuProduct(고춧가루, new MenuProductQuantity(3), id2); + MenuProduct lettuces = new MenuProduct(lettuce, new MenuProductQuantity(1), lettuce.getId()); + MenuProduct peppers = new MenuProduct(pepper, new MenuProductQuantity(3), pepper.getId()); // when // then - assertThatThrownBy(() -> menuProductValidator.validateMenuProduct(List.of(배추들, 고춧가루들))) + assertThatThrownBy(() -> menuProductValidator.validateMenuProduct(List.of(lettuces, peppers))) .isInstanceOf(IllegalArgumentException.class) .hasMessage("메뉴 상품에 들어갈 상품 수와 실제 상품 수가 다릅니다!"); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java b/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java index aca63a338..d52669bbd 100644 --- a/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java +++ b/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java @@ -15,7 +15,7 @@ class OrderLineItemTest { @DisplayName("주문 내역의 메뉴 수량은 0 이하면 예외를 던진다.") void validate_order_line_item_quantity() { // given - Menu menu = new Menu(UUID.randomUUID(), "김치", BigDecimal.ONE, true); + Menu menu = new Menu("김치", BigDecimal.ONE, true); // when // then assertThatThrownBy(() -> new OrderLineItem(menu, 0, menu.getId(), BigDecimal.ONE)) @@ -27,7 +27,7 @@ void validate_order_line_item_quantity() { @DisplayName("주문 내역의 메뉴가 게시 상태가 아니면 예외를 던진다.") void validate_order_line_item_menu_display() { // given - Menu menu = new Menu(UUID.randomUUID(), "김치", BigDecimal.ONE, false); + Menu menu = new Menu("김치", BigDecimal.ONE, false); // when // then assertThatThrownBy(() -> new OrderLineItem(menu, 1, menu.getId(), BigDecimal.ONE)) @@ -39,7 +39,7 @@ void validate_order_line_item_menu_display() { @DisplayName("주문 내역의 가격과 메뉴의 가격이 다르면 예외를 던진다.") void validate_order_line_item_price() { // given - Menu menu = new Menu(UUID.randomUUID(), "김치", BigDecimal.TEN, true); + Menu menu = new Menu("김치", BigDecimal.TEN, true); // when // then assertThatThrownBy(() -> new OrderLineItem(menu, 1, menu.getId(), BigDecimal.ONE)) From 7cfe350271e4eeca7ec9d96315505c16f0ccd3ad Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:52:58 +0900 Subject: [PATCH 34/71] =?UTF-8?q?style(kitchen=20pos)=20:=20import=20?= =?UTF-8?q?=EB=AC=B8=20=EC=B5=9C=EC=A0=81=ED=99=94=20=EB=B0=8F=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../external/DefaultPurgomalumClient.java | 3 +- .../menu/application/MenuGroupService.java | 7 ++--- .../menu/application/MenuService.java | 24 ++++++++------ .../menu/domain/model/MenuGroupName.java | 13 ++++---- .../model/MenuGroupNameCreationService.java | 4 +-- .../menu/domain/model/MenuName.java | 5 ++- .../domain/model/MenuNameCreationService.java | 4 +-- .../menu/domain/model/MenuPrice.java | 5 ++- .../menu/domain/model/MenuProduct.java | 15 +++++++-- .../domain/model/MenuProductQuantity.java | 13 ++++---- .../repository/MenuGroupRepository.java | 3 +- .../domain/repository/MenuRepository.java | 3 +- .../menu/domain/service/MarginValidator.java | 5 ++- .../domain/service/MenuProductValidator.java | 3 +- .../persistence/JpaMenuGroupRepository.java | 3 +- .../infra/persistence/JpaMenuRepository.java | 5 ++- .../menu/ui/MenuGroupRestController.java | 11 ++++--- .../menu/ui/MenuRestController.java | 15 ++++++--- .../common/application/OrderService.java | 11 ++++--- .../infra/persistence/JpaOrderRepository.java | 3 +- .../persistence/JpaOrderTableRepository.java | 3 +- .../kitchenpos/order/common/model/Order.java | 16 ++++++++-- .../order/common/model/OrderLineItem.java | 20 +++++++++--- .../common/repository/OrderRepository.java | 7 ++--- .../order/common/ui/OrderRestController.java | 15 ++++++--- .../infra/adaptor/RiderAdaptor.java | 3 +- .../external/DefaultKitchenridersClient.java | 3 +- .../domain/model/EatInOrderFlow.java | 14 ++++----- .../domain/model/OrderTableName.java | 9 +++--- .../repository/EatInOrderRepository.java | 7 ++--- .../repository/OrderTableRepository.java | 3 +- .../persistence/JpaEatInOrderRepository.java | 3 +- .../ui/EatInOrderRestController.java | 15 ++++++--- .../ui/OrderTableRestController.java | 15 ++++++--- .../product/application/ProductService.java | 9 +++--- .../product/domain/model/ProductName.java | 5 ++- .../model/ProductNameCreationService.java | 4 +-- .../product/domain/model/ProductPrice.java | 5 ++- .../domain/repository/ProductRepository.java | 3 +- .../persistence/JpaProductRepository.java | 3 +- .../product/ui/ProductRestController.java | 15 ++++++--- .../java/kitchenpos/TestFixtureFactory.java | 8 ++--- .../application/MenuGroupServiceTest.java | 20 ++++++------ .../menu/application/MenuServiceTest.java | 22 ++++++------- .../MenuGroupNameCreationServiceTest.java | 4 +-- .../menu/domain/model/MenuGroupNameTest.java | 4 +-- .../model/MenuNameCreationServiceTest.java | 4 +-- .../menu/domain/model/MenuNameTest.java | 4 +-- .../menu/domain/model/MenuPriceTest.java | 23 +++++++------- .../domain/model/MenuProductQuantityTest.java | 6 ++-- .../menu/domain/model/MenuTest.java | 31 +++++++++---------- .../domain/service/MarginValidatorTest.java | 15 ++++----- .../persistence/FakeMenuGroupRepository.java | 7 +++-- .../infra/persistence/FakeMenuRepository.java | 7 +++-- .../menu/ui/MenuGroupRestControllerTest.java | 13 +++++--- .../menu/ui/MenuRestControllerTest.java | 25 ++++++++------- .../common/application/OrderServiceTest.java | 29 ++++++++++------- .../order/common/model/OrderLineItemTest.java | 8 ++--- .../common/ui/OrderRestControllerTest.java | 17 +++++++--- .../application/OrderTableServiceTest.java | 30 +++++++++--------- .../domain/model/EatInOrderFactoryTest.java | 2 +- .../domain/model/EatInOrderFlowTest.java | 31 +++++++++---------- .../domain/model/EatInOrderTest.java | 8 ++--- .../domain/model/OrderTableNameTest.java | 6 ++-- .../domain/model/OrderTableTest.java | 8 ++--- .../OrderTableOccupationManagerTest.java | 1 - .../ui/EatInOrderRestControllerTest.java | 24 ++++++++------ .../ui/OrderTableRestControllerTest.java | 10 ++++-- .../application/ProductServiceTest.java | 21 ++++++------- .../model/ProductNameCreationServiceTest.java | 4 +-- .../product/domain/model/ProductNameTest.java | 4 +-- .../domain/model/ProductPriceTest.java | 23 +++++++------- .../persistence/FakeProductRepository.java | 7 +++-- .../product/ui/ProductRestControllerTest.java | 15 ++++----- 74 files changed, 423 insertions(+), 350 deletions(-) diff --git a/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java index f409428a5..a4d421c88 100644 --- a/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java @@ -1,13 +1,12 @@ package kitchenpos.common.infra.external; +import java.net.URI; import kitchenpos.common.application.PurgomalumClient; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import java.net.URI; - @Component public class DefaultPurgomalumClient implements PurgomalumClient { private final RestTemplate restTemplate; diff --git a/src/main/java/kitchenpos/menu/application/MenuGroupService.java b/src/main/java/kitchenpos/menu/application/MenuGroupService.java index c48b60453..0385b6666 100644 --- a/src/main/java/kitchenpos/menu/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menu/application/MenuGroupService.java @@ -1,5 +1,6 @@ package kitchenpos.menu.application; +import java.util.List; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuGroupName; import kitchenpos.menu.domain.model.MenuGroupNameCreationService; @@ -7,15 +8,13 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.UUID; - @Service public class MenuGroupService { private final MenuGroupRepository menuGroupRepository; private final MenuGroupNameCreationService menuGroupNameCreationService; - public MenuGroupService(final MenuGroupRepository menuGroupRepository, MenuGroupNameCreationService menuGroupNameCreationService) { + public MenuGroupService(final MenuGroupRepository menuGroupRepository, + MenuGroupNameCreationService menuGroupNameCreationService) { this.menuGroupRepository = menuGroupRepository; this.menuGroupNameCreationService = menuGroupNameCreationService; } diff --git a/src/main/java/kitchenpos/menu/application/MenuService.java b/src/main/java/kitchenpos/menu/application/MenuService.java index cdea280fd..a79f13455 100644 --- a/src/main/java/kitchenpos/menu/application/MenuService.java +++ b/src/main/java/kitchenpos/menu/application/MenuService.java @@ -1,6 +1,18 @@ package kitchenpos.menu.application; -import kitchenpos.menu.domain.model.*; +import static kitchenpos.menu.exception.MenuExceptionMessage.NONE_MARGIN_EXCEPTION; + +import java.math.BigDecimal; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuName; +import kitchenpos.menu.domain.model.MenuNameCreationService; +import kitchenpos.menu.domain.model.MenuPrice; +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.menu.domain.model.MenuProductQuantity; import kitchenpos.menu.domain.repository.MenuGroupRepository; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.menu.domain.service.MarginValidator; @@ -10,13 +22,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; - -import static kitchenpos.menu.exception.MenuExceptionMessage.NONE_MARGIN_EXCEPTION; - @Service public class MenuService { private final MenuRepository menuRepository; @@ -55,7 +60,8 @@ public Menu create(final Menu request) { final String name = request.getInnerName(); MenuName menuName = menuNameCreationService.createName(name); - final Menu menu = new Menu(menuName, new MenuPrice(price), menuGroup, request.isDisplayed(), menuProducts, menuGroup.getId()); + final Menu menu = new Menu(menuName, new MenuPrice(price), menuGroup, request.isDisplayed(), menuProducts, + menuGroup.getId()); validateMargin(menu); return menuRepository.save(menu); diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java index 0ea292f6f..22a309f26 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java @@ -1,14 +1,13 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; - @Embeddable public class MenuGroupName { @Column(name = "name", nullable = false) @@ -20,16 +19,16 @@ protected MenuGroupName(String value) { this.value = value; } + protected MenuGroupName() { + this.value = null; + } + private void validateMenuGroupName(String value) { if (Objects.isNull(value) || value.isEmpty()) { throw new IllegalArgumentException(MENU_CATEGORY_NAME_CREATION_EXCEPTION.getMessage()); } } - protected MenuGroupName() { - this.value = null; - } - @JsonValue public String getValue() { return value; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java index bf1db1139..8b66c6ec1 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java @@ -1,10 +1,10 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_NAME_VALIDATION_EXCEPTION; + import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_NAME_VALIDATION_EXCEPTION; - @Service public class MenuGroupNameCreationService { private final PurgomalumClient purgomalumClient; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuName.java b/src/main/java/kitchenpos/menu/domain/model/MenuName.java index 8cf9ab92c..90954dc8a 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuName.java @@ -1,14 +1,13 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; - @Embeddable public class MenuName { @Column(name = "name", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java b/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java index e62aca753..1b49f1dff 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java @@ -1,10 +1,10 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_VALIDATION_EXCEPTION; + import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_VALIDATION_EXCEPTION; - @Service public class MenuNameCreationService { private final PurgomalumClient purgomalumClient; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java index 89b7193d3..67ecd2c08 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java @@ -1,15 +1,14 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRICE_CREATION_EXCEPTION; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.math.BigDecimal; import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRICE_CREATION_EXCEPTION; - @Embeddable public class MenuPrice { @Column(name = "price", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java index 32381f96f..09e095bb1 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java @@ -1,9 +1,18 @@ package kitchenpos.menu.domain.model; -import jakarta.persistence.*; -import kitchenpos.product.domain.model.Product; - +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import java.util.UUID; +import kitchenpos.product.domain.model.Product; @Table(name = "menu_product") @Entity diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java index ae3e47dfb..036686f83 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java @@ -1,14 +1,13 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; - @Embeddable public class MenuProductQuantity { @Column(name = "quantity", nullable = false) @@ -20,16 +19,16 @@ public MenuProductQuantity(long value) { this.value = value; } + protected MenuProductQuantity() { + this.value = null; + } + private void validateMenuProductQuantity(long value) { if (value <= 0) { throw new IllegalArgumentException(MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION.getMessage()); } } - protected MenuProductQuantity() { - this.value = null; - } - @JsonValue public Long getValue() { return value; diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java index 672d57be1..cfb05d515 100644 --- a/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java @@ -1,10 +1,9 @@ package kitchenpos.menu.domain.repository; -import kitchenpos.menu.domain.model.MenuGroup; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.menu.domain.model.MenuGroup; public interface MenuGroupRepository { MenuGroup save(MenuGroup menuGroup); diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java index 9c9c73489..f83243f3d 100644 --- a/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java @@ -1,10 +1,9 @@ package kitchenpos.menu.domain.repository; -import kitchenpos.menu.domain.model.Menu; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; public interface MenuRepository { Menu save(Menu menu); diff --git a/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java b/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java index 17698484f..b4bc47931 100644 --- a/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java +++ b/src/main/java/kitchenpos/menu/domain/service/MarginValidator.java @@ -1,14 +1,13 @@ package kitchenpos.menu.domain.service; +import java.math.BigDecimal; +import java.util.List; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuProduct; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.product.domain.model.Product; import org.springframework.stereotype.Service; -import java.math.BigDecimal; -import java.util.List; - @Service public class MarginValidator { diff --git a/src/main/java/kitchenpos/menu/domain/service/MenuProductValidator.java b/src/main/java/kitchenpos/menu/domain/service/MenuProductValidator.java index adce2949f..060b1a5c7 100644 --- a/src/main/java/kitchenpos/menu/domain/service/MenuProductValidator.java +++ b/src/main/java/kitchenpos/menu/domain/service/MenuProductValidator.java @@ -1,12 +1,11 @@ package kitchenpos.menu.domain.service; +import java.util.List; import kitchenpos.menu.domain.model.MenuProduct; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.springframework.stereotype.Service; -import java.util.List; - @Service public class MenuProductValidator { private static final String MENU_PRODUCT_VALIDATION_EXCEPTION = "메뉴 상품에 들어갈 상품 수와 실제 상품 수가 다릅니다!"; diff --git a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java index 4b4e02a61..13d3e1fdb 100644 --- a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java @@ -1,10 +1,9 @@ package kitchenpos.menu.infra.persistence; +import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - public interface JpaMenuGroupRepository extends MenuGroupRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java index 451b0148d..9f9ec4437 100644 --- a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java @@ -1,14 +1,13 @@ package kitchenpos.menu.infra.persistence; +import java.util.List; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.util.List; -import java.util.UUID; - public interface JpaMenuRepository extends MenuRepository, JpaRepository { @Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId") @Override diff --git a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java index e94edeb35..bc89f2359 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java @@ -1,12 +1,15 @@ package kitchenpos.menu.ui; +import java.net.URI; +import java.util.List; import kitchenpos.menu.application.MenuGroupService; import kitchenpos.menu.domain.model.MenuGroup; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.net.URI; -import java.util.List; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/menu-groups") @RestController diff --git a/src/main/java/kitchenpos/menu/ui/MenuRestController.java b/src/main/java/kitchenpos/menu/ui/MenuRestController.java index e3105012c..f0d7c8f41 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuRestController.java @@ -1,13 +1,18 @@ package kitchenpos.menu.ui; -import kitchenpos.menu.application.MenuService; -import kitchenpos.menu.domain.model.Menu; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - import java.net.URI; import java.util.List; import java.util.UUID; +import kitchenpos.menu.application.MenuService; +import kitchenpos.menu.domain.model.Menu; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/menus") @RestController diff --git a/src/main/java/kitchenpos/order/common/application/OrderService.java b/src/main/java/kitchenpos/order/common/application/OrderService.java index 8fe986a59..88994b97d 100644 --- a/src/main/java/kitchenpos/order/common/application/OrderService.java +++ b/src/main/java/kitchenpos/order/common/application/OrderService.java @@ -1,5 +1,12 @@ package kitchenpos.order.common.application; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.Order; @@ -13,10 +20,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.*; - @Service public class OrderService { private final OrderRepository orderRepository; diff --git a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java index 1ede0e32b..22b55e7a9 100644 --- a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java +++ b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java @@ -1,10 +1,9 @@ package kitchenpos.order.common.infra.persistence; +import java.util.UUID; import kitchenpos.order.common.model.Order; import kitchenpos.order.common.repository.OrderRepository; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - public interface JpaOrderRepository extends OrderRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java index 33a42afb5..975ca8c6c 100644 --- a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java @@ -1,10 +1,9 @@ package kitchenpos.order.common.infra.persistence; +import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - public interface JpaOrderTableRepository extends OrderTableRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/order/common/model/Order.java b/src/main/java/kitchenpos/order/common/model/Order.java index 567da0207..fb29c3bc2 100644 --- a/src/main/java/kitchenpos/order/common/model/Order.java +++ b/src/main/java/kitchenpos/order/common/model/Order.java @@ -1,11 +1,21 @@ package kitchenpos.order.common.model; -import jakarta.persistence.*; -import kitchenpos.order.eatinorder.domain.model.OrderTable; - +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; @Table(name = "orders") @Entity diff --git a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java index 2d3fbb73e..38fc23846 100644 --- a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java +++ b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java @@ -1,12 +1,22 @@ package kitchenpos.order.common.model; -import jakarta.persistence.*; -import kitchenpos.menu.domain.model.Menu; - +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_MENU_DISPLAY_EXCEPTION; +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_PRICE_EXCEPTION; +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_QUANTITY_EXCEPTION; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import java.math.BigDecimal; import java.util.UUID; - -import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.*; +import kitchenpos.menu.domain.model.Menu; @Table(name = "order_line_item") @Entity diff --git a/src/main/java/kitchenpos/order/common/repository/OrderRepository.java b/src/main/java/kitchenpos/order/common/repository/OrderRepository.java index b8f156360..843816c3c 100644 --- a/src/main/java/kitchenpos/order/common/repository/OrderRepository.java +++ b/src/main/java/kitchenpos/order/common/repository/OrderRepository.java @@ -1,12 +1,11 @@ package kitchenpos.order.common.repository; -import kitchenpos.order.common.model.Order; -import kitchenpos.order.common.model.OrderStatus; -import kitchenpos.order.eatinorder.domain.model.OrderTable; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.eatinorder.domain.model.OrderTable; public interface OrderRepository { Order save(Order order); diff --git a/src/main/java/kitchenpos/order/common/ui/OrderRestController.java b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java index 365952ffe..7fa233224 100644 --- a/src/main/java/kitchenpos/order/common/ui/OrderRestController.java +++ b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java @@ -1,13 +1,18 @@ package kitchenpos.order.common.ui; -import kitchenpos.order.common.application.OrderService; -import kitchenpos.order.common.model.Order; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - import java.net.URI; import java.util.List; import java.util.UUID; +import kitchenpos.order.common.application.OrderService; +import kitchenpos.order.common.model.Order; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/orders") @RestController diff --git a/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java b/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java index 3eebc04b4..faf88dabd 100644 --- a/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java @@ -1,11 +1,10 @@ package kitchenpos.order.deliveryorder.infra.adaptor; +import java.math.BigDecimal; import kitchenpos.order.deliveryorder.domain.model.DeliveryOrder; import kitchenpos.order.deliveryorder.domain.port.RiderPort; import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; -import java.math.BigDecimal; - public class RiderAdaptor implements RiderPort { private KitchenridersClient kitchenridersClient; diff --git a/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java b/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java index 276ad9840..580d076a1 100644 --- a/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java @@ -1,9 +1,8 @@ package kitchenpos.order.deliveryorder.infra.external; -import org.springframework.stereotype.Component; - import java.math.BigDecimal; import java.util.UUID; +import org.springframework.stereotype.Component; @Component public class DefaultKitchenridersClient implements KitchenridersClient { diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java index b0ca26fa8..84c3dfa74 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java @@ -1,9 +1,9 @@ package kitchenpos.order.eatinorder.domain.model; -import java.util.Arrays; - import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION; +import java.util.Arrays; + public enum EatInOrderFlow { WAITING(EatInOrderStatus.NONE), ACCEPTED(EatInOrderStatus.WAITING), @@ -16,15 +16,15 @@ public enum EatInOrderFlow { this.previousOrderStatus = previousOrderStatus; } - public boolean validateOrderStatus(EatInOrderStatus nextOrderStatus) { - EatInOrderFlow nextOrderFlow = findByOrderStatus(nextOrderStatus); - return this.name().equals(nextOrderFlow.previousOrderStatus.name()); - } - public static EatInOrderFlow findByOrderStatus(EatInOrderStatus nextOrderStatus) { return Arrays.stream(values()) .filter(flow -> flow.name().equals(nextOrderStatus.name())) .findFirst() .orElseThrow(() -> new IllegalArgumentException(EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION.getMessage())); } + + public boolean validateOrderStatus(EatInOrderStatus nextOrderStatus) { + EatInOrderFlow nextOrderFlow = findByOrderStatus(nextOrderStatus); + return this.name().equals(nextOrderFlow.previousOrderStatus.name()); + } } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java index daa327fdd..8626c018c 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/OrderTableName.java @@ -1,12 +1,11 @@ package kitchenpos.order.eatinorder.domain.model; +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.ORDER_TABLE_NAME_CREATION_EXCEPTION; + import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.ORDER_TABLE_NAME_CREATION_EXCEPTION; - @Embeddable public class OrderTableName { @@ -34,7 +33,9 @@ public String getValue() { @Override public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; + if (o == null || getClass() != o.getClass()) { + return false; + } OrderTableName that = (OrderTableName) o; return Objects.equals(value, that.value); } diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java b/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java index 54e9ca611..294fbaa77 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/repository/EatInOrderRepository.java @@ -1,12 +1,11 @@ package kitchenpos.order.eatinorder.domain.repository; -import kitchenpos.order.eatinorder.domain.model.EatInOrder; -import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; -import kitchenpos.order.eatinorder.domain.model.OrderTable; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; +import kitchenpos.order.eatinorder.domain.model.OrderTable; public interface EatInOrderRepository { Optional findById(UUID eatInOrderId); diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java b/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java index f2f2a36b9..86a420535 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java @@ -1,10 +1,9 @@ package kitchenpos.order.eatinorder.domain.repository; -import kitchenpos.order.eatinorder.domain.model.OrderTable; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; public interface OrderTableRepository { OrderTable save(OrderTable orderTable); diff --git a/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java b/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java index f3af44d10..6444e1ca8 100644 --- a/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/infra/persistence/JpaEatInOrderRepository.java @@ -1,10 +1,9 @@ package kitchenpos.order.eatinorder.infra.persistence; +import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - public interface JpaEatInOrderRepository extends EatInOrderRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java index 789209c0f..d2b8da7df 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java @@ -1,13 +1,18 @@ package kitchenpos.order.eatinorder.ui; -import kitchenpos.order.eatinorder.domain.model.EatInOrder; -import kitchenpos.order.eatinorder.service.EatInOrderService; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - import java.net.URI; import java.util.List; import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.service.EatInOrderService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/eatInOrder") @RestController diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java index 07f959b5b..ca215b771 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java @@ -1,13 +1,18 @@ package kitchenpos.order.eatinorder.ui; -import kitchenpos.order.eatinorder.application.OrderTableService; -import kitchenpos.order.eatinorder.domain.model.OrderTable; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - import java.net.URI; import java.util.List; import java.util.UUID; +import kitchenpos.order.eatinorder.application.OrderTableService; +import kitchenpos.order.eatinorder.domain.model.OrderTable; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/order-tables") @RestController diff --git a/src/main/java/kitchenpos/product/application/ProductService.java b/src/main/java/kitchenpos/product/application/ProductService.java index b7982fe79..140e5e886 100644 --- a/src/main/java/kitchenpos/product/application/ProductService.java +++ b/src/main/java/kitchenpos/product/application/ProductService.java @@ -1,5 +1,9 @@ package kitchenpos.product.application; +import java.math.BigDecimal; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; import kitchenpos.menu.domain.service.MarginValidator; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.model.ProductName; @@ -9,11 +13,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; - @Service public class ProductService { private final ProductRepository productRepository; diff --git a/src/main/java/kitchenpos/product/domain/model/ProductName.java b/src/main/java/kitchenpos/product/domain/model/ProductName.java index 5b92e20de..d5d42dc7c 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductName.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductName.java @@ -1,12 +1,11 @@ package kitchenpos.product.domain.model; +import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_NAME_CREATION_EXCEPTION; + import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_NAME_CREATION_EXCEPTION; - @Embeddable public class ProductName { @Column(name = "name", nullable = false) diff --git a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java index b31fff18e..c32098139 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java @@ -1,10 +1,10 @@ package kitchenpos.product.domain.model; +import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_NAME_VALIDATION_EXCEPTION; + import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; -import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_NAME_VALIDATION_EXCEPTION; - @Service public class ProductNameCreationService { private final PurgomalumClient purgomalumClient; diff --git a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java index 8792d99a5..137a63621 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java @@ -1,13 +1,12 @@ package kitchenpos.product.domain.model; +import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_PRICE_CREATION_EXCEPTION; + import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.math.BigDecimal; import java.util.Objects; -import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_PRICE_CREATION_EXCEPTION; - @Embeddable public class ProductPrice { @Column(name = "price", nullable = false) diff --git a/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java b/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java index f619bbcb0..b54094985 100644 --- a/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java +++ b/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java @@ -1,10 +1,9 @@ package kitchenpos.product.domain.repository; -import kitchenpos.product.domain.model.Product; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.product.domain.model.Product; public interface ProductRepository { Product save(Product product); diff --git a/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java index ffbf2c003..a519bd5b2 100644 --- a/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java +++ b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java @@ -1,10 +1,9 @@ package kitchenpos.product.infra.persistence; +import java.util.UUID; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - public interface JpaProductRepository extends ProductRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/product/ui/ProductRestController.java b/src/main/java/kitchenpos/product/ui/ProductRestController.java index 5cd8b4f26..c5f061243 100644 --- a/src/main/java/kitchenpos/product/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/product/ui/ProductRestController.java @@ -1,13 +1,18 @@ package kitchenpos.product.ui; -import kitchenpos.product.application.ProductService; -import kitchenpos.product.domain.model.Product; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - import java.net.URI; import java.util.List; import java.util.UUID; +import kitchenpos.product.application.ProductService; +import kitchenpos.product.domain.model.Product; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/products") @RestController diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 6a7c996dd..90ffb7848 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -1,5 +1,8 @@ package kitchenpos; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; @@ -17,11 +20,6 @@ import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.product.domain.model.ProductPrice; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.UUID; - public class TestFixtureFactory { public static MenuGroup createMenuGroup() { diff --git a/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java index 254f86806..8476f9f91 100644 --- a/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java @@ -1,5 +1,14 @@ package kitchenpos.menu.application; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.List; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuGroupNameCreationService; @@ -10,14 +19,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - class MenuGroupServiceTest { private MenuGroupService menuGroupService; @@ -26,7 +27,8 @@ class MenuGroupServiceTest { @BeforeEach void setUp() { menuGroupRepository = mock(MenuGroupRepository.class); - MenuGroupNameCreationService menuGroupNameCreationService = new MenuGroupNameCreationService(new FakePurgomalumClient()); + MenuGroupNameCreationService menuGroupNameCreationService = new MenuGroupNameCreationService( + new FakePurgomalumClient()); menuGroupService = new MenuGroupService(menuGroupRepository, menuGroupNameCreationService); } diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index abc885619..e6cabcd38 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -1,5 +1,14 @@ package kitchenpos.menu.application; +import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.NoSuchElementException; import kitchenpos.common.application.PurgomalumClient; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; @@ -21,16 +30,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.List; -import java.util.NoSuchElementException; - -import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class MenuServiceTest { private MenuService menuService; @@ -48,7 +47,8 @@ void setUp() { MarginValidator marginValidator = new MarginValidator(menuRepository); MenuProductValidator menuProductValidator = new MenuProductValidator(productRepository); MenuNameCreationService menuNameCreationService = new MenuNameCreationService(purgomalumClient); - menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, marginValidator, menuProductValidator, menuNameCreationService); + menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, marginValidator, + menuProductValidator, menuNameCreationService); } @Test diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameCreationServiceTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameCreationServiceTest.java index 98b07175b..9e99b9d05 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameCreationServiceTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameCreationServiceTest.java @@ -1,13 +1,13 @@ package kitchenpos.menu.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import kitchenpos.common.application.PurgomalumClient; import kitchenpos.common.infra.external.FakePurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class MenuGroupNameCreationServiceTest { private MenuGroupNameCreationService menuGroupNameCreationService; diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java index 4067bdea1..a67cd4a8f 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.menu.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class MenuGroupNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuNameCreationServiceTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuNameCreationServiceTest.java index 255149e87..908179d13 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuNameCreationServiceTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuNameCreationServiceTest.java @@ -1,13 +1,13 @@ package kitchenpos.menu.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import kitchenpos.common.application.PurgomalumClient; import kitchenpos.common.infra.external.FakePurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class MenuNameCreationServiceTest { private MenuNameCreationService menuNameCreationService; diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java index 9bdcebae8..9a0e8e68e 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.menu.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class MenuNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java index f4c3b08f7..f4c3961f5 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java @@ -1,16 +1,22 @@ package kitchenpos.menu.domain.model; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.math.BigDecimal; import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; class MenuPriceTest { + private static Stream invalidMenuPriceProvider() { + return Stream.of( + null, + BigDecimal.valueOf(-1) + ); + } + @DisplayName("가격은 비어있거나 null이면 예외가 발생한다") @ParameterizedTest @MethodSource("invalidMenuPriceProvider") @@ -19,11 +25,4 @@ void create_price_exception(BigDecimal value) { .isInstanceOf(IllegalArgumentException.class) .hasMessage("메뉴 가격을 채워주세요!"); } - - private static Stream invalidMenuPriceProvider() { - return Stream.of( - null, - BigDecimal.valueOf(-1) - ); - } } diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java index 166d6b8a1..103dc3daa 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java @@ -1,10 +1,10 @@ package kitchenpos.menu.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class MenuProductQuantityTest { @Test @@ -18,4 +18,4 @@ void create_menu_product_quantity_exception() { .isInstanceOf(IllegalArgumentException.class) .hasMessage("메뉴 상품의 수량은 0보다 커야 합니다!"); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuTest.java index f2f233047..d676661d1 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuTest.java @@ -1,5 +1,13 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.math.BigDecimal; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import java.util.stream.Stream; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.model.ProductName; @@ -10,17 +18,15 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import java.math.BigDecimal; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; -import java.util.stream.Stream; - -import static kitchenpos.TestFixtureFactory.createMenuGroup; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class MenuTest { + private static Stream> invalidMenuProductProvider() { + return Stream.of( + null, + List.of() + ); + } + @Test @DisplayName("메뉴가 생성될 때, 메뉴 그룹이 포함되지 않으면 예외가 발생한다.") void validate_menu_group_exists_exception() { @@ -63,11 +69,4 @@ void validate_menu_products_exists_exception(List menuProducts) { )).isInstanceOf(NoSuchElementException.class) .hasMessage("메뉴 상품이 존재하지 않습니다!"); } - - private static Stream> invalidMenuProductProvider() { - return Stream.of( - null, - List.of() - ); - } } diff --git a/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java b/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java index 058b1965b..6be47b827 100644 --- a/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java +++ b/src/test/java/kitchenpos/menu/domain/service/MarginValidatorTest.java @@ -1,5 +1,13 @@ package kitchenpos.menu.domain.service; +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.menu.infra.persistence.FakeMenuRepository; @@ -8,13 +16,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.UUID; - -import static kitchenpos.TestFixtureFactory.*; -import static org.assertj.core.api.Assertions.assertThat; - class MarginValidatorTest { private MenuRepository menuRepository; diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java index 71055a8a2..0a3bc55b3 100644 --- a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java @@ -1,10 +1,13 @@ package kitchenpos.menu.infra.persistence; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; -import java.util.*; - public class FakeMenuGroupRepository implements MenuGroupRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java index 1f187f058..56b6c4ace 100644 --- a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java @@ -1,10 +1,13 @@ package kitchenpos.menu.infra.persistence; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; -import java.util.*; - public class FakeMenuRepository implements MenuRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java index f6115d1d3..9020080b5 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java @@ -1,5 +1,11 @@ package kitchenpos.menu.ui; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.MenuGroup; @@ -15,10 +21,6 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - @SpringBootTest @AutoConfigureMockMvc class MenuGroupRestControllerTest { @@ -33,7 +35,8 @@ class MenuGroupRestControllerTest { @DisplayName("메뉴 그룹을 생성한다.") void create_success() throws Exception { // given - MenuGroupNameCreationService menuGroupNameCreationService = new MenuGroupNameCreationService(new FakePurgomalumClient()); + MenuGroupNameCreationService menuGroupNameCreationService = new MenuGroupNameCreationService( + new FakePurgomalumClient()); MenuGroup request = new MenuGroup(menuGroupNameCreationService.createName("한식")); // when diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java index a1f3c4e38..54690e079 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -1,6 +1,20 @@ package kitchenpos.menu.ui; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; +import java.math.BigDecimal; +import java.util.List; +import java.util.NoSuchElementException; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuProduct; @@ -18,17 +32,6 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; -import java.util.List; -import java.util.NoSuchElementException; - -import static kitchenpos.TestFixtureFactory.createMenuGroup; -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - @SpringBootTest @AutoConfigureMockMvc @Transactional diff --git a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java index a8fca032d..1bd1ef60f 100644 --- a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java @@ -1,5 +1,23 @@ package kitchenpos.order.common.application; +import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; +import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; +import static kitchenpos.TestFixtureFactory.createOrder; +import static kitchenpos.TestFixtureFactory.createOrderLineItem; +import static kitchenpos.TestFixtureFactory.createOrderWithDeliveryType; +import static kitchenpos.TestFixtureFactory.createOrderWithTakeOutType; +import static kitchenpos.TestFixtureFactory.createUsingOrderTable; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.Order; @@ -16,17 +34,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -import static kitchenpos.TestFixtureFactory.*; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyList; -import static org.mockito.Mockito.*; - class OrderServiceTest { private OrderService orderService; diff --git a/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java b/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java index d52669bbd..7046c1cb0 100644 --- a/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java +++ b/src/test/java/kitchenpos/order/common/model/OrderLineItemTest.java @@ -1,14 +1,12 @@ package kitchenpos.order.common.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.math.BigDecimal; import kitchenpos.menu.domain.model.Menu; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.math.BigDecimal; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class OrderLineItemTest { @Test diff --git a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java index e9d42abe2..d2e69eb01 100644 --- a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java @@ -1,5 +1,18 @@ package kitchenpos.order.common.ui; +import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createOrderLineItem; +import static kitchenpos.TestFixtureFactory.createOrderWithDeliveryType; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; @@ -26,10 +39,6 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; -import static kitchenpos.TestFixtureFactory.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - @SpringBootTest @AutoConfigureMockMvc @Transactional diff --git a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index 6fb53bc62..28eff9e30 100644 --- a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -1,9 +1,21 @@ package kitchenpos.order.eatinorder.application; +import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; +import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createProduct; +import static kitchenpos.TestFixtureFactory.createUsingOrderTable; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import java.math.BigDecimal; import java.util.HashMap; -import kitchenpos.order.common.model.OrderStatus; -import kitchenpos.order.common.repository.OrderRepository; +import java.util.List; +import java.util.Optional; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; @@ -17,20 +29,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import java.util.List; -import java.util.Optional; - -import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; -import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; -import static kitchenpos.TestFixtureFactory.createMenu; -import static kitchenpos.TestFixtureFactory.createMenuGroup; -import static kitchenpos.TestFixtureFactory.createProduct; -import static kitchenpos.TestFixtureFactory.createUsingOrderTable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - class OrderTableServiceTest { private OrderTableService orderTableService; diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactoryTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactoryTest.java index 4ef055f97..97c0e1537 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactoryTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFactoryTest.java @@ -12,8 +12,8 @@ import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.menu.infra.persistence.FakeMenuRepository; -import kitchenpos.order.common.model.OrderLineItemValidator; import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.common.model.OrderLineItemValidator; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.infra.persistence.FakeOrderTableRepository; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java index 506b48f21..151a1313c 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlowTest.java @@ -1,16 +1,28 @@ package kitchenpos.order.eatinorder.domain.model; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; -import java.util.stream.Stream; +class EatInOrderFlowTest { -import static org.assertj.core.api.Assertions.assertThat; + private static Stream provideOrderStatusTransitions() { + return Stream.of( + Arguments.of(EatInOrderFlow.WAITING, EatInOrderStatus.ACCEPTED, true), + Arguments.of(EatInOrderFlow.ACCEPTED, EatInOrderStatus.SERVED, true), + Arguments.of(EatInOrderFlow.SERVED, EatInOrderStatus.COMPLETED, true), -class EatInOrderFlowTest { + Arguments.of(EatInOrderFlow.WAITING, EatInOrderStatus.SERVED, false), + Arguments.of(EatInOrderFlow.WAITING, EatInOrderStatus.COMPLETED, false), + Arguments.of(EatInOrderFlow.ACCEPTED, EatInOrderStatus.COMPLETED, false), + Arguments.of(EatInOrderFlow.SERVED, EatInOrderStatus.ACCEPTED, false) + ); + } @ParameterizedTest @EnumSource(value = EatInOrderStatus.class, names = {"ACCEPTED", "SERVED", "COMPLETED"}) @@ -33,17 +45,4 @@ void validate_eat_in_order_status(EatInOrderFlow currentFlow, EatInOrderStatus n // then assertThat(result).isEqualTo(expected); } - - private static Stream provideOrderStatusTransitions() { - return Stream.of( - Arguments.of(EatInOrderFlow.WAITING, EatInOrderStatus.ACCEPTED, true), - Arguments.of(EatInOrderFlow.ACCEPTED, EatInOrderStatus.SERVED, true), - Arguments.of(EatInOrderFlow.SERVED, EatInOrderStatus.COMPLETED, true), - - Arguments.of(EatInOrderFlow.WAITING, EatInOrderStatus.SERVED, false), - Arguments.of(EatInOrderFlow.WAITING, EatInOrderStatus.COMPLETED, false), - Arguments.of(EatInOrderFlow.ACCEPTED, EatInOrderStatus.COMPLETED, false), - Arguments.of(EatInOrderFlow.SERVED, EatInOrderStatus.ACCEPTED, false) - ); - } } diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java index b48458f9a..29135a81d 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java @@ -1,14 +1,14 @@ package kitchenpos.order.eatinorder.domain.model; -import kitchenpos.menu.domain.model.Menu; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import kitchenpos.menu.domain.model.Menu; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + class EatInOrderTest { @Test diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableNameTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableNameTest.java index 2914aa75b..8f585a096 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableNameTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.order.eatinorder.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class OrderTableNameTest { @ParameterizedTest @@ -18,4 +18,4 @@ void create_order_table_name_exception(String name) { .hasMessage("주문 테이블 이름을 채워주세요!"); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java index 4f2bbb837..f1e2f2f41 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/OrderTableTest.java @@ -1,13 +1,11 @@ package kitchenpos.order.eatinorder.domain.model; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.UUID; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + class OrderTableTest { @Test diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java index 525efab72..89e35e4b1 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManagerTest.java @@ -11,7 +11,6 @@ import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; -import java.util.UUID; import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java index c7749e7d6..72ea17ad0 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java @@ -1,6 +1,21 @@ package kitchenpos.order.eatinorder.ui; +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createOrderLineItem; +import static kitchenpos.TestFixtureFactory.createProduct; +import static kitchenpos.TestFixtureFactory.createUsingOrderTable; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; +import java.time.LocalDateTime; +import java.util.List; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; @@ -23,15 +38,6 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; -import java.util.List; -import java.util.UUID; - -import static kitchenpos.TestFixtureFactory.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - @SpringBootTest @AutoConfigureMockMvc @Transactional diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java index c05a0ff0e..553c4451f 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java @@ -1,5 +1,12 @@ package kitchenpos.order.eatinorder.ui; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; @@ -13,9 +20,6 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - @SpringBootTest @AutoConfigureMockMvc @Transactional diff --git a/src/test/java/kitchenpos/product/application/ProductServiceTest.java b/src/test/java/kitchenpos/product/application/ProductServiceTest.java index e3dbe3bc8..1a06c9903 100644 --- a/src/test/java/kitchenpos/product/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/product/application/ProductServiceTest.java @@ -1,5 +1,15 @@ package kitchenpos.product.application; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Optional; import kitchenpos.TestFixtureFactory; import kitchenpos.common.application.PurgomalumClient; import kitchenpos.menu.domain.model.Menu; @@ -12,17 +22,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.math.BigDecimal; -import java.util.List; -import java.util.Optional; - -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - class ProductServiceTest { private ProductService productService; diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java index 1cfff05b6..1040fbd19 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java @@ -1,13 +1,13 @@ package kitchenpos.product.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import kitchenpos.common.application.PurgomalumClient; import kitchenpos.common.infra.external.FakePurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class ProductNameCreationServiceTest { private ProductNameCreationService productNameCreationService; diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java index 525b5f170..69238f2c8 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.product.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class ProductNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java index dc7e0c15a..25c3da9c3 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java @@ -1,16 +1,22 @@ package kitchenpos.product.domain.model; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.math.BigDecimal; import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; class ProductPriceTest { + private static Stream invalidProductPriceProvider() { + return Stream.of( + null, + BigDecimal.valueOf(-1) + ); + } + @DisplayName("가격은 비어있거나 null이면 예외가 발생한다") @ParameterizedTest @MethodSource("invalidProductPriceProvider") @@ -19,11 +25,4 @@ void create_price_exception(BigDecimal value) { .isInstanceOf(IllegalArgumentException.class) .hasMessage("상품 가격을 채워주세요!"); } - - private static Stream invalidProductPriceProvider() { - return Stream.of( - null, - BigDecimal.valueOf(-1) - ); - } } diff --git a/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java b/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java index 34e2327d9..06aa7523c 100644 --- a/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java +++ b/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java @@ -1,10 +1,13 @@ package kitchenpos.product.infra.persistence; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; -import java.util.*; - public class FakeProductRepository implements ProductRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java index a7e1aa31a..39e98c4eb 100644 --- a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java +++ b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java @@ -1,6 +1,14 @@ package kitchenpos.product.ui; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; +import java.math.BigDecimal; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.junit.jupiter.api.DisplayName; @@ -14,13 +22,6 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; - -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - @SpringBootTest @AutoConfigureMockMvc @Transactional From 25ac259c4d603abe7760f10063e2f7cc9b943dad Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 00:39:15 +0900 Subject: [PATCH 35/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20EatInOrderR?= =?UTF-8?q?estController=20create=20=EB=A9=94=EC=86=8C=EB=93=9C=20dto=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorder/service/EatInOrderService.java | 27 ++++---- .../dto/CreateEatInOrderServiceRq.java | 54 ++++++++++++++++ .../ui/EatInOrderRestController.java | 9 +-- .../eatinorder/ui/dto/CreateEatInOrderRq.java | 64 +++++++++++++++++++ .../java/kitchenpos/TestFixtureFactory.java | 32 ++++++++++ .../service/EatInOrderServiceTest.java | 5 +- .../ui/EatInOrderRestControllerTest.java | 19 ++++-- 7 files changed, 185 insertions(+), 25 deletions(-) create mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateEatInOrderRq.java diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index b9e4fb306..0aab847b9 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -1,6 +1,5 @@ package kitchenpos.order.eatinorder.service; -import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; @@ -11,6 +10,8 @@ import kitchenpos.order.eatinorder.domain.model.EatInOrderFactory; import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; +import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,22 +32,20 @@ public EatInOrderService( } @Transactional - public EatInOrder create(final EatInOrder request) { - final List orderLineItems = toOrderLineItems(request.getOrderLineItems()); + public UUID create(final CreateEatInOrderServiceRq request) { + final List orderLineItems = toOrderLineItems(request.getOrderLineItemDtos()); EatInOrder eatInOrder = eatInOrderFactory.create(orderLineItems, request.getOrderTableId()); - return eatInOrderRepository.save(eatInOrder); + return eatInOrderRepository.save(eatInOrder).getId(); } - private List toOrderLineItems(List request) { - final List orderLineItems = new ArrayList<>(); - for (final OrderLineItem itemRq : request) { - final Menu menu = menuRepository.findById(itemRq.getMenuId()) - .orElseThrow(NoSuchElementException::new); - final OrderLineItem orderLineItem = new OrderLineItem(menu, itemRq.getQuantity(), menu.getId(), - itemRq.getPrice()); - orderLineItems.add(orderLineItem); - } - return orderLineItems; + private List toOrderLineItems(List request) { + return request.stream() + .map(itemRq -> { + final Menu menu = menuRepository.findById(itemRq.getMenuId()) + .orElseThrow(NoSuchElementException::new); + return new OrderLineItem(menu, itemRq.getQuantity(), menu.getId(), itemRq.getPrice()); + }) + .toList(); } @Transactional diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java new file mode 100644 index 000000000..c18978c4e --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java @@ -0,0 +1,54 @@ +package kitchenpos.order.eatinorder.service.dto; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +public class CreateEatInOrderServiceRq { + private List orderLineItemDtos; + private UUID orderTableId; + + public CreateEatInOrderServiceRq(List orderLineItemDtos, UUID orderTableId) { + this.orderLineItemDtos = orderLineItemDtos; + this.orderTableId = orderTableId; + } + + public CreateEatInOrderServiceRq() { + } + + public List getOrderLineItemDtos() { + return orderLineItemDtos; + } + + public UUID getOrderTableId() { + return orderTableId; + } + + public static class OrderLineItemServiceDto { + private UUID menuId; + private long quantity; + private BigDecimal price; + + public OrderLineItemServiceDto(UUID menuId, long quantity, BigDecimal price) { + this.menuId = menuId; + this.quantity = quantity; + this.price = price; + } + + public OrderLineItemServiceDto() { + } + + public UUID getMenuId() { + return menuId; + } + + public long getQuantity() { + return quantity; + } + + public BigDecimal getPrice() { + return price; + } + } + +} diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java index d2b8da7df..f6c324d38 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java @@ -5,6 +5,7 @@ import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.service.EatInOrderService; +import kitchenpos.order.eatinorder.ui.dto.CreateEatInOrderRq; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -24,10 +25,10 @@ public EatInOrderRestController(final EatInOrderService eatInOrderService) { } @PostMapping - public ResponseEntity create(@RequestBody final EatInOrder request) { - final EatInOrder response = eatInOrderService.create(request); - return ResponseEntity.created(URI.create("/api/orders/" + response.getId())) - .body(response); + public ResponseEntity create(@RequestBody final CreateEatInOrderRq request) { + final UUID eatInOrderId = eatInOrderService.create(request.createServiceRq()); + return ResponseEntity.created(URI.create("/api/orders/" + eatInOrderId)) + .body(eatInOrderId); } @PutMapping("/{eatInOrderId}/accept") diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateEatInOrderRq.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateEatInOrderRq.java new file mode 100644 index 000000000..cbdf1b060 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateEatInOrderRq.java @@ -0,0 +1,64 @@ +package kitchenpos.order.eatinorder.ui.dto; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; +import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; + +public class CreateEatInOrderRq { + private List orderLineItemDtos; + private UUID orderTableId; + + public CreateEatInOrderRq(List orderLineItemDtos, UUID orderTableId) { + this.orderLineItemDtos = orderLineItemDtos; + this.orderTableId = orderTableId; + } + + public CreateEatInOrderRq() { + } + + public List getOrderLineItemDtos() { + return orderLineItemDtos; + } + + public UUID getOrderTableId() { + return orderTableId; + } + + public CreateEatInOrderServiceRq createServiceRq() { + return new CreateEatInOrderServiceRq( + this.orderLineItemDtos.stream() + .map(o -> new OrderLineItemServiceDto(o.menuId, o.quantity, o.price)) + .toList(), + orderTableId + ); + } + + public static class OrderLineItemDto { + private UUID menuId; + private long quantity; + private BigDecimal price; + + public OrderLineItemDto(UUID menuId, long quantity, BigDecimal price) { + this.menuId = menuId; + this.quantity = quantity; + this.price = price; + } + + public OrderLineItemDto() { + } + + public UUID getMenuId() { + return menuId; + } + + public long getQuantity() { + return quantity; + } + + public BigDecimal getPrice() { + return price; + } + } +} diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 90ffb7848..928e7d917 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -1,8 +1,11 @@ package kitchenpos; +import static org.hamcrest.text.MatchesPattern.matchesPattern; + import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; +import java.util.UUID; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; @@ -15,10 +18,16 @@ import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; +import kitchenpos.order.eatinorder.ui.dto.CreateEatInOrderRq; +import kitchenpos.order.eatinorder.ui.dto.CreateEatInOrderRq.OrderLineItemDto; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.model.ProductName; import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.product.domain.model.ProductPrice; +import org.hamcrest.Matcher; +import org.jetbrains.annotations.NotNull; public class TestFixtureFactory { @@ -124,4 +133,27 @@ public static EatInOrder createEatInOrderRequestWithEmptyTable(Menu menu, return new EatInOrder(LocalDateTime.now(), List.of(new OrderLineItem(menu, 1, menu.getId(), BigDecimal.valueOf(8000))), eatInOrderFlow); } + + public static CreateEatInOrderServiceRq createEatInOrderServiceRq(Menu menu, UUID orderTableId) { + return new CreateEatInOrderServiceRq( + List.of(new OrderLineItemServiceDto(menu.getId(), 1, BigDecimal.valueOf(8000))), orderTableId); + } + + public static CreateEatInOrderRq createEatInOrderRq(Menu menu, UUID orderTableId) { + return new CreateEatInOrderRq( + List.of(new OrderLineItemDto(menu.getId(), 1, BigDecimal.valueOf(8000))), orderTableId); + } + + public static CreateEatInOrderRq createEatInOrderRq(List menuIds, UUID orderTableId) { + return new CreateEatInOrderRq( + menuIds.stream() + .map(id -> new OrderLineItemDto(id, 2, BigDecimal.valueOf(8000))) + .toList(), + orderTableId); + } + + public static @NotNull Matcher matchUUID() { + return matchesPattern( + "\"[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\""); + } } diff --git a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java index a2e0bb5f9..e93a55a45 100644 --- a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java @@ -1,6 +1,7 @@ package kitchenpos.order.eatinorder.service; import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; +import static kitchenpos.TestFixtureFactory.createEatInOrderServiceRq; import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; import static kitchenpos.TestFixtureFactory.createUsingOrderTable; @@ -24,6 +25,7 @@ import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; +import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -60,7 +62,8 @@ void not_occupied_table_order_exception() { // given Menu menu = createMenuWithProductAndGroup(); OrderTable orderTable = createEmptyOrderTable(); - EatInOrder request = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.WAITING); + + CreateEatInOrderServiceRq request = createEatInOrderServiceRq(menu, orderTable.getId()); when(menuRepository.findAllByIdIn(anyList())).thenReturn(List.of(menu)); when(menuRepository.findById(any())).thenReturn(Optional.of(menu)); diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java index 72ea17ad0..28c5f3879 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java @@ -1,14 +1,16 @@ package kitchenpos.order.eatinorder.ui; +import static kitchenpos.TestFixtureFactory.createEatInOrderRq; import static kitchenpos.TestFixtureFactory.createMenu; import static kitchenpos.TestFixtureFactory.createMenuGroup; import static kitchenpos.TestFixtureFactory.createOrderLineItem; import static kitchenpos.TestFixtureFactory.createProduct; import static kitchenpos.TestFixtureFactory.createUsingOrderTable; +import static kitchenpos.TestFixtureFactory.matchUUID; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -16,6 +18,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import java.time.LocalDateTime; import java.util.List; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; @@ -26,6 +29,7 @@ import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.ui.dto.CreateEatInOrderRq; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.junit.jupiter.api.DisplayName; @@ -64,7 +68,12 @@ class EatInOrderRestControllerTest { @DisplayName("주문을 생성한다.") void create_success() throws Exception { // given - EatInOrder request = createEatInOrderRequest(); + Menu menu1 = createAndSaveMenu(createAndSaveMenuGroup(), createAndSaveProduct()); + Menu menu2 = createAndSaveMenu(createAndSaveMenuGroup(), createAndSaveProduct()); + OrderTable orderTable = createAndSaveUsingOrderTable(); + + List menuIds = List.of(menu1.getId(), menu2.getId()); + CreateEatInOrderRq request = createEatInOrderRq(menuIds, orderTable.getId()); // when ResultActions result = mockMvc.perform(post("/api/eatInOrder") @@ -74,10 +83,8 @@ void create_success() throws Exception { // then result.andExpect(status().isCreated()) .andExpect(header().exists("Location")) - .andExpect(jsonPath("$.id").exists()) - .andExpect(jsonPath("$.orderLineItems").isArray()) - .andExpect(jsonPath("$.eatInOrderFlow").value(EatInOrderFlow.WAITING.toString())) - .andDo(print()); + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(content().string(matchUUID())); } @Test From 484d4ccfacd2cb4cfd098040c26b26925bdbf73d Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:14:34 +0900 Subject: [PATCH 36/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20EatInOrderR?= =?UTF-8?q?estController=20create=20=EC=A0=9C=EC=99=B8=20=EB=82=98?= =?UTF-8?q?=EB=A8=B8=EC=A7=80=20=EB=A9=94=EC=86=8C=EB=93=9C=20dto=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorder/service/EatInOrderService.java | 19 +++++++------ .../service/dto/EatInOrderServiceRs.java | 28 +++++++++++++++++++ .../ui/EatInOrderRestController.java | 27 ++++++++++++------ .../order/eatinorder/ui/dto/EatInOrderRs.java | 26 +++++++++++++++++ .../service/EatInOrderServiceTest.java | 26 +++++++++-------- .../ui/EatInOrderRestControllerTest.java | 6 ++-- 6 files changed, 100 insertions(+), 32 deletions(-) create mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index 0aab847b9..2289236d3 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -12,6 +12,7 @@ import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq; import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; +import kitchenpos.order.eatinorder.service.dto.EatInOrderServiceRs; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -49,32 +50,34 @@ private List toOrderLineItems(List reque } @Transactional - public EatInOrder accept(final UUID orderId) { + public EatInOrderServiceRs accept(final UUID orderId) { final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); eatInOrder.processOrderFlow(EatInOrderStatus.ACCEPTED); - return eatInOrder; + return new EatInOrderServiceRs(eatInOrder); } @Transactional - public EatInOrder serve(final UUID orderId) { + public EatInOrderServiceRs serve(final UUID orderId) { final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); eatInOrder.processOrderFlow(EatInOrderStatus.SERVED); - return eatInOrder; + return new EatInOrderServiceRs(eatInOrder); } @Transactional - public EatInOrder complete(final UUID orderId) { + public EatInOrderServiceRs complete(final UUID orderId) { final EatInOrder eatInOrder = eatInOrderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); eatInOrder.processOrderFlow(EatInOrderStatus.COMPLETED); - return eatInOrder; + return new EatInOrderServiceRs(eatInOrder); } @Transactional(readOnly = true) - public List findAll() { - return eatInOrderRepository.findAll(); + public List findAll() { + return eatInOrderRepository.findAll().stream() + .map(EatInOrderServiceRs::new) + .toList(); } } diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java new file mode 100644 index 000000000..74bd1fdba --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java @@ -0,0 +1,28 @@ +package kitchenpos.order.eatinorder.service.dto; + +import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; + +public class EatInOrderServiceRs { + private UUID eatInOrderId; + private EatInOrderFlow eatInOrderFlow; + + public EatInOrderServiceRs(EatInOrder eatInOrder) { + this.eatInOrderId = eatInOrder.getId(); + this.eatInOrderFlow = eatInOrder.getEatInOrderFlow(); + } + + public EatInOrderServiceRs(UUID eatInOrderId, EatInOrderFlow eatInOrderFlow) { + this.eatInOrderId = eatInOrderId; + this.eatInOrderFlow = eatInOrderFlow; + } + + public UUID getEatInOrderId() { + return eatInOrderId; + } + + public EatInOrderFlow getEatInOrderFlow() { + return eatInOrderFlow; + } +} diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java index f6c324d38..64170976d 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java @@ -3,9 +3,10 @@ import java.net.URI; import java.util.List; import java.util.UUID; -import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.service.EatInOrderService; +import kitchenpos.order.eatinorder.service.dto.EatInOrderServiceRs; import kitchenpos.order.eatinorder.ui.dto.CreateEatInOrderRq; +import kitchenpos.order.eatinorder.ui.dto.EatInOrderRs; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -32,22 +33,30 @@ public ResponseEntity create(@RequestBody final CreateEatInOrderRq request } @PutMapping("/{eatInOrderId}/accept") - public ResponseEntity accept(@PathVariable("eatInOrderId") final UUID eatInOrderId) { - return ResponseEntity.ok(eatInOrderService.accept(eatInOrderId)); + public ResponseEntity accept(@PathVariable("eatInOrderId") final UUID eatInOrderId) { + EatInOrderServiceRs response = eatInOrderService.accept(eatInOrderId); + return ResponseEntity.ok(new EatInOrderRs(response)); } @PutMapping("/{eatInOrderId}/serve") - public ResponseEntity serve(@PathVariable("eatInOrderId") final UUID eatInOrderId) { - return ResponseEntity.ok(eatInOrderService.serve(eatInOrderId)); + public ResponseEntity serve(@PathVariable("eatInOrderId") final UUID eatInOrderId) { + EatInOrderServiceRs response = eatInOrderService.serve(eatInOrderId); + return ResponseEntity.ok(new EatInOrderRs(response)); } @PutMapping("/{eatInOrderId}/complete") - public ResponseEntity complete(@PathVariable("eatInOrderId") final UUID eatInOrderId) { - return ResponseEntity.ok(eatInOrderService.complete(eatInOrderId)); + public ResponseEntity complete(@PathVariable("eatInOrderId") final UUID eatInOrderId) { + EatInOrderServiceRs response = eatInOrderService.complete(eatInOrderId); + return ResponseEntity.ok(new EatInOrderRs(response)); } @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok(eatInOrderService.findAll()); + public ResponseEntity> findAll() { + List response = eatInOrderService.findAll(); + return ResponseEntity.ok( + response.stream() + .map(EatInOrderRs::new) + .toList() + ); } } diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java new file mode 100644 index 000000000..9b8927c7f --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java @@ -0,0 +1,26 @@ +package kitchenpos.order.eatinorder.ui.dto; + +import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; +import kitchenpos.order.eatinorder.service.dto.EatInOrderServiceRs; + +public class EatInOrderRs { + private UUID eatInOrderId; + private EatInOrderFlow eatInOrderFlow; + + public EatInOrderRs(EatInOrderServiceRs eatInOrder) { + this.eatInOrderId = eatInOrder.getEatInOrderId(); + this.eatInOrderFlow = eatInOrder.getEatInOrderFlow(); + } + + public EatInOrderRs() { + } + + public UUID getEatInOrderId() { + return eatInOrderId; + } + + public EatInOrderFlow getEatInOrderFlow() { + return eatInOrderFlow; + } +} diff --git a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java index e93a55a45..e51a54459 100644 --- a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java @@ -26,6 +26,7 @@ import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.service.dto.EatInOrderServiceRs; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -83,14 +84,14 @@ void clear_table_with_complete_status() { // given Menu menu = createMenuWithProductAndGroup(); OrderTable orderTable = createUsingOrderTable(); - EatInOrder order = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.SERVED); - order.occupyOrderTable(orderTable); + EatInOrder eatInOrder = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.SERVED); + eatInOrder.occupyOrderTable(orderTable); - when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(order)); + when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(eatInOrder)); when(eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(any(), any())).thenReturn(false); // when - EatInOrder eatInOrder = eatInOrderService.complete(order.getId()); + EatInOrderServiceRs result = eatInOrderService.complete(eatInOrder.getId()); orderTableOccupationManager.release(new ReleaseOrderTableEvent(orderTable)); // then @@ -101,6 +102,7 @@ void clear_table_with_complete_status() { assertThat(orderTable.isOccupied()).isFalse(); assertThat(orderTable.getNumberOfGuests()).isZero(); + assertThat(result.getEatInOrderFlow()).isEqualTo(EatInOrderFlow.COMPLETED); } private List getEvents(EatInOrder eatInOrder) { @@ -133,12 +135,12 @@ void accept_success() { // given Menu menu = createMenuWithProductAndGroup(); OrderTable orderTable = createUsingOrderTable(); - EatInOrder order = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.WAITING); - order.occupyOrderTable(orderTable); - when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(order)); + EatInOrder eatInOrder = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.WAITING); + eatInOrder.occupyOrderTable(orderTable); + when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(eatInOrder)); // when - EatInOrder result = eatInOrderService.accept(order.getId()); + EatInOrderServiceRs result = eatInOrderService.accept(eatInOrder.getId()); // then assertThat(result.getEatInOrderFlow()).isEqualTo(EatInOrderFlow.ACCEPTED); @@ -150,12 +152,12 @@ void complete_order() { // given Menu menu = createMenuWithProductAndGroup(); OrderTable orderTable = createUsingOrderTable(); - EatInOrder order = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.SERVED); - order.occupyOrderTable(orderTable); - when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(order)); + EatInOrder eatInOrder = createEatInOrderRequestWithEmptyTable(menu, EatInOrderFlow.SERVED); + eatInOrder.occupyOrderTable(orderTable); + when(eatInOrderRepository.findById(any())).thenReturn(Optional.of(eatInOrder)); // when - EatInOrder result = eatInOrderService.complete(order.getId()); + EatInOrderServiceRs result = eatInOrderService.complete(eatInOrder.getId()); // then assertThat(result.getEatInOrderFlow()).isEqualTo(EatInOrderFlow.COMPLETED); diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java index 28c5f3879..284c37bf0 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java @@ -98,7 +98,7 @@ void accept_success() throws Exception { // then result.andExpect(status().isOk()) - .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.eatInOrderId").value(savedOrder.getId().toString())) .andExpect(jsonPath("$.eatInOrderFlow").value(EatInOrderFlow.ACCEPTED.toString())); } @@ -113,7 +113,7 @@ void serve_success() throws Exception { // then result.andExpect(status().isOk()) - .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.eatInOrderId").value(savedOrder.getId().toString())) .andExpect(jsonPath("$.eatInOrderFlow").value(EatInOrderFlow.SERVED.toString())); } @@ -128,7 +128,7 @@ void complete_success() throws Exception { // then result.andExpect(status().isOk()) - .andExpect(jsonPath("$.id").value(savedOrder.getId().toString())) + .andExpect(jsonPath("$.eatInOrderId").value(savedOrder.getId().toString())) .andExpect(jsonPath("$.eatInOrderFlow").value(EatInOrderFlow.COMPLETED.toString())); } From d11b48af97d74560ba6c735e7fd1bb1e95fdbce1 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:33:38 +0900 Subject: [PATCH 37/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20OrderTableR?= =?UTF-8?q?estController=20create=20=EB=A9=94=EC=86=8C=EB=93=9C=20dto?= =?UTF-8?q?=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/OrderTableService.java | 10 +++-- .../dto/CreateOrderTableServiceRq.java | 16 +++++++ .../dto/CreateOrderTableServiceRs.java | 41 +++++++++++++++++ .../ui/OrderTableRestController.java | 11 +++-- .../eatinorder/ui/dto/CreateOrderTableRq.java | 16 +++++++ .../eatinorder/ui/dto/CreateOrderTableRs.java | 44 +++++++++++++++++++ .../application/OrderTableServiceTest.java | 23 ++++++---- .../ui/EatInOrderRestControllerTest.java | 11 ----- .../ui/OrderTableRestControllerTest.java | 3 +- 9 files changed, 148 insertions(+), 27 deletions(-) create mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRq.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java diff --git a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index 2d80b20e5..4b6137327 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -8,6 +8,8 @@ import kitchenpos.order.eatinorder.domain.model.ReleaseOrderTableEvent; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; +import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRq; +import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRs; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,10 +25,10 @@ public OrderTableService(final OrderTableRepository orderTableRepository, } @Transactional - public OrderTable create(final OrderTable request) { - final String name = request.getInnerName(); - final OrderTable orderTable = new OrderTable(new OrderTableName(name)); - return orderTableRepository.save(orderTable); + public CreateOrderTableServiceRs create(final CreateOrderTableServiceRq request) { + final String name = request.getName(); + final OrderTable orderTable = orderTableRepository.save(new OrderTable(new OrderTableName(name))); + return new CreateOrderTableServiceRs(orderTable); } @Transactional diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java new file mode 100644 index 000000000..95a7ce918 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java @@ -0,0 +1,16 @@ +package kitchenpos.order.eatinorder.service.dto; + +public class CreateOrderTableServiceRq { + private String name; + + public CreateOrderTableServiceRq(String name) { + this.name = name; + } + + public CreateOrderTableServiceRq() { + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java new file mode 100644 index 000000000..dbdce02da --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java @@ -0,0 +1,41 @@ +package kitchenpos.order.eatinorder.service.dto; + +import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; + +public class CreateOrderTableServiceRs { + private UUID id; + private String name; + private int numberOfGuests; + private boolean occupied; + + public CreateOrderTableServiceRs(UUID id, String name, int numberOfGuests, boolean occupied) { + this.id = id; + this.name = name; + this.numberOfGuests = numberOfGuests; + this.occupied = occupied; + } + + public CreateOrderTableServiceRs(OrderTable orderTable) { + this.id = orderTable.getId(); + this.name = orderTable.getInnerName(); + this.numberOfGuests = orderTable.getNumberOfGuests(); + this.occupied = orderTable.isOccupied(); + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public int getNumberOfGuests() { + return numberOfGuests; + } + + public boolean isOccupied() { + return occupied; + } +} diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java index ca215b771..dc6f5eb85 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java @@ -5,6 +5,10 @@ import java.util.UUID; import kitchenpos.order.eatinorder.application.OrderTableService; import kitchenpos.order.eatinorder.domain.model.OrderTable; +import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRq; +import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRs; +import kitchenpos.order.eatinorder.ui.dto.CreateOrderTableRq; +import kitchenpos.order.eatinorder.ui.dto.CreateOrderTableRs; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -24,10 +28,11 @@ public OrderTableRestController(final OrderTableService orderTableService) { } @PostMapping - public ResponseEntity create(@RequestBody final OrderTable request) { - final OrderTable response = orderTableService.create(request); + public ResponseEntity create(@RequestBody final CreateOrderTableRq request) { + CreateOrderTableServiceRs response = orderTableService.create( + new CreateOrderTableServiceRq(request.getName())); return ResponseEntity.created(URI.create("/api/order-tables/" + response.getId())) - .body(response); + .body(new CreateOrderTableRs(response)); } @PutMapping("/{orderTableId}/sit") diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRq.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRq.java new file mode 100644 index 000000000..27aa61dc5 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRq.java @@ -0,0 +1,16 @@ +package kitchenpos.order.eatinorder.ui.dto; + +public class CreateOrderTableRq { + private String name; + + public CreateOrderTableRq(String name) { + this.name = name; + } + + public CreateOrderTableRq() { + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java new file mode 100644 index 000000000..4c5154fde --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java @@ -0,0 +1,44 @@ +package kitchenpos.order.eatinorder.ui.dto; + +import java.util.UUID; +import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRs; + +public class CreateOrderTableRs { + private UUID id; + private String name; + private int numberOfGuests; + private boolean occupied; + + public CreateOrderTableRs(UUID id, String name, int numberOfGuests, boolean occupied) { + this.id = id; + this.name = name; + this.numberOfGuests = numberOfGuests; + this.occupied = occupied; + } + + public CreateOrderTableRs(CreateOrderTableServiceRs rs) { + this.id = rs.getId(); + this.name = rs.getName(); + this.numberOfGuests = rs.getNumberOfGuests(); + this.occupied = rs.isOccupied(); + } + + public CreateOrderTableRs() { + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public int getNumberOfGuests() { + return numberOfGuests; + } + + public boolean isOccupied() { + return occupied; + } +} diff --git a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index 28eff9e30..6f179c65d 100644 --- a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -16,6 +16,7 @@ import java.util.HashMap; import java.util.List; import java.util.Optional; +import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; @@ -23,6 +24,8 @@ import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; import kitchenpos.order.eatinorder.infra.persistence.FakeEatInOrderRepository; +import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRq; +import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRs; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -48,27 +51,31 @@ void setUp() { @DisplayName("매장 테이블을 만들 수 있다") void create() { // given - OrderTable request = createOrderTableRequest(); + CreateOrderTableServiceRq request = new CreateOrderTableServiceRq("1번 테이블"); when(orderTableRepository.save(any(OrderTable.class))) .thenAnswer(invocation -> invocation.getArgument(0)); // when - OrderTable created = orderTableService.create(request); + CreateOrderTableServiceRs result = orderTableService.create(request); // then - assertThat(created.getId()).isNotNull(); - assertThat(created.getInnerName()).isEqualTo("1번 테이블"); - assertThat(created.getNumberOfGuests()).isZero(); - assertThat(created.isOccupied()).isFalse(); + assertThat(result).isNotNull(); + assertThat(result.getName()).isEqualTo("1번 테이블"); + assertThat(result.getNumberOfGuests()).isZero(); + assertThat(result.isOccupied()).isFalse(); } @ParameterizedTest @NullAndEmptySource @DisplayName("매장 테이블 이름이 없으면 예외가 발생한다.") void orderTable_name_exception(String name) { + // given + CreateOrderTableServiceRq request = new CreateOrderTableServiceRq(name); + // when // then - assertThatThrownBy(() -> orderTableService.create(new OrderTable(name, 0, false))) - .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> { + orderTableService.create(request); + }).isInstanceOf(IllegalArgumentException.class); } @Test diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java index 284c37bf0..0ee057f8f 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java @@ -148,17 +148,6 @@ void findAll_success() throws Exception { .andExpect(jsonPath("$.length()").value(2)); } - private EatInOrder createEatInOrderRequest() { - MenuGroup menuGroup = createAndSaveMenuGroup(); - Product product = createAndSaveProduct(); - Menu menu = createAndSaveMenu(menuGroup, product); - - OrderLineItem orderLineItem = createOrderLineItem(menu); - OrderTable orderTable = createAndSaveUsingOrderTable(); - - return createEatInOrder(orderLineItem, orderTable, EatInOrderFlow.WAITING); - } - private EatInOrder createAndSaveEatInOrder() { MenuGroup menuGroup = createAndSaveMenuGroup(); Product product = createAndSaveProduct(); diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java index 553c4451f..a27c45273 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.ui.dto.CreateOrderTableRq; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -38,7 +39,7 @@ class OrderTableRestControllerTest { @DisplayName("주문 테이블을 생성한다") void create_orderTable() throws Exception { // given - OrderTable request = createOrderTableRequest(0); + CreateOrderTableRq request = new CreateOrderTableRq("1번 테이블"); // when ResultActions perform = mockMvc.perform(post("/api/order-tables") From 6b8faf98a8e2d1d0f1769634f0aa22583fcb10b5 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:39:06 +0900 Subject: [PATCH 38/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20OrderTableR?= =?UTF-8?q?estController=20create=20=EC=A0=9C=EC=99=B8=20=EB=82=98?= =?UTF-8?q?=EB=A8=B8=EC=A7=80=20=EB=A9=94=EC=86=8C=EB=93=9C=20dto=EB=A5=BC?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/OrderTableService.java | 24 +++++++------ ...erviceRs.java => OrderTableServiceRs.java} | 6 ++-- .../ui/OrderTableRestController.java | 34 ++++++++++++------- ...ateOrderTableRs.java => OrderTableRs.java} | 10 +++--- .../application/OrderTableServiceTest.java | 24 ++++++------- 5 files changed, 54 insertions(+), 44 deletions(-) rename src/main/java/kitchenpos/order/eatinorder/service/dto/{CreateOrderTableServiceRs.java => OrderTableServiceRs.java} (80%) rename src/main/java/kitchenpos/order/eatinorder/ui/dto/{CreateOrderTableRs.java => OrderTableRs.java} (71%) diff --git a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index 4b6137327..0a55799e5 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -9,7 +9,7 @@ import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRq; -import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRs; +import kitchenpos.order.eatinorder.service.dto.OrderTableServiceRs; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,39 +25,41 @@ public OrderTableService(final OrderTableRepository orderTableRepository, } @Transactional - public CreateOrderTableServiceRs create(final CreateOrderTableServiceRq request) { + public OrderTableServiceRs create(final CreateOrderTableServiceRq request) { final String name = request.getName(); final OrderTable orderTable = orderTableRepository.save(new OrderTable(new OrderTableName(name))); - return new CreateOrderTableServiceRs(orderTable); + return new OrderTableServiceRs(orderTable); } @Transactional - public OrderTable sit(final UUID orderTableId) { + public OrderTableServiceRs sit(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) .orElseThrow(NoSuchElementException::new); orderTable.occupyTable(); - return orderTable; + return new OrderTableServiceRs(orderTable); } @Transactional - public OrderTable clear(final UUID orderTableId) { + public OrderTableServiceRs clear(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) .orElseThrow(NoSuchElementException::new); orderTableOccupationManager.release(new ReleaseOrderTableEvent(orderTable)); - return orderTable; + return new OrderTableServiceRs(orderTable); } @Transactional - public OrderTable changeNumberOfGuests(final UUID orderTableId, final OrderTable request) { + public OrderTableServiceRs changeNumberOfGuests(final UUID orderTableId, final OrderTable request) { final int numberOfGuests = request.getNumberOfGuests(); final OrderTable orderTable = orderTableRepository.findById(orderTableId) .orElseThrow(NoSuchElementException::new); orderTable.changeNumberOfGuests(numberOfGuests); - return orderTable; + return new OrderTableServiceRs(orderTable); } @Transactional(readOnly = true) - public List findAll() { - return orderTableRepository.findAll(); + public List findAll() { + return orderTableRepository.findAll().stream() + .map(OrderTableServiceRs::new) + .toList(); } } diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java similarity index 80% rename from src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java rename to src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java index dbdce02da..137974063 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java @@ -3,20 +3,20 @@ import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.OrderTable; -public class CreateOrderTableServiceRs { +public class OrderTableServiceRs { private UUID id; private String name; private int numberOfGuests; private boolean occupied; - public CreateOrderTableServiceRs(UUID id, String name, int numberOfGuests, boolean occupied) { + public OrderTableServiceRs(UUID id, String name, int numberOfGuests, boolean occupied) { this.id = id; this.name = name; this.numberOfGuests = numberOfGuests; this.occupied = occupied; } - public CreateOrderTableServiceRs(OrderTable orderTable) { + public OrderTableServiceRs(OrderTable orderTable) { this.id = orderTable.getId(); this.name = orderTable.getInnerName(); this.numberOfGuests = orderTable.getNumberOfGuests(); diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java index dc6f5eb85..9388cf5d6 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java @@ -6,9 +6,9 @@ import kitchenpos.order.eatinorder.application.OrderTableService; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRq; -import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRs; +import kitchenpos.order.eatinorder.service.dto.OrderTableServiceRs; import kitchenpos.order.eatinorder.ui.dto.CreateOrderTableRq; -import kitchenpos.order.eatinorder.ui.dto.CreateOrderTableRs; +import kitchenpos.order.eatinorder.ui.dto.OrderTableRs; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -28,33 +28,41 @@ public OrderTableRestController(final OrderTableService orderTableService) { } @PostMapping - public ResponseEntity create(@RequestBody final CreateOrderTableRq request) { - CreateOrderTableServiceRs response = orderTableService.create( + public ResponseEntity create(@RequestBody final CreateOrderTableRq request) { + OrderTableServiceRs response = orderTableService.create( new CreateOrderTableServiceRq(request.getName())); return ResponseEntity.created(URI.create("/api/order-tables/" + response.getId())) - .body(new CreateOrderTableRs(response)); + .body(new OrderTableRs(response)); } @PutMapping("/{orderTableId}/sit") - public ResponseEntity sit(@PathVariable("orderTableId") final UUID orderTableId) { - return ResponseEntity.ok(orderTableService.sit(orderTableId)); + public ResponseEntity sit(@PathVariable("orderTableId") final UUID orderTableId) { + OrderTableServiceRs response = orderTableService.sit(orderTableId); + return ResponseEntity.ok(new OrderTableRs(response)); } @PutMapping("/{orderTableId}/clear") - public ResponseEntity clear(@PathVariable("orderTableId") final UUID orderTableId) { - return ResponseEntity.ok(orderTableService.clear(orderTableId)); + public ResponseEntity clear(@PathVariable("orderTableId") final UUID orderTableId) { + OrderTableServiceRs response = orderTableService.clear(orderTableId); + return ResponseEntity.ok(new OrderTableRs(response)); } @PutMapping("/{orderTableId}/number-of-guests") - public ResponseEntity changeNumberOfGuests( + public ResponseEntity changeNumberOfGuests( @PathVariable("orderTableId") final UUID orderTableId, @RequestBody final OrderTable request ) { - return ResponseEntity.ok(orderTableService.changeNumberOfGuests(orderTableId, request)); + OrderTableServiceRs response = orderTableService.changeNumberOfGuests(orderTableId, request); + return ResponseEntity.ok(new OrderTableRs(response)); } @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok(orderTableService.findAll()); + public ResponseEntity> findAll() { + List response = orderTableService.findAll(); + return ResponseEntity.ok( + response.stream() + .map(OrderTableRs::new) + .toList() + ); } } diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/OrderTableRs.java similarity index 71% rename from src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java rename to src/main/java/kitchenpos/order/eatinorder/ui/dto/OrderTableRs.java index 4c5154fde..395f2cc31 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/dto/OrderTableRs.java @@ -1,29 +1,29 @@ package kitchenpos.order.eatinorder.ui.dto; import java.util.UUID; -import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRs; +import kitchenpos.order.eatinorder.service.dto.OrderTableServiceRs; -public class CreateOrderTableRs { +public class OrderTableRs { private UUID id; private String name; private int numberOfGuests; private boolean occupied; - public CreateOrderTableRs(UUID id, String name, int numberOfGuests, boolean occupied) { + public OrderTableRs(UUID id, String name, int numberOfGuests, boolean occupied) { this.id = id; this.name = name; this.numberOfGuests = numberOfGuests; this.occupied = occupied; } - public CreateOrderTableRs(CreateOrderTableServiceRs rs) { + public OrderTableRs(OrderTableServiceRs rs) { this.id = rs.getId(); this.name = rs.getName(); this.numberOfGuests = rs.getNumberOfGuests(); this.occupied = rs.isOccupied(); } - public CreateOrderTableRs() { + public OrderTableRs() { } public UUID getId() { diff --git a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index 6f179c65d..f43397bdd 100644 --- a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -16,7 +16,6 @@ import java.util.HashMap; import java.util.List; import java.util.Optional; -import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; @@ -25,7 +24,7 @@ import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; import kitchenpos.order.eatinorder.infra.persistence.FakeEatInOrderRepository; import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRq; -import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRs; +import kitchenpos.order.eatinorder.service.dto.OrderTableServiceRs; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -56,7 +55,7 @@ void create() { .thenAnswer(invocation -> invocation.getArgument(0)); // when - CreateOrderTableServiceRs result = orderTableService.create(request); + OrderTableServiceRs result = orderTableService.create(request); // then assertThat(result).isNotNull(); @@ -89,10 +88,10 @@ void find_all() { when(orderTableRepository.findAll()).thenReturn(orderTables); // when - List found = orderTableService.findAll(); + List result = orderTableService.findAll(); // then - assertThat(found).hasSize(2); + assertThat(result).hasSize(2); } @Test @@ -103,10 +102,10 @@ void sit() { when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); // when - OrderTable occupied = orderTableService.sit(orderTable.getId()); + OrderTableServiceRs result = orderTableService.sit(orderTable.getId()); // then - assertThat(occupied.isOccupied()).isTrue(); + assertThat(result.isOccupied()).isTrue(); } @Test @@ -122,11 +121,11 @@ void clear() { when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); // when - OrderTable clearedOrderTable = orderTableService.clear(orderTable.getId()); + OrderTableServiceRs result = orderTableService.clear(orderTable.getId()); // then - assertThat(clearedOrderTable.isOccupied()).isFalse(); - assertThat(clearedOrderTable.getNumberOfGuests()).isZero(); + assertThat(result.isOccupied()).isFalse(); + assertThat(result.getNumberOfGuests()).isZero(); } @Test @@ -157,10 +156,11 @@ void change_numberOfGuests() { when(orderTableRepository.findById(any())).thenReturn(Optional.of(orderTable)); // when - OrderTable changed = orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable); + OrderTableServiceRs result = orderTableService.changeNumberOfGuests(orderTable.getId(), + orderTable); // then - assertThat(changed.getNumberOfGuests()).isEqualTo(4); + assertThat(result.getNumberOfGuests()).isEqualTo(4); } @Test From 21e8a34ea0d8151b066328579e66bb465b06d451 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:44:35 +0900 Subject: [PATCH 39/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20EatInOrderR?= =?UTF-8?q?estController=20=EB=B0=98=ED=99=98=20dto=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/eatinorder/service/EatInOrderService.java | 5 +++-- .../order/eatinorder/ui/EatInOrderRestController.java | 8 ++++---- src/test/java/kitchenpos/TestFixtureFactory.java | 5 ----- .../order/eatinorder/ui/EatInOrderRestControllerTest.java | 4 ++-- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java index 2289236d3..588c6a583 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java @@ -33,10 +33,11 @@ public EatInOrderService( } @Transactional - public UUID create(final CreateEatInOrderServiceRq request) { + public EatInOrderServiceRs create(final CreateEatInOrderServiceRq request) { final List orderLineItems = toOrderLineItems(request.getOrderLineItemDtos()); EatInOrder eatInOrder = eatInOrderFactory.create(orderLineItems, request.getOrderTableId()); - return eatInOrderRepository.save(eatInOrder).getId(); + eatInOrderRepository.save(eatInOrder); + return new EatInOrderServiceRs(eatInOrder); } private List toOrderLineItems(List request) { diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java index 64170976d..406c7dd80 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java @@ -26,10 +26,10 @@ public EatInOrderRestController(final EatInOrderService eatInOrderService) { } @PostMapping - public ResponseEntity create(@RequestBody final CreateEatInOrderRq request) { - final UUID eatInOrderId = eatInOrderService.create(request.createServiceRq()); - return ResponseEntity.created(URI.create("/api/orders/" + eatInOrderId)) - .body(eatInOrderId); + public ResponseEntity create(@RequestBody final CreateEatInOrderRq request) { + EatInOrderServiceRs response = eatInOrderService.create(request.createServiceRq()); + return ResponseEntity.created(URI.create("/api/orders/" + response.getEatInOrderId())) + .body(new EatInOrderRs(response)); } @PutMapping("/{eatInOrderId}/accept") diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 928e7d917..0e68bea2b 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -151,9 +151,4 @@ public static CreateEatInOrderRq createEatInOrderRq(List menuIds, UUID ord .toList(), orderTableId); } - - public static @NotNull Matcher matchUUID() { - return matchesPattern( - "\"[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\""); - } } diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java index 0ee057f8f..393318f32 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/EatInOrderRestControllerTest.java @@ -6,7 +6,6 @@ import static kitchenpos.TestFixtureFactory.createOrderLineItem; import static kitchenpos.TestFixtureFactory.createProduct; import static kitchenpos.TestFixtureFactory.createUsingOrderTable; -import static kitchenpos.TestFixtureFactory.matchUUID; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; @@ -84,7 +83,8 @@ void create_success() throws Exception { result.andExpect(status().isCreated()) .andExpect(header().exists("Location")) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(content().string(matchUUID())); + .andExpect(jsonPath("$.eatInOrderId").isNotEmpty()) + .andExpect(jsonPath("$.eatInOrderFlow").value(EatInOrderFlow.WAITING.toString())); } @Test From 6acd197addcae8816a6bf01dd570e8c080ee1e88 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:47:09 +0900 Subject: [PATCH 40/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20service=20-?= =?UTF-8?q?>=20application=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{service => application}/EatInOrderService.java | 8 ++++---- .../order/eatinorder/application/OrderTableService.java | 4 ++-- .../dto/CreateEatInOrderServiceRq.java | 2 +- .../dto/CreateOrderTableServiceRq.java | 2 +- .../{service => application}/dto/EatInOrderServiceRs.java | 2 +- .../{service => application}/dto/OrderTableServiceRs.java | 2 +- .../order/eatinorder/ui/EatInOrderRestController.java | 4 ++-- .../order/eatinorder/ui/OrderTableRestController.java | 4 ++-- .../order/eatinorder/ui/dto/CreateEatInOrderRq.java | 4 ++-- .../kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java | 2 +- .../kitchenpos/order/eatinorder/ui/dto/OrderTableRs.java | 2 +- src/test/java/kitchenpos/TestFixtureFactory.java | 6 ++---- .../eatinorder/application/OrderTableServiceTest.java | 4 ++-- .../order/eatinorder/service/EatInOrderServiceTest.java | 5 +++-- 14 files changed, 25 insertions(+), 26 deletions(-) rename src/main/java/kitchenpos/order/eatinorder/{service => application}/EatInOrderService.java (91%) rename src/main/java/kitchenpos/order/eatinorder/{service => application}/dto/CreateEatInOrderServiceRq.java (96%) rename src/main/java/kitchenpos/order/eatinorder/{service => application}/dto/CreateOrderTableServiceRq.java (83%) rename src/main/java/kitchenpos/order/eatinorder/{service => application}/dto/EatInOrderServiceRs.java (93%) rename src/main/java/kitchenpos/order/eatinorder/{service => application}/dto/OrderTableServiceRs.java (94%) diff --git a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/application/EatInOrderService.java similarity index 91% rename from src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java rename to src/main/java/kitchenpos/order/eatinorder/application/EatInOrderService.java index 588c6a583..d6915f282 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/EatInOrderService.java @@ -1,4 +1,4 @@ -package kitchenpos.order.eatinorder.service; +package kitchenpos.order.eatinorder.application; import java.util.List; import java.util.NoSuchElementException; @@ -10,9 +10,9 @@ import kitchenpos.order.eatinorder.domain.model.EatInOrderFactory; import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; -import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq; -import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; -import kitchenpos.order.eatinorder.service.dto.EatInOrderServiceRs; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; +import kitchenpos.order.eatinorder.application.dto.EatInOrderServiceRs; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index 0a55799e5..276ca4a86 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -8,8 +8,8 @@ import kitchenpos.order.eatinorder.domain.model.ReleaseOrderTableEvent; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; -import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRq; -import kitchenpos.order.eatinorder.service.dto.OrderTableServiceRs; +import kitchenpos.order.eatinorder.application.dto.CreateOrderTableServiceRq; +import kitchenpos.order.eatinorder.application.dto.OrderTableServiceRs; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java b/src/main/java/kitchenpos/order/eatinorder/application/dto/CreateEatInOrderServiceRq.java similarity index 96% rename from src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java rename to src/main/java/kitchenpos/order/eatinorder/application/dto/CreateEatInOrderServiceRq.java index c18978c4e..1867ba201 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/dto/CreateEatInOrderServiceRq.java @@ -1,4 +1,4 @@ -package kitchenpos.order.eatinorder.service.dto; +package kitchenpos.order.eatinorder.application.dto; import java.math.BigDecimal; import java.util.List; diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java b/src/main/java/kitchenpos/order/eatinorder/application/dto/CreateOrderTableServiceRq.java similarity index 83% rename from src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java rename to src/main/java/kitchenpos/order/eatinorder/application/dto/CreateOrderTableServiceRq.java index 95a7ce918..b671bbcb7 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/dto/CreateOrderTableServiceRq.java @@ -1,4 +1,4 @@ -package kitchenpos.order.eatinorder.service.dto; +package kitchenpos.order.eatinorder.application.dto; public class CreateOrderTableServiceRq { private String name; diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java b/src/main/java/kitchenpos/order/eatinorder/application/dto/EatInOrderServiceRs.java similarity index 93% rename from src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java rename to src/main/java/kitchenpos/order/eatinorder/application/dto/EatInOrderServiceRs.java index 74bd1fdba..2d1a3a184 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/dto/EatInOrderServiceRs.java @@ -1,4 +1,4 @@ -package kitchenpos.order.eatinorder.service.dto; +package kitchenpos.order.eatinorder.application.dto; import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.EatInOrder; diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java b/src/main/java/kitchenpos/order/eatinorder/application/dto/OrderTableServiceRs.java similarity index 94% rename from src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java rename to src/main/java/kitchenpos/order/eatinorder/application/dto/OrderTableServiceRs.java index 137974063..280a1296d 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/dto/OrderTableServiceRs.java @@ -1,4 +1,4 @@ -package kitchenpos.order.eatinorder.service.dto; +package kitchenpos.order.eatinorder.application.dto; import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.OrderTable; diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java index 406c7dd80..d51af37c0 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/EatInOrderRestController.java @@ -3,8 +3,8 @@ import java.net.URI; import java.util.List; import java.util.UUID; -import kitchenpos.order.eatinorder.service.EatInOrderService; -import kitchenpos.order.eatinorder.service.dto.EatInOrderServiceRs; +import kitchenpos.order.eatinorder.application.EatInOrderService; +import kitchenpos.order.eatinorder.application.dto.EatInOrderServiceRs; import kitchenpos.order.eatinorder.ui.dto.CreateEatInOrderRq; import kitchenpos.order.eatinorder.ui.dto.EatInOrderRs; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java index 9388cf5d6..687d6e200 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java @@ -5,8 +5,8 @@ import java.util.UUID; import kitchenpos.order.eatinorder.application.OrderTableService; import kitchenpos.order.eatinorder.domain.model.OrderTable; -import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRq; -import kitchenpos.order.eatinorder.service.dto.OrderTableServiceRs; +import kitchenpos.order.eatinorder.application.dto.CreateOrderTableServiceRq; +import kitchenpos.order.eatinorder.application.dto.OrderTableServiceRs; import kitchenpos.order.eatinorder.ui.dto.CreateOrderTableRq; import kitchenpos.order.eatinorder.ui.dto.OrderTableRs; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateEatInOrderRq.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateEatInOrderRq.java index cbdf1b060..b92aa1004 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateEatInOrderRq.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateEatInOrderRq.java @@ -3,8 +3,8 @@ import java.math.BigDecimal; import java.util.List; import java.util.UUID; -import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq; -import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; public class CreateEatInOrderRq { private List orderLineItemDtos; diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java index 9b8927c7f..eb232cc4a 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java @@ -2,7 +2,7 @@ import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; -import kitchenpos.order.eatinorder.service.dto.EatInOrderServiceRs; +import kitchenpos.order.eatinorder.application.dto.EatInOrderServiceRs; public class EatInOrderRs { private UUID eatInOrderId; diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/OrderTableRs.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/OrderTableRs.java index 395f2cc31..5735f8e2b 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/dto/OrderTableRs.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/dto/OrderTableRs.java @@ -1,7 +1,7 @@ package kitchenpos.order.eatinorder.ui.dto; import java.util.UUID; -import kitchenpos.order.eatinorder.service.dto.OrderTableServiceRs; +import kitchenpos.order.eatinorder.application.dto.OrderTableServiceRs; public class OrderTableRs { private UUID id; diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 0e68bea2b..3ee399fd5 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -18,16 +18,14 @@ import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; -import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq; -import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; import kitchenpos.order.eatinorder.ui.dto.CreateEatInOrderRq; import kitchenpos.order.eatinorder.ui.dto.CreateEatInOrderRq.OrderLineItemDto; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.model.ProductName; import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.product.domain.model.ProductPrice; -import org.hamcrest.Matcher; -import org.jetbrains.annotations.NotNull; public class TestFixtureFactory { diff --git a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index f43397bdd..a05433510 100644 --- a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -23,8 +23,8 @@ import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; import kitchenpos.order.eatinorder.infra.persistence.FakeEatInOrderRepository; -import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRq; -import kitchenpos.order.eatinorder.service.dto.OrderTableServiceRs; +import kitchenpos.order.eatinorder.application.dto.CreateOrderTableServiceRq; +import kitchenpos.order.eatinorder.application.dto.OrderTableServiceRs; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java index e51a54459..38127665d 100644 --- a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java @@ -17,6 +17,7 @@ import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.OrderLineItemValidator; +import kitchenpos.order.eatinorder.application.EatInOrderService; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFactory; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; @@ -25,8 +26,8 @@ import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; -import kitchenpos.order.eatinorder.service.dto.CreateEatInOrderServiceRq; -import kitchenpos.order.eatinorder.service.dto.EatInOrderServiceRs; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.application.dto.EatInOrderServiceRs; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From 3cf4724f30c42a031e9dfb5cba907162c2f66363 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 11:07:14 +0900 Subject: [PATCH 41/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20MenuGroupRe?= =?UTF-8?q?stController=20dto=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/application/MenuGroupService.java | 14 ++++++---- .../dto/CreateMenuGroupServiceRq.java | 16 +++++++++++ .../application/dto/MenuGroupServiceRs.java | 27 ++++++++++++++++++ .../menu/ui/MenuGroupRestController.java | 20 +++++++++---- .../menu/ui/dto/CreateMenuGroupRq.java | 20 +++++++++++++ .../kitchenpos/menu/ui/dto/MenuGroupRs.java | 28 +++++++++++++++++++ .../application/MenuGroupServiceTest.java | 20 +++++++------ .../menu/ui/MenuGroupRestControllerTest.java | 5 ++-- 8 files changed, 128 insertions(+), 22 deletions(-) create mode 100644 src/main/java/kitchenpos/menu/application/dto/CreateMenuGroupServiceRq.java create mode 100644 src/main/java/kitchenpos/menu/application/dto/MenuGroupServiceRs.java create mode 100644 src/main/java/kitchenpos/menu/ui/dto/CreateMenuGroupRq.java create mode 100644 src/main/java/kitchenpos/menu/ui/dto/MenuGroupRs.java diff --git a/src/main/java/kitchenpos/menu/application/MenuGroupService.java b/src/main/java/kitchenpos/menu/application/MenuGroupService.java index 0385b6666..0671e11e1 100644 --- a/src/main/java/kitchenpos/menu/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menu/application/MenuGroupService.java @@ -1,6 +1,8 @@ package kitchenpos.menu.application; import java.util.List; +import kitchenpos.menu.application.dto.CreateMenuGroupServiceRq; +import kitchenpos.menu.application.dto.MenuGroupServiceRs; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuGroupName; import kitchenpos.menu.domain.model.MenuGroupNameCreationService; @@ -20,15 +22,17 @@ public MenuGroupService(final MenuGroupRepository menuGroupRepository, } @Transactional - public MenuGroup create(final MenuGroup request) { + public MenuGroupServiceRs create(final CreateMenuGroupServiceRq request) { final String name = request.getName(); MenuGroupName menuGroupName = menuGroupNameCreationService.createName(name); - final MenuGroup menuGroup = new MenuGroup(menuGroupName); - return menuGroupRepository.save(menuGroup); + MenuGroup menuGroup = menuGroupRepository.save(new MenuGroup(menuGroupName)); + return new MenuGroupServiceRs(menuGroup); } @Transactional(readOnly = true) - public List findAll() { - return menuGroupRepository.findAll(); + public List findAll() { + return menuGroupRepository.findAll().stream() + .map(MenuGroupServiceRs::new) + .toList(); } } diff --git a/src/main/java/kitchenpos/menu/application/dto/CreateMenuGroupServiceRq.java b/src/main/java/kitchenpos/menu/application/dto/CreateMenuGroupServiceRq.java new file mode 100644 index 000000000..3919c09cf --- /dev/null +++ b/src/main/java/kitchenpos/menu/application/dto/CreateMenuGroupServiceRq.java @@ -0,0 +1,16 @@ +package kitchenpos.menu.application.dto; + +public class CreateMenuGroupServiceRq { + private String name; + + public CreateMenuGroupServiceRq(String name) { + this.name = name; + } + + public CreateMenuGroupServiceRq() { + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/kitchenpos/menu/application/dto/MenuGroupServiceRs.java b/src/main/java/kitchenpos/menu/application/dto/MenuGroupServiceRs.java new file mode 100644 index 000000000..3d2bee3b4 --- /dev/null +++ b/src/main/java/kitchenpos/menu/application/dto/MenuGroupServiceRs.java @@ -0,0 +1,27 @@ +package kitchenpos.menu.application.dto; + +import java.util.UUID; +import kitchenpos.menu.domain.model.MenuGroup; + +public class MenuGroupServiceRs { + private UUID id; + private String name; + + public MenuGroupServiceRs(UUID id, String name) { + this.id = id; + this.name = name; + } + + public MenuGroupServiceRs(MenuGroup menuGroup) { + this.id = menuGroup.getId(); + this.name = menuGroup.getName(); + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java index bc89f2359..a1c779708 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java @@ -3,7 +3,10 @@ import java.net.URI; import java.util.List; import kitchenpos.menu.application.MenuGroupService; -import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.application.dto.CreateMenuGroupServiceRq; +import kitchenpos.menu.application.dto.MenuGroupServiceRs; +import kitchenpos.menu.ui.dto.CreateMenuGroupRq; +import kitchenpos.menu.ui.dto.MenuGroupRs; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -21,14 +24,19 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { } @PostMapping - public ResponseEntity create(@RequestBody final MenuGroup request) { - final MenuGroup response = menuGroupService.create(request); + public ResponseEntity create(@RequestBody final CreateMenuGroupRq request) { + MenuGroupServiceRs response = menuGroupService.create( + new CreateMenuGroupServiceRq(request.getName())); return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getId())) - .body(response); + .body(new MenuGroupRs(response)); } @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok(menuGroupService.findAll()); + public ResponseEntity> findAll() { + return ResponseEntity.ok( + menuGroupService.findAll().stream() + .map(MenuGroupRs::new) + .toList() + ); } } diff --git a/src/main/java/kitchenpos/menu/ui/dto/CreateMenuGroupRq.java b/src/main/java/kitchenpos/menu/ui/dto/CreateMenuGroupRq.java new file mode 100644 index 000000000..1d9094385 --- /dev/null +++ b/src/main/java/kitchenpos/menu/ui/dto/CreateMenuGroupRq.java @@ -0,0 +1,20 @@ +package kitchenpos.menu.ui.dto; + +public class CreateMenuGroupRq { + private String name; + + public CreateMenuGroupRq(String name) { + this.name = name; + } + + public CreateMenuGroupRq(CreateMenuGroupRq menuGroup) { + this.name = menuGroup.getName(); + } + + public CreateMenuGroupRq() { + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/kitchenpos/menu/ui/dto/MenuGroupRs.java b/src/main/java/kitchenpos/menu/ui/dto/MenuGroupRs.java new file mode 100644 index 000000000..fb020dc69 --- /dev/null +++ b/src/main/java/kitchenpos/menu/ui/dto/MenuGroupRs.java @@ -0,0 +1,28 @@ +package kitchenpos.menu.ui.dto; + +import java.util.UUID; +import kitchenpos.menu.application.dto.MenuGroupServiceRs; +import kitchenpos.menu.domain.model.MenuGroup; + +public class MenuGroupRs { + private UUID id; + private String name; + + public MenuGroupRs(UUID id, String name) { + this.id = id; + this.name = name; + } + + public MenuGroupRs(MenuGroupServiceRs menuGroup) { + this.id = menuGroup.getId(); + this.name = menuGroup.getName(); + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java index 8476f9f91..f00db979f 100644 --- a/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java @@ -10,6 +10,8 @@ import java.util.Arrays; import java.util.List; import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.menu.application.dto.CreateMenuGroupServiceRq; +import kitchenpos.menu.application.dto.MenuGroupServiceRs; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuGroupNameCreationService; import kitchenpos.menu.domain.repository.MenuGroupRepository; @@ -36,13 +38,13 @@ void setUp() { @DisplayName("메뉴 그룹을 생성한다") void create_menuGroup() { // given - MenuGroup request = new MenuGroup("한식"); + CreateMenuGroupServiceRq request = new CreateMenuGroupServiceRq("한식"); when(menuGroupRepository.save(any(MenuGroup.class))) .thenAnswer(invocation -> invocation.getArgument(0)); // when - MenuGroup result = menuGroupService.create(request); + MenuGroupServiceRs result = menuGroupService.create(request); // then assertThat(result.getId()).isNotNull(); @@ -54,9 +56,13 @@ void create_menuGroup() { @NullAndEmptySource @DisplayName("메뉴 그룹 이름이 null이거나 비어있으면 예외가 발생한다") void create_MenuGroup_fail(String name) { + // given + CreateMenuGroupServiceRq request = new CreateMenuGroupServiceRq(name); + // when // then - assertThatThrownBy(() -> menuGroupService.create(new MenuGroup(name))) - .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> { + menuGroupService.create(request); + }).isInstanceOf(IllegalArgumentException.class); } @Test @@ -69,12 +75,10 @@ void findAll() { when(menuGroupRepository.findAll()).thenReturn(expected); // when - List result = menuGroupService.findAll(); + List result = menuGroupService.findAll(); // then - assertThat(result).hasSize(2) - .usingRecursiveComparison() - .isEqualTo(expected); + assertThat(result).hasSize(2); verify(menuGroupRepository).findAll(); } } diff --git a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java index 9020080b5..516e17858 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java @@ -10,6 +10,7 @@ import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuGroupNameCreationService; +import kitchenpos.menu.ui.dto.CreateMenuGroupRq; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -35,9 +36,7 @@ class MenuGroupRestControllerTest { @DisplayName("메뉴 그룹을 생성한다.") void create_success() throws Exception { // given - MenuGroupNameCreationService menuGroupNameCreationService = new MenuGroupNameCreationService( - new FakePurgomalumClient()); - MenuGroup request = new MenuGroup(menuGroupNameCreationService.createName("한식")); + CreateMenuGroupRq request = new CreateMenuGroupRq("한식"); // when ResultActions result = mockMvc.perform(post("/api/menu-groups") From 7d8902ab68139340d725771f0f02b0b9789ad2c1 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 11:24:39 +0900 Subject: [PATCH 42/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20ProductRest?= =?UTF-8?q?Controller=20dto=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/application/ProductService.java | 24 +++++++----- .../dto/ChangeProductPriceServiceRq.java | 18 +++++++++ .../dto/CreateProductServiceRq.java | 24 ++++++++++++ .../application/dto/ProductServiceRs.java | 32 +++++++++++++++ .../product/ui/ProductRestController.java | 33 +++++++++++----- .../product/ui/dto/ChangeProductPriceRq.java | 18 +++++++++ .../product/ui/dto/CreateProductRq.java | 24 ++++++++++++ .../kitchenpos/product/ui/dto/ProductRs.java | 39 +++++++++++++++++++ .../application/ProductServiceTest.java | 31 +++++++++------ .../product/ui/ProductRestControllerTest.java | 18 +++++---- 10 files changed, 223 insertions(+), 38 deletions(-) create mode 100644 src/main/java/kitchenpos/product/application/dto/ChangeProductPriceServiceRq.java create mode 100644 src/main/java/kitchenpos/product/application/dto/CreateProductServiceRq.java create mode 100644 src/main/java/kitchenpos/product/application/dto/ProductServiceRs.java create mode 100644 src/main/java/kitchenpos/product/ui/dto/ChangeProductPriceRq.java create mode 100644 src/main/java/kitchenpos/product/ui/dto/CreateProductRq.java create mode 100644 src/main/java/kitchenpos/product/ui/dto/ProductRs.java diff --git a/src/main/java/kitchenpos/product/application/ProductService.java b/src/main/java/kitchenpos/product/application/ProductService.java index 140e5e886..e7afcdc01 100644 --- a/src/main/java/kitchenpos/product/application/ProductService.java +++ b/src/main/java/kitchenpos/product/application/ProductService.java @@ -5,6 +5,9 @@ import java.util.NoSuchElementException; import java.util.UUID; import kitchenpos.menu.domain.service.MarginValidator; +import kitchenpos.product.application.dto.ChangeProductPriceServiceRq; +import kitchenpos.product.application.dto.CreateProductServiceRq; +import kitchenpos.product.application.dto.ProductServiceRs; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.model.ProductName; import kitchenpos.product.domain.model.ProductNameCreationService; @@ -30,26 +33,29 @@ public ProductService( } @Transactional - public Product create(final Product request) { - final BigDecimal price = request.getInnerPrice(); - final String name = request.getInnerName(); + public ProductServiceRs create(final CreateProductServiceRq request) { + final BigDecimal price = request.getPrice(); + final String name = request.getName(); final ProductName validProductName = productNameCreationService.createName(name); final Product product = new Product(validProductName, new ProductPrice(price)); - return productRepository.save(product); + productRepository.save(product); + return new ProductServiceRs(product); } @Transactional - public Product changePrice(final UUID productId, final Product request) { - final BigDecimal price = request.getInnerPrice(); + public ProductServiceRs changePrice(final UUID productId, final ChangeProductPriceServiceRq request) { + final BigDecimal price = request.getPrice(); final Product product = productRepository.findById(productId) .orElseThrow(NoSuchElementException::new); product.changePrice(price); marginValidator.checkMargin(product); - return product; + return new ProductServiceRs(product); } @Transactional(readOnly = true) - public List findAll() { - return productRepository.findAll(); + public List findAll() { + return productRepository.findAll().stream() + .map(ProductServiceRs::new) + .toList(); } } diff --git a/src/main/java/kitchenpos/product/application/dto/ChangeProductPriceServiceRq.java b/src/main/java/kitchenpos/product/application/dto/ChangeProductPriceServiceRq.java new file mode 100644 index 000000000..2ba3b64a8 --- /dev/null +++ b/src/main/java/kitchenpos/product/application/dto/ChangeProductPriceServiceRq.java @@ -0,0 +1,18 @@ +package kitchenpos.product.application.dto; + +import java.math.BigDecimal; + +public class ChangeProductPriceServiceRq { + private BigDecimal price; + + public ChangeProductPriceServiceRq(BigDecimal price) { + this.price = price; + } + + public ChangeProductPriceServiceRq() { + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/product/application/dto/CreateProductServiceRq.java b/src/main/java/kitchenpos/product/application/dto/CreateProductServiceRq.java new file mode 100644 index 000000000..82496bfa1 --- /dev/null +++ b/src/main/java/kitchenpos/product/application/dto/CreateProductServiceRq.java @@ -0,0 +1,24 @@ +package kitchenpos.product.application.dto; + +import java.math.BigDecimal; + +public class CreateProductServiceRq { + private String name; + private BigDecimal price; + + public CreateProductServiceRq(String name, BigDecimal price) { + this.name = name; + this.price = price; + } + + public CreateProductServiceRq() { + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/product/application/dto/ProductServiceRs.java b/src/main/java/kitchenpos/product/application/dto/ProductServiceRs.java new file mode 100644 index 000000000..8952b0dbb --- /dev/null +++ b/src/main/java/kitchenpos/product/application/dto/ProductServiceRs.java @@ -0,0 +1,32 @@ +package kitchenpos.product.application.dto; + +import java.math.BigDecimal; +import java.util.UUID; +import kitchenpos.product.domain.model.Product; + +public class ProductServiceRs { + private UUID id; + private String name; + private BigDecimal price; + + public ProductServiceRs(Product product) { + this.id = product.getId(); + this.name = product.getInnerName(); + this.price = product.getInnerPrice(); + } + + public ProductServiceRs() { + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/product/ui/ProductRestController.java b/src/main/java/kitchenpos/product/ui/ProductRestController.java index c5f061243..c3f482b74 100644 --- a/src/main/java/kitchenpos/product/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/product/ui/ProductRestController.java @@ -4,7 +4,12 @@ import java.util.List; import java.util.UUID; import kitchenpos.product.application.ProductService; -import kitchenpos.product.domain.model.Product; +import kitchenpos.product.application.dto.ChangeProductPriceServiceRq; +import kitchenpos.product.application.dto.CreateProductServiceRq; +import kitchenpos.product.application.dto.ProductServiceRs; +import kitchenpos.product.ui.dto.ChangeProductPriceRq; +import kitchenpos.product.ui.dto.CreateProductRq; +import kitchenpos.product.ui.dto.ProductRs; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -24,20 +29,30 @@ public ProductRestController(final ProductService productService) { } @PostMapping - public ResponseEntity create(@RequestBody final Product request) { - final Product response = productService.create(request); + public ResponseEntity create(@RequestBody final CreateProductRq request) { + ProductServiceRs response = productService.create( + new CreateProductServiceRq(request.getName(), request.getPrice())); return ResponseEntity.created(URI.create("/api/products/" + response.getId())) - .body(response); + .body(new ProductRs(response)); } @PutMapping("/{productId}/price") - public ResponseEntity changePrice(@PathVariable("productId") final UUID productId, - @RequestBody final Product request) { - return ResponseEntity.ok(productService.changePrice(productId, request)); + public ResponseEntity changePrice(@PathVariable("productId") final UUID productId, + @RequestBody final ChangeProductPriceRq request) { + ProductServiceRs response = productService.changePrice( + productId, + new ChangeProductPriceServiceRq(request.getPrice()) + ); + return ResponseEntity.ok(new ProductRs(response)); } @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok(productService.findAll()); + public ResponseEntity> findAll() { + List response = productService.findAll(); + return ResponseEntity.ok( + response.stream() + .map(ProductRs::new) + .toList() + ); } } diff --git a/src/main/java/kitchenpos/product/ui/dto/ChangeProductPriceRq.java b/src/main/java/kitchenpos/product/ui/dto/ChangeProductPriceRq.java new file mode 100644 index 000000000..4ee3c34bf --- /dev/null +++ b/src/main/java/kitchenpos/product/ui/dto/ChangeProductPriceRq.java @@ -0,0 +1,18 @@ +package kitchenpos.product.ui.dto; + +import java.math.BigDecimal; + +public class ChangeProductPriceRq { + private BigDecimal price; + + public ChangeProductPriceRq(BigDecimal price) { + this.price = price; + } + + public ChangeProductPriceRq() { + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/product/ui/dto/CreateProductRq.java b/src/main/java/kitchenpos/product/ui/dto/CreateProductRq.java new file mode 100644 index 000000000..0b5e0b4f0 --- /dev/null +++ b/src/main/java/kitchenpos/product/ui/dto/CreateProductRq.java @@ -0,0 +1,24 @@ +package kitchenpos.product.ui.dto; + +import java.math.BigDecimal; + +public class CreateProductRq { + private String name; + private BigDecimal price; + + public CreateProductRq(String name, BigDecimal price) { + this.name = name; + this.price = price; + } + + public CreateProductRq() { + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/product/ui/dto/ProductRs.java b/src/main/java/kitchenpos/product/ui/dto/ProductRs.java new file mode 100644 index 000000000..bdf91191f --- /dev/null +++ b/src/main/java/kitchenpos/product/ui/dto/ProductRs.java @@ -0,0 +1,39 @@ +package kitchenpos.product.ui.dto; + +import java.math.BigDecimal; +import java.util.UUID; +import kitchenpos.product.application.dto.ProductServiceRs; +import kitchenpos.product.domain.model.Product; + +public class ProductRs { + private UUID id; + private String name; + private BigDecimal price; + + public ProductRs(Product product) { + this.id = product.getId(); + this.name = product.getInnerName(); + this.price = product.getInnerPrice(); + } + + public ProductRs(ProductServiceRs product) { + this.id = product.getId(); + this.name = product.getName(); + this.price = product.getPrice(); + } + + public ProductRs() { + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/test/java/kitchenpos/product/application/ProductServiceTest.java b/src/test/java/kitchenpos/product/application/ProductServiceTest.java index 1a06c9903..08a5d2982 100644 --- a/src/test/java/kitchenpos/product/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/product/application/ProductServiceTest.java @@ -15,6 +15,9 @@ import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.menu.domain.service.MarginValidator; +import kitchenpos.product.application.dto.ChangeProductPriceServiceRq; +import kitchenpos.product.application.dto.CreateProductServiceRq; +import kitchenpos.product.application.dto.ProductServiceRs; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.product.domain.repository.ProductRepository; @@ -43,25 +46,29 @@ void setUp() { @DisplayName("상품을 등록할 수 있다") void create() { // given - Product request = createProductRequest("김치", 5000); + CreateProductServiceRq request = new CreateProductServiceRq("김치", BigDecimal.valueOf(5000)); when(purgomalumClient.containsProfanity(any())).thenReturn(false); when(productRepository.save(any(Product.class))).thenAnswer(invocation -> invocation.getArgument(0)); // when - Product result = productService.create(request); + ProductServiceRs result = productService.create(request); // then assertThat(result.getId()).isNotNull(); - assertThat(result.getInnerName()).isEqualTo("김치"); - assertThat(result.getInnerPrice()).isEqualTo(BigDecimal.valueOf(5000)); + assertThat(result.getName()).isEqualTo("김치"); + assertThat(result.getPrice()).isEqualTo(BigDecimal.valueOf(5000)); } @Test @DisplayName("상품 가격은 0원 미만이면 예외가 발생한다.") void product_price_exception() { + // given + CreateProductServiceRq request = new CreateProductServiceRq("김치", BigDecimal.valueOf(-1000)); + // when // then - assertThatThrownBy(() -> productService.create(createProductRequest("김치", -1000))) - .isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> { + productService.create(request); + }).isInstanceOf(IllegalArgumentException.class) .hasMessage("상품 가격을 채워주세요!"); } @@ -69,7 +76,7 @@ void product_price_exception() { @DisplayName("상품 이름에 비속어를 넣으면 예외가 발생한다.") void product_name_exception() { // given - Product request = createProductRequest("fuck", 5000); + CreateProductServiceRq request = new CreateProductServiceRq("fuck", BigDecimal.valueOf(5000)); when(purgomalumClient.containsProfanity("fuck")).thenReturn(true); // when // then @@ -82,15 +89,15 @@ void product_name_exception() { void change_price() { // given Product product = createProduct("김치", 5000); - Product request = createProductRequest("김치", 6000); + ChangeProductPriceServiceRq request = new ChangeProductPriceServiceRq(BigDecimal.valueOf(6000)); when(productRepository.findById(any())).thenReturn(Optional.of(product)); when(menuRepository.findAllByProductId(any())).thenReturn(List.of()); // when - Product result = productService.changePrice(product.getId(), request); + ProductServiceRs result = productService.changePrice(product.getId(), request); // then - assertThat(result.getInnerPrice()).isEqualTo(BigDecimal.valueOf(6000)); + assertThat(result.getPrice()).isEqualTo(BigDecimal.valueOf(6000)); } @Test @@ -99,7 +106,7 @@ void change_price_exception() { // given Product product = createProduct("김치", 5000); Menu menu = TestFixtureFactory.createMenuWithProductAndGroup("김치찌개", 7000, product); - Product request = createProductRequest("김치", 8000); + ChangeProductPriceServiceRq request = new ChangeProductPriceServiceRq(new BigDecimal(8000)); when(productRepository.findById(any())).thenReturn(Optional.of(product)); when(menuRepository.findAllByProductId(any())).thenReturn(List.of(menu)); @@ -122,7 +129,7 @@ void find_all() { when(productRepository.findAll()).thenReturn(products); // when - List result = productService.findAll(); + List result = productService.findAll(); // then assertThat(result).hasSize(2); diff --git a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java index 39e98c4eb..98c45c568 100644 --- a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java +++ b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java @@ -11,6 +11,8 @@ import java.math.BigDecimal; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; +import kitchenpos.product.ui.dto.ChangeProductPriceRq; +import kitchenpos.product.ui.dto.CreateProductRq; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -40,7 +42,7 @@ class ProductRestControllerTest { @DisplayName("상품을 생성한다") void create_product() throws Exception { // given - Product request = createAndSaveProduct("김치", 5000); + CreateProductRq request = new CreateProductRq("김치", BigDecimal.valueOf(5000)); // when ResultActions result = mockMvc.perform(post("/api/products") @@ -51,27 +53,27 @@ void create_product() throws Exception { result.andExpect(status().isCreated()) .andExpect(header().exists("Location")) .andExpect(jsonPath("$.id").exists()) - .andExpect(jsonPath("$.name.value").value("김치")) - .andExpect(jsonPath("$.price.value").value(5000)); + .andExpect(jsonPath("$.name").value("김치")) + .andExpect(jsonPath("$.price").value(5000)); } @Test @DisplayName("상품의 가격을 변경한다") void change_productPrice() throws Exception { // given - Product request = createAndSaveProduct("김치", 5000); - request.changePrice(BigDecimal.valueOf(6000)); + Product product = createAndSaveProduct("김치", 5000); + ChangeProductPriceRq request = new ChangeProductPriceRq(BigDecimal.valueOf(6000)); // when ResultActions result = mockMvc.perform( - MockMvcRequestBuilders.put("/api/products/{productId}/price", request.getId()) + MockMvcRequestBuilders.put("/api/products/{productId}/price", product.getId()) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(request))); // then result.andExpect(status().isOk()) - .andExpect(jsonPath("$.id").value(request.getId().toString())) - .andExpect(jsonPath("$.price.value").value(6000)); + .andExpect(jsonPath("$.id").value(product.getId().toString())) + .andExpect(jsonPath("$.price").value(6000)); } @Test From 0b1695dfd6e6ae80b7703371a84cb26115bb05b0 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 12:31:56 +0900 Subject: [PATCH 43/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20MenuRestCon?= =?UTF-8?q?troller=20dto=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/application/MenuService.java | 44 ++++--- .../dto/ChangeMenuPriceServiceRq.java | 18 +++ .../application/dto/CreateMenuServiceRq.java | 66 ++++++++++ .../menu/application/dto/MenuServiceRs.java | 81 ++++++++++++ .../application/dto/SimpleMenuServiceRs.java | 42 +++++++ .../menu/domain/model/MenuGroupName.java | 1 - .../menu/domain/model/MenuName.java | 1 - .../menu/domain/model/MenuPrice.java | 1 - .../domain/model/MenuProductQuantity.java | 1 - .../menu/ui/MenuRestController.java | 42 +++++-- .../menu/ui/dto/ChangeMenuPriceRq.java | 18 +++ .../kitchenpos/menu/ui/dto/CreateMenuRq.java | 80 ++++++++++++ .../java/kitchenpos/menu/ui/dto/MenuRs.java | 81 ++++++++++++ .../kitchenpos/menu/ui/dto/SimpleMenuRs.java | 42 +++++++ .../menu/application/MenuServiceTest.java | 118 ++++++++++-------- ...st.java => MenuProductRsQuantityTest.java} | 2 +- ...t.java => MenuProductRsValidatorTest.java} | 2 +- .../menu/ui/MenuRestControllerTest.java | 20 ++- .../common/ui/OrderRestControllerTest.java | 40 +++--- 19 files changed, 590 insertions(+), 110 deletions(-) create mode 100644 src/main/java/kitchenpos/menu/application/dto/ChangeMenuPriceServiceRq.java create mode 100644 src/main/java/kitchenpos/menu/application/dto/CreateMenuServiceRq.java create mode 100644 src/main/java/kitchenpos/menu/application/dto/MenuServiceRs.java create mode 100644 src/main/java/kitchenpos/menu/application/dto/SimpleMenuServiceRs.java create mode 100644 src/main/java/kitchenpos/menu/ui/dto/ChangeMenuPriceRq.java create mode 100644 src/main/java/kitchenpos/menu/ui/dto/CreateMenuRq.java create mode 100644 src/main/java/kitchenpos/menu/ui/dto/MenuRs.java create mode 100644 src/main/java/kitchenpos/menu/ui/dto/SimpleMenuRs.java rename src/test/java/kitchenpos/menu/domain/model/{MenuProductQuantityTest.java => MenuProductRsQuantityTest.java} (94%) rename src/test/java/kitchenpos/menu/domain/service/{MenuProductValidatorTest.java => MenuProductRsValidatorTest.java} (98%) diff --git a/src/main/java/kitchenpos/menu/application/MenuService.java b/src/main/java/kitchenpos/menu/application/MenuService.java index a79f13455..0175f66b6 100644 --- a/src/main/java/kitchenpos/menu/application/MenuService.java +++ b/src/main/java/kitchenpos/menu/application/MenuService.java @@ -6,6 +6,11 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; +import kitchenpos.menu.application.dto.ChangeMenuPriceServiceRq; +import kitchenpos.menu.application.dto.CreateMenuServiceRq; +import kitchenpos.menu.application.dto.CreateMenuServiceRq.MenuProductServiceRq; +import kitchenpos.menu.application.dto.MenuServiceRs; +import kitchenpos.menu.application.dto.SimpleMenuServiceRs; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuName; @@ -48,31 +53,32 @@ public MenuService( } @Transactional - public Menu create(final Menu request) { - final BigDecimal price = request.getInnerPrice(); + public MenuServiceRs create(final CreateMenuServiceRq request) { + final BigDecimal price = request.getPrice(); final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) .orElseThrow(NoSuchElementException::new); - final List menuProductRequests = request.getMenuProducts(); - menuProductValidator.validateMenuProduct(menuProductRequests); + List menuProductRequests = request.getMenuProductDtos(); final List menuProducts = createMenuProductsByRequest(menuProductRequests); + menuProductValidator.validateMenuProduct(menuProducts); - final String name = request.getInnerName(); + final String name = request.getName(); MenuName menuName = menuNameCreationService.createName(name); final Menu menu = new Menu(menuName, new MenuPrice(price), menuGroup, request.isDisplayed(), menuProducts, menuGroup.getId()); validateMargin(menu); + menuRepository.save(menu); - return menuRepository.save(menu); + return new MenuServiceRs(menu); } - private List createMenuProductsByRequest(List menuProductRequests) { + private List createMenuProductsByRequest(List menuProductRequests) { return menuProductRequests.stream().map(this::createMenuProductByRequest).toList(); } - private MenuProduct createMenuProductByRequest(MenuProduct request) { - final long quantity = request.getInnerQuantity(); + private MenuProduct createMenuProductByRequest(MenuProductServiceRq request) { + final long quantity = request.getQuantity(); final Product product = productRepository.findById(request.getProductId()) .orElseThrow(NoSuchElementException::new); return new MenuProduct(product, new MenuProductQuantity(quantity), product.getId()); @@ -86,34 +92,36 @@ private void validateMargin(Menu menu) { } @Transactional - public Menu changePrice(final UUID menuId, final Menu request) { - final BigDecimal price = request.getInnerPrice(); + public SimpleMenuServiceRs changePrice(final UUID menuId, final ChangeMenuPriceServiceRq request) { + final BigDecimal price = request.getPrice(); final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); menu.changePrice(price); validateMargin(menu); - return menu; + return new SimpleMenuServiceRs(menu); } @Transactional - public Menu display(final UUID menuId) { + public SimpleMenuServiceRs display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); validateMargin(menu); menu.changeDisplay(true); - return menu; + return new SimpleMenuServiceRs(menu); } @Transactional - public Menu hide(final UUID menuId) { + public SimpleMenuServiceRs hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); menu.changeDisplay(false); - return menu; + return new SimpleMenuServiceRs(menu); } @Transactional(readOnly = true) - public List findAll() { - return menuRepository.findAll(); + public List findAll() { + return menuRepository.findAll().stream() + .map(MenuServiceRs::new) + .toList(); } } diff --git a/src/main/java/kitchenpos/menu/application/dto/ChangeMenuPriceServiceRq.java b/src/main/java/kitchenpos/menu/application/dto/ChangeMenuPriceServiceRq.java new file mode 100644 index 000000000..4ce401270 --- /dev/null +++ b/src/main/java/kitchenpos/menu/application/dto/ChangeMenuPriceServiceRq.java @@ -0,0 +1,18 @@ +package kitchenpos.menu.application.dto; + +import java.math.BigDecimal; + +public class ChangeMenuPriceServiceRq { + private BigDecimal price; + + public ChangeMenuPriceServiceRq(BigDecimal price) { + this.price = price; + } + + public ChangeMenuPriceServiceRq() { + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/menu/application/dto/CreateMenuServiceRq.java b/src/main/java/kitchenpos/menu/application/dto/CreateMenuServiceRq.java new file mode 100644 index 000000000..41c55ff32 --- /dev/null +++ b/src/main/java/kitchenpos/menu/application/dto/CreateMenuServiceRq.java @@ -0,0 +1,66 @@ +package kitchenpos.menu.application.dto; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +public class CreateMenuServiceRq { + private String name; + private BigDecimal price; + private boolean isDisplayed; + private UUID menuGroupId; + private List menuProductServiceRqs; + + public CreateMenuServiceRq(String name, BigDecimal price, boolean isDisplayed, UUID menuGroupId, + List menuProductServiceRqs) { + this.name = name; + this.price = price; + this.isDisplayed = isDisplayed; + this.menuGroupId = menuGroupId; + this.menuProductServiceRqs = menuProductServiceRqs; + } + + public CreateMenuServiceRq() { + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + + public boolean isDisplayed() { + return isDisplayed; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public List getMenuProductDtos() { + return menuProductServiceRqs; + } + + public static class MenuProductServiceRq { + private UUID productId; + private long quantity; + + public MenuProductServiceRq(UUID productId, long quantity) { + this.productId = productId; + this.quantity = quantity; + } + + public MenuProductServiceRq() { + } + + public UUID getProductId() { + return productId; + } + + public long getQuantity() { + return quantity; + } + } +} diff --git a/src/main/java/kitchenpos/menu/application/dto/MenuServiceRs.java b/src/main/java/kitchenpos/menu/application/dto/MenuServiceRs.java new file mode 100644 index 000000000..6c0658b6c --- /dev/null +++ b/src/main/java/kitchenpos/menu/application/dto/MenuServiceRs.java @@ -0,0 +1,81 @@ +package kitchenpos.menu.application.dto; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; + +public class MenuServiceRs { + private UUID id; + private String name; + private BigDecimal price; + private boolean isDisplayed; + private UUID menuGroupId; + private List menuProductServiceRsList; + + public MenuServiceRs(UUID id, String name, BigDecimal price, boolean isDisplayed, UUID menuGroupId, + List menuProductServiceRsList) { + this.id = id; + this.name = name; + this.price = price; + this.isDisplayed = isDisplayed; + this.menuGroupId = menuGroupId; + this.menuProductServiceRsList = menuProductServiceRsList; + } + + public MenuServiceRs(Menu menu) { + this.id = menu.getId(); + this.name = menu.getInnerName(); + this.price = menu.getInnerPrice(); + this.isDisplayed = menu.isDisplayed(); + this.menuGroupId = menu.getMenuGroupId(); + this.menuProductServiceRsList = menu.getMenuProducts().stream() + .map(mp -> new MenuProductServiceRs(mp.getProductId(), mp.getInnerQuantity())) + .toList(); + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + + public boolean isDisplayed() { + return isDisplayed; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public List getMenuProductServiceRsList() { + return menuProductServiceRsList; + } + + public static class MenuProductServiceRs { + private UUID productId; + private long quantity; + + public MenuProductServiceRs(UUID productId, long quantity) { + this.productId = productId; + this.quantity = quantity; + } + + public MenuProductServiceRs() { + } + + public UUID getProductId() { + return productId; + } + + public long getQuantity() { + return quantity; + } + } +} diff --git a/src/main/java/kitchenpos/menu/application/dto/SimpleMenuServiceRs.java b/src/main/java/kitchenpos/menu/application/dto/SimpleMenuServiceRs.java new file mode 100644 index 000000000..375f03853 --- /dev/null +++ b/src/main/java/kitchenpos/menu/application/dto/SimpleMenuServiceRs.java @@ -0,0 +1,42 @@ +package kitchenpos.menu.application.dto; + +import java.math.BigDecimal; +import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; + +public class SimpleMenuServiceRs { + private UUID id; + private String name; + private BigDecimal price; + private boolean isDisplayed; + + public SimpleMenuServiceRs(UUID id, String name, BigDecimal price, boolean isDisplayed) { + this.id = id; + this.name = name; + this.price = price; + this.isDisplayed = isDisplayed; + } + + public SimpleMenuServiceRs(Menu menu) { + this.id = menu.getId(); + this.name = menu.getInnerName(); + this.price = menu.getInnerPrice(); + this.isDisplayed = menu.isDisplayed(); + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + + public boolean isDisplayed() { + return isDisplayed; + } +} diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java index 22a309f26..446a44383 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java @@ -13,7 +13,6 @@ public class MenuGroupName { @Column(name = "name", nullable = false) private final String value; - @JsonCreator protected MenuGroupName(String value) { validateMenuGroupName(value); this.value = value; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuName.java b/src/main/java/kitchenpos/menu/domain/model/MenuName.java index 90954dc8a..526d0c5a1 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuName.java @@ -13,7 +13,6 @@ public class MenuName { @Column(name = "name", nullable = false) private final String value; - @JsonCreator public MenuName(String value) { validateName(value); this.value = value; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java index 67ecd2c08..85ea6eaf7 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java @@ -14,7 +14,6 @@ public class MenuPrice { @Column(name = "price", nullable = false) private final BigDecimal value; - @JsonCreator public MenuPrice(BigDecimal value) { validatePrice(value); this.value = value; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java index 036686f83..4cad0c18d 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java @@ -13,7 +13,6 @@ public class MenuProductQuantity { @Column(name = "quantity", nullable = false) private final Long value; - @JsonCreator public MenuProductQuantity(long value) { validateMenuProductQuantity(value); this.value = value; diff --git a/src/main/java/kitchenpos/menu/ui/MenuRestController.java b/src/main/java/kitchenpos/menu/ui/MenuRestController.java index f0d7c8f41..0ddf9727c 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuRestController.java @@ -4,7 +4,13 @@ import java.util.List; import java.util.UUID; import kitchenpos.menu.application.MenuService; -import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.application.dto.ChangeMenuPriceServiceRq; +import kitchenpos.menu.application.dto.MenuServiceRs; +import kitchenpos.menu.application.dto.SimpleMenuServiceRs; +import kitchenpos.menu.ui.dto.ChangeMenuPriceRq; +import kitchenpos.menu.ui.dto.CreateMenuRq; +import kitchenpos.menu.ui.dto.MenuRs; +import kitchenpos.menu.ui.dto.SimpleMenuRs; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -24,30 +30,40 @@ public MenuRestController(final MenuService menuService) { } @PostMapping - public ResponseEntity create(@RequestBody final Menu request) { - final Menu response = menuService.create(request); + public ResponseEntity create(@RequestBody final CreateMenuRq request) { + MenuServiceRs response = menuService.create(request.toServiceRq()); return ResponseEntity.created(URI.create("/api/menus/" + response.getId())) - .body(response); + .body(new MenuRs(response)); } @PutMapping("/{menuId}/price") - public ResponseEntity changePrice(@PathVariable("menuId") final UUID menuId, - @RequestBody final Menu request) { - return ResponseEntity.ok(menuService.changePrice(menuId, request)); + public ResponseEntity changePrice(@PathVariable("menuId") final UUID menuId, + @RequestBody final ChangeMenuPriceRq request) { + SimpleMenuServiceRs response = menuService.changePrice( + menuId, + new ChangeMenuPriceServiceRq(request.getPrice()) + ); + return ResponseEntity.ok(new SimpleMenuRs(response)); } @PutMapping("/{menuId}/display") - public ResponseEntity display(@PathVariable("menuId") final UUID menuId) { - return ResponseEntity.ok(menuService.display(menuId)); + public ResponseEntity display(@PathVariable("menuId") final UUID menuId) { + SimpleMenuServiceRs response = menuService.display(menuId); + return ResponseEntity.ok(new SimpleMenuRs(response)); } @PutMapping("/{menuId}/hide") - public ResponseEntity hide(@PathVariable("menuId") final UUID menuId) { - return ResponseEntity.ok(menuService.hide(menuId)); + public ResponseEntity hide(@PathVariable("menuId") final UUID menuId) { + SimpleMenuServiceRs response = menuService.hide(menuId); + return ResponseEntity.ok(new SimpleMenuRs(response)); } @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok(menuService.findAll()); + public ResponseEntity> findAll() { + return ResponseEntity.ok( + menuService.findAll().stream() + .map(MenuRs::new) + .toList() + ); } } diff --git a/src/main/java/kitchenpos/menu/ui/dto/ChangeMenuPriceRq.java b/src/main/java/kitchenpos/menu/ui/dto/ChangeMenuPriceRq.java new file mode 100644 index 000000000..a9c7f6c07 --- /dev/null +++ b/src/main/java/kitchenpos/menu/ui/dto/ChangeMenuPriceRq.java @@ -0,0 +1,18 @@ +package kitchenpos.menu.ui.dto; + +import java.math.BigDecimal; + +public class ChangeMenuPriceRq { + private BigDecimal price; + + public ChangeMenuPriceRq(BigDecimal price) { + this.price = price; + } + + public ChangeMenuPriceRq() { + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/menu/ui/dto/CreateMenuRq.java b/src/main/java/kitchenpos/menu/ui/dto/CreateMenuRq.java new file mode 100644 index 000000000..6bb6f0479 --- /dev/null +++ b/src/main/java/kitchenpos/menu/ui/dto/CreateMenuRq.java @@ -0,0 +1,80 @@ +package kitchenpos.menu.ui.dto; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; +import kitchenpos.menu.application.dto.CreateMenuServiceRq; +import kitchenpos.menu.application.dto.CreateMenuServiceRq.MenuProductServiceRq; + +public class CreateMenuRq { + private String name; + private BigDecimal price; + private boolean isDisplayed; + private UUID menuGroupId; + private List menuProductRqs; + + public CreateMenuRq(String name, BigDecimal price, boolean isDisplayed, UUID menuGroupId, + List menuProductRqs) { + this.name = name; + this.price = price; + this.isDisplayed = isDisplayed; + this.menuGroupId = menuGroupId; + this.menuProductRqs = menuProductRqs; + } + + public CreateMenuRq() { + } + + public CreateMenuServiceRq toServiceRq() { + return new CreateMenuServiceRq( + this.name, + this.price, + this.isDisplayed, + this.menuGroupId, + this.menuProductRqs.stream() + .map(mp -> new MenuProductServiceRq(mp.productId, mp.quantity)) + .toList() + ); + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + + public boolean isDisplayed() { + return isDisplayed; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public List getMenuProductRqs() { + return menuProductRqs; + } + + public static class MenuProductRq { + private UUID productId; + private long quantity; + + public MenuProductRq(UUID productId, long quantity) { + this.productId = productId; + this.quantity = quantity; + } + + public MenuProductRq() { + } + + public UUID getProductId() { + return productId; + } + + public long getQuantity() { + return quantity; + } + } +} diff --git a/src/main/java/kitchenpos/menu/ui/dto/MenuRs.java b/src/main/java/kitchenpos/menu/ui/dto/MenuRs.java new file mode 100644 index 000000000..e7eb2a2f9 --- /dev/null +++ b/src/main/java/kitchenpos/menu/ui/dto/MenuRs.java @@ -0,0 +1,81 @@ +package kitchenpos.menu.ui.dto; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; +import kitchenpos.menu.application.dto.MenuServiceRs; + +public class MenuRs { + private UUID id; + private String name; + private BigDecimal price; + private boolean isDisplayed; + private UUID menuGroupId; + private List menuProductRsList; + + public MenuRs(UUID id, String name, BigDecimal price, boolean isDisplayed, UUID menuGroupId, + List menuProductRsList) { + this.id = id; + this.name = name; + this.price = price; + this.isDisplayed = isDisplayed; + this.menuGroupId = menuGroupId; + this.menuProductRsList = menuProductRsList; + } + + public MenuRs(MenuServiceRs rs) { + this.id = rs.getId(); + this.name = rs.getName(); + this.price = rs.getPrice(); + this.isDisplayed = rs.isDisplayed(); + this.menuGroupId = rs.getMenuGroupId(); + this.menuProductRsList = rs.getMenuProductServiceRsList().stream() + .map(mpsrs -> new MenuProductRs(mpsrs.getProductId(), mpsrs.getQuantity())) + .toList(); + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + + public boolean isDisplayed() { + return isDisplayed; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public List getMenuProductRsList() { + return menuProductRsList; + } + + public static class MenuProductRs { + private UUID productId; + private long quantity; + + public MenuProductRs(UUID productId, long quantity) { + this.productId = productId; + this.quantity = quantity; + } + + public MenuProductRs() { + } + + public UUID getProductId() { + return productId; + } + + public long getQuantity() { + return quantity; + } + } +} diff --git a/src/main/java/kitchenpos/menu/ui/dto/SimpleMenuRs.java b/src/main/java/kitchenpos/menu/ui/dto/SimpleMenuRs.java new file mode 100644 index 000000000..57053558e --- /dev/null +++ b/src/main/java/kitchenpos/menu/ui/dto/SimpleMenuRs.java @@ -0,0 +1,42 @@ +package kitchenpos.menu.ui.dto; + +import java.math.BigDecimal; +import java.util.UUID; +import kitchenpos.menu.application.dto.SimpleMenuServiceRs; + +public class SimpleMenuRs { + private UUID id; + private String name; + private BigDecimal price; + private boolean isDisplayed; + + public SimpleMenuRs(UUID id, String name, BigDecimal price, boolean isDisplayed) { + this.id = id; + this.name = name; + this.price = price; + this.isDisplayed = isDisplayed; + } + + public SimpleMenuRs(SimpleMenuServiceRs rs) { + this.id = rs.getId(); + this.name = rs.getName(); + this.price = rs.getPrice(); + this.isDisplayed = rs.isDisplayed(); + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + + public boolean isDisplayed() { + return isDisplayed; + } +} diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index e6cabcd38..4ad68f79c 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -8,9 +8,14 @@ import java.math.BigDecimal; import java.util.HashMap; import java.util.List; -import java.util.NoSuchElementException; +import java.util.UUID; import kitchenpos.common.application.PurgomalumClient; import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.menu.application.dto.ChangeMenuPriceServiceRq; +import kitchenpos.menu.application.dto.CreateMenuServiceRq; +import kitchenpos.menu.application.dto.CreateMenuServiceRq.MenuProductServiceRq; +import kitchenpos.menu.application.dto.MenuServiceRs; +import kitchenpos.menu.application.dto.SimpleMenuServiceRs; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuNameCreationService; @@ -59,17 +64,16 @@ void create_menu() { menuGroupRepository.save(menuGroup); Product product = createProduct(BigDecimal.valueOf(5000)); productRepository.save(product); - Menu request = createMenuRequest("김치찌개", 8000, menuGroup, product); + CreateMenuServiceRq request = createMenuServiceRequest("김치찌개", 12000, menuGroup.getId(), product.getId()); // when - Menu created = menuService.create(request); + MenuServiceRs result = menuService.create(request); // then - assertThat(created.getId()).isNotNull(); - assertThat(created.getInnerName()).isEqualTo("김치찌개"); - assertThat(created.getInnerPrice()).isEqualTo(BigDecimal.valueOf(8000)); - MenuGroup actualMenuGroup = created.getMenuGroup(); - assertThat(actualMenuGroup.getName()).isEqualTo("한식"); + assertThat(result.getId()).isNotNull(); + assertThat(result.getName()).isEqualTo("김치찌개"); + assertThat(result.getPrice()).isEqualTo(BigDecimal.valueOf(12000)); + assertThat(result.getMenuGroupId()).isEqualTo(menuGroup.getId()); assertThat(menuRepository.findAll().size()).isEqualTo(1); } @@ -77,13 +81,15 @@ void create_menu() { @DisplayName("메뉴 가격은 0원 미만이면 예외가 발생한다.") void menu_price_exception() { // given - MenuGroup menuGroup = createMenuGroup(); - Product product = createProduct(BigDecimal.valueOf(5000)); + MenuGroup menuGroup = createAndSaveMenuGroup(); + Product product = createAndSaveProduct(); + CreateMenuServiceRq request = createMenuServiceRequest("김치찌개", -1000, menuGroup.getId(), + product.getId()); // when // then - assertThatThrownBy(() -> menuService.create(createMenuRequest("김치찌개", -1000, menuGroup, - product))) - .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> { + menuService.create(request); + }).isInstanceOf(IllegalArgumentException.class); } @ParameterizedTest @@ -95,10 +101,13 @@ void menu_name_exists_exception(String name) { menuGroupRepository.save(menuGroup); Product product = createProduct(BigDecimal.valueOf(5000)); productRepository.save(product); + CreateMenuServiceRq request = createMenuServiceRequest(name, 8000, menuGroup.getId(), + product.getId()); // when // then - assertThatThrownBy(() -> menuService.create(createMenuRequest(name, 8000, menuGroup, - product))).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> { + menuService.create(request); + }).isInstanceOf(IllegalArgumentException.class); } @Test @@ -109,8 +118,8 @@ void menu_name_profanity_exception() { menuGroupRepository.save(menuGroup); Product product = createProduct(BigDecimal.valueOf(5000)); productRepository.save(product); - Menu request = createMenuRequest("fuck", 8000, menuGroup, - product); + CreateMenuServiceRq request = createMenuServiceRequest("fuck", 8000, menuGroup.getId(), + product.getId()); // 다운 캐스팅해서 강제로 메소드 호출 FakePurgomalumClient fakePurgomalumClient = (FakePurgomalumClient) purgomalumClient; @@ -121,24 +130,23 @@ void menu_name_profanity_exception() { .isInstanceOf(IllegalArgumentException.class); } - @Test - @DisplayName("메뉴 그룹이 존재하지 않으면 예외가 발생한다") - void menu_group_exception() { - // given - Product product = createProduct(BigDecimal.valueOf(5000)); - MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); - MenuGroup menuGroup = null; - - // when // then - assertThatThrownBy(() -> { - Menu request = new Menu("김치찌개", BigDecimal.valueOf(8000), true, List.of(menuProduct), menuGroup, - null); - menuService.create(request); - }) - .isInstanceOf(NoSuchElementException.class) - .hasMessage("메뉴 그룹이 존재하지 않습니다!"); - } - + /** + * 필요 없어진 테스트 + */ +// @Test +// @DisplayName("메뉴 그룹이 존재하지 않으면 예외가 발생한다") +// void menu_group_exception() { +// // given +// Product product = createProduct(BigDecimal.valueOf(5000)); +// MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); +// CreateMenuServiceRq request = createMenuServiceRequest("김치찌개", 8000, UUID.randomUUID(), menuProduct.getProductId()); +// +// // when // then +// assertThatThrownBy(() -> { +// menuService.create(request); +// }).isInstanceOf(NoSuchElementException.class) +// .hasMessage("메뉴 그룹이 존재하지 않습니다!"); +// } @Test @DisplayName("메뉴의 판매 가격이 재료 가격의 총합 낮으면 예외가 발생한다.") void create_menu_with_menuPrice_andTotalPrice_exception() { @@ -147,11 +155,10 @@ void create_menu_with_menuPrice_andTotalPrice_exception() { menuGroupRepository.save(menuGroup); Product product = createProduct(BigDecimal.valueOf(10000)); productRepository.save(product); - Menu request = createMenuRequest("김치찌개", 8000, menuGroup, product); + CreateMenuServiceRq request = createMenuServiceRequest("김치찌개", 8000, menuGroup.getId(), product.getId()); // when // then assertThatThrownBy(() -> { - request.changePrice(BigDecimal.valueOf(8000)); menuService.create(request); }).isInstanceOf(IllegalStateException.class) .hasMessage("마진이 남지 않습니다! 마진을 남기게 만들어주세요!"); @@ -163,14 +170,14 @@ void change_price() { // given Menu menu = createMenuWithProductAndGroup(); menuRepository.save(menu); - Menu request = new Menu(); - request.changePrice(BigDecimal.valueOf(12000)); + + ChangeMenuPriceServiceRq request = new ChangeMenuPriceServiceRq(BigDecimal.valueOf(12000)); // when - Menu updated = menuService.changePrice(menu.getId(), request); + SimpleMenuServiceRs result = menuService.changePrice(menu.getId(), request); // then - assertThat(updated.getInnerPrice()).isEqualTo(BigDecimal.valueOf(12000)); + assertThat(result.getPrice()).isEqualTo(BigDecimal.valueOf(12000)); } @Test @@ -179,11 +186,11 @@ void change_price_with_menuPrice_andTotalPrice_exception() { // given Menu menu = createMenuWithProductAndGroup(); menuRepository.save(menu); - Menu request = new Menu(); + + ChangeMenuPriceServiceRq request = new ChangeMenuPriceServiceRq(BigDecimal.valueOf(4000)); // when // then assertThatThrownBy(() -> { - request.changePrice(BigDecimal.valueOf(4000)); menuService.changePrice(menu.getId(), request); }).isInstanceOf(IllegalStateException.class) .hasMessage("마진이 남지 않습니다! 마진을 남기게 만들어주세요!"); @@ -197,10 +204,10 @@ void display() { menuRepository.save(menu); // when - Menu displayed = menuService.display(menu.getId()); + SimpleMenuServiceRs result = menuService.display(menu.getId()); // then - assertThat(displayed.isDisplayed()).isTrue(); + assertThat(result.isDisplayed()).isTrue(); } @Test @@ -212,10 +219,10 @@ void hide() { menuRepository.save(menu); // when - Menu hidden = menuService.hide(menu.getId()); + SimpleMenuServiceRs result = menuService.hide(menu.getId()); // then - assertThat(hidden.isDisplayed()).isFalse(); + assertThat(result.isDisplayed()).isFalse(); } @@ -230,10 +237,10 @@ void find_allMenus() { } // when - List found = menuService.findAll(); + List result = menuService.findAll(); // then - assertThat(found).hasSize(2); + assertThat(result).hasSize(2); } private MenuGroup createMenuGroup() { @@ -245,4 +252,17 @@ private Menu createMenuRequest(String name, int price, MenuGroup menuGroup, Prod return new Menu(name, BigDecimal.valueOf(price), true, List.of(menuProduct), menuGroup, menuGroup.getId()); } + + private CreateMenuServiceRq createMenuServiceRequest(String name, int price, UUID menuGroupId, UUID productId) { + return new CreateMenuServiceRq(name, BigDecimal.valueOf(price), true, menuGroupId, + List.of(new MenuProductServiceRq(productId, 2))); + } + + private MenuGroup createAndSaveMenuGroup() { + return menuGroupRepository.save(createMenuGroup()); + } + + private Product createAndSaveProduct() { + return productRepository.save(createProduct("김치", 5000)); + } } diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuProductRsQuantityTest.java similarity index 94% rename from src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java rename to src/test/java/kitchenpos/menu/domain/model/MenuProductRsQuantityTest.java index 103dc3daa..67760a07e 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuProductQuantityTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuProductRsQuantityTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -class MenuProductQuantityTest { +class MenuProductRsQuantityTest { @Test @DisplayName("메뉴 상품의 수량이 1 이상이 아니면 예외를 던진다.") diff --git a/src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java b/src/test/java/kitchenpos/menu/domain/service/MenuProductRsValidatorTest.java similarity index 98% rename from src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java rename to src/test/java/kitchenpos/menu/domain/service/MenuProductRsValidatorTest.java index 0903ef94d..d7d9518b1 100644 --- a/src/test/java/kitchenpos/menu/domain/service/MenuProductValidatorTest.java +++ b/src/test/java/kitchenpos/menu/domain/service/MenuProductRsValidatorTest.java @@ -17,7 +17,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -class MenuProductValidatorTest { +class MenuProductRsValidatorTest { private MenuProductValidator menuProductValidator; private ProductRepository productRepository; diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java index 54690e079..fc0b6498a 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -6,7 +6,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -15,11 +14,14 @@ import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuProduct; import kitchenpos.menu.domain.repository.MenuGroupRepository; import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.ui.dto.CreateMenuRq; +import kitchenpos.menu.ui.dto.CreateMenuRq.MenuProductRq; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.junit.jupiter.api.DisplayName; @@ -56,7 +58,9 @@ class MenuRestControllerTest { @DisplayName("메뉴를 생성한다") void create_menu_success() throws Exception { // given - Menu request = createMenuRequest(createAndSaveMenuGroup(), createAndSaveProduct()); + MenuGroup menuGroup = createAndSaveMenuGroup(); + Product product = createAndSaveProduct(); + CreateMenuRq request = createMenuRequest("김치찌개", 12000, menuGroup.getId(), product.getId()); // when ResultActions result = mockMvc.perform(post("/api/menus") @@ -68,10 +72,9 @@ void create_menu_success() throws Exception { .andExpect(header().exists("Location")) .andExpect(jsonPath("$.id").exists()) .andExpect(jsonPath("$.name").value("김치찌개")) - .andExpect(jsonPath("$.price").value(8000)) - .andExpect(jsonPath("$.menuGroup").exists()) - .andExpect(jsonPath("$.menuProducts").isNotEmpty()) - .andDo(print()); + .andExpect(jsonPath("$.price").value(12000)) + .andExpect(jsonPath("$.menuGroupId").exists()) + .andExpect(jsonPath("$.menuProductRsList").isNotEmpty()); } @Test @@ -201,4 +204,9 @@ private Menu createAndSaveMenu(boolean displayed) { menuGroup.getId()); return menuRepository.save(menu); } + + private CreateMenuRq createMenuRequest(String name, int price, UUID menuGroupId, UUID productId) { + return new CreateMenuRq(name, BigDecimal.valueOf(price), true, menuGroupId, + List.of(new MenuProductRq(productId, 2))); + } } diff --git a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java index d2e69eb01..0ec402a58 100644 --- a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java @@ -61,24 +61,28 @@ class OrderRestControllerTest { @Autowired private ProductRepository productRepository; - @Test - @DisplayName("주문을 생성한다.") - void create_success() throws Exception { - // given - Order request = createOrderRequestWithDeliveryType(); - - // when - ResultActions result = mockMvc.perform(post("/api/orders") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))); - - // then - result.andExpect(status().isCreated()) - .andExpect(header().exists("Location")) - .andExpect(jsonPath("$.id").exists()) - .andExpect(jsonPath("$.orderLineItems").isArray()) - .andExpect(jsonPath("$.status").value("WAITING")); - } + /** + * 필요 없어진 테스트 + * @throws Exception + */ +// @Test +// @DisplayName("주문을 생성한다.") +// void create_success() throws Exception { +// // given +// Order request = createOrderRequestWithDeliveryType(); +// +// // when +// ResultActions result = mockMvc.perform(post("/api/orders") +// .contentType(MediaType.APPLICATION_JSON) +// .content(objectMapper.writeValueAsString(request))); +// +// // then +// result.andExpect(status().isCreated()) +// .andExpect(header().exists("Location")) +// .andExpect(jsonPath("$.id").exists()) +// .andExpect(jsonPath("$.orderLineItems").isArray()) +// .andExpect(jsonPath("$.status").value("WAITING")); +// } @Test @DisplayName("주문 상태가 주문 대기 중이라면 주문을 수락할 수 있다.") From 9a60447fd4a7cfdddf84855a5d4506ab2b08db05 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:22:58 +0900 Subject: [PATCH 44/71] =?UTF-8?q?remove(kitchen=20pos)=20:=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/kitchenpos/TestFixtureFactory.java | 12 ++---------- .../kitchenpos/menu/application/MenuServiceTest.java | 6 ------ .../kitchenpos/menu/ui/MenuRestControllerTest.java | 6 ------ .../order/common/ui/OrderRestControllerTest.java | 11 ----------- .../application/OrderTableServiceTest.java | 4 ---- .../product/application/ProductServiceTest.java | 4 ---- 6 files changed, 2 insertions(+), 41 deletions(-) diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 3ee399fd5..40004c6b9 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -1,7 +1,5 @@ package kitchenpos; -import static org.hamcrest.text.MatchesPattern.matchesPattern; - import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @@ -15,11 +13,11 @@ import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.model.OrderType; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; -import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq; -import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; import kitchenpos.order.eatinorder.ui.dto.CreateEatInOrderRq; import kitchenpos.order.eatinorder.ui.dto.CreateEatInOrderRq.OrderLineItemDto; import kitchenpos.product.domain.model.Product; @@ -110,12 +108,6 @@ public static Order createOrderWithTakeOutType(OrderLineItem orderLineItem, Orde "주소", orderTable, orderTable.getId()); } - public static Order createOrderWithEatInType(OrderLineItem orderLineItem, OrderTable orderTable, - OrderStatus status) { - return new Order(OrderType.EAT_IN, status, LocalDateTime.now(), List.of(orderLineItem), - "주소", orderTable, orderTable.getId()); - } - public static Order createOrder(OrderLineItem orderLineItem, OrderTable orderTable, OrderType orderType, OrderStatus orderStatus, String address) { return new Order(orderType, orderStatus, LocalDateTime.now(), List.of(orderLineItem), diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 4ad68f79c..0257ba191 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -247,12 +247,6 @@ private MenuGroup createMenuGroup() { return new MenuGroup("한식"); } - private Menu createMenuRequest(String name, int price, MenuGroup menuGroup, Product product) { - MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); - return new Menu(name, BigDecimal.valueOf(price), true, List.of(menuProduct), menuGroup, - menuGroup.getId()); - } - private CreateMenuServiceRq createMenuServiceRequest(String name, int price, UUID menuGroupId, UUID productId) { return new CreateMenuServiceRq(name, BigDecimal.valueOf(price), true, menuGroupId, List.of(new MenuProductServiceRq(productId, 2))); diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java index fc0b6498a..72a3e683f 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -182,12 +182,6 @@ void find_allMenus() throws Exception { .andExpect(jsonPath("$.length()").value(2)); } - private Menu createMenuRequest(MenuGroup menuGroup, Product product) { - MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); - return new Menu("김치찌개", BigDecimal.valueOf(8000), true, List.of(menuProduct), menuGroup, - menuGroup.getId()); - } - private MenuGroup createAndSaveMenuGroup() { return menuGroupRepository.save(createMenuGroup()); } diff --git a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java index 0ec402a58..b4802d0f1 100644 --- a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java @@ -185,17 +185,6 @@ void findAll_success() throws Exception { .andExpect(jsonPath("$.length()").value(2)); } - private Order createOrderRequestWithDeliveryType() { - MenuGroup menuGroup = createAndSaveMenuGroup(); - Product product = createAndSaveProduct(); - Menu menu = createAndSaveMenu(menuGroup, product); - - OrderLineItem orderLineItem = createOrderLineItem(menu); - OrderTable orderTable = createAndSaveOrderTable(); - - return createOrderWithDeliveryType(orderLineItem, orderTable, OrderStatus.WAITING); - } - private Order createAndSaveOrderWithDeliveryType() { MenuGroup menuGroup = createAndSaveMenuGroup(); Product product = createAndSaveProduct(); diff --git a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index a05433510..57ecfb68d 100644 --- a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -192,8 +192,4 @@ void change_numberOfGuests_negative_number_exception() { }).isInstanceOf(IllegalArgumentException.class) .hasMessage("손님 수가 음수일 수 없습니다!"); } - - private OrderTable createOrderTableRequest() { - return new OrderTable("1번 테이블", 0, false); - } } diff --git a/src/test/java/kitchenpos/product/application/ProductServiceTest.java b/src/test/java/kitchenpos/product/application/ProductServiceTest.java index 08a5d2982..4b4df7e1a 100644 --- a/src/test/java/kitchenpos/product/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/product/application/ProductServiceTest.java @@ -134,8 +134,4 @@ void find_all() { // then assertThat(result).hasSize(2); } - - private Product createProductRequest(String name, long price) { - return createProduct(name, price); - } } From 5354b99dad8c17cab27ceba4e42f35265c718a78 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:45:39 +0900 Subject: [PATCH 45/71] =?UTF-8?q?feat(kitchen=20pos)=20:=20=EA=B0=99?= =?UTF-8?q?=EC=9D=80=20=ED=8A=B8=EB=9E=9C=EC=9E=AD=EC=85=98=20=EC=A0=84?= =?UTF-8?q?=ED=8C=8C=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=ED=95=B4=20=EC=98=A4=EB=A5=98=20=EB=B0=9C=EC=83=9D?= =?UTF-8?q?=20=EC=8B=9C=20=EA=B0=99=EC=9D=B4=20=EB=A1=A4=EB=B0=B1=EB=90=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/service/OrderTableOccupationManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java b/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java index eb43de009..916bc13d9 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java @@ -6,8 +6,8 @@ import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.model.ReleaseOrderTableEvent; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; -import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; +import org.springframework.transaction.event.TransactionalEventListener; @Service public class OrderTableOccupationManager { @@ -17,7 +17,7 @@ public OrderTableOccupationManager(EatInOrderRepository eatInOrderRepository) { this.eatInOrderRepository = eatInOrderRepository; } - @EventListener + @TransactionalEventListener public void release(ReleaseOrderTableEvent event) { OrderTable orderTable = event.orderTable(); if (eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(orderTable, EatInOrderFlow.COMPLETED)) { From a61dbf8d418e95aafee54d7440bba087bead8ff2 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 23:25:12 +0900 Subject: [PATCH 46/71] =?UTF-8?q?fix(kitchen=20pos)=20:=20event=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=EC=97=90=EC=84=9C=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=20=EC=8B=9C=20=EC=A0=84=EC=B2=B4=20=ED=8A=B8?= =?UTF-8?q?=EB=9E=9C=EC=9E=AD=EC=85=98=EC=9D=B4=20=ED=95=A8=EA=BB=98=20?= =?UTF-8?q?=EB=A1=A4=EB=B0=B1=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorder/domain/service/OrderTableOccupationManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java b/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java index 916bc13d9..54fbe7436 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/service/OrderTableOccupationManager.java @@ -7,6 +7,7 @@ import kitchenpos.order.eatinorder.domain.model.ReleaseOrderTableEvent; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; @Service @@ -17,7 +18,7 @@ public OrderTableOccupationManager(EatInOrderRepository eatInOrderRepository) { this.eatInOrderRepository = eatInOrderRepository; } - @TransactionalEventListener + @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT) public void release(ReleaseOrderTableEvent event) { OrderTable orderTable = event.orderTable(); if (eatInOrderRepository.existsByOrderTableAndEatInOrderFlowNot(orderTable, EatInOrderFlow.COMPLETED)) { From 3dcf859411423352a5a889ec27e3c9991a4b8bca Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Wed, 26 Feb 2025 23:15:23 +0900 Subject: [PATCH 47/71] =?UTF-8?q?chore(kitchen=20pos)=20:=20queryDSL=20gra?= =?UTF-8?q?dle=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 67ab16154..743f6f0cb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,6 +6,7 @@ plugins { kotlin("jvm") version "1.9.23" kotlin("plugin.spring") version "1.9.23" kotlin("plugin.jpa") version "1.9.23" + kotlin("kapt") version "1.9.23" id("org.flywaydb.flyway") version "7.12.0" } @@ -32,6 +33,11 @@ dependencies { runtimeOnly("com.h2database:h2") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") + + implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta") + kapt("com.querydsl:querydsl-apt:5.0.0:jakarta") + kapt("jakarta.persistence:jakarta.persistence-api") + kapt("jakarta.annotation:jakarta.annotation-api") } tasks.withType { From 767a12fe207037c70743b005e9e679f610aaac2f Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Wed, 26 Feb 2025 23:15:53 +0900 Subject: [PATCH 48/71] =?UTF-8?q?feat(kitchen=20pos)=20:=20Menu,=20Product?= =?UTF-8?q?=20=EC=BF=BC=EB=A6=AC=20=EB=AA=A8=EB=8D=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/domain/model/MenuSummary.java | 29 +++++++++++++++++++ .../product/domain/model/ProductSummary.java | 17 +++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/main/java/kitchenpos/menu/domain/model/MenuSummary.java create mode 100644 src/main/java/kitchenpos/product/domain/model/ProductSummary.java diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java b/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java new file mode 100644 index 000000000..049a250c1 --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java @@ -0,0 +1,29 @@ +package kitchenpos.menu.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import kitchenpos.product.domain.model.ProductSummary; + +@Entity +public class MenuSummary { + + @Id + @Column(name = "id") + private UUID id; + private String menuName; + private BigDecimal price; + private boolean isDisplayed; + private UUID menuGroupId; + private String menuGroupName; + + @OneToMany(mappedBy = "menuSummary") + private List productSummaries = new ArrayList<>(); +} + + diff --git a/src/main/java/kitchenpos/product/domain/model/ProductSummary.java b/src/main/java/kitchenpos/product/domain/model/ProductSummary.java new file mode 100644 index 000000000..52383cc0f --- /dev/null +++ b/src/main/java/kitchenpos/product/domain/model/ProductSummary.java @@ -0,0 +1,17 @@ +package kitchenpos.product.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import java.util.UUID; + +@Entity +public class ProductSummary { + + @Id + @Column(name = "id") + private UUID id; + + private String name; + private long quantity; +} From d9a8710c58b7c45d5c064cb09358f69c0fe45b06 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 27 Feb 2025 00:12:49 +0900 Subject: [PATCH 49/71] =?UTF-8?q?feat(kitchen=20pos)=20:=20findAll=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EB=AA=A8=EB=8D=B8=EC=9D=84=20=ED=86=B5?= =?UTF-8?q?=ED=95=B4=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/QuerydslConfig.java | 21 +++++++++ .../menu/application/MenuQueryService.java | 19 ++++++++ .../menu/domain/model/MenuSummary.java | 46 ++++++++++++++++++- .../repository/MenuQueryRepository.java | 11 +++++ .../QuerydslMenuQueryRepository.java | 28 +++++++++++ .../menu/ui/MenuGroupRestController.java | 18 ++++---- .../menu/ui/MenuRestController.java | 14 +++--- .../product/domain/model/ProductSummary.java | 9 ++++ .../menu/ui/MenuRestControllerTest.java | 31 ++++++------- 9 files changed, 163 insertions(+), 34 deletions(-) create mode 100644 src/main/java/kitchenpos/common/config/QuerydslConfig.java create mode 100644 src/main/java/kitchenpos/menu/application/MenuQueryService.java create mode 100644 src/main/java/kitchenpos/menu/domain/repository/MenuQueryRepository.java create mode 100644 src/main/java/kitchenpos/menu/infra/persistence/QuerydslMenuQueryRepository.java diff --git a/src/main/java/kitchenpos/common/config/QuerydslConfig.java b/src/main/java/kitchenpos/common/config/QuerydslConfig.java new file mode 100644 index 000000000..259af694d --- /dev/null +++ b/src/main/java/kitchenpos/common/config/QuerydslConfig.java @@ -0,0 +1,21 @@ +package kitchenpos.common.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QuerydslConfig { + + private final EntityManager entityManager; + + public QuerydslConfig(EntityManager entityManager) { + this.entityManager = entityManager; + } + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} diff --git a/src/main/java/kitchenpos/menu/application/MenuQueryService.java b/src/main/java/kitchenpos/menu/application/MenuQueryService.java new file mode 100644 index 000000000..4aa61fb4c --- /dev/null +++ b/src/main/java/kitchenpos/menu/application/MenuQueryService.java @@ -0,0 +1,19 @@ +package kitchenpos.menu.application; + +import java.util.List; +import kitchenpos.menu.domain.model.MenuSummary; +import kitchenpos.menu.domain.repository.MenuQueryRepository; +import org.springframework.stereotype.Service; + +@Service +public class MenuQueryService { + private final MenuQueryRepository menuQueryRepository; + + public MenuQueryService(MenuQueryRepository menuQueryRepository) { + this.menuQueryRepository = menuQueryRepository; + } + + public List findAll() { + return menuQueryRepository.findAll(); + } +} diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java b/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java index 049a250c1..4f5c7f8f6 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java @@ -3,6 +3,7 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToMany; import java.math.BigDecimal; import java.util.ArrayList; @@ -22,8 +23,51 @@ public class MenuSummary { private UUID menuGroupId; private String menuGroupName; - @OneToMany(mappedBy = "menuSummary") + @OneToMany + @JoinColumn(name = "menu_summary_id") private List productSummaries = new ArrayList<>(); + + public MenuSummary(String menuName, BigDecimal price, boolean isDisplayed, UUID menuGroupId, + String menuGroupName, List productSummaries) { + this.id = UUID.randomUUID(); + this.menuName = menuName; + this.price = price; + this.isDisplayed = isDisplayed; + this.menuGroupId = menuGroupId; + this.menuGroupName = menuGroupName; + this.productSummaries = productSummaries; + } + + protected MenuSummary() { + } + + public UUID getId() { + return id; + } + + public String getMenuName() { + return menuName; + } + + public BigDecimal getPrice() { + return price; + } + + public boolean isDisplayed() { + return isDisplayed; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public String getMenuGroupName() { + return menuGroupName; + } + + public List getProductSummaries() { + return productSummaries; + } } diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuQueryRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuQueryRepository.java new file mode 100644 index 000000000..8ba9227a4 --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuQueryRepository.java @@ -0,0 +1,11 @@ +package kitchenpos.menu.domain.repository; + +import java.util.List; +import kitchenpos.menu.domain.model.MenuSummary; +import org.springframework.stereotype.Repository; + +@Repository +public interface MenuQueryRepository { + + List findAll(); +} diff --git a/src/main/java/kitchenpos/menu/infra/persistence/QuerydslMenuQueryRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/QuerydslMenuQueryRepository.java new file mode 100644 index 000000000..419111581 --- /dev/null +++ b/src/main/java/kitchenpos/menu/infra/persistence/QuerydslMenuQueryRepository.java @@ -0,0 +1,28 @@ +package kitchenpos.menu.infra.persistence; + +import static kitchenpos.menu.domain.model.QMenuSummary.menuSummary; +import static kitchenpos.product.domain.model.QProductSummary.productSummary; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.List; +import kitchenpos.menu.domain.model.MenuSummary; +import kitchenpos.menu.domain.repository.MenuQueryRepository; +import org.springframework.stereotype.Repository; + +@Repository +public class QuerydslMenuQueryRepository implements MenuQueryRepository { + private final JPAQueryFactory queryFactory; + + public QuerydslMenuQueryRepository(JPAQueryFactory queryFactory) { + this.queryFactory = queryFactory; + } + + @Override + public List findAll() { + return queryFactory + .selectFrom(menuSummary) + .distinct() + .leftJoin(menuSummary.productSummaries, productSummary).fetchJoin() + .fetch(); + } +} diff --git a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java index a1c779708..41a112a8b 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java @@ -1,14 +1,12 @@ package kitchenpos.menu.ui; import java.net.URI; -import java.util.List; import kitchenpos.menu.application.MenuGroupService; import kitchenpos.menu.application.dto.CreateMenuGroupServiceRq; import kitchenpos.menu.application.dto.MenuGroupServiceRs; import kitchenpos.menu.ui.dto.CreateMenuGroupRq; import kitchenpos.menu.ui.dto.MenuGroupRs; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -31,12 +29,12 @@ public ResponseEntity create(@RequestBody final CreateMenuGroupRq r .body(new MenuGroupRs(response)); } - @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok( - menuGroupService.findAll().stream() - .map(MenuGroupRs::new) - .toList() - ); - } +// @GetMapping +// public ResponseEntity> findAll() { +// return ResponseEntity.ok( +// menuGroupService.findAll().stream() +// .map(MenuGroupRs::new) +// .toList() +// ); +// } } diff --git a/src/main/java/kitchenpos/menu/ui/MenuRestController.java b/src/main/java/kitchenpos/menu/ui/MenuRestController.java index 0ddf9727c..e8aaa710f 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuRestController.java @@ -3,10 +3,12 @@ import java.net.URI; import java.util.List; import java.util.UUID; +import kitchenpos.menu.application.MenuQueryService; import kitchenpos.menu.application.MenuService; import kitchenpos.menu.application.dto.ChangeMenuPriceServiceRq; import kitchenpos.menu.application.dto.MenuServiceRs; import kitchenpos.menu.application.dto.SimpleMenuServiceRs; +import kitchenpos.menu.domain.model.MenuSummary; import kitchenpos.menu.ui.dto.ChangeMenuPriceRq; import kitchenpos.menu.ui.dto.CreateMenuRq; import kitchenpos.menu.ui.dto.MenuRs; @@ -24,9 +26,11 @@ @RestController public class MenuRestController { private final MenuService menuService; + private final MenuQueryService menuQueryService; - public MenuRestController(final MenuService menuService) { + public MenuRestController(final MenuService menuService, MenuQueryService menuQueryService) { this.menuService = menuService; + this.menuQueryService = menuQueryService; } @PostMapping @@ -59,11 +63,7 @@ public ResponseEntity hide(@PathVariable("menuId") final UUID menu } @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok( - menuService.findAll().stream() - .map(MenuRs::new) - .toList() - ); + public ResponseEntity> findAll() { + return ResponseEntity.ok(menuQueryService.findAll()); } } diff --git a/src/main/java/kitchenpos/product/domain/model/ProductSummary.java b/src/main/java/kitchenpos/product/domain/model/ProductSummary.java index 52383cc0f..ede811d50 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductSummary.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductSummary.java @@ -14,4 +14,13 @@ public class ProductSummary { private String name; private long quantity; + + public ProductSummary(String name, long quantity) { + this.id = UUID.randomUUID(); + this.name = name; + this.quantity = quantity; + } + + protected ProductSummary() { + } } diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java index 72a3e683f..f21e35e34 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -3,7 +3,6 @@ import static kitchenpos.TestFixtureFactory.createMenuGroup; import static kitchenpos.TestFixtureFactory.createProduct; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; @@ -166,21 +165,21 @@ void hide_menu() throws Exception { .andExpect(jsonPath("$.displayed").value(false)); } - @Test - @DisplayName("모든 메뉴를 조회한다") - void find_allMenus() throws Exception { - // given - createAndSaveMenu(true); - createAndSaveMenu(true); - - // when - ResultActions result = mockMvc.perform(get("/api/menus")); - - // then - result.andExpect(status().isOk()) - .andExpect(jsonPath("$").isArray()) - .andExpect(jsonPath("$.length()").value(2)); - } +// @Test +// @DisplayName("모든 메뉴를 조회한다") +// void find_allMenus() throws Exception { +// // given +// createAndSaveMenu(true); +// createAndSaveMenu(true); +// +// // when +// ResultActions result = mockMvc.perform(get("/api/menus")); +// +// // then +// result.andExpect(status().isOk()) +// .andExpect(jsonPath("$").isArray()) +// .andExpect(jsonPath("$.length()").value(2)); +// } private MenuGroup createAndSaveMenuGroup() { return menuGroupRepository.save(createMenuGroup()); From 51d8a5b144ce661c38cbabb35064b622e8534328 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 13:35:19 +0900 Subject: [PATCH 50/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20menu=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=98=88=EC=99=B8=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20enum=EC=9C=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kitchenpos/menu/domain/model/Menu.java | 4 ++++ .../menu/domain/model/MenuGroupNameCreationService.java | 2 ++ src/main/java/kitchenpos/menu/domain/model/MenuName.java | 2 ++ .../kitchenpos/menu/domain/model/MenuNameCreationService.java | 2 ++ src/main/java/kitchenpos/menu/domain/model/MenuPrice.java | 2 ++ 5 files changed, 12 insertions(+) diff --git a/src/main/java/kitchenpos/menu/domain/model/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java index 33bdfcf8f..eb5be9e46 100644 --- a/src/main/java/kitchenpos/menu/domain/model/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -14,11 +14,15 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import jakarta.persistence.Transient; + import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_EXISTS_EXCEPTION; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCTS_EXISTS_EXCEPTION; + @Table(name = "menu") @Entity public class Menu { diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java index 8b66c6ec1..a0bdd140a 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java @@ -5,6 +5,8 @@ import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_NAME_VALIDATION_EXCEPTION; + @Service public class MenuGroupNameCreationService { private final PurgomalumClient purgomalumClient; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuName.java b/src/main/java/kitchenpos/menu/domain/model/MenuName.java index 526d0c5a1..d54cb5ce5 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuName.java @@ -8,6 +8,8 @@ import jakarta.persistence.Embeddable; import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; + @Embeddable public class MenuName { @Column(name = "name", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java b/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java index 1b49f1dff..11c97cb3d 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java @@ -5,6 +5,8 @@ import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_VALIDATION_EXCEPTION; + @Service public class MenuNameCreationService { private final PurgomalumClient purgomalumClient; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java index 85ea6eaf7..0925f59db 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java @@ -9,6 +9,8 @@ import java.math.BigDecimal; import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRICE_CREATION_EXCEPTION; + @Embeddable public class MenuPrice { @Column(name = "price", nullable = false) From b87589bf176642029665e4b2ac0438dc2b00f842 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 13:40:35 +0900 Subject: [PATCH 51/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20product=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=98=88=EC=99=B8=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20enum=EC=9C=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kitchenpos/product/domain/model/ProductName.java | 3 +++ .../product/domain/model/ProductNameCreationService.java | 2 ++ .../java/kitchenpos/product/domain/model/ProductPrice.java | 3 +++ 3 files changed, 8 insertions(+) diff --git a/src/main/java/kitchenpos/product/domain/model/ProductName.java b/src/main/java/kitchenpos/product/domain/model/ProductName.java index d5d42dc7c..7aca2b89e 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductName.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductName.java @@ -4,8 +4,11 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.util.Objects; +import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_NAME_CREATION_EXCEPTION; + @Embeddable public class ProductName { @Column(name = "name", nullable = false) diff --git a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java index c32098139..2df14f98c 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java @@ -5,6 +5,8 @@ import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; +import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_NAME_VALIDATION_EXCEPTION; + @Service public class ProductNameCreationService { private final PurgomalumClient purgomalumClient; diff --git a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java index 137a63621..65b8d65c8 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java @@ -4,9 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.math.BigDecimal; import java.util.Objects; +import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_PRICE_CREATION_EXCEPTION; + @Embeddable public class ProductPrice { @Column(name = "price", nullable = false) From ace54b663dc6bd727dfa336490f8c36efb473eee Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Wed, 19 Feb 2025 21:33:54 +0900 Subject: [PATCH 52/71] =?UTF-8?q?fix(kitchen=20pos)=20:=20EatInOrder=20Ent?= =?UTF-8?q?ity=20=EC=83=9D=EC=84=B1=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=20=EB=A7=A4=ED=95=91=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/EatInOrderLineItem.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java new file mode 100644 index 000000000..e93c60b1d --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java @@ -0,0 +1,91 @@ +//package kitchenpos.order.eatinorder.domain.model; +// +//import jakarta.persistence.Column; +//import jakarta.persistence.Entity; +//import jakarta.persistence.ForeignKey; +//import jakarta.persistence.GeneratedValue; +//import jakarta.persistence.GenerationType; +//import jakarta.persistence.Id; +//import jakarta.persistence.JoinColumn; +//import jakarta.persistence.ManyToOne; +//import jakarta.persistence.Table; +//import jakarta.persistence.Transient; +//import java.math.BigDecimal; +//import java.util.UUID; +//import kitchenpos.menu.domain.model.Menu; +// +//@Table(name = "eat_in_order_line_item") +//@Entity +//public class EatInOrderLineItem { +// @Column(name = "seq") +// @GeneratedValue(strategy = GenerationType.IDENTITY) +// @Id +// private Long seq; +// +// @ManyToOne(optional = false) +// @JoinColumn( +// name = "menu_id", +// columnDefinition = "binary(16)", +// foreignKey = @ForeignKey(name = "fk_eat_in_order_line_item_to_menu") +// ) +// private Menu menu; +// +// @Column(name = "quantity", nullable = false) +// private long quantity; +// +// @Transient +// private UUID menuId; +// +// @Transient +// private BigDecimal price; +// +// public EatInOrderLineItem() { +// } +// +// public EatInOrderLineItem(Menu menu, long quantity, UUID menuId, BigDecimal price) { +// this.menu = menu; +// this.quantity = quantity; +// this.menuId = menuId; +// this.price = price; +// } +// +// public Long getSeq() { +// return seq; +// } +// +// public void setSeq(final Long seq) { +// this.seq = seq; +// } +// +// public Menu getMenu() { +// return menu; +// } +// +// public void setMenu(final Menu menu) { +// this.menu = menu; +// } +// +// public long getQuantity() { +// return quantity; +// } +// +// public void setQuantity(final long quantity) { +// this.quantity = quantity; +// } +// +// public UUID getMenuId() { +// return menuId; +// } +// +// public void setMenuId(final UUID menuId) { +// this.menuId = menuId; +// } +// +// public BigDecimal getPrice() { +// return price; +// } +// +// public void setPrice(final BigDecimal price) { +// this.price = price; +// } +//} From 1def6213389bf4bbd909cbf77609e37b560c2bbf Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Wed, 19 Feb 2025 22:45:40 +0900 Subject: [PATCH 53/71] =?UTF-8?q?feat&refactor(kitchen=20pos)=20:=20EatInO?= =?UTF-8?q?rder,=20OrderLineItem=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/EatInOrderLineItem.java | 91 ------------------- 1 file changed, 91 deletions(-) delete mode 100644 src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java deleted file mode 100644 index e93c60b1d..000000000 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderLineItem.java +++ /dev/null @@ -1,91 +0,0 @@ -//package kitchenpos.order.eatinorder.domain.model; -// -//import jakarta.persistence.Column; -//import jakarta.persistence.Entity; -//import jakarta.persistence.ForeignKey; -//import jakarta.persistence.GeneratedValue; -//import jakarta.persistence.GenerationType; -//import jakarta.persistence.Id; -//import jakarta.persistence.JoinColumn; -//import jakarta.persistence.ManyToOne; -//import jakarta.persistence.Table; -//import jakarta.persistence.Transient; -//import java.math.BigDecimal; -//import java.util.UUID; -//import kitchenpos.menu.domain.model.Menu; -// -//@Table(name = "eat_in_order_line_item") -//@Entity -//public class EatInOrderLineItem { -// @Column(name = "seq") -// @GeneratedValue(strategy = GenerationType.IDENTITY) -// @Id -// private Long seq; -// -// @ManyToOne(optional = false) -// @JoinColumn( -// name = "menu_id", -// columnDefinition = "binary(16)", -// foreignKey = @ForeignKey(name = "fk_eat_in_order_line_item_to_menu") -// ) -// private Menu menu; -// -// @Column(name = "quantity", nullable = false) -// private long quantity; -// -// @Transient -// private UUID menuId; -// -// @Transient -// private BigDecimal price; -// -// public EatInOrderLineItem() { -// } -// -// public EatInOrderLineItem(Menu menu, long quantity, UUID menuId, BigDecimal price) { -// this.menu = menu; -// this.quantity = quantity; -// this.menuId = menuId; -// this.price = price; -// } -// -// public Long getSeq() { -// return seq; -// } -// -// public void setSeq(final Long seq) { -// this.seq = seq; -// } -// -// public Menu getMenu() { -// return menu; -// } -// -// public void setMenu(final Menu menu) { -// this.menu = menu; -// } -// -// public long getQuantity() { -// return quantity; -// } -// -// public void setQuantity(final long quantity) { -// this.quantity = quantity; -// } -// -// public UUID getMenuId() { -// return menuId; -// } -// -// public void setMenuId(final UUID menuId) { -// this.menuId = menuId; -// } -// -// public BigDecimal getPrice() { -// return price; -// } -// -// public void setPrice(final BigDecimal price) { -// this.price = price; -// } -//} From d78682d1f2950c0ca81c84397173fd9332d4d983 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 20 Feb 2025 00:16:45 +0900 Subject: [PATCH 54/71] =?UTF-8?q?refactor=20&=20test(kitchen=20pos)=20:=20?= =?UTF-8?q?EatInOrderService=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/common/application/OrderServiceTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java index 1bd1ef60f..c849cb1a2 100644 --- a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java @@ -15,18 +15,24 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.model.OrderType; import kitchenpos.order.common.repository.OrderRepository; import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.service.EatInOrderService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; From 7c4a56651daa0818c6a1607d381399d2140068d0 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Thu, 20 Feb 2025 14:37:45 +0900 Subject: [PATCH 55/71] =?UTF-8?q?test(kitchen=20pos)=20:=20EatInOrderRestC?= =?UTF-8?q?ontroller=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/kitchenpos/TestFixtureFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 40004c6b9..19ccf55ce 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -89,7 +89,7 @@ public static OrderTable createEmptyOrderTable() { } public static OrderTable createUsingOrderTable() { - return new OrderTable("사용 중인 테이블", 4, true); + return new OrderTable(UUID.randomUUID(), "사용 중인 테이블", 4, true); } public static Product createProduct(String name, long price) { From 92d2382feac9dd2c0deb5f62022f900a46114683 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Thu, 20 Feb 2025 14:38:38 +0900 Subject: [PATCH 56/71] =?UTF-8?q?style(kitchen=20pos)=20:=20import=20?= =?UTF-8?q?=EB=AC=B8=20=EC=B5=9C=EC=A0=81=ED=99=94=20=EB=B0=8F=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../external/DefaultPurgomalumClient.java | 3 ++- .../menu/domain/model/MenuGroupName.java | 5 +++-- .../menu/domain/model/MenuName.java | 3 +-- .../menu/domain/model/MenuPrice.java | 1 + .../menu/domain/model/MenuProduct.java | 15 +++----------- .../domain/model/MenuProductQuantity.java | 5 +++-- .../repository/MenuGroupRepository.java | 3 ++- .../domain/repository/MenuRepository.java | 3 ++- .../persistence/JpaMenuGroupRepository.java | 3 ++- .../infra/persistence/JpaMenuRepository.java | 5 +++-- .../common/application/OrderService.java | 11 ++++------ .../infra/persistence/JpaOrderRepository.java | 3 ++- .../persistence/JpaOrderTableRepository.java | 3 ++- .../kitchenpos/order/common/model/Order.java | 16 +++------------ .../order/common/model/OrderLineItem.java | 20 +++++-------------- .../common/repository/OrderRepository.java | 7 ++++--- .../order/common/ui/OrderRestController.java | 15 +++++--------- .../infra/adaptor/RiderAdaptor.java | 3 ++- .../external/DefaultKitchenridersClient.java | 3 ++- .../domain/model/EatInOrderFlow.java | 4 ++-- .../repository/OrderTableRepository.java | 3 ++- .../domain/repository/ProductRepository.java | 3 ++- .../persistence/JpaProductRepository.java | 3 ++- .../java/kitchenpos/TestFixtureFactory.java | 9 +++++---- .../menu/domain/model/MenuGroupNameTest.java | 4 ++-- .../menu/domain/model/MenuNameTest.java | 4 ++-- .../menu/domain/model/MenuPriceTest.java | 9 +++++---- .../persistence/FakeMenuGroupRepository.java | 7 ++----- .../infra/persistence/FakeMenuRepository.java | 7 ++----- .../common/ui/OrderRestControllerTest.java | 17 ++++------------ .../domain/model/EatInOrderTest.java | 8 ++++---- .../ui/OrderTableRestControllerTest.java | 10 +++------- .../model/ProductNameCreationServiceTest.java | 4 ++-- .../product/domain/model/ProductNameTest.java | 4 ++-- .../domain/model/ProductPriceTest.java | 9 +++++---- .../persistence/FakeProductRepository.java | 7 ++----- .../product/ui/ProductRestControllerTest.java | 15 +++++++------- 37 files changed, 106 insertions(+), 148 deletions(-) diff --git a/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java index a4d421c88..f409428a5 100644 --- a/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java @@ -1,12 +1,13 @@ package kitchenpos.common.infra.external; -import java.net.URI; import kitchenpos.common.application.PurgomalumClient; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import java.net.URI; + @Component public class DefaultPurgomalumClient implements PurgomalumClient { private final RestTemplate restTemplate; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java index 446a44383..bc9cf17f7 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java @@ -1,13 +1,14 @@ package kitchenpos.menu.domain.model; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; + @Embeddable public class MenuGroupName { @Column(name = "name", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuName.java b/src/main/java/kitchenpos/menu/domain/model/MenuName.java index d54cb5ce5..cca05a3e1 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuName.java @@ -1,11 +1,10 @@ package kitchenpos.menu.domain.model; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.util.Objects; import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java index 0925f59db..884175ad1 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.math.BigDecimal; import java.util.Objects; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java index 09e095bb1..32381f96f 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java @@ -1,19 +1,10 @@ package kitchenpos.menu.domain.model; -import jakarta.persistence.Column; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; -import java.util.UUID; +import jakarta.persistence.*; import kitchenpos.product.domain.model.Product; +import java.util.UUID; + @Table(name = "menu_product") @Entity public class MenuProduct { diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java index 4cad0c18d..dabd88e3b 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java @@ -1,13 +1,14 @@ package kitchenpos.menu.domain.model; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; + import java.util.Objects; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; + @Embeddable public class MenuProductQuantity { @Column(name = "quantity", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java index cfb05d515..672d57be1 100644 --- a/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java @@ -1,9 +1,10 @@ package kitchenpos.menu.domain.repository; +import kitchenpos.menu.domain.model.MenuGroup; + import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.menu.domain.model.MenuGroup; public interface MenuGroupRepository { MenuGroup save(MenuGroup menuGroup); diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java index f83243f3d..9c9c73489 100644 --- a/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java @@ -1,9 +1,10 @@ package kitchenpos.menu.domain.repository; +import kitchenpos.menu.domain.model.Menu; + import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.menu.domain.model.Menu; public interface MenuRepository { Menu save(Menu menu); diff --git a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java index 13d3e1fdb..4b4e02a61 100644 --- a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java @@ -1,9 +1,10 @@ package kitchenpos.menu.infra.persistence; -import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.UUID; + public interface JpaMenuGroupRepository extends MenuGroupRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java index 9f9ec4437..451b0148d 100644 --- a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java @@ -1,13 +1,14 @@ package kitchenpos.menu.infra.persistence; -import java.util.List; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.List; +import java.util.UUID; + public interface JpaMenuRepository extends MenuRepository, JpaRepository { @Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId") @Override diff --git a/src/main/java/kitchenpos/order/common/application/OrderService.java b/src/main/java/kitchenpos/order/common/application/OrderService.java index 88994b97d..8fe986a59 100644 --- a/src/main/java/kitchenpos/order/common/application/OrderService.java +++ b/src/main/java/kitchenpos/order/common/application/OrderService.java @@ -1,12 +1,5 @@ package kitchenpos.order.common.application; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.Order; @@ -20,6 +13,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; + @Service public class OrderService { private final OrderRepository orderRepository; diff --git a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java index 22b55e7a9..1ede0e32b 100644 --- a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java +++ b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java @@ -1,9 +1,10 @@ package kitchenpos.order.common.infra.persistence; -import java.util.UUID; import kitchenpos.order.common.model.Order; import kitchenpos.order.common.repository.OrderRepository; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.UUID; + public interface JpaOrderRepository extends OrderRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java index 975ca8c6c..33a42afb5 100644 --- a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java @@ -1,9 +1,10 @@ package kitchenpos.order.common.infra.persistence; -import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.UUID; + public interface JpaOrderTableRepository extends OrderTableRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/order/common/model/Order.java b/src/main/java/kitchenpos/order/common/model/Order.java index fb29c3bc2..567da0207 100644 --- a/src/main/java/kitchenpos/order/common/model/Order.java +++ b/src/main/java/kitchenpos/order/common/model/Order.java @@ -1,21 +1,11 @@ package kitchenpos.order.common.model; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; +import jakarta.persistence.*; +import kitchenpos.order.eatinorder.domain.model.OrderTable; + import java.time.LocalDateTime; import java.util.List; import java.util.UUID; -import kitchenpos.order.eatinorder.domain.model.OrderTable; @Table(name = "orders") @Entity diff --git a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java index 38fc23846..2d3fbb73e 100644 --- a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java +++ b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java @@ -1,22 +1,12 @@ package kitchenpos.order.common.model; -import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_MENU_DISPLAY_EXCEPTION; -import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_PRICE_EXCEPTION; -import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_QUANTITY_EXCEPTION; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; +import jakarta.persistence.*; +import kitchenpos.menu.domain.model.Menu; + import java.math.BigDecimal; import java.util.UUID; -import kitchenpos.menu.domain.model.Menu; + +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.*; @Table(name = "order_line_item") @Entity diff --git a/src/main/java/kitchenpos/order/common/repository/OrderRepository.java b/src/main/java/kitchenpos/order/common/repository/OrderRepository.java index 843816c3c..b8f156360 100644 --- a/src/main/java/kitchenpos/order/common/repository/OrderRepository.java +++ b/src/main/java/kitchenpos/order/common/repository/OrderRepository.java @@ -1,12 +1,13 @@ package kitchenpos.order.common.repository; -import java.util.List; -import java.util.Optional; -import java.util.UUID; import kitchenpos.order.common.model.Order; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + public interface OrderRepository { Order save(Order order); diff --git a/src/main/java/kitchenpos/order/common/ui/OrderRestController.java b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java index 7fa233224..365952ffe 100644 --- a/src/main/java/kitchenpos/order/common/ui/OrderRestController.java +++ b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java @@ -1,18 +1,13 @@ package kitchenpos.order.common.ui; -import java.net.URI; -import java.util.List; -import java.util.UUID; import kitchenpos.order.common.application.OrderService; import kitchenpos.order.common.model.Order; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; +import java.util.List; +import java.util.UUID; @RequestMapping("/api/orders") @RestController diff --git a/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java b/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java index faf88dabd..3eebc04b4 100644 --- a/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java @@ -1,10 +1,11 @@ package kitchenpos.order.deliveryorder.infra.adaptor; -import java.math.BigDecimal; import kitchenpos.order.deliveryorder.domain.model.DeliveryOrder; import kitchenpos.order.deliveryorder.domain.port.RiderPort; import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; +import java.math.BigDecimal; + public class RiderAdaptor implements RiderPort { private KitchenridersClient kitchenridersClient; diff --git a/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java b/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java index 580d076a1..276ad9840 100644 --- a/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java @@ -1,8 +1,9 @@ package kitchenpos.order.deliveryorder.infra.external; +import org.springframework.stereotype.Component; + import java.math.BigDecimal; import java.util.UUID; -import org.springframework.stereotype.Component; @Component public class DefaultKitchenridersClient implements KitchenridersClient { diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java index 84c3dfa74..ff696fae1 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java @@ -1,9 +1,9 @@ package kitchenpos.order.eatinorder.domain.model; -import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION; - import java.util.Arrays; +import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION; + public enum EatInOrderFlow { WAITING(EatInOrderStatus.NONE), ACCEPTED(EatInOrderStatus.WAITING), diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java b/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java index 86a420535..f2f2a36b9 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java @@ -1,9 +1,10 @@ package kitchenpos.order.eatinorder.domain.repository; +import kitchenpos.order.eatinorder.domain.model.OrderTable; + import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.order.eatinorder.domain.model.OrderTable; public interface OrderTableRepository { OrderTable save(OrderTable orderTable); diff --git a/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java b/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java index b54094985..f619bbcb0 100644 --- a/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java +++ b/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java @@ -1,9 +1,10 @@ package kitchenpos.product.domain.repository; +import kitchenpos.product.domain.model.Product; + import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.product.domain.model.Product; public interface ProductRepository { Product save(Product product); diff --git a/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java index a519bd5b2..ffbf2c003 100644 --- a/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java +++ b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java @@ -1,9 +1,10 @@ package kitchenpos.product.infra.persistence; -import java.util.UUID; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.UUID; + public interface JpaProductRepository extends ProductRepository, JpaRepository { } diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 19ccf55ce..286f7476b 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -1,9 +1,5 @@ package kitchenpos; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.UUID; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; @@ -25,6 +21,11 @@ import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.product.domain.model.ProductPrice; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + public class TestFixtureFactory { public static MenuGroup createMenuGroup() { diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java index a67cd4a8f..4067bdea1 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.menu.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class MenuGroupNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java index 9a0e8e68e..9bdcebae8 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.menu.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class MenuNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java index f4c3961f5..66fafe650 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java @@ -1,13 +1,14 @@ package kitchenpos.menu.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.math.BigDecimal; -import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import java.math.BigDecimal; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class MenuPriceTest { private static Stream invalidMenuPriceProvider() { diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java index 0a3bc55b3..71055a8a2 100644 --- a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java @@ -1,13 +1,10 @@ package kitchenpos.menu.infra.persistence; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; +import java.util.*; + public class FakeMenuGroupRepository implements MenuGroupRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java index 56b6c4ace..1f187f058 100644 --- a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java @@ -1,13 +1,10 @@ package kitchenpos.menu.infra.persistence; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; +import java.util.*; + public class FakeMenuRepository implements MenuRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java index b4802d0f1..6ce2e5cf2 100644 --- a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java @@ -1,18 +1,5 @@ package kitchenpos.order.common.ui; -import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; -import static kitchenpos.TestFixtureFactory.createMenu; -import static kitchenpos.TestFixtureFactory.createMenuGroup; -import static kitchenpos.TestFixtureFactory.createOrderLineItem; -import static kitchenpos.TestFixtureFactory.createOrderWithDeliveryType; -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - import com.fasterxml.jackson.databind.ObjectMapper; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; @@ -39,6 +26,10 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; +import static kitchenpos.TestFixtureFactory.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + @SpringBootTest @AutoConfigureMockMvc @Transactional diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java index 29135a81d..b48458f9a 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java @@ -1,14 +1,14 @@ package kitchenpos.order.eatinorder.domain.model; +import kitchenpos.menu.domain.model.Menu; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import kitchenpos.menu.domain.model.Menu; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - class EatInOrderTest { @Test diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java index a27c45273..037bce8bb 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java @@ -1,12 +1,5 @@ package kitchenpos.order.eatinorder.ui; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - import com.fasterxml.jackson.databind.ObjectMapper; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; @@ -21,6 +14,9 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + @SpringBootTest @AutoConfigureMockMvc @Transactional diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java index 1040fbd19..1cfff05b6 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java @@ -1,13 +1,13 @@ package kitchenpos.product.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - import kitchenpos.common.application.PurgomalumClient; import kitchenpos.common.infra.external.FakePurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class ProductNameCreationServiceTest { private ProductNameCreationService productNameCreationService; diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java index 69238f2c8..525b5f170 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.product.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class ProductNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java index 25c3da9c3..f3b9cd175 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java @@ -1,13 +1,14 @@ package kitchenpos.product.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.math.BigDecimal; -import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import java.math.BigDecimal; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + class ProductPriceTest { private static Stream invalidProductPriceProvider() { diff --git a/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java b/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java index 06aa7523c..34e2327d9 100644 --- a/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java +++ b/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java @@ -1,13 +1,10 @@ package kitchenpos.product.infra.persistence; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; +import java.util.*; + public class FakeProductRepository implements ProductRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java index 98c45c568..e73e966e2 100644 --- a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java +++ b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java @@ -1,14 +1,6 @@ package kitchenpos.product.ui; -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - import com.fasterxml.jackson.databind.ObjectMapper; -import java.math.BigDecimal; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import kitchenpos.product.ui.dto.ChangeProductPriceRq; @@ -24,6 +16,13 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; + +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + @SpringBootTest @AutoConfigureMockMvc @Transactional From 1dfe6e92744b0699d2e81392cee547af2783bd20 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:35:41 +0900 Subject: [PATCH 57/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20EatInOrder,?= =?UTF-8?q?=20OrderTable=20id=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EB=82=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=9E=90=EB=8F=99=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=A8=EA=B8=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/kitchenpos/TestFixtureFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 286f7476b..f9800a24d 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -90,7 +90,7 @@ public static OrderTable createEmptyOrderTable() { } public static OrderTable createUsingOrderTable() { - return new OrderTable(UUID.randomUUID(), "사용 중인 테이블", 4, true); + return new OrderTable("사용 중인 테이블", 4, true); } public static Product createProduct(String name, long price) { From 4c445d345e19b3ba3287deb883a5d2fe016c8d91 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:52:58 +0900 Subject: [PATCH 58/71] =?UTF-8?q?style(kitchen=20pos)=20:=20import=20?= =?UTF-8?q?=EB=AC=B8=20=EC=B5=9C=EC=A0=81=ED=99=94=20=EB=B0=8F=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../external/DefaultPurgomalumClient.java | 3 +-- .../menu/domain/model/MenuGroupName.java | 5 ++--- .../model/MenuGroupNameCreationService.java | 2 -- .../menu/domain/model/MenuName.java | 5 ++--- .../domain/model/MenuNameCreationService.java | 2 -- .../menu/domain/model/MenuPrice.java | 3 --- .../menu/domain/model/MenuProduct.java | 15 +++++++++++--- .../domain/model/MenuProductQuantity.java | 5 ++--- .../repository/MenuGroupRepository.java | 3 +-- .../domain/repository/MenuRepository.java | 3 +-- .../persistence/JpaMenuGroupRepository.java | 3 +-- .../infra/persistence/JpaMenuRepository.java | 5 ++--- .../common/application/OrderService.java | 11 ++++++---- .../infra/persistence/JpaOrderRepository.java | 3 +-- .../persistence/JpaOrderTableRepository.java | 3 +-- .../kitchenpos/order/common/model/Order.java | 16 ++++++++++++--- .../order/common/model/OrderLineItem.java | 20 ++++++++++++++----- .../common/repository/OrderRepository.java | 7 +++---- .../order/common/ui/OrderRestController.java | 15 +++++++++----- .../infra/adaptor/RiderAdaptor.java | 3 +-- .../external/DefaultKitchenridersClient.java | 3 +-- .../domain/model/EatInOrderFlow.java | 4 ++-- .../repository/OrderTableRepository.java | 3 +-- .../product/domain/model/ProductName.java | 3 --- .../model/ProductNameCreationService.java | 2 -- .../product/domain/model/ProductPrice.java | 3 --- .../domain/repository/ProductRepository.java | 3 +-- .../persistence/JpaProductRepository.java | 3 +-- .../java/kitchenpos/TestFixtureFactory.java | 8 +++----- .../menu/domain/model/MenuGroupNameTest.java | 4 ++-- .../menu/domain/model/MenuNameTest.java | 4 ++-- .../menu/domain/model/MenuPriceTest.java | 9 ++++----- .../persistence/FakeMenuGroupRepository.java | 7 +++++-- .../infra/persistence/FakeMenuRepository.java | 7 +++++-- .../common/ui/OrderRestControllerTest.java | 17 ++++++++++++---- .../domain/model/EatInOrderTest.java | 8 ++++---- .../ui/OrderTableRestControllerTest.java | 10 +++++++--- .../model/ProductNameCreationServiceTest.java | 4 ++-- .../product/domain/model/ProductNameTest.java | 4 ++-- .../domain/model/ProductPriceTest.java | 9 ++++----- .../persistence/FakeProductRepository.java | 7 +++++-- .../product/ui/ProductRestControllerTest.java | 15 +++++++------- 42 files changed, 147 insertions(+), 122 deletions(-) diff --git a/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java index f409428a5..a4d421c88 100644 --- a/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/common/infra/external/DefaultPurgomalumClient.java @@ -1,13 +1,12 @@ package kitchenpos.common.infra.external; +import java.net.URI; import kitchenpos.common.application.PurgomalumClient; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import java.net.URI; - @Component public class DefaultPurgomalumClient implements PurgomalumClient { private final RestTemplate restTemplate; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java index bc9cf17f7..446a44383 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java @@ -1,14 +1,13 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; - @Embeddable public class MenuGroupName { @Column(name = "name", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java index a0bdd140a..8b66c6ec1 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupNameCreationService.java @@ -5,8 +5,6 @@ import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_NAME_VALIDATION_EXCEPTION; - @Service public class MenuGroupNameCreationService { private final PurgomalumClient purgomalumClient; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuName.java b/src/main/java/kitchenpos/menu/domain/model/MenuName.java index cca05a3e1..526d0c5a1 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuName.java @@ -1,14 +1,13 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; - @Embeddable public class MenuName { @Column(name = "name", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java b/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java index 11c97cb3d..1b49f1dff 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuNameCreationService.java @@ -5,8 +5,6 @@ import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_VALIDATION_EXCEPTION; - @Service public class MenuNameCreationService { private final PurgomalumClient purgomalumClient; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java index 884175ad1..85ea6eaf7 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java @@ -6,12 +6,9 @@ import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.math.BigDecimal; import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRICE_CREATION_EXCEPTION; - @Embeddable public class MenuPrice { @Column(name = "price", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java index 32381f96f..09e095bb1 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProduct.java @@ -1,9 +1,18 @@ package kitchenpos.menu.domain.model; -import jakarta.persistence.*; -import kitchenpos.product.domain.model.Product; - +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import java.util.UUID; +import kitchenpos.product.domain.model.Product; @Table(name = "menu_product") @Entity diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java index dabd88e3b..4cad0c18d 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java @@ -1,14 +1,13 @@ package kitchenpos.menu.domain.model; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; - @Embeddable public class MenuProductQuantity { @Column(name = "quantity", nullable = false) diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java index 672d57be1..cfb05d515 100644 --- a/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuGroupRepository.java @@ -1,10 +1,9 @@ package kitchenpos.menu.domain.repository; -import kitchenpos.menu.domain.model.MenuGroup; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.menu.domain.model.MenuGroup; public interface MenuGroupRepository { MenuGroup save(MenuGroup menuGroup); diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java index 9c9c73489..f83243f3d 100644 --- a/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuRepository.java @@ -1,10 +1,9 @@ package kitchenpos.menu.domain.repository; -import kitchenpos.menu.domain.model.Menu; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.menu.domain.model.Menu; public interface MenuRepository { Menu save(Menu menu); diff --git a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java index 4b4e02a61..13d3e1fdb 100644 --- a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java @@ -1,10 +1,9 @@ package kitchenpos.menu.infra.persistence; +import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - public interface JpaMenuGroupRepository extends MenuGroupRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java index 451b0148d..9f9ec4437 100644 --- a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java @@ -1,14 +1,13 @@ package kitchenpos.menu.infra.persistence; +import java.util.List; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.util.List; -import java.util.UUID; - public interface JpaMenuRepository extends MenuRepository, JpaRepository { @Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId") @Override diff --git a/src/main/java/kitchenpos/order/common/application/OrderService.java b/src/main/java/kitchenpos/order/common/application/OrderService.java index 8fe986a59..88994b97d 100644 --- a/src/main/java/kitchenpos/order/common/application/OrderService.java +++ b/src/main/java/kitchenpos/order/common/application/OrderService.java @@ -1,5 +1,12 @@ package kitchenpos.order.common.application; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.Order; @@ -13,10 +20,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.*; - @Service public class OrderService { private final OrderRepository orderRepository; diff --git a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java index 1ede0e32b..22b55e7a9 100644 --- a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java +++ b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderRepository.java @@ -1,10 +1,9 @@ package kitchenpos.order.common.infra.persistence; +import java.util.UUID; import kitchenpos.order.common.model.Order; import kitchenpos.order.common.repository.OrderRepository; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - public interface JpaOrderRepository extends OrderRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java index 33a42afb5..975ca8c6c 100644 --- a/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/order/common/infra/persistence/JpaOrderTableRepository.java @@ -1,10 +1,9 @@ package kitchenpos.order.common.infra.persistence; +import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - public interface JpaOrderTableRepository extends OrderTableRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/order/common/model/Order.java b/src/main/java/kitchenpos/order/common/model/Order.java index 567da0207..fb29c3bc2 100644 --- a/src/main/java/kitchenpos/order/common/model/Order.java +++ b/src/main/java/kitchenpos/order/common/model/Order.java @@ -1,11 +1,21 @@ package kitchenpos.order.common.model; -import jakarta.persistence.*; -import kitchenpos.order.eatinorder.domain.model.OrderTable; - +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; @Table(name = "orders") @Entity diff --git a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java index 2d3fbb73e..38fc23846 100644 --- a/src/main/java/kitchenpos/order/common/model/OrderLineItem.java +++ b/src/main/java/kitchenpos/order/common/model/OrderLineItem.java @@ -1,12 +1,22 @@ package kitchenpos.order.common.model; -import jakarta.persistence.*; -import kitchenpos.menu.domain.model.Menu; - +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_MENU_DISPLAY_EXCEPTION; +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_PRICE_EXCEPTION; +import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.ORDER_LINE_ITEM_QUANTITY_EXCEPTION; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import java.math.BigDecimal; import java.util.UUID; - -import static kitchenpos.order.common.exception.OrderLineItemExceptionMessage.*; +import kitchenpos.menu.domain.model.Menu; @Table(name = "order_line_item") @Entity diff --git a/src/main/java/kitchenpos/order/common/repository/OrderRepository.java b/src/main/java/kitchenpos/order/common/repository/OrderRepository.java index b8f156360..843816c3c 100644 --- a/src/main/java/kitchenpos/order/common/repository/OrderRepository.java +++ b/src/main/java/kitchenpos/order/common/repository/OrderRepository.java @@ -1,12 +1,11 @@ package kitchenpos.order.common.repository; -import kitchenpos.order.common.model.Order; -import kitchenpos.order.common.model.OrderStatus; -import kitchenpos.order.eatinorder.domain.model.OrderTable; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderStatus; +import kitchenpos.order.eatinorder.domain.model.OrderTable; public interface OrderRepository { Order save(Order order); diff --git a/src/main/java/kitchenpos/order/common/ui/OrderRestController.java b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java index 365952ffe..7fa233224 100644 --- a/src/main/java/kitchenpos/order/common/ui/OrderRestController.java +++ b/src/main/java/kitchenpos/order/common/ui/OrderRestController.java @@ -1,13 +1,18 @@ package kitchenpos.order.common.ui; -import kitchenpos.order.common.application.OrderService; -import kitchenpos.order.common.model.Order; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - import java.net.URI; import java.util.List; import java.util.UUID; +import kitchenpos.order.common.application.OrderService; +import kitchenpos.order.common.model.Order; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/orders") @RestController diff --git a/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java b/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java index 3eebc04b4..faf88dabd 100644 --- a/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/adaptor/RiderAdaptor.java @@ -1,11 +1,10 @@ package kitchenpos.order.deliveryorder.infra.adaptor; +import java.math.BigDecimal; import kitchenpos.order.deliveryorder.domain.model.DeliveryOrder; import kitchenpos.order.deliveryorder.domain.port.RiderPort; import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; -import java.math.BigDecimal; - public class RiderAdaptor implements RiderPort { private KitchenridersClient kitchenridersClient; diff --git a/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java b/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java index 276ad9840..580d076a1 100644 --- a/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java +++ b/src/main/java/kitchenpos/order/deliveryorder/infra/external/DefaultKitchenridersClient.java @@ -1,9 +1,8 @@ package kitchenpos.order.deliveryorder.infra.external; -import org.springframework.stereotype.Component; - import java.math.BigDecimal; import java.util.UUID; +import org.springframework.stereotype.Component; @Component public class DefaultKitchenridersClient implements KitchenridersClient { diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java index ff696fae1..84c3dfa74 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/model/EatInOrderFlow.java @@ -1,9 +1,9 @@ package kitchenpos.order.eatinorder.domain.model; -import java.util.Arrays; - import static kitchenpos.order.eatinorder.exception.EatInOrderExceptionMessage.EAT_IN_ORDER_FLOW_NOT_FOUND_EXCEPTION; +import java.util.Arrays; + public enum EatInOrderFlow { WAITING(EatInOrderStatus.NONE), ACCEPTED(EatInOrderStatus.WAITING), diff --git a/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java b/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java index f2f2a36b9..86a420535 100644 --- a/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java +++ b/src/main/java/kitchenpos/order/eatinorder/domain/repository/OrderTableRepository.java @@ -1,10 +1,9 @@ package kitchenpos.order.eatinorder.domain.repository; -import kitchenpos.order.eatinorder.domain.model.OrderTable; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; public interface OrderTableRepository { OrderTable save(OrderTable orderTable); diff --git a/src/main/java/kitchenpos/product/domain/model/ProductName.java b/src/main/java/kitchenpos/product/domain/model/ProductName.java index 7aca2b89e..d5d42dc7c 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductName.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductName.java @@ -4,11 +4,8 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; -import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_NAME_CREATION_EXCEPTION; - @Embeddable public class ProductName { @Column(name = "name", nullable = false) diff --git a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java index 2df14f98c..c32098139 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductNameCreationService.java @@ -5,8 +5,6 @@ import kitchenpos.common.application.PurgomalumClient; import org.springframework.stereotype.Service; -import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_NAME_VALIDATION_EXCEPTION; - @Service public class ProductNameCreationService { private final PurgomalumClient purgomalumClient; diff --git a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java index 65b8d65c8..137a63621 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductPrice.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductPrice.java @@ -4,12 +4,9 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.math.BigDecimal; import java.util.Objects; -import static kitchenpos.product.exception.ProductExceptionMessage.PRODUCT_PRICE_CREATION_EXCEPTION; - @Embeddable public class ProductPrice { @Column(name = "price", nullable = false) diff --git a/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java b/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java index f619bbcb0..b54094985 100644 --- a/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java +++ b/src/main/java/kitchenpos/product/domain/repository/ProductRepository.java @@ -1,10 +1,9 @@ package kitchenpos.product.domain.repository; -import kitchenpos.product.domain.model.Product; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.product.domain.model.Product; public interface ProductRepository { Product save(Product product); diff --git a/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java index ffbf2c003..a519bd5b2 100644 --- a/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java +++ b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java @@ -1,10 +1,9 @@ package kitchenpos.product.infra.persistence; +import java.util.UUID; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - public interface JpaProductRepository extends ProductRepository, JpaRepository { } diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index f9800a24d..864da4550 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -1,5 +1,8 @@ package kitchenpos; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; @@ -21,11 +24,6 @@ import kitchenpos.product.domain.model.ProductNameCreationService; import kitchenpos.product.domain.model.ProductPrice; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.UUID; - public class TestFixtureFactory { public static MenuGroup createMenuGroup() { diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java index 4067bdea1..a67cd4a8f 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuGroupNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.menu.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class MenuGroupNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java index 9bdcebae8..9a0e8e68e 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.menu.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class MenuNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java b/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java index 66fafe650..f4c3961f5 100644 --- a/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java +++ b/src/test/java/kitchenpos/menu/domain/model/MenuPriceTest.java @@ -1,13 +1,12 @@ package kitchenpos.menu.domain.model; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.math.BigDecimal; import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; class MenuPriceTest { diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java index 71055a8a2..0a3bc55b3 100644 --- a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuGroupRepository.java @@ -1,10 +1,13 @@ package kitchenpos.menu.infra.persistence; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.repository.MenuGroupRepository; -import java.util.*; - public class FakeMenuGroupRepository implements MenuGroupRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java index 1f187f058..56b6c4ace 100644 --- a/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java +++ b/src/test/java/kitchenpos/menu/infra/persistence/FakeMenuRepository.java @@ -1,10 +1,13 @@ package kitchenpos.menu.infra.persistence; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; -import java.util.*; - public class FakeMenuRepository implements MenuRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java index 6ce2e5cf2..b4802d0f1 100644 --- a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java @@ -1,5 +1,18 @@ package kitchenpos.order.common.ui; +import static kitchenpos.TestFixtureFactory.createEmptyOrderTable; +import static kitchenpos.TestFixtureFactory.createMenu; +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createOrderLineItem; +import static kitchenpos.TestFixtureFactory.createOrderWithDeliveryType; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; @@ -26,10 +39,6 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; -import static kitchenpos.TestFixtureFactory.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - @SpringBootTest @AutoConfigureMockMvc @Transactional diff --git a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java index b48458f9a..29135a81d 100644 --- a/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/domain/model/EatInOrderTest.java @@ -1,14 +1,14 @@ package kitchenpos.order.eatinorder.domain.model; -import kitchenpos.menu.domain.model.Menu; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - import static kitchenpos.TestFixtureFactory.createEatInOrderRequestWithEmptyTable; import static kitchenpos.TestFixtureFactory.createMenuWithProductAndGroup; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import kitchenpos.menu.domain.model.Menu; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + class EatInOrderTest { @Test diff --git a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java index 037bce8bb..a27c45273 100644 --- a/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/ui/OrderTableRestControllerTest.java @@ -1,5 +1,12 @@ package kitchenpos.order.eatinorder.ui; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; @@ -14,9 +21,6 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - @SpringBootTest @AutoConfigureMockMvc @Transactional diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java index 1cfff05b6..1040fbd19 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameCreationServiceTest.java @@ -1,13 +1,13 @@ package kitchenpos.product.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import kitchenpos.common.application.PurgomalumClient; import kitchenpos.common.infra.external.FakePurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class ProductNameCreationServiceTest { private ProductNameCreationService productNameCreationService; diff --git a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java index 525b5f170..69238f2c8 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductNameTest.java @@ -1,11 +1,11 @@ package kitchenpos.product.domain.model; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - class ProductNameTest { @ParameterizedTest diff --git a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java index f3b9cd175..25c3da9c3 100644 --- a/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java +++ b/src/test/java/kitchenpos/product/domain/model/ProductPriceTest.java @@ -1,13 +1,12 @@ package kitchenpos.product.domain.model; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.math.BigDecimal; import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; class ProductPriceTest { diff --git a/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java b/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java index 34e2327d9..06aa7523c 100644 --- a/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java +++ b/src/test/java/kitchenpos/product/infra/persistence/FakeProductRepository.java @@ -1,10 +1,13 @@ package kitchenpos.product.infra.persistence; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; -import java.util.*; - public class FakeProductRepository implements ProductRepository { private final Map storage; diff --git a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java index e73e966e2..98c45c568 100644 --- a/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java +++ b/src/test/java/kitchenpos/product/ui/ProductRestControllerTest.java @@ -1,6 +1,14 @@ package kitchenpos.product.ui; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; +import java.math.BigDecimal; import kitchenpos.product.domain.model.Product; import kitchenpos.product.domain.repository.ProductRepository; import kitchenpos.product.ui.dto.ChangeProductPriceRq; @@ -16,13 +24,6 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; - -import static kitchenpos.TestFixtureFactory.createProduct; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - @SpringBootTest @AutoConfigureMockMvc @Transactional From 4848d6bd0deba8610d7fb0442a2b3acfc43d4f5f Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 00:39:15 +0900 Subject: [PATCH 59/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20EatInOrderR?= =?UTF-8?q?estController=20create=20=EB=A9=94=EC=86=8C=EB=93=9C=20dto=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/CreateEatInOrderServiceRq.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java new file mode 100644 index 000000000..c18978c4e --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java @@ -0,0 +1,54 @@ +package kitchenpos.order.eatinorder.service.dto; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +public class CreateEatInOrderServiceRq { + private List orderLineItemDtos; + private UUID orderTableId; + + public CreateEatInOrderServiceRq(List orderLineItemDtos, UUID orderTableId) { + this.orderLineItemDtos = orderLineItemDtos; + this.orderTableId = orderTableId; + } + + public CreateEatInOrderServiceRq() { + } + + public List getOrderLineItemDtos() { + return orderLineItemDtos; + } + + public UUID getOrderTableId() { + return orderTableId; + } + + public static class OrderLineItemServiceDto { + private UUID menuId; + private long quantity; + private BigDecimal price; + + public OrderLineItemServiceDto(UUID menuId, long quantity, BigDecimal price) { + this.menuId = menuId; + this.quantity = quantity; + this.price = price; + } + + public OrderLineItemServiceDto() { + } + + public UUID getMenuId() { + return menuId; + } + + public long getQuantity() { + return quantity; + } + + public BigDecimal getPrice() { + return price; + } + } + +} From 70db9d08439f6a5a147b5fd6086aca2ed6a82cea Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:14:34 +0900 Subject: [PATCH 60/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20EatInOrderR?= =?UTF-8?q?estController=20create=20=EC=A0=9C=EC=99=B8=20=EB=82=98?= =?UTF-8?q?=EB=A8=B8=EC=A7=80=20=EB=A9=94=EC=86=8C=EB=93=9C=20dto=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/dto/EatInOrderServiceRs.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java new file mode 100644 index 000000000..74bd1fdba --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java @@ -0,0 +1,28 @@ +package kitchenpos.order.eatinorder.service.dto; + +import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; + +public class EatInOrderServiceRs { + private UUID eatInOrderId; + private EatInOrderFlow eatInOrderFlow; + + public EatInOrderServiceRs(EatInOrder eatInOrder) { + this.eatInOrderId = eatInOrder.getId(); + this.eatInOrderFlow = eatInOrder.getEatInOrderFlow(); + } + + public EatInOrderServiceRs(UUID eatInOrderId, EatInOrderFlow eatInOrderFlow) { + this.eatInOrderId = eatInOrderId; + this.eatInOrderFlow = eatInOrderFlow; + } + + public UUID getEatInOrderId() { + return eatInOrderId; + } + + public EatInOrderFlow getEatInOrderFlow() { + return eatInOrderFlow; + } +} From c39625881dd3e1900e24a1439d0b2b7a821176b2 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:33:38 +0900 Subject: [PATCH 61/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20OrderTableR?= =?UTF-8?q?estController=20create=20=EB=A9=94=EC=86=8C=EB=93=9C=20dto?= =?UTF-8?q?=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/CreateOrderTableServiceRq.java | 16 +++++++ .../dto/CreateOrderTableServiceRs.java | 41 +++++++++++++++++ .../eatinorder/ui/dto/CreateOrderTableRs.java | 44 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java create mode 100644 src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java new file mode 100644 index 000000000..95a7ce918 --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java @@ -0,0 +1,16 @@ +package kitchenpos.order.eatinorder.service.dto; + +public class CreateOrderTableServiceRq { + private String name; + + public CreateOrderTableServiceRq(String name) { + this.name = name; + } + + public CreateOrderTableServiceRq() { + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java new file mode 100644 index 000000000..dbdce02da --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java @@ -0,0 +1,41 @@ +package kitchenpos.order.eatinorder.service.dto; + +import java.util.UUID; +import kitchenpos.order.eatinorder.domain.model.OrderTable; + +public class CreateOrderTableServiceRs { + private UUID id; + private String name; + private int numberOfGuests; + private boolean occupied; + + public CreateOrderTableServiceRs(UUID id, String name, int numberOfGuests, boolean occupied) { + this.id = id; + this.name = name; + this.numberOfGuests = numberOfGuests; + this.occupied = occupied; + } + + public CreateOrderTableServiceRs(OrderTable orderTable) { + this.id = orderTable.getId(); + this.name = orderTable.getInnerName(); + this.numberOfGuests = orderTable.getNumberOfGuests(); + this.occupied = orderTable.isOccupied(); + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public int getNumberOfGuests() { + return numberOfGuests; + } + + public boolean isOccupied() { + return occupied; + } +} diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java new file mode 100644 index 000000000..4c5154fde --- /dev/null +++ b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java @@ -0,0 +1,44 @@ +package kitchenpos.order.eatinorder.ui.dto; + +import java.util.UUID; +import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRs; + +public class CreateOrderTableRs { + private UUID id; + private String name; + private int numberOfGuests; + private boolean occupied; + + public CreateOrderTableRs(UUID id, String name, int numberOfGuests, boolean occupied) { + this.id = id; + this.name = name; + this.numberOfGuests = numberOfGuests; + this.occupied = occupied; + } + + public CreateOrderTableRs(CreateOrderTableServiceRs rs) { + this.id = rs.getId(); + this.name = rs.getName(); + this.numberOfGuests = rs.getNumberOfGuests(); + this.occupied = rs.isOccupied(); + } + + public CreateOrderTableRs() { + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public int getNumberOfGuests() { + return numberOfGuests; + } + + public boolean isOccupied() { + return occupied; + } +} From dcfc9b368c5bc8cbe274b3a0535347eb5f4fed25 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:39:06 +0900 Subject: [PATCH 62/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20OrderTableR?= =?UTF-8?q?estController=20create=20=EC=A0=9C=EC=99=B8=20=EB=82=98?= =?UTF-8?q?=EB=A8=B8=EC=A7=80=20=EB=A9=94=EC=86=8C=EB=93=9C=20dto=EB=A5=BC?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...erviceRs.java => OrderTableServiceRs.java} | 6 +-- .../eatinorder/ui/dto/CreateOrderTableRs.java | 44 ------------------- 2 files changed, 3 insertions(+), 47 deletions(-) rename src/main/java/kitchenpos/order/eatinorder/service/dto/{CreateOrderTableServiceRs.java => OrderTableServiceRs.java} (80%) delete mode 100644 src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java similarity index 80% rename from src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java rename to src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java index dbdce02da..137974063 100644 --- a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRs.java +++ b/src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java @@ -3,20 +3,20 @@ import java.util.UUID; import kitchenpos.order.eatinorder.domain.model.OrderTable; -public class CreateOrderTableServiceRs { +public class OrderTableServiceRs { private UUID id; private String name; private int numberOfGuests; private boolean occupied; - public CreateOrderTableServiceRs(UUID id, String name, int numberOfGuests, boolean occupied) { + public OrderTableServiceRs(UUID id, String name, int numberOfGuests, boolean occupied) { this.id = id; this.name = name; this.numberOfGuests = numberOfGuests; this.occupied = occupied; } - public CreateOrderTableServiceRs(OrderTable orderTable) { + public OrderTableServiceRs(OrderTable orderTable) { this.id = orderTable.getId(); this.name = orderTable.getInnerName(); this.numberOfGuests = orderTable.getNumberOfGuests(); diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java deleted file mode 100644 index 4c5154fde..000000000 --- a/src/main/java/kitchenpos/order/eatinorder/ui/dto/CreateOrderTableRs.java +++ /dev/null @@ -1,44 +0,0 @@ -package kitchenpos.order.eatinorder.ui.dto; - -import java.util.UUID; -import kitchenpos.order.eatinorder.service.dto.CreateOrderTableServiceRs; - -public class CreateOrderTableRs { - private UUID id; - private String name; - private int numberOfGuests; - private boolean occupied; - - public CreateOrderTableRs(UUID id, String name, int numberOfGuests, boolean occupied) { - this.id = id; - this.name = name; - this.numberOfGuests = numberOfGuests; - this.occupied = occupied; - } - - public CreateOrderTableRs(CreateOrderTableServiceRs rs) { - this.id = rs.getId(); - this.name = rs.getName(); - this.numberOfGuests = rs.getNumberOfGuests(); - this.occupied = rs.isOccupied(); - } - - public CreateOrderTableRs() { - } - - public UUID getId() { - return id; - } - - public String getName() { - return name; - } - - public int getNumberOfGuests() { - return numberOfGuests; - } - - public boolean isOccupied() { - return occupied; - } -} From 4de18359127bf27bf5f1952ba993faad8602f6a8 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:47:09 +0900 Subject: [PATCH 63/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20service=20-?= =?UTF-8?q?>=20application=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/CreateEatInOrderServiceRq.java | 54 ------------------- .../dto/CreateOrderTableServiceRq.java | 16 ------ .../service/dto/EatInOrderServiceRs.java | 28 ---------- .../service/dto/OrderTableServiceRs.java | 41 -------------- 4 files changed, 139 deletions(-) delete mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java delete mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java delete mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java delete mode 100644 src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java deleted file mode 100644 index c18978c4e..000000000 --- a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateEatInOrderServiceRq.java +++ /dev/null @@ -1,54 +0,0 @@ -package kitchenpos.order.eatinorder.service.dto; - -import java.math.BigDecimal; -import java.util.List; -import java.util.UUID; - -public class CreateEatInOrderServiceRq { - private List orderLineItemDtos; - private UUID orderTableId; - - public CreateEatInOrderServiceRq(List orderLineItemDtos, UUID orderTableId) { - this.orderLineItemDtos = orderLineItemDtos; - this.orderTableId = orderTableId; - } - - public CreateEatInOrderServiceRq() { - } - - public List getOrderLineItemDtos() { - return orderLineItemDtos; - } - - public UUID getOrderTableId() { - return orderTableId; - } - - public static class OrderLineItemServiceDto { - private UUID menuId; - private long quantity; - private BigDecimal price; - - public OrderLineItemServiceDto(UUID menuId, long quantity, BigDecimal price) { - this.menuId = menuId; - this.quantity = quantity; - this.price = price; - } - - public OrderLineItemServiceDto() { - } - - public UUID getMenuId() { - return menuId; - } - - public long getQuantity() { - return quantity; - } - - public BigDecimal getPrice() { - return price; - } - } - -} diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java deleted file mode 100644 index 95a7ce918..000000000 --- a/src/main/java/kitchenpos/order/eatinorder/service/dto/CreateOrderTableServiceRq.java +++ /dev/null @@ -1,16 +0,0 @@ -package kitchenpos.order.eatinorder.service.dto; - -public class CreateOrderTableServiceRq { - private String name; - - public CreateOrderTableServiceRq(String name) { - this.name = name; - } - - public CreateOrderTableServiceRq() { - } - - public String getName() { - return name; - } -} diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java deleted file mode 100644 index 74bd1fdba..000000000 --- a/src/main/java/kitchenpos/order/eatinorder/service/dto/EatInOrderServiceRs.java +++ /dev/null @@ -1,28 +0,0 @@ -package kitchenpos.order.eatinorder.service.dto; - -import java.util.UUID; -import kitchenpos.order.eatinorder.domain.model.EatInOrder; -import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; - -public class EatInOrderServiceRs { - private UUID eatInOrderId; - private EatInOrderFlow eatInOrderFlow; - - public EatInOrderServiceRs(EatInOrder eatInOrder) { - this.eatInOrderId = eatInOrder.getId(); - this.eatInOrderFlow = eatInOrder.getEatInOrderFlow(); - } - - public EatInOrderServiceRs(UUID eatInOrderId, EatInOrderFlow eatInOrderFlow) { - this.eatInOrderId = eatInOrderId; - this.eatInOrderFlow = eatInOrderFlow; - } - - public UUID getEatInOrderId() { - return eatInOrderId; - } - - public EatInOrderFlow getEatInOrderFlow() { - return eatInOrderFlow; - } -} diff --git a/src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java b/src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java deleted file mode 100644 index 137974063..000000000 --- a/src/main/java/kitchenpos/order/eatinorder/service/dto/OrderTableServiceRs.java +++ /dev/null @@ -1,41 +0,0 @@ -package kitchenpos.order.eatinorder.service.dto; - -import java.util.UUID; -import kitchenpos.order.eatinorder.domain.model.OrderTable; - -public class OrderTableServiceRs { - private UUID id; - private String name; - private int numberOfGuests; - private boolean occupied; - - public OrderTableServiceRs(UUID id, String name, int numberOfGuests, boolean occupied) { - this.id = id; - this.name = name; - this.numberOfGuests = numberOfGuests; - this.occupied = occupied; - } - - public OrderTableServiceRs(OrderTable orderTable) { - this.id = orderTable.getId(); - this.name = orderTable.getInnerName(); - this.numberOfGuests = orderTable.getNumberOfGuests(); - this.occupied = orderTable.isOccupied(); - } - - public UUID getId() { - return id; - } - - public String getName() { - return name; - } - - public int getNumberOfGuests() { - return numberOfGuests; - } - - public boolean isOccupied() { - return occupied; - } -} From 3337e96667968b699c85318229cd82ea80b445a9 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Tue, 25 Feb 2025 12:31:56 +0900 Subject: [PATCH 64/71] =?UTF-8?q?refactor(kitchen=20pos)=20:=20MenuRestCon?= =?UTF-8?q?troller=20dto=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/application/MenuServiceTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 0257ba191..720cdb0b3 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -259,4 +259,17 @@ private MenuGroup createAndSaveMenuGroup() { private Product createAndSaveProduct() { return productRepository.save(createProduct("김치", 5000)); } + + private CreateMenuServiceRq createMenuServiceRequest(String name, int price, UUID menuGroupId, UUID productId) { + return new CreateMenuServiceRq(name, BigDecimal.valueOf(price), true, menuGroupId, + List.of(new MenuProductServiceRq(productId, 2))); + } + + private MenuGroup createAndSaveMenuGroup() { + return menuGroupRepository.save(createMenuGroup()); + } + + private Product createAndSaveProduct() { + return productRepository.save(createProduct("김치", 5000)); + } } From 70dacec82e3f3106b972124bfcdf3c47352ff5c3 Mon Sep 17 00:00:00 2001 From: suzhanlee Date: Wed, 19 Feb 2025 13:35:19 +0900 Subject: [PATCH 65/71] squash --- .../java/kitchenpos/menu/domain/model/Menu.java | 4 ++++ src/test/java/kitchenpos/TestFixtureFactory.java | 1 - .../menu/application/MenuServiceTest.java | 13 +++++++++++++ .../order/common/application/OrderServiceTest.java | 6 ++++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/kitchenpos/menu/domain/model/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java index 33bdfcf8f..eb5be9e46 100644 --- a/src/main/java/kitchenpos/menu/domain/model/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -14,11 +14,15 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import jakarta.persistence.Transient; + import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_EXISTS_EXCEPTION; +import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCTS_EXISTS_EXCEPTION; + @Table(name = "menu") @Entity public class Menu { diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 40004c6b9..864da4550 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -3,7 +3,6 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; -import java.util.UUID; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 0257ba191..720cdb0b3 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -259,4 +259,17 @@ private MenuGroup createAndSaveMenuGroup() { private Product createAndSaveProduct() { return productRepository.save(createProduct("김치", 5000)); } + + private CreateMenuServiceRq createMenuServiceRequest(String name, int price, UUID menuGroupId, UUID productId) { + return new CreateMenuServiceRq(name, BigDecimal.valueOf(price), true, menuGroupId, + List.of(new MenuProductServiceRq(productId, 2))); + } + + private MenuGroup createAndSaveMenuGroup() { + return menuGroupRepository.save(createMenuGroup()); + } + + private Product createAndSaveProduct() { + return productRepository.save(createProduct("김치", 5000)); + } } diff --git a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java index 1bd1ef60f..c849cb1a2 100644 --- a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java @@ -15,18 +15,24 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.UUID; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.Order; +import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.model.OrderType; import kitchenpos.order.common.repository.OrderRepository; import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; +import kitchenpos.order.eatinorder.domain.model.EatInOrder; +import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; +import kitchenpos.order.eatinorder.service.EatInOrderService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; From 698a618cab2bd1813870ca16486998c62a70a730 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 27 Feb 2025 00:42:10 +0900 Subject: [PATCH 66/71] =?UTF-8?q?fix(kitchen=20pos)=20:=20rebase=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/ui/MenuGroupRestController.java | 18 ++++++++++-------- .../java/kitchenpos/TestFixtureFactory.java | 1 + .../menu/application/MenuServiceTest.java | 13 ------------- .../common/application/OrderServiceTest.java | 4 ---- 4 files changed, 11 insertions(+), 25 deletions(-) diff --git a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java index 41a112a8b..a1c779708 100644 --- a/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java @@ -1,12 +1,14 @@ package kitchenpos.menu.ui; import java.net.URI; +import java.util.List; import kitchenpos.menu.application.MenuGroupService; import kitchenpos.menu.application.dto.CreateMenuGroupServiceRq; import kitchenpos.menu.application.dto.MenuGroupServiceRs; import kitchenpos.menu.ui.dto.CreateMenuGroupRq; import kitchenpos.menu.ui.dto.MenuGroupRs; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -29,12 +31,12 @@ public ResponseEntity create(@RequestBody final CreateMenuGroupRq r .body(new MenuGroupRs(response)); } -// @GetMapping -// public ResponseEntity> findAll() { -// return ResponseEntity.ok( -// menuGroupService.findAll().stream() -// .map(MenuGroupRs::new) -// .toList() -// ); -// } + @GetMapping + public ResponseEntity> findAll() { + return ResponseEntity.ok( + menuGroupService.findAll().stream() + .map(MenuGroupRs::new) + .toList() + ); + } } diff --git a/src/test/java/kitchenpos/TestFixtureFactory.java b/src/test/java/kitchenpos/TestFixtureFactory.java index 864da4550..40004c6b9 100644 --- a/src/test/java/kitchenpos/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/TestFixtureFactory.java @@ -3,6 +3,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; +import java.util.UUID; import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 720cdb0b3..0257ba191 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -259,17 +259,4 @@ private MenuGroup createAndSaveMenuGroup() { private Product createAndSaveProduct() { return productRepository.save(createProduct("김치", 5000)); } - - private CreateMenuServiceRq createMenuServiceRequest(String name, int price, UUID menuGroupId, UUID productId) { - return new CreateMenuServiceRq(name, BigDecimal.valueOf(price), true, menuGroupId, - List.of(new MenuProductServiceRq(productId, 2))); - } - - private MenuGroup createAndSaveMenuGroup() { - return menuGroupRepository.save(createMenuGroup()); - } - - private Product createAndSaveProduct() { - return productRepository.save(createProduct("김치", 5000)); - } } diff --git a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java index c849cb1a2..c7b8978cc 100644 --- a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java @@ -23,16 +23,12 @@ import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.Order; -import kitchenpos.order.common.model.OrderLineItem; import kitchenpos.order.common.model.OrderStatus; import kitchenpos.order.common.model.OrderType; import kitchenpos.order.common.repository.OrderRepository; import kitchenpos.order.deliveryorder.infra.external.KitchenridersClient; -import kitchenpos.order.eatinorder.domain.model.EatInOrder; -import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; -import kitchenpos.order.eatinorder.service.EatInOrderService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; From 0e27cced410d4d1efcebed4512f7126779fb5e40 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 27 Feb 2025 22:28:21 +0900 Subject: [PATCH 67/71] =?UTF-8?q?test(kitchen=20pos)=20:=20MenuRestControl?= =?UTF-8?q?lerTest=20findAll=20test=20code=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/MenuSummaryRepository.java | 7 +++ .../persistence/JpaMenuSummaryRepository.java | 9 +++ .../repository/ProductSummaryRepository.java | 7 +++ .../JpaProductSummaryRepository.java | 10 ++++ .../menu/ui/MenuRestControllerTest.java | 59 ++++++++++++++----- 5 files changed, 77 insertions(+), 15 deletions(-) create mode 100644 src/main/java/kitchenpos/menu/domain/repository/MenuSummaryRepository.java create mode 100644 src/main/java/kitchenpos/menu/infra/persistence/JpaMenuSummaryRepository.java create mode 100644 src/main/java/kitchenpos/product/domain/repository/ProductSummaryRepository.java create mode 100644 src/main/java/kitchenpos/product/infra/persistence/JpaProductSummaryRepository.java diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuSummaryRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuSummaryRepository.java new file mode 100644 index 000000000..fe1b8efb1 --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuSummaryRepository.java @@ -0,0 +1,7 @@ +package kitchenpos.menu.domain.repository; + +import kitchenpos.menu.domain.model.MenuSummary; + +public interface MenuSummaryRepository { + MenuSummary save(MenuSummary menuSummary); +} diff --git a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuSummaryRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuSummaryRepository.java new file mode 100644 index 000000000..6a524b6a0 --- /dev/null +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuSummaryRepository.java @@ -0,0 +1,9 @@ +package kitchenpos.menu.infra.persistence; + +import java.util.UUID; +import kitchenpos.menu.domain.model.MenuSummary; +import kitchenpos.menu.domain.repository.MenuSummaryRepository; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface JpaMenuSummaryRepository extends JpaRepository, MenuSummaryRepository { +} diff --git a/src/main/java/kitchenpos/product/domain/repository/ProductSummaryRepository.java b/src/main/java/kitchenpos/product/domain/repository/ProductSummaryRepository.java new file mode 100644 index 000000000..71f730358 --- /dev/null +++ b/src/main/java/kitchenpos/product/domain/repository/ProductSummaryRepository.java @@ -0,0 +1,7 @@ +package kitchenpos.product.domain.repository; + +import kitchenpos.product.domain.model.ProductSummary; + +public interface ProductSummaryRepository { + ProductSummary save(ProductSummary productSummary); +} diff --git a/src/main/java/kitchenpos/product/infra/persistence/JpaProductSummaryRepository.java b/src/main/java/kitchenpos/product/infra/persistence/JpaProductSummaryRepository.java new file mode 100644 index 000000000..fec071612 --- /dev/null +++ b/src/main/java/kitchenpos/product/infra/persistence/JpaProductSummaryRepository.java @@ -0,0 +1,10 @@ +package kitchenpos.product.infra.persistence; + +import java.util.UUID; +import kitchenpos.product.domain.model.ProductSummary; +import kitchenpos.product.domain.repository.ProductSummaryRepository; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface JpaProductSummaryRepository extends JpaRepository, ProductSummaryRepository { + +} diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java index f21e35e34..90127d918 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -3,6 +3,7 @@ import static kitchenpos.TestFixtureFactory.createMenuGroup; import static kitchenpos.TestFixtureFactory.createProduct; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; @@ -17,12 +18,17 @@ import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.menu.domain.model.MenuSummary; import kitchenpos.menu.domain.repository.MenuGroupRepository; import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.domain.repository.MenuSummaryRepository; import kitchenpos.menu.ui.dto.CreateMenuRq; import kitchenpos.menu.ui.dto.CreateMenuRq.MenuProductRq; import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.model.ProductSummary; import kitchenpos.product.domain.repository.ProductRepository; +import kitchenpos.product.domain.repository.ProductSummaryRepository; +import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -53,6 +59,12 @@ class MenuRestControllerTest { @Autowired private ProductRepository productRepository; + @Autowired + private MenuSummaryRepository menuSummaryRepository; + + @Autowired + private ProductSummaryRepository productSummaryRepository; + @Test @DisplayName("메뉴를 생성한다") void create_menu_success() throws Exception { @@ -165,21 +177,23 @@ void hide_menu() throws Exception { .andExpect(jsonPath("$.displayed").value(false)); } -// @Test -// @DisplayName("모든 메뉴를 조회한다") -// void find_allMenus() throws Exception { -// // given -// createAndSaveMenu(true); -// createAndSaveMenu(true); -// -// // when -// ResultActions result = mockMvc.perform(get("/api/menus")); -// -// // then -// result.andExpect(status().isOk()) -// .andExpect(jsonPath("$").isArray()) -// .andExpect(jsonPath("$.length()").value(2)); -// } + @Test + @DisplayName("모든 메뉴를 조회한다.") + void find_allMenus() throws Exception { + // given + MenuGroup menuGroup1 = createAndSaveMenuGroup(); + MenuGroup menuGroup2 = createAndSaveMenuGroup(); + createAndSaveMenuSummary(menuGroup1); + createAndSaveMenuSummary(menuGroup2); + + // when + ResultActions result = mockMvc.perform(get("/api/menus")); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$.length()").value(2)); + } private MenuGroup createAndSaveMenuGroup() { return menuGroupRepository.save(createMenuGroup()); @@ -198,6 +212,21 @@ private Menu createAndSaveMenu(boolean displayed) { return menuRepository.save(menu); } + private MenuSummary createAndSaveMenuSummary(MenuGroup menuGroup) { + ProductSummary productSummary = createAndSaveProductSummary(); + MenuSummary menuSummary = new MenuSummary("김치찌개", BigDecimal.valueOf(8000), true, menuGroup.getId(), + menuGroup.getName(), + List.of(productSummary)); + menuSummaryRepository.save(menuSummary); + return menuSummary; + } + + private ProductSummary createAndSaveProductSummary() { + ProductSummary productSummary = new ProductSummary("김치", 3); + productSummaryRepository.save(productSummary); + return productSummary; + } + private CreateMenuRq createMenuRequest(String name, int price, UUID menuGroupId, UUID productId) { return new CreateMenuRq(name, BigDecimal.valueOf(price), true, menuGroupId, List.of(new MenuProductRq(productId, 2))); From d1b51215830e6d0832d591179701cfb70be7a0b2 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 27 Feb 2025 23:01:24 +0900 Subject: [PATCH 68/71] =?UTF-8?q?test(kitchen=20pos)=20:=20MenuQueryReposi?= =?UTF-8?q?tory=20test=20code=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/domain/model/MenuSummary.java | 20 ++++ .../repository/MenuSummaryRepository.java | 2 + .../persistence/JpaMenuSummaryRepository.java | 2 + .../product/domain/model/ProductSummary.java | 31 ++++++ .../repository/ProductSummaryRepository.java | 2 + .../repository/MenuQueryRepositoryTest.java | 100 ++++++++++++++++++ 6 files changed, 157 insertions(+) create mode 100644 src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java b/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java index 4f5c7f8f6..fda1bb111 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java @@ -8,6 +8,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; import kitchenpos.product.domain.model.ProductSummary; @@ -68,6 +69,25 @@ public String getMenuGroupName() { public List getProductSummaries() { return productSummaries; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MenuSummary that = (MenuSummary) o; + return isDisplayed == that.isDisplayed && Objects.equals(id, that.id) && Objects.equals( + menuName, that.menuName) && Objects.equals(price, that.price) && Objects.equals( + menuGroupId, that.menuGroupId) && Objects.equals(menuGroupName, that.menuGroupName); + } + + @Override + public int hashCode() { + return Objects.hash(id, menuName, price, isDisplayed, menuGroupId, menuGroupName); + } } diff --git a/src/main/java/kitchenpos/menu/domain/repository/MenuSummaryRepository.java b/src/main/java/kitchenpos/menu/domain/repository/MenuSummaryRepository.java index fe1b8efb1..c07758e9b 100644 --- a/src/main/java/kitchenpos/menu/domain/repository/MenuSummaryRepository.java +++ b/src/main/java/kitchenpos/menu/domain/repository/MenuSummaryRepository.java @@ -1,7 +1,9 @@ package kitchenpos.menu.domain.repository; import kitchenpos.menu.domain.model.MenuSummary; +import org.springframework.stereotype.Repository; +@Repository public interface MenuSummaryRepository { MenuSummary save(MenuSummary menuSummary); } diff --git a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuSummaryRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuSummaryRepository.java index 6a524b6a0..8f418cd3f 100644 --- a/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuSummaryRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuSummaryRepository.java @@ -4,6 +4,8 @@ import kitchenpos.menu.domain.model.MenuSummary; import kitchenpos.menu.domain.repository.MenuSummaryRepository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +@Repository public interface JpaMenuSummaryRepository extends JpaRepository, MenuSummaryRepository { } diff --git a/src/main/java/kitchenpos/product/domain/model/ProductSummary.java b/src/main/java/kitchenpos/product/domain/model/ProductSummary.java index ede811d50..bfe7c231b 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductSummary.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductSummary.java @@ -3,6 +3,7 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; +import java.util.Objects; import java.util.UUID; @Entity @@ -23,4 +24,34 @@ public ProductSummary(String name, long quantity) { protected ProductSummary() { } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public long getQuantity() { + return quantity; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ProductSummary that = (ProductSummary) o; + return quantity == that.quantity && Objects.equals(id, that.id) && Objects.equals(name, + that.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, quantity); + } } diff --git a/src/main/java/kitchenpos/product/domain/repository/ProductSummaryRepository.java b/src/main/java/kitchenpos/product/domain/repository/ProductSummaryRepository.java index 71f730358..01fc992be 100644 --- a/src/main/java/kitchenpos/product/domain/repository/ProductSummaryRepository.java +++ b/src/main/java/kitchenpos/product/domain/repository/ProductSummaryRepository.java @@ -1,7 +1,9 @@ package kitchenpos.product.domain.repository; import kitchenpos.product.domain.model.ProductSummary; +import org.springframework.stereotype.Repository; +@Repository public interface ProductSummaryRepository { ProductSummary save(ProductSummary productSummary); } diff --git a/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java b/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java new file mode 100644 index 000000000..11ac46abb --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java @@ -0,0 +1,100 @@ +package kitchenpos.menu.domain.repository; + +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static org.assertj.core.api.Assertions.assertThat; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import java.math.BigDecimal; +import java.util.List; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuSummary; +import kitchenpos.menu.infra.persistence.QuerydslMenuQueryRepository; +import kitchenpos.product.domain.model.ProductSummary; +import kitchenpos.product.domain.repository.ProductSummaryRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +@DataJpaTest +@Import(QuerydslMenuQueryRepository.class) +class MenuQueryRepositoryTest { + + @Autowired + private MenuSummaryRepository menuSummaryRepository; + + @Autowired + private ProductSummaryRepository productSummaryRepository; + + @Autowired + private MenuGroupRepository menuGroupRepository; + + @Autowired + private MenuQueryRepository menuQueryRepository; + + @TestConfiguration + static class TestConfig { + @Bean + public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) { + return new JPAQueryFactory(entityManager); + } + } + + @Test + @DisplayName("메뉴 요약 정보를 조회한다.") + void find_all() { + // given + MenuGroup menuGroup1 = createAndSaveMenuGroup(); + MenuGroup menuGroup2 = createAndSaveMenuGroup(); + + List firstProductSummaries = List.of(createAndSaveProductSummary()); + MenuSummary menuSummary1 = new MenuSummary("김치찌개1", BigDecimal.valueOf(8000), true, menuGroup1.getId(), + menuGroup1.getName(), + firstProductSummaries); + menuSummaryRepository.save(menuSummary1); + + List secondProductSummaries = List.of(createAndSaveProductSummary()); + MenuSummary menuSummary2 = new MenuSummary("김치찌개2", BigDecimal.valueOf(8000), true, menuGroup2.getId(), + menuGroup2.getName(), + secondProductSummaries); + menuSummaryRepository.save(menuSummary2); + + // when + List result = menuQueryRepository.findAll(); + + // then + assertThat(result) + .isNotNull() + .hasSize(2) + .satisfiesExactlyInAnyOrder( + menu -> { + assertThat(menu.getMenuName()).isEqualTo(menuSummary1.getMenuName()); + assertThat(menu.getPrice()).isEqualTo(menuSummary1.getPrice()); + assertThat(menu.getMenuGroupId()).isEqualTo(menuGroup1.getId()); + assertThat(menu.getProductSummaries()).hasSize(1); + assertThat(menu.getProductSummaries().getFirst().getName()).isEqualTo("김치"); + }, + menu -> { + assertThat(menu.getMenuName()).isEqualTo(menuSummary2.getMenuName()); + assertThat(menu.getPrice()).isEqualTo(menuSummary2.getPrice()); + assertThat(menu.getMenuGroupId()).isEqualTo(menuGroup2.getId()); + assertThat(menu.getProductSummaries()).hasSize(1); + assertThat(menu.getProductSummaries().getFirst().getName()).isEqualTo("김치"); + } + ); + } + + private ProductSummary createAndSaveProductSummary() { + ProductSummary productSummary = new ProductSummary("김치", 3); + productSummaryRepository.save(productSummary); + return productSummary; + } + + private MenuGroup createAndSaveMenuGroup() { + return menuGroupRepository.save(createMenuGroup()); + } +} From f945af55e2a6286f7704bae2b37c2e0ec3a6fd76 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 27 Feb 2025 23:14:08 +0900 Subject: [PATCH 69/71] =?UTF-8?q?fix(kitchen=20pos)=20:=20MenuSummary=20?= =?UTF-8?q?=EC=99=80=20ProductSummary=20=EA=B0=80=20Menu,=20Product=20?= =?UTF-8?q?=EC=99=80=20id=EB=A5=BC=20=EA=B3=B5=EC=9C=A0=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/menu/domain/model/Menu.java | 4 ---- .../menu/domain/model/MenuSummary.java | 24 ++----------------- .../product/domain/model/ProductSummary.java | 4 ++-- .../repository/MenuQueryRepositoryTest.java | 7 +++--- .../menu/ui/MenuRestControllerTest.java | 6 ++--- 5 files changed, 11 insertions(+), 34 deletions(-) diff --git a/src/main/java/kitchenpos/menu/domain/model/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java index eb5be9e46..33bdfcf8f 100644 --- a/src/main/java/kitchenpos/menu/domain/model/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -14,15 +14,11 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import jakarta.persistence.Transient; - import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_GROUP_EXISTS_EXCEPTION; -import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCTS_EXISTS_EXCEPTION; - @Table(name = "menu") @Entity public class Menu { diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java b/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java index fda1bb111..00e2c38f7 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java @@ -8,7 +8,6 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.UUID; import kitchenpos.product.domain.model.ProductSummary; @@ -28,9 +27,9 @@ public class MenuSummary { @JoinColumn(name = "menu_summary_id") private List productSummaries = new ArrayList<>(); - public MenuSummary(String menuName, BigDecimal price, boolean isDisplayed, UUID menuGroupId, + public MenuSummary(UUID menuId, String menuName, BigDecimal price, boolean isDisplayed, UUID menuGroupId, String menuGroupName, List productSummaries) { - this.id = UUID.randomUUID(); + this.id = menuId; this.menuName = menuName; this.price = price; this.isDisplayed = isDisplayed; @@ -69,25 +68,6 @@ public String getMenuGroupName() { public List getProductSummaries() { return productSummaries; } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - MenuSummary that = (MenuSummary) o; - return isDisplayed == that.isDisplayed && Objects.equals(id, that.id) && Objects.equals( - menuName, that.menuName) && Objects.equals(price, that.price) && Objects.equals( - menuGroupId, that.menuGroupId) && Objects.equals(menuGroupName, that.menuGroupName); - } - - @Override - public int hashCode() { - return Objects.hash(id, menuName, price, isDisplayed, menuGroupId, menuGroupName); - } } diff --git a/src/main/java/kitchenpos/product/domain/model/ProductSummary.java b/src/main/java/kitchenpos/product/domain/model/ProductSummary.java index bfe7c231b..77a8cd9a6 100644 --- a/src/main/java/kitchenpos/product/domain/model/ProductSummary.java +++ b/src/main/java/kitchenpos/product/domain/model/ProductSummary.java @@ -16,8 +16,8 @@ public class ProductSummary { private String name; private long quantity; - public ProductSummary(String name, long quantity) { - this.id = UUID.randomUUID(); + public ProductSummary(UUID productId, String name, long quantity) { + this.id = productId; this.name = name; this.quantity = quantity; } diff --git a/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java b/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java index 11ac46abb..0a1a42b1c 100644 --- a/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java +++ b/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java @@ -7,6 +7,7 @@ import jakarta.persistence.EntityManager; import java.math.BigDecimal; import java.util.List; +import java.util.UUID; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuSummary; import kitchenpos.menu.infra.persistence.QuerydslMenuQueryRepository; @@ -52,13 +53,13 @@ void find_all() { MenuGroup menuGroup2 = createAndSaveMenuGroup(); List firstProductSummaries = List.of(createAndSaveProductSummary()); - MenuSummary menuSummary1 = new MenuSummary("김치찌개1", BigDecimal.valueOf(8000), true, menuGroup1.getId(), + MenuSummary menuSummary1 = new MenuSummary(UUID.randomUUID(), "김치찌개1", BigDecimal.valueOf(8000), true, menuGroup1.getId(), menuGroup1.getName(), firstProductSummaries); menuSummaryRepository.save(menuSummary1); List secondProductSummaries = List.of(createAndSaveProductSummary()); - MenuSummary menuSummary2 = new MenuSummary("김치찌개2", BigDecimal.valueOf(8000), true, menuGroup2.getId(), + MenuSummary menuSummary2 = new MenuSummary(UUID.randomUUID(),"김치찌개2", BigDecimal.valueOf(8000), true, menuGroup2.getId(), menuGroup2.getName(), secondProductSummaries); menuSummaryRepository.save(menuSummary2); @@ -89,7 +90,7 @@ void find_all() { } private ProductSummary createAndSaveProductSummary() { - ProductSummary productSummary = new ProductSummary("김치", 3); + ProductSummary productSummary = new ProductSummary(UUID.randomUUID(), "김치", 3); productSummaryRepository.save(productSummary); return productSummary; } diff --git a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java index 90127d918..dc9428844 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuRestControllerTest.java @@ -28,7 +28,6 @@ import kitchenpos.product.domain.model.ProductSummary; import kitchenpos.product.domain.repository.ProductRepository; import kitchenpos.product.domain.repository.ProductSummaryRepository; -import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -214,7 +213,8 @@ private Menu createAndSaveMenu(boolean displayed) { private MenuSummary createAndSaveMenuSummary(MenuGroup menuGroup) { ProductSummary productSummary = createAndSaveProductSummary(); - MenuSummary menuSummary = new MenuSummary("김치찌개", BigDecimal.valueOf(8000), true, menuGroup.getId(), + MenuSummary menuSummary = new MenuSummary(UUID.randomUUID(), "김치찌개", BigDecimal.valueOf(8000), true, + menuGroup.getId(), menuGroup.getName(), List.of(productSummary)); menuSummaryRepository.save(menuSummary); @@ -222,7 +222,7 @@ private MenuSummary createAndSaveMenuSummary(MenuGroup menuGroup) { } private ProductSummary createAndSaveProductSummary() { - ProductSummary productSummary = new ProductSummary("김치", 3); + ProductSummary productSummary = new ProductSummary(UUID.randomUUID(), "김치", 3); productSummaryRepository.save(productSummary); return productSummary; } From 5f1b3d08e7ff73376b0c3a65d68cddfe350bd8ca Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 27 Feb 2025 23:53:25 +0900 Subject: [PATCH 70/71] =?UTF-8?q?feat(kitchen=20pos)=20:=20MenuQueryModelS?= =?UTF-8?q?ynchronizer=20=EC=BF=BC=EB=A6=AC=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=ED=99=94=20=EC=A0=80=EC=9E=A5=EC=86=8C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/menu/domain/model/Menu.java | 11 ++- .../menu/domain/model/MenuSummary.java | 10 +++ .../menu/domain/model/MenuSummaryEvent.java | 71 ++++++++++++++++ .../service/MenuQueryModelSynchronizer.java | 29 +++++++ .../MenuQueryModelSynchronizerTest.java | 81 +++++++++++++++++++ 5 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 src/main/java/kitchenpos/menu/domain/model/MenuSummaryEvent.java create mode 100644 src/main/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizer.java create mode 100644 src/test/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizerTest.java diff --git a/src/main/java/kitchenpos/menu/domain/model/Menu.java b/src/main/java/kitchenpos/menu/domain/model/Menu.java index 33bdfcf8f..c66b5336d 100644 --- a/src/main/java/kitchenpos/menu/domain/model/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/model/Menu.java @@ -18,10 +18,11 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; +import org.springframework.data.domain.AbstractAggregateRoot; @Table(name = "menu") @Entity -public class Menu { +public class Menu extends AbstractAggregateRoot { @Column(name = "id", columnDefinition = "binary(16)") @Id private UUID id; @@ -63,6 +64,8 @@ public Menu(String name, BigDecimal price, boolean displayed) { this.name = new MenuName(name); this.price = new MenuPrice(price); this.displayed = displayed; + // test 용 생성자 +// registerEvent(MenuSummaryEvent.from(this)); } public Menu(MenuName name, MenuPrice price, MenuGroup menuGroup, boolean displayed, @@ -76,6 +79,7 @@ public Menu(MenuName name, MenuPrice price, MenuGroup menuGroup, boolean display this.displayed = displayed; this.menuProducts = menuProducts; this.menuGroupId = menuGroupId; + registerEvent(MenuSummaryEvent.from(this)); } public Menu(String name, BigDecimal price, boolean displayed, List menuProducts, @@ -102,6 +106,7 @@ public UUID getId() { public void setId(final UUID id) { this.id = id; + registerEvent(MenuSummaryEvent.from(this)); } public String getInnerName() { @@ -114,6 +119,7 @@ public MenuName getName() { public void setName(final String name) { this.name = new MenuName(name); + registerEvent(MenuSummaryEvent.from(this)); } public BigDecimal getInnerPrice() { @@ -126,6 +132,7 @@ public MenuPrice getPrice() { public void changePrice(final BigDecimal price) { this.price = new MenuPrice(price); + registerEvent(MenuSummaryEvent.from(this)); } public MenuGroup getMenuGroup() { @@ -138,10 +145,12 @@ public boolean isDisplayed() { public void changeDisplay(final boolean displayed) { this.displayed = displayed; + registerEvent(MenuSummaryEvent.from(this)); } public void changeDisplay() { this.displayed = !this.displayed; + registerEvent(MenuSummaryEvent.from(this)); } public List getMenuProducts() { diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java b/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java index 00e2c38f7..5b33c2a78 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuSummary.java @@ -41,6 +41,16 @@ public MenuSummary(UUID menuId, String menuName, BigDecimal price, boolean isDis protected MenuSummary() { } + public MenuSummary(MenuSummaryEvent event) { + this.id = event.getId(); + this.menuName = event.getMenuName(); + this.price = event.getPrice(); + this.isDisplayed = event.isDisplayed(); + this.menuGroupId = event.getMenuGroupId(); + this.menuGroupName = event.getMenuGroupName(); + this.productSummaries = event.getProductSummaries(); + } + public UUID getId() { return id; } diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuSummaryEvent.java b/src/main/java/kitchenpos/menu/domain/model/MenuSummaryEvent.java new file mode 100644 index 000000000..f30be0c09 --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/model/MenuSummaryEvent.java @@ -0,0 +1,71 @@ +package kitchenpos.menu.domain.model; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; +import kitchenpos.product.domain.model.ProductSummary; + +public class MenuSummaryEvent { + + private UUID id; + private String menuName; + private BigDecimal price; + private boolean isDisplayed; + private UUID menuGroupId; + private String menuGroupName; + private List productSummaries; + + private MenuSummaryEvent(UUID id, String menuName, BigDecimal price, boolean isDisplayed, UUID menuGroupId, + String menuGroupName, List productSummaries) { + this.id = id; + this.menuName = menuName; + this.price = price; + this.isDisplayed = isDisplayed; + this.menuGroupId = menuGroupId; + this.menuGroupName = menuGroupName; + this.productSummaries = productSummaries; + } + + public static MenuSummaryEvent from(Menu menu) { + return new MenuSummaryEvent( + menu.getId(), + menu.getInnerName(), + menu.getInnerPrice(), + menu.isDisplayed(), + menu.getMenuGroupId(), + menu.getMenuGroup().getName(), + menu.getMenuProducts().stream() + .map(mp -> new ProductSummary(mp.getProductId(), mp.getProduct().getInnerName(), + mp.getInnerQuantity())) + .toList() + ); + } + + public UUID getId() { + return id; + } + + public String getMenuName() { + return menuName; + } + + public BigDecimal getPrice() { + return price; + } + + public boolean isDisplayed() { + return isDisplayed; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public String getMenuGroupName() { + return menuGroupName; + } + + public List getProductSummaries() { + return productSummaries; + } +} diff --git a/src/main/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizer.java b/src/main/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizer.java new file mode 100644 index 000000000..77c9f741b --- /dev/null +++ b/src/main/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizer.java @@ -0,0 +1,29 @@ +package kitchenpos.menu.domain.service; + +import kitchenpos.menu.domain.model.MenuSummary; +import kitchenpos.menu.domain.model.MenuSummaryEvent; +import kitchenpos.menu.domain.repository.MenuSummaryRepository; +import kitchenpos.product.domain.model.ProductSummary; +import kitchenpos.product.domain.repository.ProductSummaryRepository; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; + +@Service +public class MenuQueryModelSynchronizer { + private final MenuSummaryRepository menuSummaryRepository; + private final ProductSummaryRepository productSummaryRepository; // 이 레포지토리 추가 + + public MenuQueryModelSynchronizer(MenuSummaryRepository menuSummaryRepository, + ProductSummaryRepository productSummaryRepository) { + this.menuSummaryRepository = menuSummaryRepository; + this.productSummaryRepository = productSummaryRepository; + } + + @EventListener + public void updateReadModel(MenuSummaryEvent event) { + for (ProductSummary productSummary : event.getProductSummaries()) { + productSummaryRepository.save(productSummary); + } + menuSummaryRepository.save(new MenuSummary(event)); + } +} diff --git a/src/test/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizerTest.java b/src/test/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizerTest.java new file mode 100644 index 000000000..e8f862c27 --- /dev/null +++ b/src/test/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizerTest.java @@ -0,0 +1,81 @@ +package kitchenpos.menu.domain.service; + +import static kitchenpos.TestFixtureFactory.createMenuGroup; +import static kitchenpos.TestFixtureFactory.createProduct; +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigDecimal; +import java.util.List; +import kitchenpos.menu.domain.model.Menu; +import kitchenpos.menu.domain.model.MenuGroup; +import kitchenpos.menu.domain.model.MenuProduct; +import kitchenpos.menu.domain.model.MenuSummary; +import kitchenpos.menu.domain.repository.MenuGroupRepository; +import kitchenpos.menu.domain.repository.MenuQueryRepository; +import kitchenpos.menu.domain.repository.MenuRepository; +import kitchenpos.menu.domain.repository.MenuSummaryRepository; +import kitchenpos.product.domain.model.Product; +import kitchenpos.product.domain.repository.ProductRepository; +import kitchenpos.product.domain.repository.ProductSummaryRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class MenuQueryModelSynchronizerTest { + + @Autowired + private MenuSummaryRepository menuSummaryRepository; + + @Autowired + private MenuRepository menuRepository; + + @Autowired + private MenuGroupRepository menuGroupRepository; + + @Autowired + private ProductRepository productRepository; + + @Autowired + private MenuQueryRepository menuQueryRepository; + + @Autowired + private ProductSummaryRepository productSummaryRepository; + + @Test + @DisplayName("이벤트를 받으면 메뉴 쿼리 모델을 업데이트 한다.") + void update_model() throws InterruptedException { + // given + MenuQueryModelSynchronizer menuQueryModelSynchronizer = new MenuQueryModelSynchronizer(menuSummaryRepository, productSummaryRepository); + + // when + Menu menu = createAndSaveMenu(true); + + Thread.sleep(100); + + // then + List result = menuQueryRepository.findAll(); + + assertThat(result).hasSize(1); + assertThat(result.getFirst().getId()).isEqualTo(menu.getId()); + assertThat(result.getFirst().getMenuName()).isEqualTo("real 김치찌개"); + } + + private MenuGroup createAndSaveMenuGroup() { + return menuGroupRepository.save(createMenuGroup()); + } + + private Product createAndSaveProduct() { + return productRepository.save(createProduct("김치", 5000)); + } + + private Menu createAndSaveMenu(boolean displayed) { + MenuGroup menuGroup = createAndSaveMenuGroup(); + Product product = createAndSaveProduct(); + MenuProduct menuProduct = new MenuProduct(1, product, product.getId()); + Menu menu = new Menu("real 김치찌개", BigDecimal.valueOf(8000), displayed, List.of(menuProduct), menuGroup, + menuGroup.getId()); + return menuRepository.save(menu); + } +} From 24756a7c499afcb0281943a677ec593334ce6193 Mon Sep 17 00:00:00 2001 From: suzhanlee <108535068+suzhanlee@users.noreply.github.com> Date: Thu, 27 Feb 2025 23:56:13 +0900 Subject: [PATCH 71/71] =?UTF-8?q?style(kitchen=20pos)=20:=20import=20?= =?UTF-8?q?=EB=AC=B8=20=EC=9E=AC=EC=A0=95=EB=A6=AC=20=EB=B0=8F=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/domain/model/MenuGroupName.java | 1 - .../menu/domain/model/MenuName.java | 1 - .../menu/domain/model/MenuPrice.java | 1 - .../domain/model/MenuProductQuantity.java | 1 - .../kitchenpos/menu/ui/dto/MenuGroupRs.java | 1 - .../application/EatInOrderService.java | 6 ++--- .../application/OrderTableService.java | 4 ++-- .../ui/OrderTableRestController.java | 2 +- .../order/eatinorder/ui/dto/EatInOrderRs.java | 2 +- .../menu/application/MenuServiceTest.java | 1 - .../repository/MenuQueryRepositoryTest.java | 22 ++++++++++--------- .../MenuQueryModelSynchronizerTest.java | 3 ++- .../menu/ui/MenuGroupRestControllerTest.java | 2 -- .../common/application/OrderServiceTest.java | 2 -- .../common/ui/OrderRestControllerTest.java | 5 +---- .../application/OrderTableServiceTest.java | 4 ++-- .../service/EatInOrderServiceTest.java | 4 ++-- 17 files changed, 26 insertions(+), 36 deletions(-) diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java index 446a44383..5afd18e61 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuGroupName.java @@ -2,7 +2,6 @@ import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_CATEGORY_NAME_CREATION_EXCEPTION; -import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuName.java b/src/main/java/kitchenpos/menu/domain/model/MenuName.java index 526d0c5a1..e9ab5d663 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuName.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuName.java @@ -2,7 +2,6 @@ import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_NAME_CREATION_EXCEPTION; -import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java index 85ea6eaf7..27af93625 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuPrice.java @@ -2,7 +2,6 @@ import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRICE_CREATION_EXCEPTION; -import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; diff --git a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java index 4cad0c18d..28cf9d252 100644 --- a/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java +++ b/src/main/java/kitchenpos/menu/domain/model/MenuProductQuantity.java @@ -2,7 +2,6 @@ import static kitchenpos.menu.exception.MenuExceptionMessage.MENU_PRODUCT_QUANTITY_CREATION_EXCEPTION; -import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; diff --git a/src/main/java/kitchenpos/menu/ui/dto/MenuGroupRs.java b/src/main/java/kitchenpos/menu/ui/dto/MenuGroupRs.java index fb020dc69..4f77100ee 100644 --- a/src/main/java/kitchenpos/menu/ui/dto/MenuGroupRs.java +++ b/src/main/java/kitchenpos/menu/ui/dto/MenuGroupRs.java @@ -2,7 +2,6 @@ import java.util.UUID; import kitchenpos.menu.application.dto.MenuGroupServiceRs; -import kitchenpos.menu.domain.model.MenuGroup; public class MenuGroupRs { private UUID id; diff --git a/src/main/java/kitchenpos/order/eatinorder/application/EatInOrderService.java b/src/main/java/kitchenpos/order/eatinorder/application/EatInOrderService.java index d6915f282..2f5b41d1b 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/EatInOrderService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/EatInOrderService.java @@ -6,13 +6,13 @@ import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.OrderLineItem; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; +import kitchenpos.order.eatinorder.application.dto.EatInOrderServiceRs; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFactory; import kitchenpos.order.eatinorder.domain.model.EatInOrderStatus; import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; -import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq; -import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq.OrderLineItemServiceDto; -import kitchenpos.order.eatinorder.application.dto.EatInOrderServiceRs; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java index 276ca4a86..6c02172e7 100644 --- a/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java +++ b/src/main/java/kitchenpos/order/eatinorder/application/OrderTableService.java @@ -3,13 +3,13 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; +import kitchenpos.order.eatinorder.application.dto.CreateOrderTableServiceRq; +import kitchenpos.order.eatinorder.application.dto.OrderTableServiceRs; import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.domain.model.OrderTableName; import kitchenpos.order.eatinorder.domain.model.ReleaseOrderTableEvent; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; -import kitchenpos.order.eatinorder.application.dto.CreateOrderTableServiceRq; -import kitchenpos.order.eatinorder.application.dto.OrderTableServiceRs; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java index 687d6e200..efba17170 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/OrderTableRestController.java @@ -4,9 +4,9 @@ import java.util.List; import java.util.UUID; import kitchenpos.order.eatinorder.application.OrderTableService; -import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.application.dto.CreateOrderTableServiceRq; import kitchenpos.order.eatinorder.application.dto.OrderTableServiceRs; +import kitchenpos.order.eatinorder.domain.model.OrderTable; import kitchenpos.order.eatinorder.ui.dto.CreateOrderTableRq; import kitchenpos.order.eatinorder.ui.dto.OrderTableRs; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java b/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java index eb232cc4a..22b0eae46 100644 --- a/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java +++ b/src/main/java/kitchenpos/order/eatinorder/ui/dto/EatInOrderRs.java @@ -1,8 +1,8 @@ package kitchenpos.order.eatinorder.ui.dto; import java.util.UUID; -import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.application.dto.EatInOrderServiceRs; +import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; public class EatInOrderRs { private UUID eatInOrderId; diff --git a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 0257ba191..949d29915 100644 --- a/src/test/java/kitchenpos/menu/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -19,7 +19,6 @@ import kitchenpos.menu.domain.model.Menu; import kitchenpos.menu.domain.model.MenuGroup; import kitchenpos.menu.domain.model.MenuNameCreationService; -import kitchenpos.menu.domain.model.MenuProduct; import kitchenpos.menu.domain.repository.MenuGroupRepository; import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.menu.domain.service.MarginValidator; diff --git a/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java b/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java index 0a1a42b1c..541f81dd6 100644 --- a/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java +++ b/src/test/java/kitchenpos/menu/domain/repository/MenuQueryRepositoryTest.java @@ -37,14 +37,6 @@ class MenuQueryRepositoryTest { @Autowired private MenuQueryRepository menuQueryRepository; - @TestConfiguration - static class TestConfig { - @Bean - public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) { - return new JPAQueryFactory(entityManager); - } - } - @Test @DisplayName("메뉴 요약 정보를 조회한다.") void find_all() { @@ -53,13 +45,15 @@ void find_all() { MenuGroup menuGroup2 = createAndSaveMenuGroup(); List firstProductSummaries = List.of(createAndSaveProductSummary()); - MenuSummary menuSummary1 = new MenuSummary(UUID.randomUUID(), "김치찌개1", BigDecimal.valueOf(8000), true, menuGroup1.getId(), + MenuSummary menuSummary1 = new MenuSummary(UUID.randomUUID(), "김치찌개1", BigDecimal.valueOf(8000), true, + menuGroup1.getId(), menuGroup1.getName(), firstProductSummaries); menuSummaryRepository.save(menuSummary1); List secondProductSummaries = List.of(createAndSaveProductSummary()); - MenuSummary menuSummary2 = new MenuSummary(UUID.randomUUID(),"김치찌개2", BigDecimal.valueOf(8000), true, menuGroup2.getId(), + MenuSummary menuSummary2 = new MenuSummary(UUID.randomUUID(), "김치찌개2", BigDecimal.valueOf(8000), true, + menuGroup2.getId(), menuGroup2.getName(), secondProductSummaries); menuSummaryRepository.save(menuSummary2); @@ -98,4 +92,12 @@ private ProductSummary createAndSaveProductSummary() { private MenuGroup createAndSaveMenuGroup() { return menuGroupRepository.save(createMenuGroup()); } + + @TestConfiguration + static class TestConfig { + @Bean + public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) { + return new JPAQueryFactory(entityManager); + } + } } diff --git a/src/test/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizerTest.java b/src/test/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizerTest.java index e8f862c27..6ba4de7cf 100644 --- a/src/test/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizerTest.java +++ b/src/test/java/kitchenpos/menu/domain/service/MenuQueryModelSynchronizerTest.java @@ -47,7 +47,8 @@ class MenuQueryModelSynchronizerTest { @DisplayName("이벤트를 받으면 메뉴 쿼리 모델을 업데이트 한다.") void update_model() throws InterruptedException { // given - MenuQueryModelSynchronizer menuQueryModelSynchronizer = new MenuQueryModelSynchronizer(menuSummaryRepository, productSummaryRepository); + MenuQueryModelSynchronizer menuQueryModelSynchronizer = new MenuQueryModelSynchronizer(menuSummaryRepository, + productSummaryRepository); // when Menu menu = createAndSaveMenu(true); diff --git a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java index 516e17858..a17368647 100644 --- a/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java +++ b/src/test/java/kitchenpos/menu/ui/MenuGroupRestControllerTest.java @@ -7,9 +7,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.fasterxml.jackson.databind.ObjectMapper; -import kitchenpos.common.infra.external.FakePurgomalumClient; import kitchenpos.menu.domain.model.MenuGroup; -import kitchenpos.menu.domain.model.MenuGroupNameCreationService; import kitchenpos.menu.ui.dto.CreateMenuGroupRq; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java index c7b8978cc..1bd1ef60f 100644 --- a/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/common/application/OrderServiceTest.java @@ -15,8 +15,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.UUID; diff --git a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java index b4802d0f1..00ff6ec7f 100644 --- a/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java +++ b/src/test/java/kitchenpos/order/common/ui/OrderRestControllerTest.java @@ -7,9 +7,7 @@ import static kitchenpos.TestFixtureFactory.createOrderWithDeliveryType; import static kitchenpos.TestFixtureFactory.createProduct; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -34,7 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; @@ -63,6 +60,7 @@ class OrderRestControllerTest { /** * 필요 없어진 테스트 + * * @throws Exception */ // @Test @@ -83,7 +81,6 @@ class OrderRestControllerTest { // .andExpect(jsonPath("$.orderLineItems").isArray()) // .andExpect(jsonPath("$.status").value("WAITING")); // } - @Test @DisplayName("주문 상태가 주문 대기 중이라면 주문을 수락할 수 있다.") void accept_success() throws Exception { diff --git a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java index 57ecfb68d..c7928df3a 100644 --- a/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/application/OrderTableServiceTest.java @@ -16,6 +16,8 @@ import java.util.HashMap; import java.util.List; import java.util.Optional; +import kitchenpos.order.eatinorder.application.dto.CreateOrderTableServiceRq; +import kitchenpos.order.eatinorder.application.dto.OrderTableServiceRs; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; import kitchenpos.order.eatinorder.domain.model.OrderTable; @@ -23,8 +25,6 @@ import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; import kitchenpos.order.eatinorder.infra.persistence.FakeEatInOrderRepository; -import kitchenpos.order.eatinorder.application.dto.CreateOrderTableServiceRq; -import kitchenpos.order.eatinorder.application.dto.OrderTableServiceRs; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java index 38127665d..8304096d4 100644 --- a/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java +++ b/src/test/java/kitchenpos/order/eatinorder/service/EatInOrderServiceTest.java @@ -18,6 +18,8 @@ import kitchenpos.menu.domain.repository.MenuRepository; import kitchenpos.order.common.model.OrderLineItemValidator; import kitchenpos.order.eatinorder.application.EatInOrderService; +import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq; +import kitchenpos.order.eatinorder.application.dto.EatInOrderServiceRs; import kitchenpos.order.eatinorder.domain.model.EatInOrder; import kitchenpos.order.eatinorder.domain.model.EatInOrderFactory; import kitchenpos.order.eatinorder.domain.model.EatInOrderFlow; @@ -26,8 +28,6 @@ import kitchenpos.order.eatinorder.domain.repository.EatInOrderRepository; import kitchenpos.order.eatinorder.domain.repository.OrderTableRepository; import kitchenpos.order.eatinorder.domain.service.OrderTableOccupationManager; -import kitchenpos.order.eatinorder.application.dto.CreateEatInOrderServiceRq; -import kitchenpos.order.eatinorder.application.dto.EatInOrderServiceRs; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test;