From ecf8396cb3d72fb9810cefd4225edb32c5a76398 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Wed, 19 Jun 2024 02:09:22 +0900 Subject: [PATCH 01/42] =?UTF-8?q?refactor(MenuProduct):=20MenuProduct?= =?UTF-8?q?=EB=8A=94=20=EA=B0=80=EA=B2=A9=EC=9D=84=20=EA=B0=96=EB=8A=94?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MenuProductsService.java | 3 +-- .../menus/domain/tobe/MenuProduct.java | 20 +++++++++---------- .../menus/domain/tobe/MenuProductTest.java | 6 +----- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/main/java/kitchenpos/menus/application/MenuProductsService.java b/src/main/java/kitchenpos/menus/application/MenuProductsService.java index 018f7ee93..4b5292938 100644 --- a/src/main/java/kitchenpos/menus/application/MenuProductsService.java +++ b/src/main/java/kitchenpos/menus/application/MenuProductsService.java @@ -55,8 +55,7 @@ public boolean isOverThanProductSumPrice(List menuProducts, MenuPri private BigDecimal calculateProductSumPrice(List menuProducts) { BigDecimal sum = BigDecimal.ZERO; for (MenuProduct menuProduct : menuProducts) { - Product product = findProduct(menuProduct.getProductId()); - sum = sum.add(menuProduct.calculateSum(product)); + sum = sum.add(menuProduct.calculateSum()); } return sum; } diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java index 74d023ed7..3ebad50f8 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java @@ -18,28 +18,28 @@ public class MenuProduct { @Column(name = "seq") @GeneratedValue(strategy = GenerationType.IDENTITY) @Id - private Long seq; + private final Long seq; - private UUID productId; + private final UUID productId; - @Embedded - private MenuQuantity quantity; + private final BigDecimal price; - protected MenuProduct() { - } + @Embedded + private final MenuQuantity quantity; public MenuProduct(Product product, MenuQuantity quantity) { - this(null, product.getId(), quantity); + this(null, product.getId(), product.getPrice(), quantity); } - public MenuProduct(Long seq, UUID productId, MenuQuantity quantity) { + public MenuProduct(Long seq, UUID productId, BigDecimal price, MenuQuantity quantity) { this.seq = seq; this.productId = productId; + this.price = price; this.quantity = quantity; } - public BigDecimal calculateSum(Product product) { - return product.getPrice().multiply(quantity.getQuantity()); + public BigDecimal calculateSum() { + return price.multiply(quantity.getQuantity()); } public UUID getProductId() { diff --git a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductTest.java b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductTest.java index 51b355d51..f81317b78 100644 --- a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductTest.java +++ b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductTest.java @@ -4,9 +4,6 @@ import java.math.BigDecimal; import kitchenpos.fixture.ProductFixture; -import kitchenpos.menus.domain.tobe.MenuProduct; -import kitchenpos.menus.domain.tobe.MenuQuantity; -import kitchenpos.products.domain.tobe.Product; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -18,9 +15,8 @@ class MenuProductTest { @Test void 메뉴상품의_가격과_수량을_곱하여_합을_구할_수_있다() { - Product product = ProductFixture.createFired(); MenuProduct actual = new MenuProduct(ProductFixture.createFired(), new MenuQuantity(2)); - assertThat(actual.calculateSum(product)).isEqualTo(BigDecimal.valueOf(40_000L)); + assertThat(actual.calculateSum()).isEqualTo(BigDecimal.valueOf(40_000L)); } } \ No newline at end of file From 16677210552ed7b9a639d68e3987ed111b9f6c29 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Wed, 19 Jun 2024 19:33:12 +0900 Subject: [PATCH 02/42] =?UTF-8?q?refactor(Menu):=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=EB=8A=94=20=EC=8A=A4=EC=8A=A4=EB=A1=9C=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=EA=B0=80=EA=B2=A9=EC=9D=84=20=EA=B2=80=EC=A6=9D=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/menus/domain/tobe/Menu.java | 14 +++++++------ .../java/kitchenpos/fixture/MenuFixture.java | 10 +++++++--- .../menus/domain/tobe/MenuTest.java | 20 ++++++++++++++++--- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java index 4bcf7b340..5372c662d 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java @@ -55,10 +55,12 @@ public Menu(UUID id, MenuName name, MenuPrice price, UUID menuGroupId, } public void changePrice(MenuPrice price) { + menuProducts.validateSumPrice(price); this.price = price; } public void display() { + menuProducts.validateSumPrice(this.price); this.displayed = new DisplayedMenu(true); } @@ -66,6 +68,10 @@ public void hide() { this.displayed = new DisplayedMenu(false); } + public boolean isOverThanProductSumPrice() { + return menuProducts.isOverThanSumPrice(this.price); + } + public boolean isDisplayed() { return this.displayed.isDisplayed(); } @@ -74,15 +80,11 @@ public UUID getId() { return id; } - public MenuPrice getMenuPrice() { - return price; - } - public BigDecimal getPrice() { return price.getPrice(); } - public List getMenuProducts() { - return menuProducts.getMenuProducts(); + public MenuProducts getMenuProducts() { + return menuProducts; } } diff --git a/src/test/java/kitchenpos/fixture/MenuFixture.java b/src/test/java/kitchenpos/fixture/MenuFixture.java index 131b98588..76eb64539 100644 --- a/src/test/java/kitchenpos/fixture/MenuFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuFixture.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.util.List; +import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.domain.tobe.DisplayedMenu; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuName; @@ -9,7 +10,6 @@ import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.menus.domain.tobe.MenuProducts; import kitchenpos.menus.domain.tobe.MenuQuantity; -import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.ui.dto.MenuCreateRequest; import kitchenpos.menus.ui.dto.MenuProductCreateRequests; import kitchenpos.products.domain.tobe.Product; @@ -48,11 +48,15 @@ public static MenuPrice changePriceRequest(Long price) { } public static Menu createFriedOnePlusOne(MenuGroup menuGroup, Product product) { + return createFriedOnePlusOne(menuGroup, product, 30_000L); + } + + public static Menu createFriedOnePlusOne(MenuGroup menuGroup, Product product, Long price) { MenuName menuName = new MenuName("후라이드1+1"); - MenuPrice menuPrice = new MenuPrice(BigDecimal.valueOf(30_000L)); + MenuPrice menuPrice = new MenuPrice(BigDecimal.valueOf(price)); DisplayedMenu displayedMenu = new DisplayedMenu(true); MenuProducts menuProducts = new MenuProducts( - List.of(new MenuProduct(product, new MenuQuantity(2)))); + List.of(new MenuProduct(product, new MenuQuantity(2))), menuPrice); return new Menu(menuName, menuPrice, menuGroup, displayedMenu, menuProducts); } diff --git a/src/test/java/kitchenpos/menus/domain/tobe/MenuTest.java b/src/test/java/kitchenpos/menus/domain/tobe/MenuTest.java index e3601489d..3de301e26 100644 --- a/src/test/java/kitchenpos/menus/domain/tobe/MenuTest.java +++ b/src/test/java/kitchenpos/menus/domain/tobe/MenuTest.java @@ -1,13 +1,12 @@ package kitchenpos.menus.domain.tobe; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.math.BigDecimal; import kitchenpos.fixture.MenuFixture; import kitchenpos.fixture.MenuGroupFixture; import kitchenpos.fixture.ProductFixture; -import kitchenpos.menus.domain.tobe.Menu; -import kitchenpos.menus.domain.tobe.MenuPrice; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -26,6 +25,14 @@ class MenuTest { assertThat(actual.getPrice()).isEqualTo(BigDecimal.valueOf(35_000L)); } + @Test + void 메뉴가격_변경시_상품가격x상품갯수의_총합을_넘으면_예외를_던진다() { + Menu actual = createFriedMenu(); + + assertThatThrownBy(() -> actual.changePrice(new MenuPrice(BigDecimal.valueOf(50_000L)))) + .isInstanceOf(IllegalArgumentException.class); + } + @Test void 메뉴를_노출할_수_있다() { Menu actual = createFriedMenu(); @@ -44,8 +51,15 @@ class MenuTest { assertThat(actual.isDisplayed()).isFalse(); } + @Test + void 메뉴가격이_상품가격x상품갯수의_총합을_넘는지_확인할_수_있다() { + Menu actual = createFriedMenu(); + + assertThat(actual.isOverThanProductSumPrice()).isFalse(); + } + private Menu createFriedMenu() { return MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), - ProductFixture.createFired()); + ProductFixture.createFired(20000L), 30000L); } } \ No newline at end of file From ff0d84b26b29f247c754c5c7b4b06290b7540a79 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Wed, 19 Jun 2024 19:44:46 +0900 Subject: [PATCH 03/42] =?UTF-8?q?fix(MenuProduct):=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?final=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - JPA Entity에는 붙일 수 없다. --- .../kitchenpos/menus/domain/tobe/MenuProduct.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java index 3ebad50f8..de8fedb20 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java @@ -18,14 +18,17 @@ public class MenuProduct { @Column(name = "seq") @GeneratedValue(strategy = GenerationType.IDENTITY) @Id - private final Long seq; + private Long seq; - private final UUID productId; + private UUID productId; - private final BigDecimal price; + private BigDecimal price; @Embedded - private final MenuQuantity quantity; + private MenuQuantity quantity; + + protected MenuProduct() { + } public MenuProduct(Product product, MenuQuantity quantity) { this(null, product.getId(), product.getPrice(), quantity); From c3f2e8bcb974f9c597aa33b832eb63a97a6f0dea Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Wed, 19 Jun 2024 20:08:40 +0900 Subject: [PATCH 04/42] =?UTF-8?q?fix(MenuProducts):=20MenuPrice=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MenuProducts는 MenuPrice를 몰라도 된다. 의존성 제거. --- .../menus/domain/tobe/MenuProduct.java | 4 ++++ .../menus/domain/tobe/MenuProducts.java | 19 ++++++++++++++++--- .../menus/domain/tobe/MenuProductsTest.java | 10 +++++++++- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java index de8fedb20..6be2c1c29 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java @@ -30,6 +30,10 @@ public class MenuProduct { protected MenuProduct() { } + public MenuProduct(Product product, int quantity) { + this(null, product.getId(), product.getPrice(), new MenuQuantity(quantity)); + } + public MenuProduct(Product product, MenuQuantity quantity) { this(null, product.getId(), product.getPrice(), quantity); } diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java index abc485517..110502c2d 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java @@ -5,11 +5,14 @@ import jakarta.persistence.ForeignKey; import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToMany; +import java.math.BigDecimal; +import java.util.Iterator; import java.util.List; import java.util.Objects; +import org.jetbrains.annotations.NotNull; @Embeddable -public class MenuProducts { +public class MenuProducts implements Iterable { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( @@ -34,7 +37,17 @@ private void validateMenuProducts(List menuProducts) { } } - public List getMenuProducts() { - return menuProducts; + public BigDecimal calculateSumPrice() { + BigDecimal sum = BigDecimal.ZERO; + for (MenuProduct menuProduct : menuProducts) { + sum = sum.add(menuProduct.calculateSum()); + } + return sum; + } + + @NotNull + @Override + public Iterator iterator() { + return menuProducts.iterator(); } } diff --git a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java index 46728f741..b39c5c8bb 100644 --- a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java +++ b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java @@ -1,9 +1,10 @@ package kitchenpos.menus.domain.tobe; +import static org.assertj.core.api.Assertions.assertThatNoException; import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.List; -import kitchenpos.menus.domain.tobe.MenuProducts; +import kitchenpos.fixture.ProductFixture; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -26,4 +27,11 @@ class MenuProductsTest { () -> new MenuProducts(List.of())) .isInstanceOf(IllegalArgumentException.class); } + + @Test + void 메뉴상품들을_생성할_수_있다() { + assertThatNoException().isThrownBy(() -> new MenuProducts( + List.of(new MenuProduct(ProductFixture.createFired(20_000L), 2))) + ); + } } \ No newline at end of file From db93f019094c0b0826bdbb02533bcf2f73a645cb Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Wed, 19 Jun 2024 20:13:20 +0900 Subject: [PATCH 05/42] =?UTF-8?q?fix(Menu):=20MenuPrice=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=EC=9D=80=20Menu=EA=B0=80=20=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MenuProductsService.java | 27 +------------ .../menus/application/MenuService.java | 7 +--- .../kitchenpos/menus/domain/tobe/Menu.java | 32 +++++++++------ .../products/application/ProductService.java | 3 +- .../java/kitchenpos/fixture/MenuFixture.java | 2 +- .../kitchenpos/fixture/ProductFixture.java | 6 ++- .../application/MenuProductsServiceTest.java | 40 ++++++------------- 7 files changed, 42 insertions(+), 75 deletions(-) diff --git a/src/main/java/kitchenpos/menus/application/MenuProductsService.java b/src/main/java/kitchenpos/menus/application/MenuProductsService.java index 4b5292938..e76e06063 100644 --- a/src/main/java/kitchenpos/menus/application/MenuProductsService.java +++ b/src/main/java/kitchenpos/menus/application/MenuProductsService.java @@ -1,11 +1,9 @@ package kitchenpos.menus.application; -import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; import java.util.stream.Collectors; -import kitchenpos.menus.domain.tobe.MenuPrice; import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.menus.domain.tobe.MenuProducts; import kitchenpos.menus.ui.dto.MenuProductCreateRequests; @@ -22,14 +20,11 @@ public MenuProductsService(ProductRepository productRepository) { this.productRepository = productRepository; } - public MenuProducts create(final MenuProductCreateRequests requests, - MenuPrice price) { + public MenuProducts create(final MenuProductCreateRequests requests) { List products = findProducts(requests.getProductIds()); requests.validateMenuProducts(products); - List menuProducts = createMenuProducts(requests); - validateMenuPrice(menuProducts, price); - return new MenuProducts(menuProducts); + return new MenuProducts(createMenuProducts(requests)); } private List createMenuProducts(MenuProductCreateRequests requests) { @@ -42,24 +37,6 @@ private List createMenuProducts(MenuProductCreateRequests requests) .collect(Collectors.toList()); } - public void validateMenuPrice(List menuProducts, MenuPrice price) { - if (isOverThanProductSumPrice(menuProducts, price)) { - throw new IllegalArgumentException(); - } - } - - public boolean isOverThanProductSumPrice(List menuProducts, MenuPrice price) { - return price.isOver(calculateProductSumPrice(menuProducts)); - } - - private BigDecimal calculateProductSumPrice(List menuProducts) { - BigDecimal sum = BigDecimal.ZERO; - for (MenuProduct menuProduct : menuProducts) { - sum = sum.add(menuProduct.calculateSum()); - } - return sum; - } - private List findProducts(List productIds) { return productRepository.findAllByIdIn(productIds); } diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index abad4364d..f87db4770 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -4,11 +4,11 @@ import java.util.NoSuchElementException; import java.util.UUID; import kitchenpos.menugroups.domain.MenuGroupRepository; +import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; import kitchenpos.menus.domain.tobe.MenuProducts; -import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.ui.dto.MenuCreateRequest; import kitchenpos.products.domain.ProfanityValidator; import org.springframework.stereotype.Service; @@ -38,15 +38,13 @@ public MenuService( public Menu create(final MenuCreateRequest request) { request.validateName(profanityValidator); final MenuGroup menuGroup = findMenuGroup(request.getMenuGroupId()); - final MenuProducts menuProducts = menuProductsService.create(request.getMenuProducts(), - request.getPrice()); + final MenuProducts menuProducts = menuProductsService.create(request.getMenuProducts()); return menuRepository.save(request.to(menuGroup, menuProducts)); } @Transactional public Menu changePrice(final UUID menuId, final MenuPrice request) { final Menu menu = findMenu(menuId); - menuProductsService.validateMenuPrice(menu.getMenuProducts(), request); menu.changePrice(request); return menu; } @@ -54,7 +52,6 @@ public Menu changePrice(final UUID menuId, final MenuPrice request) { @Transactional public Menu display(final UUID menuId) { final Menu menu = findMenu(menuId); - menuProductsService.validateMenuPrice(menu.getMenuProducts(), menu.getMenuPrice()); menu.display(); return menu; } diff --git a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java index 5372c662d..bad2e5e1c 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java @@ -3,14 +3,9 @@ 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.Table; -import jakarta.persistence.Transient; import java.math.BigDecimal; -import java.util.List; import java.util.UUID; import kitchenpos.menugroups.domain.tobe.MenuGroup; @@ -44,8 +39,9 @@ public Menu(MenuName name, MenuPrice price, MenuGroup menuGroup, DisplayedMenu d this(UUID.randomUUID(), name, price, menuGroup.getId(), displayed, menuProducts); } - public Menu(UUID id, MenuName name, MenuPrice price, UUID menuGroupId, - DisplayedMenu displayed, MenuProducts menuProducts) { + public Menu(UUID id, MenuName name, MenuPrice price, UUID menuGroupId, DisplayedMenu displayed, + MenuProducts menuProducts) { + validateMenuPrice(price, menuProducts); this.id = id; this.name = name; this.price = price; @@ -54,22 +50,32 @@ public Menu(UUID id, MenuName name, MenuPrice price, UUID menuGroupId, this.menuProducts = menuProducts; } + private static void validateMenuPrice(MenuPrice price, MenuProducts menuProducts) { + if (price.isOver(menuProducts.calculateSumPrice())) { + throw new IllegalArgumentException(); + } + } + public void changePrice(MenuPrice price) { - menuProducts.validateSumPrice(price); + if (isOverThanProductSumPrice()) { + throw new IllegalArgumentException(); + } this.price = price; } public void display() { - menuProducts.validateSumPrice(this.price); + if (isOverThanProductSumPrice()) { + throw new IllegalArgumentException(); + } this.displayed = new DisplayedMenu(true); } - public void hide() { - this.displayed = new DisplayedMenu(false); + public boolean isOverThanProductSumPrice() { + return this.price.isOver(menuProducts.calculateSumPrice()); } - public boolean isOverThanProductSumPrice() { - return menuProducts.isOverThanSumPrice(this.price); + public void hide() { + this.displayed = new DisplayedMenu(false); } public boolean isDisplayed() { diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index f18ff03af..cebcd5087 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -49,8 +49,7 @@ public Product changePrice(final UUID productId, final ProductPrice request) { final List menus = menuRepository.findAllByProductId(productId); menus.forEach(menu -> { - if (menuProductsService.isOverThanProductSumPrice(menu.getMenuProducts(), - menu.getMenuPrice())) { + if (menu.isOverThanProductSumPrice()) { menu.hide(); } }); diff --git a/src/test/java/kitchenpos/fixture/MenuFixture.java b/src/test/java/kitchenpos/fixture/MenuFixture.java index 76eb64539..aa3ef2ff3 100644 --- a/src/test/java/kitchenpos/fixture/MenuFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuFixture.java @@ -56,7 +56,7 @@ public static Menu createFriedOnePlusOne(MenuGroup menuGroup, Product product, L MenuPrice menuPrice = new MenuPrice(BigDecimal.valueOf(price)); DisplayedMenu displayedMenu = new DisplayedMenu(true); MenuProducts menuProducts = new MenuProducts( - List.of(new MenuProduct(product, new MenuQuantity(2))), menuPrice); + List.of(new MenuProduct(product, new MenuQuantity(2)))); return new Menu(menuName, menuPrice, menuGroup, displayedMenu, menuProducts); } diff --git a/src/test/java/kitchenpos/fixture/ProductFixture.java b/src/test/java/kitchenpos/fixture/ProductFixture.java index 0eff22dab..87701ec54 100644 --- a/src/test/java/kitchenpos/fixture/ProductFixture.java +++ b/src/test/java/kitchenpos/fixture/ProductFixture.java @@ -19,7 +19,11 @@ public static ProductCreateRequest createRequest(final String name, final long p } public static Product createFired() { - return new Product("후라이드", BigDecimal.valueOf(20_000L)); + return createFired(20_000L); + } + + public static Product createFired(Long price) { + return new Product("후라이드", BigDecimal.valueOf(price)); } public static Product createSeasoned() { diff --git a/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java index 20143817d..9f996ac35 100644 --- a/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java @@ -3,13 +3,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import java.math.BigDecimal; import java.util.List; +import java.util.UUID; import kitchenpos.fake.InMemoryProductRepository; import kitchenpos.fixture.MenuProductFixture; import kitchenpos.fixture.ProductFixture; -import kitchenpos.menus.domain.tobe.MenuPrice; import kitchenpos.menus.domain.tobe.MenuProducts; +import kitchenpos.menus.domain.tobe.MenuQuantity; +import kitchenpos.menus.ui.dto.MenuProductCreateRequest; import kitchenpos.menus.ui.dto.MenuProductCreateRequests; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.tobe.Product; @@ -37,51 +38,34 @@ void setUp() { MenuProductCreateRequests createRequests = MenuProductFixture.createRequests( createFriedProduct(), 2); - MenuProducts actual = menuProductsService.create(createRequests, - new MenuPrice(BigDecimal.valueOf(30_000L))); + MenuProducts actual = menuProductsService.create(createRequests); - assertThat(actual.getMenuProducts()).isNotEmpty(); + assertThat(actual).isNotEmpty(); } @Test void 메뉴상품들_생성시_메뉴상품들이_null일_경우_예외를_던진다() { - assertThatThrownBy(() -> menuProductsService.create(new MenuProductCreateRequests(null), - new MenuPrice(BigDecimal.valueOf(30_000L)))) + assertThatThrownBy(() -> menuProductsService.create(new MenuProductCreateRequests(null))) .isInstanceOf(IllegalArgumentException.class); } @Test void 메뉴상품들_생성시_메뉴상품들이_비어있을_경우_예외를_던진다() { assertThatThrownBy( - () -> menuProductsService.create(new MenuProductCreateRequests(List.of()), - new MenuPrice(BigDecimal.valueOf(30_000L)))) + () -> menuProductsService.create(new MenuProductCreateRequests(List.of()))) .isInstanceOf(IllegalArgumentException.class); } @Test - void 메뉴상품들_생성시_메뉴가격이_메뉴상품들의_가격합보다_클_경우_예외를_던진다() { - MenuProductCreateRequests createRequests = MenuProductFixture.createRequests( - createFriedProduct(), 2); + void 메뉴상품들_생성시_없는_상품으로_생성하려_할_경우_예외를_던진다() { + MenuProductCreateRequests createRequests = new MenuProductCreateRequests( + List.of(new MenuProductCreateRequest(UUID.randomUUID(), new MenuQuantity(1)))); - assertThatThrownBy(() -> menuProductsService.create(createRequests, - new MenuPrice(BigDecimal.valueOf(50_000L)))) + assertThatThrownBy( + () -> menuProductsService.create(createRequests)) .isInstanceOf(IllegalArgumentException.class); } - @Test - void 메뉴상품들_생성시_메뉴가격이_메뉴상품들의_가격합보다_큰지_여부를_확인한다() { - MenuProductCreateRequests createRequests = MenuProductFixture.createRequests( - createFriedProduct(), 2); - MenuProducts menuProducts = menuProductsService.create(createRequests, - new MenuPrice(BigDecimal.valueOf(40_000L))); - - boolean actual = menuProductsService.isOverThanProductSumPrice( - menuProducts.getMenuProducts(), - new MenuPrice(BigDecimal.valueOf(50_000L))); - - assertThat(actual).isTrue(); - } - private Product createFriedProduct() { return productRepository.save(ProductFixture.createFired()); } From dc1d39be48f7724bc1ab03d7a22b1a8837108164 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Wed, 19 Jun 2024 20:26:01 +0900 Subject: [PATCH 06/42] =?UTF-8?q?fix(Menu):=20MenuPrice=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EC=8B=9C=20=EB=B3=80=EA=B2=BD=EB=90=9C=20=EA=B0=80?= =?UTF-8?q?=EA=B2=A9=EC=9D=84=20=EA=B2=80=EC=A6=9D=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kitchenpos/menus/domain/tobe/Menu.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java index bad2e5e1c..64e4674ed 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java @@ -57,7 +57,7 @@ private static void validateMenuPrice(MenuPrice price, MenuProducts menuProducts } public void changePrice(MenuPrice price) { - if (isOverThanProductSumPrice()) { + if (price.isOver(menuProducts.calculateSumPrice())) { throw new IllegalArgumentException(); } this.price = price; @@ -71,7 +71,7 @@ public void display() { } public boolean isOverThanProductSumPrice() { - return this.price.isOver(menuProducts.calculateSumPrice()); + return price.isOver(menuProducts.calculateSumPrice()); } public void hide() { From 3220bc1e11e3ed59d1cee6b26bbf5e70844c6cb9 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Thu, 20 Jun 2024 02:46:26 +0900 Subject: [PATCH 07/42] =?UTF-8?q?fix(Menu):=20MenuProduct=EC=9D=98=20Produ?= =?UTF-8?q?ctPrice=EB=A5=BC=20=EB=B3=80=EA=B2=BD=ED=95=9C=EB=8B=A4.=20?= =?UTF-8?q?=EC=9D=B4=EB=95=8C=20=EB=A9=94=EB=89=B4=EA=B0=80=EA=B2=A9?= =?UTF-8?q?=EC=9D=B4=20Product=EC=B4=9D=ED=95=A9=EB=B3=B4=EB=8B=A4=20?= =?UTF-8?q?=ED=81=AC=EB=A9=B4=20=EB=A9=94=EB=89=B4=EB=A5=BC=20=EC=88=A8?= =?UTF-8?q?=EA=B8=B4=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kitchenpos/menus/domain/tobe/Menu.java | 11 +++++++++++ .../menus/domain/tobe/MenuProduct.java | 5 +++++ .../menus/domain/tobe/MenuProducts.java | 5 +++++ .../products/application/ProductService.java | 6 +----- .../kitchenpos/products/domain/tobe/Product.java | 4 ++++ .../kitchenpos/menus/domain/tobe/MenuTest.java | 16 +++++++++++++++- 6 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java index 64e4674ed..0dc399fec 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java @@ -8,6 +8,7 @@ import java.math.BigDecimal; import java.util.UUID; import kitchenpos.menugroups.domain.tobe.MenuGroup; +import kitchenpos.products.domain.tobe.ProductPrice; @Table(name = "menu") @Entity @@ -78,6 +79,16 @@ public void hide() { this.displayed = new DisplayedMenu(false); } + public void changeMenuProductPrice(UUID productId, ProductPrice price) { + menuProducts.stream() + .filter(menuProduct -> menuProduct.getProductId().equals(productId)) + .forEach(menuProduct -> menuProduct.changePrice(price)); + + if (isOverThanProductSumPrice()) { + hide(); + } + } + public boolean isDisplayed() { return this.displayed.isDisplayed(); } diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java index 6be2c1c29..a982c45c8 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java @@ -10,6 +10,7 @@ import java.math.BigDecimal; import java.util.UUID; import kitchenpos.products.domain.tobe.Product; +import kitchenpos.products.domain.tobe.ProductPrice; @Table(name = "menu_product") @Entity @@ -52,4 +53,8 @@ public BigDecimal calculateSum() { public UUID getProductId() { return productId; } + + public void changePrice(ProductPrice price) { + this.price = price.getPrice(); + } } diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java index 110502c2d..804c0c982 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java @@ -9,6 +9,7 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.stream.Stream; import org.jetbrains.annotations.NotNull; @Embeddable @@ -50,4 +51,8 @@ public BigDecimal calculateSumPrice() { public Iterator iterator() { return menuProducts.iterator(); } + + public Stream stream() { + return menuProducts.stream(); + } } diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index cebcd5087..b68addb2c 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -48,11 +48,7 @@ public Product changePrice(final UUID productId, final ProductPrice request) { product.changePrice(request); final List menus = menuRepository.findAllByProductId(productId); - menus.forEach(menu -> { - if (menu.isOverThanProductSumPrice()) { - menu.hide(); - } - }); + menus.forEach(menu -> menu.changeMenuProductPrice(productId, request)); return product; } diff --git a/src/main/java/kitchenpos/products/domain/tobe/Product.java b/src/main/java/kitchenpos/products/domain/tobe/Product.java index 325149346..e2f72ced6 100644 --- a/src/main/java/kitchenpos/products/domain/tobe/Product.java +++ b/src/main/java/kitchenpos/products/domain/tobe/Product.java @@ -30,6 +30,10 @@ public Product(String name, BigDecimal price) { this(new ProductName(name), new ProductPrice(price)); } + public Product(UUID uuid, String name, BigDecimal price) { + this(uuid, new ProductName(name), new ProductPrice(price)); + } + public Product(ProductName name, ProductPrice price) { this(UUID.randomUUID(), name, price); } diff --git a/src/test/java/kitchenpos/menus/domain/tobe/MenuTest.java b/src/test/java/kitchenpos/menus/domain/tobe/MenuTest.java index 3de301e26..0f1bacaa7 100644 --- a/src/test/java/kitchenpos/menus/domain/tobe/MenuTest.java +++ b/src/test/java/kitchenpos/menus/domain/tobe/MenuTest.java @@ -4,9 +4,12 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.math.BigDecimal; +import java.util.UUID; import kitchenpos.fixture.MenuFixture; import kitchenpos.fixture.MenuGroupFixture; import kitchenpos.fixture.ProductFixture; +import kitchenpos.products.domain.tobe.Product; +import kitchenpos.products.domain.tobe.ProductPrice; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -58,8 +61,19 @@ class MenuTest { assertThat(actual.isOverThanProductSumPrice()).isFalse(); } + @Test + void 메뉴상품의_가격_수정_시_상품가격x상품갯수의_총합이_넘으면_메뉴를_숨김처리한다() { + UUID productId = UUID.randomUUID(); + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + new Product(productId, "후라이드", BigDecimal.valueOf(20_000L)), 30_000L); + + menu.changeMenuProductPrice(productId, new ProductPrice(BigDecimal.valueOf(10_000L))); + + assertThat(menu.isDisplayed()).isFalse(); + } + private Menu createFriedMenu() { return MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), - ProductFixture.createFired(20000L), 30000L); + ProductFixture.createFired(20_000L), 30_000L); } } \ No newline at end of file From 324233fe7b6140711bdb030c8a86b23ae9923928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Thu, 20 Jun 2024 17:26:15 +0900 Subject: [PATCH 08/42] =?UTF-8?q?refactor(OrderTableName):=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=ED=85=8C=EC=9D=B4=EB=B8=94=EC=9D=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=80=20=EC=97=86=EA=B1=B0=EB=82=98=20=EB=B9=84?= =?UTF-8?q?=EC=96=B4=EC=9E=88=EC=9D=84=20=EC=88=98=20=EC=97=86=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatin/domain/tobe/OrderTableName.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTableName.java diff --git a/src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTableName.java b/src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTableName.java new file mode 100644 index 000000000..413bf2c29 --- /dev/null +++ b/src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTableName.java @@ -0,0 +1,37 @@ +package kitchenpos.orders.eatin.domain.tobe; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; + +import java.util.Objects; + +@Embeddable +public class OrderTableName { + + @Column(name = "name", nullable = false) + private String name; + + protected OrderTableName() { + } + + public OrderTableName(String name) { + if (Objects.isNull(name) || name.isEmpty()) { + throw new IllegalArgumentException(); + } + + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OrderTableName that = (OrderTableName) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } +} From ebe2ef2dee15e1034ada52b6720de38e83035149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Thu, 20 Jun 2024 17:26:57 +0900 Subject: [PATCH 09/42] =?UTF-8?q?refactor(NumberOfGuests):=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=ED=85=8C=EC=9D=B4=EB=B8=94=EC=9D=98=20=EC=86=90?= =?UTF-8?q?=EB=8B=98=EC=9D=80=200=EB=B3=B4=EB=8B=A4=20=EC=9E=91=EC=9D=84?= =?UTF-8?q?=20=EC=88=98=20=EC=97=86=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatin/domain/tobe/NumberOfGuests.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/main/java/kitchenpos/orders/eatin/domain/tobe/NumberOfGuests.java diff --git a/src/main/java/kitchenpos/orders/eatin/domain/tobe/NumberOfGuests.java b/src/main/java/kitchenpos/orders/eatin/domain/tobe/NumberOfGuests.java new file mode 100644 index 000000000..3db709201 --- /dev/null +++ b/src/main/java/kitchenpos/orders/eatin/domain/tobe/NumberOfGuests.java @@ -0,0 +1,41 @@ +package kitchenpos.orders.eatin.domain.tobe; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; + +import java.util.Objects; + +@Embeddable +public class NumberOfGuests { + + @Column(name = "number_of_guests", nullable = false) + private int numberOfGuests; + + protected NumberOfGuests(){ + + } + + public NumberOfGuests(int numberOfGuests) { + if(numberOfGuests < 0){ + throw new IllegalArgumentException(); + } + this.numberOfGuests = numberOfGuests; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NumberOfGuests that = (NumberOfGuests) o; + return numberOfGuests == that.numberOfGuests; + } + + @Override + public int hashCode() { + return Objects.hashCode(numberOfGuests); + } + + public int getNumberOfGuests() { + return numberOfGuests; + } +} From 59771a5d850542a6662934db199df7dadd295823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Thu, 20 Jun 2024 17:30:21 +0900 Subject: [PATCH 10/42] =?UTF-8?q?refactor(OrderTable):=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=ED=85=8C=EC=9D=B4=EB=B8=94=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A5=BC=20=EC=83=88=EB=A1=9C=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - VO(NumberOfGuest, OrderTableName)을 갖는다. --- .../orders/eatin/domain/tobe/OrderTable.java | 54 +++++++++++++++++++ .../eatin/domain/tobe/OrderTableTest.java | 52 ++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTable.java create mode 100644 src/test/java/kitchenpos/orders/eatin/domain/tobe/OrderTableTest.java diff --git a/src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTable.java b/src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTable.java new file mode 100644 index 000000000..d090bfa18 --- /dev/null +++ b/src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTable.java @@ -0,0 +1,54 @@ +package kitchenpos.orders.eatin.domain.tobe; + +import jakarta.persistence.*; + +import java.util.UUID; + +@Table(name = "order_table") +@Entity +public class OrderTable { + + @Column(name = "id", columnDefinition = "binary(16)") + @Id + private UUID id; + + @Embedded + private OrderTableName name; + + @Embedded + private NumberOfGuests numberOfGuests; + + @Column(name = "occupied", nullable = false) + private boolean occupied; + + protected OrderTable() { + } + + public OrderTable(String name) { + this.id = UUID.randomUUID(); + this.name = new OrderTableName(name); + this.numberOfGuests = new NumberOfGuests(0); + this.occupied = false; + } + + public void sit() { + this.occupied = true; + } + + public void clear() { + this.numberOfGuests = new NumberOfGuests(0); + this.occupied = false; + } + + public void changeNumberOfGuests(NumberOfGuests numberOfGuests) { + this.numberOfGuests = numberOfGuests; + } + + public boolean isOccupied() { + return occupied; + } + + public boolean hasGuest() { + return numberOfGuests.getNumberOfGuests() > 0; + } +} diff --git a/src/test/java/kitchenpos/orders/eatin/domain/tobe/OrderTableTest.java b/src/test/java/kitchenpos/orders/eatin/domain/tobe/OrderTableTest.java new file mode 100644 index 000000000..c2f0fc4fe --- /dev/null +++ b/src/test/java/kitchenpos/orders/eatin/domain/tobe/OrderTableTest.java @@ -0,0 +1,52 @@ +package kitchenpos.orders.eatin.domain.tobe; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; + +@DisplayName("OrderTable") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +class OrderTableTest { + + @Test + void 주문테이블을_생성할_수_있다() { + assertThatNoException() + .isThrownBy(() -> new OrderTable("1번테이블")); + } + + @ParameterizedTest + @NullAndEmptySource + void 이름이_비어있거나_없는_주문테이블을_생성하면_예외를_던진다(String name) { + assertThatThrownBy(() -> new OrderTable(name)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 주문테이블에_손님이_앉으면_점유된다() { + OrderTable target = new OrderTable("1번테이블"); + + target.sit(); + + assertThat(target.isOccupied()).isTrue(); + } + + @Test + void 주문테이블을_치우면_손님은0명_비점유상태로_변경된다() { + OrderTable target = new OrderTable("1번테이블"); + target.sit(); + target.changeNumberOfGuests(new NumberOfGuests(5)); + + target.clear(); + + assertAll( + () -> assertThat(target.isOccupied()).isFalse(), + () -> assertThat(target.hasGuest()).isFalse() + ); + } +} \ No newline at end of file From 4a51c8dd7ff6d9394d4c2ba0d2a45126cd796de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Thu, 20 Jun 2024 17:36:18 +0900 Subject: [PATCH 11/42] =?UTF-8?q?chore(OrderTable):=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=EB=AA=85=20=EB=B3=80=EA=B2=BD=20eatin=20->=20store?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/orders/common/application/OrderService.java | 4 ++-- src/main/java/kitchenpos/orders/common/domain/Order.java | 2 +- .../kitchenpos/orders/common/domain/OrderRepository.java | 2 +- .../{eatin => store}/application/OrderTableService.java | 6 +++--- .../orders/{eatin => store}/domain/OrderTable.java | 2 +- .../{eatin => store}/domain/OrderTableRepository.java | 2 +- .../orders/{eatin => store}/domain/tobe/NumberOfGuests.java | 2 +- .../orders/{eatin => store}/domain/tobe/OrderTable.java | 2 +- .../orders/{eatin => store}/domain/tobe/OrderTableName.java | 2 +- .../{eatin => store}/infra/JpaOrderTableRepository.java | 6 +++--- .../{eatin => store}/ui/OrderTableRestController.java | 6 +++--- src/test/java/kitchenpos/fake/InMemoryOrderRepository.java | 2 +- .../java/kitchenpos/fake/InMemoryOrderTableRepository.java | 4 ++-- src/test/java/kitchenpos/fixture/OrderFixture.java | 2 +- src/test/java/kitchenpos/fixture/OrderTableFixture.java | 2 +- .../orders/common/application/OrderServiceTest.java | 4 ++-- .../{eatin => store}/application/OrderTableServiceTest.java | 6 +++--- .../orders/{eatin => store}/domain/tobe/OrderTableTest.java | 2 +- 18 files changed, 29 insertions(+), 29 deletions(-) rename src/main/java/kitchenpos/orders/{eatin => store}/application/OrderTableService.java (94%) rename src/main/java/kitchenpos/orders/{eatin => store}/domain/OrderTable.java (96%) rename src/main/java/kitchenpos/orders/{eatin => store}/domain/OrderTableRepository.java (85%) rename src/main/java/kitchenpos/orders/{eatin => store}/domain/tobe/NumberOfGuests.java (95%) rename src/main/java/kitchenpos/orders/{eatin => store}/domain/tobe/OrderTable.java (96%) rename src/main/java/kitchenpos/orders/{eatin => store}/domain/tobe/OrderTableName.java (94%) rename src/main/java/kitchenpos/orders/{eatin => store}/infra/JpaOrderTableRepository.java (57%) rename src/main/java/kitchenpos/orders/{eatin => store}/ui/OrderTableRestController.java (93%) rename src/test/java/kitchenpos/orders/{eatin => store}/application/OrderTableServiceTest.java (97%) rename src/test/java/kitchenpos/orders/{eatin => store}/domain/tobe/OrderTableTest.java (97%) diff --git a/src/main/java/kitchenpos/orders/common/application/OrderService.java b/src/main/java/kitchenpos/orders/common/application/OrderService.java index 8e2c4ab6f..f443a5016 100644 --- a/src/main/java/kitchenpos/orders/common/application/OrderService.java +++ b/src/main/java/kitchenpos/orders/common/application/OrderService.java @@ -15,8 +15,8 @@ import kitchenpos.orders.common.domain.OrderStatus; import kitchenpos.orders.common.domain.OrderType; import kitchenpos.orders.delivery.domain.KitchenridersClient; -import kitchenpos.orders.eatin.domain.OrderTable; -import kitchenpos.orders.eatin.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTableRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/orders/common/domain/Order.java b/src/main/java/kitchenpos/orders/common/domain/Order.java index 6611a0876..af683bd63 100644 --- a/src/main/java/kitchenpos/orders/common/domain/Order.java +++ b/src/main/java/kitchenpos/orders/common/domain/Order.java @@ -15,7 +15,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.UUID; -import kitchenpos.orders.eatin.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTable; @Table(name = "orders") @Entity diff --git a/src/main/java/kitchenpos/orders/common/domain/OrderRepository.java b/src/main/java/kitchenpos/orders/common/domain/OrderRepository.java index 7384b9f13..b654ac9aa 100644 --- a/src/main/java/kitchenpos/orders/common/domain/OrderRepository.java +++ b/src/main/java/kitchenpos/orders/common/domain/OrderRepository.java @@ -3,7 +3,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.orders.eatin.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTable; public interface OrderRepository { diff --git a/src/main/java/kitchenpos/orders/eatin/application/OrderTableService.java b/src/main/java/kitchenpos/orders/store/application/OrderTableService.java similarity index 94% rename from src/main/java/kitchenpos/orders/eatin/application/OrderTableService.java rename to src/main/java/kitchenpos/orders/store/application/OrderTableService.java index d4aaa0f69..020b62e05 100644 --- a/src/main/java/kitchenpos/orders/eatin/application/OrderTableService.java +++ b/src/main/java/kitchenpos/orders/store/application/OrderTableService.java @@ -1,4 +1,4 @@ -package kitchenpos.orders.eatin.application; +package kitchenpos.orders.store.application; import java.util.List; import java.util.NoSuchElementException; @@ -6,8 +6,8 @@ import java.util.UUID; import kitchenpos.orders.common.domain.OrderRepository; import kitchenpos.orders.common.domain.OrderStatus; -import kitchenpos.orders.eatin.domain.OrderTable; -import kitchenpos.orders.eatin.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTableRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/orders/eatin/domain/OrderTable.java b/src/main/java/kitchenpos/orders/store/domain/OrderTable.java similarity index 96% rename from src/main/java/kitchenpos/orders/eatin/domain/OrderTable.java rename to src/main/java/kitchenpos/orders/store/domain/OrderTable.java index 0b0cf6ec8..8d40d54de 100644 --- a/src/main/java/kitchenpos/orders/eatin/domain/OrderTable.java +++ b/src/main/java/kitchenpos/orders/store/domain/OrderTable.java @@ -1,4 +1,4 @@ -package kitchenpos.orders.eatin.domain; +package kitchenpos.orders.store.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/kitchenpos/orders/eatin/domain/OrderTableRepository.java b/src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java similarity index 85% rename from src/main/java/kitchenpos/orders/eatin/domain/OrderTableRepository.java rename to src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java index 238d3a29f..ba1c09582 100644 --- a/src/main/java/kitchenpos/orders/eatin/domain/OrderTableRepository.java +++ b/src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.orders.eatin.domain; +package kitchenpos.orders.store.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/orders/eatin/domain/tobe/NumberOfGuests.java b/src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java similarity index 95% rename from src/main/java/kitchenpos/orders/eatin/domain/tobe/NumberOfGuests.java rename to src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java index 3db709201..aa69df970 100644 --- a/src/main/java/kitchenpos/orders/eatin/domain/tobe/NumberOfGuests.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java @@ -1,4 +1,4 @@ -package kitchenpos.orders.eatin.domain.tobe; +package kitchenpos.orders.store.domain.tobe; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; diff --git a/src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTable.java b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java similarity index 96% rename from src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTable.java rename to src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java index d090bfa18..fe20d4b7c 100644 --- a/src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTable.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java @@ -1,4 +1,4 @@ -package kitchenpos.orders.eatin.domain.tobe; +package kitchenpos.orders.store.domain.tobe; import jakarta.persistence.*; diff --git a/src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTableName.java b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTableName.java similarity index 94% rename from src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTableName.java rename to src/main/java/kitchenpos/orders/store/domain/tobe/OrderTableName.java index 413bf2c29..f10988943 100644 --- a/src/main/java/kitchenpos/orders/eatin/domain/tobe/OrderTableName.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTableName.java @@ -1,4 +1,4 @@ -package kitchenpos.orders.eatin.domain.tobe; +package kitchenpos.orders.store.domain.tobe; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; diff --git a/src/main/java/kitchenpos/orders/eatin/infra/JpaOrderTableRepository.java b/src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java similarity index 57% rename from src/main/java/kitchenpos/orders/eatin/infra/JpaOrderTableRepository.java rename to src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java index aae2b57ea..33f647a70 100644 --- a/src/main/java/kitchenpos/orders/eatin/infra/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java @@ -1,8 +1,8 @@ -package kitchenpos.orders.eatin.infra; +package kitchenpos.orders.store.infra; import java.util.UUID; -import kitchenpos.orders.eatin.domain.OrderTable; -import kitchenpos.orders.eatin.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTableRepository; import org.springframework.data.jpa.repository.JpaRepository; public interface JpaOrderTableRepository extends OrderTableRepository, diff --git a/src/main/java/kitchenpos/orders/eatin/ui/OrderTableRestController.java b/src/main/java/kitchenpos/orders/store/ui/OrderTableRestController.java similarity index 93% rename from src/main/java/kitchenpos/orders/eatin/ui/OrderTableRestController.java rename to src/main/java/kitchenpos/orders/store/ui/OrderTableRestController.java index 320291d5a..0310d956c 100644 --- a/src/main/java/kitchenpos/orders/eatin/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/orders/store/ui/OrderTableRestController.java @@ -1,10 +1,10 @@ -package kitchenpos.orders.eatin.ui; +package kitchenpos.orders.store.ui; import java.net.URI; import java.util.List; import java.util.UUID; -import kitchenpos.orders.eatin.application.OrderTableService; -import kitchenpos.orders.eatin.domain.OrderTable; +import kitchenpos.orders.store.application.OrderTableService; +import kitchenpos.orders.store.domain.OrderTable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/test/java/kitchenpos/fake/InMemoryOrderRepository.java b/src/test/java/kitchenpos/fake/InMemoryOrderRepository.java index e41d0ffa9..221e9cdd4 100644 --- a/src/test/java/kitchenpos/fake/InMemoryOrderRepository.java +++ b/src/test/java/kitchenpos/fake/InMemoryOrderRepository.java @@ -8,7 +8,7 @@ import kitchenpos.orders.common.domain.Order; import kitchenpos.orders.common.domain.OrderRepository; import kitchenpos.orders.common.domain.OrderStatus; -import kitchenpos.orders.eatin.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTable; public class InMemoryOrderRepository implements OrderRepository { diff --git a/src/test/java/kitchenpos/fake/InMemoryOrderTableRepository.java b/src/test/java/kitchenpos/fake/InMemoryOrderTableRepository.java index 783fc47e5..22d3faa04 100644 --- a/src/test/java/kitchenpos/fake/InMemoryOrderTableRepository.java +++ b/src/test/java/kitchenpos/fake/InMemoryOrderTableRepository.java @@ -5,8 +5,8 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.orders.eatin.domain.OrderTable; -import kitchenpos.orders.eatin.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTableRepository; public class InMemoryOrderTableRepository implements OrderTableRepository { diff --git a/src/test/java/kitchenpos/fixture/OrderFixture.java b/src/test/java/kitchenpos/fixture/OrderFixture.java index 50100a8b5..0c0235106 100644 --- a/src/test/java/kitchenpos/fixture/OrderFixture.java +++ b/src/test/java/kitchenpos/fixture/OrderFixture.java @@ -7,7 +7,7 @@ import kitchenpos.orders.common.domain.OrderLineItem; import kitchenpos.orders.common.domain.OrderStatus; import kitchenpos.orders.common.domain.OrderType; -import kitchenpos.orders.eatin.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTable; public class OrderFixture { diff --git a/src/test/java/kitchenpos/fixture/OrderTableFixture.java b/src/test/java/kitchenpos/fixture/OrderTableFixture.java index fe6f24630..0f31b2387 100644 --- a/src/test/java/kitchenpos/fixture/OrderTableFixture.java +++ b/src/test/java/kitchenpos/fixture/OrderTableFixture.java @@ -1,7 +1,7 @@ package kitchenpos.fixture; import java.util.UUID; -import kitchenpos.orders.eatin.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTable; public class OrderTableFixture { diff --git a/src/test/java/kitchenpos/orders/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/orders/common/application/OrderServiceTest.java index bfcf9c66f..c3034ab60 100644 --- a/src/test/java/kitchenpos/orders/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/orders/common/application/OrderServiceTest.java @@ -26,8 +26,8 @@ import kitchenpos.orders.common.domain.OrderRepository; import kitchenpos.orders.common.domain.OrderStatus; import kitchenpos.orders.delivery.domain.KitchenridersClient; -import kitchenpos.orders.eatin.domain.OrderTable; -import kitchenpos.orders.eatin.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTableRepository; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.tobe.Product; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/kitchenpos/orders/eatin/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java similarity index 97% rename from src/test/java/kitchenpos/orders/eatin/application/OrderTableServiceTest.java rename to src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java index d59e415a9..53670d29a 100644 --- a/src/test/java/kitchenpos/orders/eatin/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java @@ -1,4 +1,4 @@ -package kitchenpos.orders.eatin.application; +package kitchenpos.orders.store.application; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; @@ -24,8 +24,8 @@ import kitchenpos.orders.common.domain.Order; import kitchenpos.orders.common.domain.OrderRepository; import kitchenpos.orders.common.domain.OrderStatus; -import kitchenpos.orders.eatin.domain.OrderTable; -import kitchenpos.orders.eatin.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.OrderTableRepository; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.tobe.Product; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/kitchenpos/orders/eatin/domain/tobe/OrderTableTest.java b/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java similarity index 97% rename from src/test/java/kitchenpos/orders/eatin/domain/tobe/OrderTableTest.java rename to src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java index c2f0fc4fe..e8277c633 100644 --- a/src/test/java/kitchenpos/orders/eatin/domain/tobe/OrderTableTest.java +++ b/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java @@ -1,4 +1,4 @@ -package kitchenpos.orders.eatin.domain.tobe; +package kitchenpos.orders.store.domain.tobe; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; From 60d3e0fcacb5b6cdc5f37490b818a22ab914bb62 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Fri, 21 Jun 2024 01:59:16 +0900 Subject: [PATCH 12/42] =?UTF-8?q?refactor(Order):=20=EA=B3=B5=ED=86=B5?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=82=AC=EC=9A=A9=EB=90=98=EB=8A=94=20Ord?= =?UTF-8?q?er=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orders/common/domain/tobe/Order.java | 39 +++++++++++++++++++ .../common/domain/tobe/OrderLineItem.java | 29 ++++++++++++++ .../common/domain/tobe/OrderLineItems.java | 36 +++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 src/main/java/kitchenpos/orders/common/domain/tobe/Order.java create mode 100644 src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java create mode 100644 src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java b/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java new file mode 100644 index 000000000..c87b534b3 --- /dev/null +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java @@ -0,0 +1,39 @@ +package kitchenpos.orders.common.domain.tobe; + +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.time.LocalDateTime; +import java.util.UUID; +import kitchenpos.orders.common.domain.OrderStatus; +import kitchenpos.orders.common.domain.OrderType; + +@Table(name = "orders") +@Entity +public class Order { + + @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 OrderStatus status; + + @Column(name = "order_date_time", nullable = false) + private LocalDateTime orderDateTime; + + @Embedded + private OrderLineItems orderLineItems; + + protected Order() { + } +} diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java new file mode 100644 index 000000000..5b99e344b --- /dev/null +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java @@ -0,0 +1,29 @@ +package kitchenpos.orders.common.domain.tobe; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.math.BigDecimal; +import java.util.UUID; + +@Table(name = "order_line_item") +@Entity +public class OrderLineItem { + + @Column(name = "seq") + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Id + private Long seq; + + private UUID menuId; + + private BigDecimal price; + + private long quantity; + + protected OrderLineItem() { + } +} diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java new file mode 100644 index 000000000..7ccda6165 --- /dev/null +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java @@ -0,0 +1,36 @@ +package kitchenpos.orders.common.domain.tobe; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Embeddable; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import java.util.Iterator; +import java.util.List; +import org.jetbrains.annotations.NotNull; + +@Embeddable +public class OrderLineItems implements Iterable { + + @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; + + protected OrderLineItems() { + } + + public OrderLineItems(List orderLineItems) { + this.orderLineItems = orderLineItems; + } + + @NotNull + @Override + public Iterator iterator() { + return orderLineItems.iterator(); + } +} From dc494e0dd8da386dcf2a7fc38f6c503105297134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Fri, 21 Jun 2024 11:07:04 +0900 Subject: [PATCH 13/42] =?UTF-8?q?fix(ProductQuantity):=20MenuQuantity=20->?= =?UTF-8?q?=20ProductQuantity=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 해당 수량은 메뉴에 대한 수량이 아닌, 메뉴상품안에 상품에 대한 수량이다. --- .../menus/domain/tobe/MenuProduct.java | 8 ++--- ...MenuQuantity.java => ProductQuantity.java} | 8 ++--- .../ui/dto/MenuProductCreateRequest.java | 8 ++--- .../common/domain/tobe/MenuQuantity.java | 29 +++++++++++++++++++ .../java/kitchenpos/fixture/MenuFixture.java | 4 +-- .../fixture/MenuProductFixture.java | 8 ++--- .../application/MenuProductsServiceTest.java | 4 +-- .../menus/domain/tobe/MenuProductTest.java | 2 +- 8 files changed, 50 insertions(+), 21 deletions(-) rename src/main/java/kitchenpos/menus/domain/tobe/{MenuQuantity.java => ProductQuantity.java} (83%) create mode 100644 src/main/java/kitchenpos/orders/common/domain/tobe/MenuQuantity.java diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java index a982c45c8..be2f3c0e4 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java @@ -26,20 +26,20 @@ public class MenuProduct { private BigDecimal price; @Embedded - private MenuQuantity quantity; + private ProductQuantity quantity; protected MenuProduct() { } public MenuProduct(Product product, int quantity) { - this(null, product.getId(), product.getPrice(), new MenuQuantity(quantity)); + this(null, product.getId(), product.getPrice(), new ProductQuantity(quantity)); } - public MenuProduct(Product product, MenuQuantity quantity) { + public MenuProduct(Product product, ProductQuantity quantity) { this(null, product.getId(), product.getPrice(), quantity); } - public MenuProduct(Long seq, UUID productId, BigDecimal price, MenuQuantity quantity) { + public MenuProduct(Long seq, UUID productId, BigDecimal price, ProductQuantity quantity) { this.seq = seq; this.productId = productId; this.price = price; diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuQuantity.java b/src/main/java/kitchenpos/menus/domain/tobe/ProductQuantity.java similarity index 83% rename from src/main/java/kitchenpos/menus/domain/tobe/MenuQuantity.java rename to src/main/java/kitchenpos/menus/domain/tobe/ProductQuantity.java index d2d9dd486..50f192e51 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuQuantity.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/ProductQuantity.java @@ -6,15 +6,15 @@ import java.util.Objects; @Embeddable -public class MenuQuantity { +public class ProductQuantity { @Column(name = "quantity", nullable = false) private long quantity; - protected MenuQuantity() { + protected ProductQuantity() { } - public MenuQuantity(long quantity) { + public ProductQuantity(long quantity) { if (quantity < 0) { throw new IllegalArgumentException(); } @@ -34,7 +34,7 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { return false; } - MenuQuantity that = (MenuQuantity) o; + ProductQuantity that = (ProductQuantity) o; return quantity == that.quantity; } diff --git a/src/main/java/kitchenpos/menus/ui/dto/MenuProductCreateRequest.java b/src/main/java/kitchenpos/menus/ui/dto/MenuProductCreateRequest.java index 71f258e24..b13703458 100644 --- a/src/main/java/kitchenpos/menus/ui/dto/MenuProductCreateRequest.java +++ b/src/main/java/kitchenpos/menus/ui/dto/MenuProductCreateRequest.java @@ -2,16 +2,16 @@ import java.util.UUID; import kitchenpos.menus.domain.tobe.MenuProduct; -import kitchenpos.menus.domain.tobe.MenuQuantity; +import kitchenpos.menus.domain.tobe.ProductQuantity; import kitchenpos.products.domain.tobe.Product; public class MenuProductCreateRequest { private UUID productId; - private MenuQuantity quantity; + private ProductQuantity quantity; - public MenuProductCreateRequest(UUID productId, MenuQuantity quantity) { + public MenuProductCreateRequest(UUID productId, ProductQuantity quantity) { this.productId = productId; this.quantity = quantity; } @@ -24,7 +24,7 @@ public UUID getProductId() { return productId; } - public MenuQuantity getQuantity() { + public ProductQuantity getQuantity() { return quantity; } } diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/MenuQuantity.java b/src/main/java/kitchenpos/orders/common/domain/tobe/MenuQuantity.java new file mode 100644 index 000000000..714420e36 --- /dev/null +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/MenuQuantity.java @@ -0,0 +1,29 @@ +package kitchenpos.orders.common.domain.tobe; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import kitchenpos.orders.common.domain.OrderType; + +@Embeddable +public class MenuQuantity { + + @Column(name = "quantity", nullable = false) + private long quantity; + + protected MenuQuantity() { + } + + public MenuQuantity(OrderType type, long quantity) { + if (type != OrderType.EAT_IN) { + validateQuantity(quantity); + } + + this.quantity = quantity; + } + + private static void validateQuantity(long quantity) { + if (quantity < 0) { + throw new IllegalArgumentException(); + } + } +} diff --git a/src/test/java/kitchenpos/fixture/MenuFixture.java b/src/test/java/kitchenpos/fixture/MenuFixture.java index aa3ef2ff3..99220f21a 100644 --- a/src/test/java/kitchenpos/fixture/MenuFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuFixture.java @@ -9,7 +9,7 @@ import kitchenpos.menus.domain.tobe.MenuPrice; import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.menus.domain.tobe.MenuProducts; -import kitchenpos.menus.domain.tobe.MenuQuantity; +import kitchenpos.menus.domain.tobe.ProductQuantity; import kitchenpos.menus.ui.dto.MenuCreateRequest; import kitchenpos.menus.ui.dto.MenuProductCreateRequests; import kitchenpos.products.domain.tobe.Product; @@ -56,7 +56,7 @@ public static Menu createFriedOnePlusOne(MenuGroup menuGroup, Product product, L MenuPrice menuPrice = new MenuPrice(BigDecimal.valueOf(price)); DisplayedMenu displayedMenu = new DisplayedMenu(true); MenuProducts menuProducts = new MenuProducts( - List.of(new MenuProduct(product, new MenuQuantity(2)))); + List.of(new MenuProduct(product, new ProductQuantity(2)))); return new Menu(menuName, menuPrice, menuGroup, displayedMenu, menuProducts); } diff --git a/src/test/java/kitchenpos/fixture/MenuProductFixture.java b/src/test/java/kitchenpos/fixture/MenuProductFixture.java index 8d982ba45..6e19a33fb 100644 --- a/src/test/java/kitchenpos/fixture/MenuProductFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuProductFixture.java @@ -2,7 +2,7 @@ import java.util.List; import kitchenpos.menus.domain.tobe.MenuProduct; -import kitchenpos.menus.domain.tobe.MenuQuantity; +import kitchenpos.menus.domain.tobe.ProductQuantity; import kitchenpos.menus.ui.dto.MenuProductCreateRequest; import kitchenpos.menus.ui.dto.MenuProductCreateRequests; import kitchenpos.products.domain.tobe.Product; @@ -11,14 +11,14 @@ public class MenuProductFixture { public static MenuProductCreateRequests createRequests(Product product, Integer quantity) { return new MenuProductCreateRequests( - List.of(new MenuProductCreateRequest(product.getId(), new MenuQuantity(quantity)))); + List.of(new MenuProductCreateRequest(product.getId(), new ProductQuantity(quantity)))); } public static MenuProduct createFired(long quantity) { - return new MenuProduct(ProductFixture.createFired(), new MenuQuantity(quantity)); + return new MenuProduct(ProductFixture.createFired(), new ProductQuantity(quantity)); } public static MenuProduct createSeasoned(long quantity) { - return new MenuProduct(ProductFixture.createSeasoned(), new MenuQuantity(quantity)); + return new MenuProduct(ProductFixture.createSeasoned(), new ProductQuantity(quantity)); } } diff --git a/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java index 9f996ac35..cae92d052 100644 --- a/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java @@ -9,7 +9,7 @@ import kitchenpos.fixture.MenuProductFixture; import kitchenpos.fixture.ProductFixture; import kitchenpos.menus.domain.tobe.MenuProducts; -import kitchenpos.menus.domain.tobe.MenuQuantity; +import kitchenpos.menus.domain.tobe.ProductQuantity; import kitchenpos.menus.ui.dto.MenuProductCreateRequest; import kitchenpos.menus.ui.dto.MenuProductCreateRequests; import kitchenpos.products.domain.ProductRepository; @@ -59,7 +59,7 @@ void setUp() { @Test void 메뉴상품들_생성시_없는_상품으로_생성하려_할_경우_예외를_던진다() { MenuProductCreateRequests createRequests = new MenuProductCreateRequests( - List.of(new MenuProductCreateRequest(UUID.randomUUID(), new MenuQuantity(1)))); + List.of(new MenuProductCreateRequest(UUID.randomUUID(), new ProductQuantity(1)))); assertThatThrownBy( () -> menuProductsService.create(createRequests)) diff --git a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductTest.java b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductTest.java index f81317b78..02f594a2b 100644 --- a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductTest.java +++ b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductTest.java @@ -15,7 +15,7 @@ class MenuProductTest { @Test void 메뉴상품의_가격과_수량을_곱하여_합을_구할_수_있다() { - MenuProduct actual = new MenuProduct(ProductFixture.createFired(), new MenuQuantity(2)); + MenuProduct actual = new MenuProduct(ProductFixture.createFired(), new ProductQuantity(2)); assertThat(actual.calculateSum()).isEqualTo(BigDecimal.valueOf(40_000L)); } From e6b31cf53993d6243a7286108ef5989c6d2e5e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Fri, 21 Jun 2024 11:22:21 +0900 Subject: [PATCH 14/42] =?UTF-8?q?fix(OrderLineItem):=20=EB=85=B8=EC=B6=9C?= =?UTF-8?q?=EB=90=98=EC=96=B4=EC=9E=88=EC=A7=80=20=EC=95=8A=EC=9D=80=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=EB=A1=9C=20=EC=A3=BC=EB=AC=B8=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=EC=95=84=EC=9D=B4=ED=85=9C=EC=9D=84=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=A0=20=EC=88=98=20=EC=97=86=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/domain/tobe/OrderLineItem.java | 21 ++++++---- .../common/domain/tobe/OrderLineItems.java | 17 ++------ .../common/domain/tobe/OrderLineItemTest.java | 39 +++++++++++++++++++ 3 files changed, 56 insertions(+), 21 deletions(-) create mode 100644 src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemTest.java diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java index 5b99e344b..33c550ad5 100644 --- a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java @@ -1,11 +1,8 @@ package kitchenpos.orders.common.domain.tobe; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; +import jakarta.persistence.*; +import kitchenpos.menus.domain.tobe.Menu; + import java.math.BigDecimal; import java.util.UUID; @@ -22,8 +19,18 @@ public class OrderLineItem { private BigDecimal price; - private long quantity; + @Embedded + private MenuQuantity quantity; protected OrderLineItem() { } + + public OrderLineItem(Menu menu, MenuQuantity quantity) { + if (!menu.isDisplayed()) { + throw new IllegalStateException(); + } + this.menuId = menu.getId(); + this.price = menu.getPrice(); + this.quantity = quantity; + } } diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java index 7ccda6165..c284755bc 100644 --- a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java @@ -1,16 +1,11 @@ package kitchenpos.orders.common.domain.tobe; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Embeddable; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToMany; -import java.util.Iterator; +import jakarta.persistence.*; + import java.util.List; -import org.jetbrains.annotations.NotNull; @Embeddable -public class OrderLineItems implements Iterable { +public class OrderLineItems { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( @@ -27,10 +22,4 @@ protected OrderLineItems() { public OrderLineItems(List orderLineItems) { this.orderLineItems = orderLineItems; } - - @NotNull - @Override - public Iterator iterator() { - return orderLineItems.iterator(); - } } diff --git a/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemTest.java b/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemTest.java new file mode 100644 index 000000000..bcd65f5e6 --- /dev/null +++ b/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemTest.java @@ -0,0 +1,39 @@ +package kitchenpos.orders.common.domain.tobe; + +import kitchenpos.fixture.MenuFixture; +import kitchenpos.fixture.MenuGroupFixture; +import kitchenpos.fixture.ProductFixture; +import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.domain.OrderType; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +@DisplayName("OrderLineItem") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +class OrderLineItemTest { + + @Test + void 노출되어있지않은_메뉴로_주문라인아이템을_생성하면_예외를_던진다() { + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), ProductFixture.createFired()); + menu.hide(); + + assertThatThrownBy(() -> createOrderLineItem(menu)) + .isInstanceOf(IllegalStateException.class); + } + + @Test + void 주문라인아이템을_생성한다() { + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), ProductFixture.createFired()); + + assertThatNoException().isThrownBy(() -> createOrderLineItem(menu)); + } + + private static void createOrderLineItem(Menu menu) { + new OrderLineItem(menu, new MenuQuantity(OrderType.TAKEOUT, 2)); + } +} \ No newline at end of file From 92c866d83e6a0652d3f8352da7efbc6800d3b712 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Fri, 21 Jun 2024 13:15:30 +0900 Subject: [PATCH 15/42] =?UTF-8?q?test(MenuQuantity):=20=EB=A7=A4=EC=9E=A5?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=EC=9D=B4=20=EC=95=84=EB=8B=8C=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=EC=9D=98=20=EB=A9=94=EB=89=B4=EC=88=98=EB=9F=89?= =?UTF-8?q?=EC=9D=80=20=EC=9D=8C=EC=88=98=EA=B0=80=20=EB=90=A0=20=EC=88=98?= =?UTF-8?q?=20=EC=97=86=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/domain/tobe/MenuQuantityTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/test/java/kitchenpos/orders/common/domain/tobe/MenuQuantityTest.java diff --git a/src/test/java/kitchenpos/orders/common/domain/tobe/MenuQuantityTest.java b/src/test/java/kitchenpos/orders/common/domain/tobe/MenuQuantityTest.java new file mode 100644 index 000000000..546fb36f8 --- /dev/null +++ b/src/test/java/kitchenpos/orders/common/domain/tobe/MenuQuantityTest.java @@ -0,0 +1,22 @@ +package kitchenpos.orders.common.domain.tobe; + +import kitchenpos.orders.common.domain.OrderType; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +@DisplayName("MenuQuantity") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +class MenuQuantityTest { + + @ParameterizedTest + @CsvSource(value = {"DELIVERY", "TAKEOUT"}) + void 매장주문이_아닌_주문의_메뉴수량은_음수가_될_수_없다(OrderType orderType) { + assertThatThrownBy(() -> new MenuQuantity(orderType, -2)) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file From 72878da93a020893fdc84bff05b1ed08266ea654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Fri, 21 Jun 2024 15:37:40 +0900 Subject: [PATCH 16/42] =?UTF-8?q?feat(StoreOrder):=20=EB=A7=A4=EC=9E=A5?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=EC=9A=A9=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20-=20=EC=A3=BC=EB=AC=B8=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A5=BC=20=EC=83=81=EC=86=8D=EB=B0=9B=EC=9C=BC?= =?UTF-8?q?=EB=A9=B0=20=EB=A7=A4=EC=9E=A5=EC=A3=BC=EB=AC=B8=EC=9A=A9=20?= =?UTF-8?q?=EB=B9=84=EC=A7=80=EB=8B=88=EC=8A=A4=EB=A1=9C=EC=A7=81=EC=9D=84?= =?UTF-8?q?=20=EA=B0=96=EB=8A=94=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orders/common/domain/tobe/Order.java | 47 ++++++-- .../orders/store/domain/tobe/StoreOrder.java | 41 +++++++ .../store/domain/tobe/StoreOrderTest.java | 113 ++++++++++++++++++ 3 files changed, 191 insertions(+), 10 deletions(-) create mode 100644 src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java create mode 100644 src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java b/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java index c87b534b3..a7247c19d 100644 --- a/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java @@ -1,20 +1,18 @@ package kitchenpos.orders.common.domain.tobe; -import jakarta.persistence.Column; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import java.time.LocalDateTime; -import java.util.UUID; +import jakarta.persistence.*; import kitchenpos.orders.common.domain.OrderStatus; import kitchenpos.orders.common.domain.OrderType; +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + @Table(name = "orders") @Entity -public class Order { +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@DiscriminatorColumn +public abstract class Order { @Column(name = "id", columnDefinition = "binary(16)") @Id @@ -36,4 +34,33 @@ public class Order { protected Order() { } + + public Order(OrderType type, List orderLineItems) { + this.id = UUID.randomUUID(); + this.type = type; + this.status = OrderStatus.WAITING; + this.orderDateTime = LocalDateTime.now(); + this.orderLineItems = new OrderLineItems(orderLineItems); + } + + public void accept() { + if (status != OrderStatus.WAITING) { + throw new IllegalStateException(); + } + status = OrderStatus.ACCEPTED; + } + + public void serve() { + if (status != OrderStatus.ACCEPTED) { + throw new IllegalStateException(); + } + status = OrderStatus.SERVED; + } + + public void complete() { + if (status != OrderStatus.SERVED) { + throw new IllegalStateException(); + } + status = OrderStatus.COMPLETED; + } } diff --git a/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java b/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java new file mode 100644 index 000000000..3400e2835 --- /dev/null +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java @@ -0,0 +1,41 @@ +package kitchenpos.orders.store.domain.tobe; + +import jakarta.persistence.Entity; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import kitchenpos.orders.common.domain.OrderType; +import kitchenpos.orders.common.domain.tobe.Order; +import kitchenpos.orders.common.domain.tobe.OrderLineItem; + +import java.util.List; + +@Entity +public class StoreOrder extends Order { + + @ManyToOne + @JoinColumn( + name = "order_table_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_orders_to_order_table") + ) + private OrderTable orderTable; + + protected StoreOrder() { + } + + public StoreOrder(List orderLineItems, OrderTable orderTable) { + super(OrderType.EAT_IN, orderLineItems); + + if (!orderTable.isOccupied()) { + throw new IllegalStateException(); + } + this.orderTable = orderTable; + } + + @Override + public void complete() { + super.complete(); + orderTable.clear(); + } +} diff --git a/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java b/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java new file mode 100644 index 000000000..546799aaa --- /dev/null +++ b/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java @@ -0,0 +1,113 @@ +package kitchenpos.orders.store.domain.tobe; + +import kitchenpos.fixture.MenuFixture; +import kitchenpos.fixture.MenuGroupFixture; +import kitchenpos.fixture.ProductFixture; +import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.domain.OrderType; +import kitchenpos.orders.common.domain.tobe.MenuQuantity; +import kitchenpos.orders.common.domain.tobe.OrderLineItem; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +@DisplayName("StoreOrder") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +class StoreOrderTest { + + @Test + void 매장주문을_생성_시_테이블이_점유되어있지않으면_예외를_던진다() { + assertThatThrownBy(() -> new StoreOrder(createOrderLineItems(), createOrderTable())) + .isInstanceOf(IllegalStateException.class); + } + + @Test + void 매장주문을_생성한다() { + OrderTable orderTable = createOrderTable(); + orderTable.sit(); + + assertThatNoException().isThrownBy(() -> new StoreOrder(createOrderLineItems(), orderTable)); + } + + @Test + void 매장주문을_접수한다() { + StoreOrder storeOrder = createStoreOrder(); + + assertThatNoException().isThrownBy(storeOrder::accept); + } + + @Test + void 매장주문을_접수시_대기상태가_아니면_예외를_던진다() { + StoreOrder storeOrder = createStoreOrder(); + storeOrder.accept(); + + assertThatThrownBy(storeOrder::accept) + .isInstanceOf(IllegalStateException.class); + } + + @Test + void 매장주문을_전달한다() { + StoreOrder storeOrder = createStoreOrder(); + storeOrder.accept(); + + assertThatNoException().isThrownBy(storeOrder::serve); + } + + @Test + void 매장주문을_전달시_접수상태가_아니면_예외를_던진다() { + StoreOrder storeOrder = createStoreOrder(); + + assertThatThrownBy(storeOrder::serve) + .isInstanceOf(IllegalStateException.class); + } + + @Test + void 매장주문을_완료한다() { + StoreOrder storeOrder = createStoreOrder(); + storeOrder.accept(); + storeOrder.serve(); + + assertThatNoException().isThrownBy(storeOrder::complete); + } + + @Test + void 매장주문을_완료하면_테이블은_청소된다() { + OrderTable targetTable = createOrderTable(); + targetTable.sit(); + StoreOrder storeOrder = new StoreOrder(createOrderLineItems(), targetTable); + storeOrder.accept(); + storeOrder.serve(); + + storeOrder.complete(); + + assertThat(targetTable.isOccupied()).isFalse(); + } + + @Test + void 매장주문을_완료시_전달상태가_아니면_예외를_던진다() { + StoreOrder storeOrder = createStoreOrder(); + + assertThatThrownBy(storeOrder::serve) + .isInstanceOf(IllegalStateException.class); + } + + private List createOrderLineItems() { + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), ProductFixture.createFired()); + return List.of(new OrderLineItem(menu, new MenuQuantity(OrderType.EAT_IN, 2))); + } + + private OrderTable createOrderTable() { + return new OrderTable("1번테이블"); + } + + private StoreOrder createStoreOrder() { + OrderTable orderTable = createOrderTable(); + orderTable.sit(); + return new StoreOrder(createOrderLineItems(), orderTable); + } +} \ No newline at end of file From 1c9cbc7db46a14b643599fb048fd070b0e7fb46a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Sat, 22 Jun 2024 00:07:24 +0900 Subject: [PATCH 17/42] =?UTF-8?q?feat(StoreOrder):=20=EB=A7=A4=EC=9E=A5?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=EC=9A=A9=20=EB=A0=88=ED=8C=8C=EC=A7=80?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/domain/OrderTableRepository.java | 2 ++ .../store/domain/StoreOrderRepository.java | 21 +++++++++++++++++++ .../store/infra/JpaOrderTableRepository.java | 2 +- .../store/infra/JpaStoreOrderRepository.java | 10 +++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/main/java/kitchenpos/orders/store/domain/StoreOrderRepository.java create mode 100644 src/main/java/kitchenpos/orders/store/infra/JpaStoreOrderRepository.java diff --git a/src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java b/src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java index ba1c09582..f7342d11f 100644 --- a/src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java +++ b/src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java @@ -1,5 +1,7 @@ package kitchenpos.orders.store.domain; +import kitchenpos.orders.store.domain.tobe.OrderTable; + import java.util.List; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/kitchenpos/orders/store/domain/StoreOrderRepository.java b/src/main/java/kitchenpos/orders/store/domain/StoreOrderRepository.java new file mode 100644 index 000000000..ba4504368 --- /dev/null +++ b/src/main/java/kitchenpos/orders/store/domain/StoreOrderRepository.java @@ -0,0 +1,21 @@ +package kitchenpos.orders.store.domain; + +import kitchenpos.orders.common.domain.OrderStatus; +import kitchenpos.orders.store.domain.tobe.StoreOrder; +import kitchenpos.orders.store.domain.tobe.OrderTable; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface StoreOrderRepository { + + StoreOrder save(StoreOrder order); + + Optional findById(UUID id); + + List findAll(); + + boolean existsByOrderTableAndStatusNot(OrderTable orderTable, OrderStatus status); +} + diff --git a/src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java b/src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java index 33f647a70..9e0d9294c 100644 --- a/src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java @@ -1,7 +1,7 @@ package kitchenpos.orders.store.infra; import java.util.UUID; -import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.tobe.OrderTable; import kitchenpos.orders.store.domain.OrderTableRepository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/kitchenpos/orders/store/infra/JpaStoreOrderRepository.java b/src/main/java/kitchenpos/orders/store/infra/JpaStoreOrderRepository.java new file mode 100644 index 000000000..9a1f5917d --- /dev/null +++ b/src/main/java/kitchenpos/orders/store/infra/JpaStoreOrderRepository.java @@ -0,0 +1,10 @@ +package kitchenpos.orders.store.infra; + +import kitchenpos.orders.store.domain.StoreOrderRepository; +import kitchenpos.orders.store.domain.tobe.StoreOrder; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface JpaStoreOrderRepository extends StoreOrderRepository, JpaRepository { +} From 4825a7f5ac92f9dc18a3a010b7ad43849c95c4b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Sat, 22 Jun 2024 00:09:55 +0900 Subject: [PATCH 18/42] =?UTF-8?q?feat(OrderTable):=20=EC=A3=BC=EB=AC=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=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 --- .../store/application/OrderTableService.java | 51 +++++++----------- .../store/domain/tobe/NumberOfGuests.java | 1 - .../orders/store/domain/tobe/OrderTable.java | 13 ++++- .../store/ui/OrderTableRestController.java | 8 +-- .../application/OrderTableServiceTest.java | 52 ++++++------------- 5 files changed, 52 insertions(+), 73 deletions(-) diff --git a/src/main/java/kitchenpos/orders/store/application/OrderTableService.java b/src/main/java/kitchenpos/orders/store/application/OrderTableService.java index 020b62e05..7a62c15e3 100644 --- a/src/main/java/kitchenpos/orders/store/application/OrderTableService.java +++ b/src/main/java/kitchenpos/orders/store/application/OrderTableService.java @@ -1,47 +1,40 @@ package kitchenpos.orders.store.application; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.UUID; -import kitchenpos.orders.common.domain.OrderRepository; import kitchenpos.orders.common.domain.OrderStatus; -import kitchenpos.orders.store.domain.OrderTable; import kitchenpos.orders.store.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.StoreOrderRepository; +import kitchenpos.orders.store.domain.tobe.NumberOfGuests; +import kitchenpos.orders.store.domain.tobe.OrderTable; +import kitchenpos.orders.store.domain.tobe.OrderTableName; 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 StoreOrderRepository storeOrderRepository; public OrderTableService(final OrderTableRepository orderTableRepository, - final OrderRepository orderRepository) { + final StoreOrderRepository storeOrderRepository) { this.orderTableRepository = orderTableRepository; - this.orderRepository = orderRepository; + this.storeOrderRepository = storeOrderRepository; } @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); - return orderTableRepository.save(orderTable); + public OrderTable create(final OrderTableName request) { + return orderTableRepository.save(new OrderTable(request)); } @Transactional public OrderTable sit(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) .orElseThrow(NoSuchElementException::new); - orderTable.setOccupied(true); + orderTable.sit(); return orderTable; } @@ -49,26 +42,18 @@ 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)) { + if (storeOrderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { throw new IllegalStateException(); } - orderTable.setNumberOfGuests(0); - orderTable.setOccupied(false); + orderTable.clear(); return orderTable; } @Transactional - public OrderTable changeNumberOfGuests(final UUID orderTableId, final OrderTable request) { - final int numberOfGuests = request.getNumberOfGuests(); - if (numberOfGuests < 0) { - throw new IllegalArgumentException(); - } + public OrderTable changeNumberOfGuests(final UUID orderTableId, final NumberOfGuests request) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) .orElseThrow(NoSuchElementException::new); - if (!orderTable.isOccupied()) { - throw new IllegalStateException(); - } - orderTable.setNumberOfGuests(numberOfGuests); + orderTable.changeNumberOfGuests(request); return orderTable; } diff --git a/src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java b/src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java index aa69df970..6ecb3e9b2 100644 --- a/src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java @@ -12,7 +12,6 @@ public class NumberOfGuests { private int numberOfGuests; protected NumberOfGuests(){ - } public NumberOfGuests(int numberOfGuests) { diff --git a/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java index fe20d4b7c..fd107abc0 100644 --- a/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java @@ -25,8 +25,12 @@ protected OrderTable() { } public OrderTable(String name) { + this(new OrderTableName(name)); + } + + public OrderTable(OrderTableName name){ this.id = UUID.randomUUID(); - this.name = new OrderTableName(name); + this.name = name; this.numberOfGuests = new NumberOfGuests(0); this.occupied = false; } @@ -41,6 +45,9 @@ public void clear() { } public void changeNumberOfGuests(NumberOfGuests numberOfGuests) { + if (isOccupied()) { + throw new IllegalStateException(); + } this.numberOfGuests = numberOfGuests; } @@ -51,4 +58,8 @@ public boolean isOccupied() { public boolean hasGuest() { return numberOfGuests.getNumberOfGuests() > 0; } + + public UUID getId() { + return id; + } } diff --git a/src/main/java/kitchenpos/orders/store/ui/OrderTableRestController.java b/src/main/java/kitchenpos/orders/store/ui/OrderTableRestController.java index 0310d956c..7ad623a68 100644 --- a/src/main/java/kitchenpos/orders/store/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/orders/store/ui/OrderTableRestController.java @@ -4,7 +4,9 @@ import java.util.List; import java.util.UUID; import kitchenpos.orders.store.application.OrderTableService; -import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.tobe.NumberOfGuests; +import kitchenpos.orders.store.domain.tobe.OrderTable; +import kitchenpos.orders.store.domain.tobe.OrderTableName; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -25,7 +27,7 @@ public OrderTableRestController(final OrderTableService orderTableService) { } @PostMapping - public ResponseEntity create(@RequestBody final OrderTable request) { + public ResponseEntity create(@RequestBody final OrderTableName request) { final OrderTable response = orderTableService.create(request); return ResponseEntity.created(URI.create("/api/order-tables/" + response.getId())) .body(response); @@ -44,7 +46,7 @@ public ResponseEntity clear(@PathVariable final UUID orderTableId) { @PutMapping("/{orderTableId}/number-of-guests") public ResponseEntity changeNumberOfGuests( @PathVariable final UUID orderTableId, - @RequestBody final OrderTable request + @RequestBody final NumberOfGuests request ) { return ResponseEntity.ok(orderTableService.changeNumberOfGuests(orderTableId, request)); } diff --git a/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java index 53670d29a..3b45b1df9 100644 --- a/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java @@ -1,9 +1,6 @@ package kitchenpos.orders.store.application; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -import static org.assertj.core.api.Assertions.assertThatIllegalStateException; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertAll; import java.util.List; @@ -24,8 +21,10 @@ import kitchenpos.orders.common.domain.Order; import kitchenpos.orders.common.domain.OrderRepository; import kitchenpos.orders.common.domain.OrderStatus; -import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.tobe.NumberOfGuests; +import kitchenpos.orders.store.domain.tobe.OrderTable; import kitchenpos.orders.store.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.tobe.OrderTableName; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.tobe.Product; import org.junit.jupiter.api.BeforeEach; @@ -57,27 +56,18 @@ void setUp() { @Test void 테이블을_생성한다() { - OrderTable request = OrderTableFixture.createRequest("1번테이블"); - - OrderTable actual = orderTableService.create(request); - - assertAll(() -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getNumberOfGuests()).isZero(), - () -> assertThat(actual.isOccupied()).isFalse()); + assertThatNoException().isThrownBy(() -> orderTableService.create(new OrderTableName("1번테이블"))); } @Test void 테이블이름이_비어있으면_예외를던진다() { - OrderTable createRequest = OrderTableFixture.createRequest(""); - assertThatIllegalArgumentException().isThrownBy( - () -> orderTableService.create(createRequest)); + () -> orderTableService.create(new OrderTableName(""))); } @Test void 먹고가는_손님이_오면_테이블점유를_체크한다() { - OrderTable createRequest = OrderTableFixture.createRequest("1번테이블"); - OrderTable saved = orderTableService.create(createRequest); + OrderTable saved = orderTableService.create(new OrderTableName("1번테이블")); OrderTable actual = orderTableService.sit(saved.getId()); @@ -86,8 +76,7 @@ void setUp() { @Test void 주문이_완료된_테이블을_치울_수_있다() { - OrderTable createRequset = OrderTableFixture.createRequest("1번테이블"); - OrderTable saved = orderTableService.create(createRequset); + OrderTable saved = orderTableService.create(new OrderTableName("1번테이블")); orderTableService.sit(saved.getId()); createCompleteOrder(saved); @@ -99,8 +88,7 @@ void setUp() { @Test void 주문이_완료되지_않은_테이블을_치우면_예외를던진다() { - OrderTable createRequest = OrderTableFixture.createRequest("1번테이블"); - OrderTable saved = orderTableService.create(createRequest); + OrderTable saved = orderTableService.create(new OrderTableName("1번테이블")); orderTableService.sit(saved.getId()); createOrder(saved); @@ -123,41 +111,35 @@ private Order createOrder(OrderTable orderTable) { @Test void 점유되어있는_테이블의_손님수를_변경할_수_있다() { - OrderTable createRequest = OrderTableFixture.createRequest("1번테이블"); - OrderTable saved = orderTableService.create(createRequest); + OrderTable saved = orderTableService.create(new OrderTableName("1번테이블")); orderTableService.sit(saved.getId()); - OrderTable changeRequest = OrderTableFixture.changeNumberOfGuestsRequest(4); - OrderTable actual = orderTableService.changeNumberOfGuests(saved.getId(), changeRequest); + OrderTable actual = orderTableService.changeNumberOfGuests(saved.getId(), new NumberOfGuests(4)); assertThat(actual.getNumberOfGuests()).isEqualTo(4); } @Test void 점유되어있지_않은_테이블의_손님수를_변경하면_예외를던진다() { - OrderTable createRequest = OrderTableFixture.createRequest("1번테이블"); - OrderTable saved = orderTableService.create(createRequest); - OrderTable changeRequest = OrderTableFixture.changeNumberOfGuestsRequest(4); + OrderTable saved = orderTableService.create(new OrderTableName("1번테이블")); assertThatIllegalStateException().isThrownBy( - () -> orderTableService.changeNumberOfGuests(saved.getId(), changeRequest)); + () -> orderTableService.changeNumberOfGuests(saved.getId(), new NumberOfGuests(4))); } @Test void 테이블의_손님수를_마이너스로_변경하면_예외를던진다() { - OrderTable createRequest = OrderTableFixture.createRequest("1번테이블"); - OrderTable saved = orderTableService.create(createRequest); + OrderTable saved = orderTableService.create(new OrderTableName("1번테이블")); orderTableService.sit(saved.getId()); - OrderTable changeRequest = OrderTableFixture.changeNumberOfGuestsRequest(-10); assertThatIllegalArgumentException().isThrownBy( - () -> orderTableService.changeNumberOfGuests(saved.getId(), changeRequest)); + () -> orderTableService.changeNumberOfGuests(saved.getId(), new NumberOfGuests(-10))); } @Test void 모든_테이블_목록을_볼_수_있다() { - orderTableService.create(OrderTableFixture.createRequest("1번테이블")); - orderTableService.create(OrderTableFixture.createRequest("2번테이블")); + orderTableService.create(new OrderTableName("1번테이블")); + orderTableService.create(new OrderTableName("2번테이블")); List actual = orderTableService.findAll(); From 6d5dce0731497490de543f1f70ddce6a598ac16a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Sat, 22 Jun 2024 00:11:27 +0900 Subject: [PATCH 19/42] =?UTF-8?q?feat(StoreOrder):=20=EB=A7=A4=EC=9E=A5?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=20=EC=A0=84=EC=9A=A9=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 매장주문을 생성한다 --- .../application/dto/OrderLineItemRequest.java | 28 +++++++++++++ .../dto/OrderLineItemRequests.java | 41 +++++++++++++++++++ .../store/application/StoreOrderService.java | 36 ++++++++++++++++ .../dto/StoreOrderCreateRequest.java | 39 ++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java create mode 100644 src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java create mode 100644 src/main/java/kitchenpos/orders/store/application/StoreOrderService.java create mode 100644 src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java diff --git a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java new file mode 100644 index 000000000..632e4c332 --- /dev/null +++ b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java @@ -0,0 +1,28 @@ +package kitchenpos.orders.common.application.dto; + +import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.domain.OrderType; +import kitchenpos.orders.common.domain.tobe.MenuQuantity; +import kitchenpos.orders.common.domain.tobe.OrderLineItem; + +import java.util.UUID; + +public class OrderLineItemRequest { + + private UUID menuId; + + private long quantity; + + public OrderLineItemRequest(UUID menuId, long quantity) { + this.menuId = menuId; + this.quantity = quantity; + } + + public OrderLineItem toStore(Menu menu, OrderType orderType) { + return new OrderLineItem(menu, new MenuQuantity(orderType, quantity)); + } + + public UUID getMenuId() { + return menuId; + } +} diff --git a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java new file mode 100644 index 000000000..21f8aa2dc --- /dev/null +++ b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java @@ -0,0 +1,41 @@ +package kitchenpos.orders.common.application.dto; + +import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.domain.OrderType; +import kitchenpos.orders.common.domain.tobe.OrderLineItem; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.UUID; + +public class OrderLineItemRequests { + + private final List orderLineItems; + + public OrderLineItemRequests(List orderLineItems) { + if (Objects.isNull(orderLineItems) || orderLineItems.isEmpty()) { + throw new IllegalArgumentException(); + } + + this.orderLineItems = orderLineItems; + } + + public void validate(List menus) { + if (menus.size() != orderLineItems.size()) { + throw new IllegalArgumentException(); + } + } + + public List getMenuIds() { + return orderLineItems.stream().map(OrderLineItemRequest::getMenuId).toList(); + } + + public List toOrderLineItems(List menus, OrderType orderType) { + return orderLineItems.stream().map(orderLineItem -> orderLineItem.toStore(findMenu(menus, orderLineItem), orderType)).toList(); + } + + private Menu findMenu(List menus, OrderLineItemRequest orderLineItem) { + return menus.stream().filter(menu -> menu.getId().equals(orderLineItem.getMenuId())).findFirst().orElseThrow((NoSuchElementException::new)); + } +} diff --git a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java new file mode 100644 index 000000000..dbcd48d2f --- /dev/null +++ b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java @@ -0,0 +1,36 @@ +package kitchenpos.orders.store.application; + +import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.store.application.dto.StoreOrderCreateRequest; +import kitchenpos.orders.store.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.StoreOrderRepository; +import kitchenpos.orders.store.domain.tobe.OrderTable; +import kitchenpos.orders.store.domain.tobe.StoreOrder; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.NoSuchElementException; + +@Service +public class StoreOrderService { + + private final StoreOrderRepository storeOrderRepository; + private final MenuRepository menuRepository; + private final OrderTableRepository orderTableRepository; + + public StoreOrderService(StoreOrderRepository storeOrderRepository, MenuRepository menuRepository, OrderTableRepository orderTableRepository) { + this.storeOrderRepository = storeOrderRepository; + this.menuRepository = menuRepository; + this.orderTableRepository = orderTableRepository; + } + + public StoreOrder create(final StoreOrderCreateRequest request) { + final List menus = menuRepository.findAllByIdIn(request.getMenuIds()); + request.validate(menus); + + OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) + .orElseThrow(NoSuchElementException::new); + return storeOrderRepository.save(new StoreOrder(request.toOrderLineItems(menus), orderTable)); + } +} diff --git a/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java b/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java new file mode 100644 index 000000000..d0d1c8045 --- /dev/null +++ b/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java @@ -0,0 +1,39 @@ +package kitchenpos.orders.store.application.dto; + +import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.application.dto.OrderLineItemRequests; +import kitchenpos.orders.common.domain.OrderType; +import kitchenpos.orders.common.domain.tobe.OrderLineItem; + +import java.util.List; +import java.util.UUID; + +public class StoreOrderCreateRequest { + + private final OrderLineItemRequests orderLineItemRequests; + private final UUID orderTableId; + + public StoreOrderCreateRequest(OrderLineItemRequests orderLineItemRequests, UUID orderTableId) { + this.orderLineItemRequests = orderLineItemRequests; + this.orderTableId = orderTableId; + } + + public List getMenuIds() { + return orderLineItemRequests.getMenuIds(); + } + + public void validate(List menus) { + orderLineItemRequests.validate(menus); + if (orderTableId == null) { + throw new IllegalArgumentException(); + } + } + + public UUID getOrderTableId() { + return orderTableId; + } + + public List toOrderLineItems(List menus) { + return orderLineItemRequests.toOrderLineItems(menus, OrderType.EAT_IN); + } +} From 80a6f64dc16cd7cabad7e2f336a81a7eda3a9f56 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sat, 22 Jun 2024 01:41:32 +0900 Subject: [PATCH 20/42] =?UTF-8?q?fix(OrderTable):=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=EC=9D=B4=20=EC=A0=90=EC=9C=A0=EB=90=98=EC=96=B4?= =?UTF-8?q?=EC=9E=88=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=86=90=EB=8B=98=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=95=98=EB=A9=B4=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EB=A5=BC=20=EB=8D=98=EC=A7=84=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orders/store/domain/tobe/OrderTable.java | 6 ++- .../kitchenpos/fixture/OrderTableFixture.java | 20 +-------- .../application/OrderTableServiceTest.java | 45 +++++++++++-------- 3 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java index fd107abc0..d23b9c6c8 100644 --- a/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java @@ -45,7 +45,7 @@ public void clear() { } public void changeNumberOfGuests(NumberOfGuests numberOfGuests) { - if (isOccupied()) { + if (!isOccupied()) { throw new IllegalStateException(); } this.numberOfGuests = numberOfGuests; @@ -62,4 +62,8 @@ public boolean hasGuest() { public UUID getId() { return id; } + + public int getNumberOfGuests() { + return numberOfGuests.getNumberOfGuests(); + } } diff --git a/src/test/java/kitchenpos/fixture/OrderTableFixture.java b/src/test/java/kitchenpos/fixture/OrderTableFixture.java index 0f31b2387..fc3238b86 100644 --- a/src/test/java/kitchenpos/fixture/OrderTableFixture.java +++ b/src/test/java/kitchenpos/fixture/OrderTableFixture.java @@ -1,26 +1,10 @@ package kitchenpos.fixture; -import java.util.UUID; -import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.tobe.OrderTable; public class OrderTableFixture { - public static OrderTable createRequest(final String name) { - OrderTable orderTable = new OrderTable(); - orderTable.setName(name); - return orderTable; - } - - public static OrderTable changeNumberOfGuestsRequest(final int numberOfGuests) { - OrderTable orderTable = new OrderTable(); - orderTable.setNumberOfGuests(numberOfGuests); - return orderTable; - } - public static OrderTable createNumber1() { - OrderTable orderTable = new OrderTable(); - orderTable.setId(UUID.randomUUID()); - orderTable.setName("1번 테이블"); - return orderTable; + return new OrderTable("1번 테이블"); } } diff --git a/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java index 3b45b1df9..3bf16ce22 100644 --- a/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java @@ -1,30 +1,32 @@ package kitchenpos.orders.store.application; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; import java.util.List; import kitchenpos.fake.InMemoryMenuGroupRepository; import kitchenpos.fake.InMemoryMenuRepository; -import kitchenpos.fake.InMemoryOrderRepository; import kitchenpos.fake.InMemoryOrderTableRepository; import kitchenpos.fake.InMemoryProductRepository; +import kitchenpos.fake.InMemoryStoreOrderRepository; import kitchenpos.fixture.MenuFixture; import kitchenpos.fixture.MenuGroupFixture; -import kitchenpos.fixture.OrderFixture; -import kitchenpos.fixture.OrderTableFixture; import kitchenpos.fixture.ProductFixture; +import kitchenpos.fixture.StoreOrderFixture; import kitchenpos.menugroups.domain.MenuGroupRepository; +import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; -import kitchenpos.menugroups.domain.tobe.MenuGroup; -import kitchenpos.orders.common.domain.Order; -import kitchenpos.orders.common.domain.OrderRepository; -import kitchenpos.orders.common.domain.OrderStatus; +import kitchenpos.orders.store.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.StoreOrderRepository; import kitchenpos.orders.store.domain.tobe.NumberOfGuests; import kitchenpos.orders.store.domain.tobe.OrderTable; -import kitchenpos.orders.store.domain.OrderTableRepository; import kitchenpos.orders.store.domain.tobe.OrderTableName; +import kitchenpos.orders.store.domain.tobe.StoreOrder; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.tobe.Product; import org.junit.jupiter.api.BeforeEach; @@ -37,7 +39,7 @@ @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class OrderTableServiceTest { - private OrderRepository orderRepository = new InMemoryOrderRepository(); + private StoreOrderRepository storeOrderRepository = new InMemoryStoreOrderRepository(); private MenuRepository menuRepository = new InMemoryMenuRepository(); @@ -51,12 +53,13 @@ class OrderTableServiceTest { @BeforeEach void setUp() { - orderTableService = new OrderTableService(orderTableRepository, orderRepository); + orderTableService = new OrderTableService(orderTableRepository, storeOrderRepository); } @Test void 테이블을_생성한다() { - assertThatNoException().isThrownBy(() -> orderTableService.create(new OrderTableName("1번테이블"))); + assertThatNoException().isThrownBy( + () -> orderTableService.create(new OrderTableName("1번테이블"))); } @Test @@ -90,23 +93,25 @@ void setUp() { void 주문이_완료되지_않은_테이블을_치우면_예외를던진다() { OrderTable saved = orderTableService.create(new OrderTableName("1번테이블")); orderTableService.sit(saved.getId()); - createOrder(saved); + createStoreOrder(saved); assertThatThrownBy(() -> orderTableService.clear(saved.getId())) .isInstanceOf(IllegalStateException.class); } private void createCompleteOrder(OrderTable orderTable) { - Order order = createOrder(orderTable); - order.setStatus(OrderStatus.COMPLETED); + StoreOrder storeOrder = createStoreOrder(orderTable); + storeOrder.accept(); + storeOrder.serve(); + storeOrder.complete(); } - private Order createOrder(OrderTable orderTable) { + private StoreOrder createStoreOrder(OrderTable orderTable) { MenuGroup chickenMenuGroup = menuGroupRepository.save(MenuGroupFixture.createChicken()); Product friedProduct = productRepository.save(ProductFixture.createFired()); Menu friedMenu = menuRepository.save( MenuFixture.createFriedOnePlusOne(chickenMenuGroup, friedProduct)); - return orderRepository.save(OrderFixture.createEatIn(orderTable, friedMenu)); + return storeOrderRepository.save(StoreOrderFixture.createStoreOrder(friedMenu, orderTable)); } @Test @@ -114,7 +119,8 @@ private Order createOrder(OrderTable orderTable) { OrderTable saved = orderTableService.create(new OrderTableName("1번테이블")); orderTableService.sit(saved.getId()); - OrderTable actual = orderTableService.changeNumberOfGuests(saved.getId(), new NumberOfGuests(4)); + OrderTable actual = orderTableService.changeNumberOfGuests(saved.getId(), + new NumberOfGuests(4)); assertThat(actual.getNumberOfGuests()).isEqualTo(4); } @@ -133,7 +139,8 @@ private Order createOrder(OrderTable orderTable) { orderTableService.sit(saved.getId()); assertThatIllegalArgumentException().isThrownBy( - () -> orderTableService.changeNumberOfGuests(saved.getId(), new NumberOfGuests(-10))); + () -> orderTableService.changeNumberOfGuests(saved.getId(), + new NumberOfGuests(-10))); } @Test From a9e04382e47f1b19bb07e76685ba7be6bea32f9e Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sat, 22 Jun 2024 01:42:58 +0900 Subject: [PATCH 21/42] =?UTF-8?q?refactor(OrderTable):=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20tobe=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=ED=8F=AC=EB=A7=B7=EB=A7=9E?= =?UTF-8?q?=EC=B6=94=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/ui/dto/MenuCreateRequest.java | 2 +- .../common/application/OrderService.java | 5 +- .../application/dto/OrderLineItemRequest.java | 3 +- .../dto/OrderLineItemRequests.java | 14 +++-- .../orders/common/domain/Order.java | 2 +- .../orders/common/domain/OrderRepository.java | 2 +- .../orders/common/domain/tobe/Order.java | 24 ++++++-- .../common/domain/tobe/OrderLineItem.java | 11 +++- .../common/domain/tobe/OrderLineItems.java | 7 ++- .../store/application/OrderTableService.java | 12 ++-- .../store/application/StoreOrderService.java | 11 ++-- .../dto/StoreOrderCreateRequest.java | 5 +- .../store/domain/OrderTableRepository.java | 3 +- .../store/domain/StoreOrderRepository.java | 7 +-- .../store/domain/tobe/NumberOfGuests.java | 13 +++-- .../orders/store/domain/tobe/OrderTable.java | 11 ++-- .../store/domain/tobe/OrderTableName.java | 9 ++- .../orders/store/domain/tobe/StoreOrder.java | 7 ++- .../store/infra/JpaOrderTableRepository.java | 2 +- .../store/infra/JpaStoreOrderRepository.java | 5 +- .../fake/InMemoryOrderRepository.java | 2 +- .../fake/InMemoryOrderTableRepository.java | 2 +- .../fake/InMemoryStoreOrderRepository.java | 47 +++++++++++++++ .../fixture/MenuProductFixture.java | 3 +- .../java/kitchenpos/fixture/OrderFixture.java | 14 +---- .../kitchenpos/fixture/StoreOrderFixture.java | 32 +++++++++++ .../application/MenuGroupServiceTest.java | 1 - .../menugroups/domain/tobe/MenuGroupTest.java | 1 - .../menus/application/MenuServiceTest.java | 2 +- .../common/application/OrderServiceTest.java | 6 +- .../common/domain/tobe/MenuQuantityTest.java | 4 +- .../common/domain/tobe/OrderLineItemTest.java | 12 ++-- .../store/domain/tobe/OrderTableTest.java | 8 ++- .../store/domain/tobe/StoreOrderTest.java | 57 +++++++------------ .../application/ProductServiceTest.java | 4 +- 35 files changed, 219 insertions(+), 131 deletions(-) create mode 100644 src/test/java/kitchenpos/fake/InMemoryStoreOrderRepository.java create mode 100644 src/test/java/kitchenpos/fixture/StoreOrderFixture.java diff --git a/src/main/java/kitchenpos/menus/ui/dto/MenuCreateRequest.java b/src/main/java/kitchenpos/menus/ui/dto/MenuCreateRequest.java index e47f86910..145325f16 100644 --- a/src/main/java/kitchenpos/menus/ui/dto/MenuCreateRequest.java +++ b/src/main/java/kitchenpos/menus/ui/dto/MenuCreateRequest.java @@ -1,12 +1,12 @@ package kitchenpos.menus.ui.dto; import java.util.UUID; +import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.domain.tobe.DisplayedMenu; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuName; import kitchenpos.menus.domain.tobe.MenuPrice; import kitchenpos.menus.domain.tobe.MenuProducts; -import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.products.domain.ProfanityValidator; public class MenuCreateRequest { diff --git a/src/main/java/kitchenpos/orders/common/application/OrderService.java b/src/main/java/kitchenpos/orders/common/application/OrderService.java index f443a5016..e9a35f61f 100644 --- a/src/main/java/kitchenpos/orders/common/application/OrderService.java +++ b/src/main/java/kitchenpos/orders/common/application/OrderService.java @@ -15,8 +15,8 @@ import kitchenpos.orders.common.domain.OrderStatus; import kitchenpos.orders.common.domain.OrderType; import kitchenpos.orders.delivery.domain.KitchenridersClient; -import kitchenpos.orders.store.domain.OrderTable; import kitchenpos.orders.store.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.tobe.OrderTable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -180,8 +180,7 @@ public Order complete(final UUID orderId) { final OrderTable orderTable = order.getOrderTable(); if (!orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { - orderTable.setNumberOfGuests(0); - orderTable.setOccupied(false); + orderTable.clear(); } } return order; diff --git a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java index 632e4c332..8a9c1243a 100644 --- a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java +++ b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java @@ -1,12 +1,11 @@ package kitchenpos.orders.common.application.dto; +import java.util.UUID; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.orders.common.domain.OrderType; import kitchenpos.orders.common.domain.tobe.MenuQuantity; import kitchenpos.orders.common.domain.tobe.OrderLineItem; -import java.util.UUID; - public class OrderLineItemRequest { private UUID menuId; diff --git a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java index 21f8aa2dc..ded9cdec8 100644 --- a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java +++ b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java @@ -1,13 +1,12 @@ package kitchenpos.orders.common.application.dto; -import kitchenpos.menus.domain.tobe.Menu; -import kitchenpos.orders.common.domain.OrderType; -import kitchenpos.orders.common.domain.tobe.OrderLineItem; - import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; import java.util.UUID; +import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.domain.OrderType; +import kitchenpos.orders.common.domain.tobe.OrderLineItem; public class OrderLineItemRequests { @@ -32,10 +31,13 @@ public List getMenuIds() { } public List toOrderLineItems(List menus, OrderType orderType) { - return orderLineItems.stream().map(orderLineItem -> orderLineItem.toStore(findMenu(menus, orderLineItem), orderType)).toList(); + return orderLineItems.stream() + .map(orderLineItem -> orderLineItem.toStore(findMenu(menus, orderLineItem), + orderType)).toList(); } private Menu findMenu(List menus, OrderLineItemRequest orderLineItem) { - return menus.stream().filter(menu -> menu.getId().equals(orderLineItem.getMenuId())).findFirst().orElseThrow((NoSuchElementException::new)); + return menus.stream().filter(menu -> menu.getId().equals(orderLineItem.getMenuId())) + .findFirst().orElseThrow((NoSuchElementException::new)); } } diff --git a/src/main/java/kitchenpos/orders/common/domain/Order.java b/src/main/java/kitchenpos/orders/common/domain/Order.java index af683bd63..eb91c5650 100644 --- a/src/main/java/kitchenpos/orders/common/domain/Order.java +++ b/src/main/java/kitchenpos/orders/common/domain/Order.java @@ -15,7 +15,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.UUID; -import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.tobe.OrderTable; @Table(name = "orders") @Entity diff --git a/src/main/java/kitchenpos/orders/common/domain/OrderRepository.java b/src/main/java/kitchenpos/orders/common/domain/OrderRepository.java index b654ac9aa..0a0bcfb27 100644 --- a/src/main/java/kitchenpos/orders/common/domain/OrderRepository.java +++ b/src/main/java/kitchenpos/orders/common/domain/OrderRepository.java @@ -3,7 +3,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.tobe.OrderTable; public interface OrderRepository { diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java b/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java index a7247c19d..985952cad 100644 --- a/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java @@ -1,12 +1,20 @@ package kitchenpos.orders.common.domain.tobe; -import jakarta.persistence.*; -import kitchenpos.orders.common.domain.OrderStatus; -import kitchenpos.orders.common.domain.OrderType; - +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorColumn; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; +import jakarta.persistence.Table; import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import kitchenpos.orders.common.domain.OrderStatus; +import kitchenpos.orders.common.domain.OrderType; @Table(name = "orders") @Entity @@ -63,4 +71,12 @@ public void complete() { } status = OrderStatus.COMPLETED; } + + public UUID getId() { + return id; + } + + public OrderStatus getStatus() { + return status; + } } diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java index 33c550ad5..3cf984c3d 100644 --- a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItem.java @@ -1,10 +1,15 @@ package kitchenpos.orders.common.domain.tobe; -import jakarta.persistence.*; -import kitchenpos.menus.domain.tobe.Menu; - +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import java.math.BigDecimal; import java.util.UUID; +import kitchenpos.menus.domain.tobe.Menu; @Table(name = "order_line_item") @Entity diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java index c284755bc..5625da3b9 100644 --- a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java @@ -1,7 +1,10 @@ package kitchenpos.orders.common.domain.tobe; -import jakarta.persistence.*; - +import jakarta.persistence.CascadeType; +import jakarta.persistence.Embeddable; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; import java.util.List; @Embeddable diff --git a/src/main/java/kitchenpos/orders/store/application/OrderTableService.java b/src/main/java/kitchenpos/orders/store/application/OrderTableService.java index 7a62c15e3..f17971e4d 100644 --- a/src/main/java/kitchenpos/orders/store/application/OrderTableService.java +++ b/src/main/java/kitchenpos/orders/store/application/OrderTableService.java @@ -1,5 +1,8 @@ package kitchenpos.orders.store.application; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; import kitchenpos.orders.common.domain.OrderStatus; import kitchenpos.orders.store.domain.OrderTableRepository; import kitchenpos.orders.store.domain.StoreOrderRepository; @@ -9,10 +12,6 @@ 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 { @@ -20,7 +19,7 @@ public class OrderTableService { private final StoreOrderRepository storeOrderRepository; public OrderTableService(final OrderTableRepository orderTableRepository, - final StoreOrderRepository storeOrderRepository) { + final StoreOrderRepository storeOrderRepository) { this.orderTableRepository = orderTableRepository; this.storeOrderRepository = storeOrderRepository; } @@ -42,7 +41,8 @@ public OrderTable sit(final UUID orderTableId) { public OrderTable clear(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) .orElseThrow(NoSuchElementException::new); - if (storeOrderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { + if (storeOrderRepository.existsByOrderTableAndStatusNot(orderTable, + OrderStatus.COMPLETED)) { throw new IllegalStateException(); } orderTable.clear(); diff --git a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java index dbcd48d2f..58769b566 100644 --- a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java +++ b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java @@ -1,5 +1,7 @@ package kitchenpos.orders.store.application; +import java.util.List; +import java.util.NoSuchElementException; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.orders.store.application.dto.StoreOrderCreateRequest; @@ -9,9 +11,6 @@ import kitchenpos.orders.store.domain.tobe.StoreOrder; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.NoSuchElementException; - @Service public class StoreOrderService { @@ -19,7 +18,8 @@ public class StoreOrderService { private final MenuRepository menuRepository; private final OrderTableRepository orderTableRepository; - public StoreOrderService(StoreOrderRepository storeOrderRepository, MenuRepository menuRepository, OrderTableRepository orderTableRepository) { + public StoreOrderService(StoreOrderRepository storeOrderRepository, + MenuRepository menuRepository, OrderTableRepository orderTableRepository) { this.storeOrderRepository = storeOrderRepository; this.menuRepository = menuRepository; this.orderTableRepository = orderTableRepository; @@ -31,6 +31,7 @@ public StoreOrder create(final StoreOrderCreateRequest request) { OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) .orElseThrow(NoSuchElementException::new); - return storeOrderRepository.save(new StoreOrder(request.toOrderLineItems(menus), orderTable)); + return storeOrderRepository.save( + new StoreOrder(request.toOrderLineItems(menus), orderTable)); } } diff --git a/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java b/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java index d0d1c8045..16ff14fc7 100644 --- a/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java +++ b/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java @@ -1,13 +1,12 @@ package kitchenpos.orders.store.application.dto; +import java.util.List; +import java.util.UUID; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.orders.common.application.dto.OrderLineItemRequests; import kitchenpos.orders.common.domain.OrderType; import kitchenpos.orders.common.domain.tobe.OrderLineItem; -import java.util.List; -import java.util.UUID; - public class StoreOrderCreateRequest { private final OrderLineItemRequests orderLineItemRequests; diff --git a/src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java b/src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java index f7342d11f..bd8057ef1 100644 --- a/src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java +++ b/src/main/java/kitchenpos/orders/store/domain/OrderTableRepository.java @@ -1,10 +1,9 @@ package kitchenpos.orders.store.domain; -import kitchenpos.orders.store.domain.tobe.OrderTable; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.orders.store.domain.tobe.OrderTable; public interface OrderTableRepository { diff --git a/src/main/java/kitchenpos/orders/store/domain/StoreOrderRepository.java b/src/main/java/kitchenpos/orders/store/domain/StoreOrderRepository.java index ba4504368..abfe2bdd4 100644 --- a/src/main/java/kitchenpos/orders/store/domain/StoreOrderRepository.java +++ b/src/main/java/kitchenpos/orders/store/domain/StoreOrderRepository.java @@ -1,12 +1,11 @@ package kitchenpos.orders.store.domain; -import kitchenpos.orders.common.domain.OrderStatus; -import kitchenpos.orders.store.domain.tobe.StoreOrder; -import kitchenpos.orders.store.domain.tobe.OrderTable; - import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.orders.common.domain.OrderStatus; +import kitchenpos.orders.store.domain.tobe.OrderTable; +import kitchenpos.orders.store.domain.tobe.StoreOrder; public interface StoreOrderRepository { diff --git a/src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java b/src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java index 6ecb3e9b2..e42edda92 100644 --- a/src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/NumberOfGuests.java @@ -2,7 +2,6 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; @Embeddable @@ -11,11 +10,11 @@ public class NumberOfGuests { @Column(name = "number_of_guests", nullable = false) private int numberOfGuests; - protected NumberOfGuests(){ + protected NumberOfGuests() { } public NumberOfGuests(int numberOfGuests) { - if(numberOfGuests < 0){ + if (numberOfGuests < 0) { throw new IllegalArgumentException(); } this.numberOfGuests = numberOfGuests; @@ -23,8 +22,12 @@ public NumberOfGuests(int numberOfGuests) { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } NumberOfGuests that = (NumberOfGuests) o; return numberOfGuests == that.numberOfGuests; } diff --git a/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java index d23b9c6c8..799a02231 100644 --- a/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTable.java @@ -1,7 +1,10 @@ package kitchenpos.orders.store.domain.tobe; -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 = "order_table") @@ -25,10 +28,10 @@ protected OrderTable() { } public OrderTable(String name) { - this(new OrderTableName(name)); + this(new OrderTableName(name)); } - public OrderTable(OrderTableName name){ + public OrderTable(OrderTableName name) { this.id = UUID.randomUUID(); this.name = name; this.numberOfGuests = new NumberOfGuests(0); diff --git a/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTableName.java b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTableName.java index f10988943..524d0bd0b 100644 --- a/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTableName.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/OrderTableName.java @@ -2,7 +2,6 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; - import java.util.Objects; @Embeddable @@ -24,8 +23,12 @@ public OrderTableName(String name) { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } OrderTableName that = (OrderTableName) o; return Objects.equals(name, that.name); } diff --git a/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java b/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java index 3400e2835..8fd9902dc 100644 --- a/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java @@ -4,12 +4,11 @@ import jakarta.persistence.ForeignKey; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import java.util.List; import kitchenpos.orders.common.domain.OrderType; import kitchenpos.orders.common.domain.tobe.Order; import kitchenpos.orders.common.domain.tobe.OrderLineItem; -import java.util.List; - @Entity public class StoreOrder extends Order { @@ -38,4 +37,8 @@ public void complete() { super.complete(); orderTable.clear(); } + + public OrderTable getOrderTable() { + return orderTable; + } } diff --git a/src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java b/src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java index 9e0d9294c..9836d4205 100644 --- a/src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/orders/store/infra/JpaOrderTableRepository.java @@ -1,8 +1,8 @@ package kitchenpos.orders.store.infra; import java.util.UUID; -import kitchenpos.orders.store.domain.tobe.OrderTable; import kitchenpos.orders.store.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.tobe.OrderTable; import org.springframework.data.jpa.repository.JpaRepository; public interface JpaOrderTableRepository extends OrderTableRepository, diff --git a/src/main/java/kitchenpos/orders/store/infra/JpaStoreOrderRepository.java b/src/main/java/kitchenpos/orders/store/infra/JpaStoreOrderRepository.java index 9a1f5917d..415788b6d 100644 --- a/src/main/java/kitchenpos/orders/store/infra/JpaStoreOrderRepository.java +++ b/src/main/java/kitchenpos/orders/store/infra/JpaStoreOrderRepository.java @@ -1,10 +1,11 @@ package kitchenpos.orders.store.infra; +import java.util.UUID; import kitchenpos.orders.store.domain.StoreOrderRepository; import kitchenpos.orders.store.domain.tobe.StoreOrder; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; +public interface JpaStoreOrderRepository extends StoreOrderRepository, + JpaRepository { -public interface JpaStoreOrderRepository extends StoreOrderRepository, JpaRepository { } diff --git a/src/test/java/kitchenpos/fake/InMemoryOrderRepository.java b/src/test/java/kitchenpos/fake/InMemoryOrderRepository.java index 221e9cdd4..6caee9d66 100644 --- a/src/test/java/kitchenpos/fake/InMemoryOrderRepository.java +++ b/src/test/java/kitchenpos/fake/InMemoryOrderRepository.java @@ -8,7 +8,7 @@ import kitchenpos.orders.common.domain.Order; import kitchenpos.orders.common.domain.OrderRepository; import kitchenpos.orders.common.domain.OrderStatus; -import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.tobe.OrderTable; public class InMemoryOrderRepository implements OrderRepository { diff --git a/src/test/java/kitchenpos/fake/InMemoryOrderTableRepository.java b/src/test/java/kitchenpos/fake/InMemoryOrderTableRepository.java index 22d3faa04..058676a20 100644 --- a/src/test/java/kitchenpos/fake/InMemoryOrderTableRepository.java +++ b/src/test/java/kitchenpos/fake/InMemoryOrderTableRepository.java @@ -5,8 +5,8 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import kitchenpos.orders.store.domain.OrderTable; import kitchenpos.orders.store.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.tobe.OrderTable; public class InMemoryOrderTableRepository implements OrderTableRepository { diff --git a/src/test/java/kitchenpos/fake/InMemoryStoreOrderRepository.java b/src/test/java/kitchenpos/fake/InMemoryStoreOrderRepository.java new file mode 100644 index 000000000..016c1f9e2 --- /dev/null +++ b/src/test/java/kitchenpos/fake/InMemoryStoreOrderRepository.java @@ -0,0 +1,47 @@ +package kitchenpos.fake; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import kitchenpos.orders.common.domain.OrderStatus; +import kitchenpos.orders.store.domain.StoreOrderRepository; +import kitchenpos.orders.store.domain.tobe.OrderTable; +import kitchenpos.orders.store.domain.tobe.StoreOrder; + +public class InMemoryStoreOrderRepository implements StoreOrderRepository { + + private final HashMap orders = new HashMap<>(); + + @Override + public StoreOrder save(StoreOrder entity) { + orders.put(entity.getId(), entity); + return entity; + } + + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(orders.get(id)); + } + + @Override + public List findAll() { + return new ArrayList<>(orders.values()); + } + + @Override + public boolean existsByOrderTableAndStatusNot(OrderTable orderTable, OrderStatus status) { + return orders.values().stream() + .anyMatch(order -> isEqualOrderTable(order, orderTable) + && !isStatus(order, status)); + } + + private boolean isEqualOrderTable(StoreOrder order, OrderTable orderTable) { + return order.getOrderTable().getId().equals(orderTable.getId()); + } + + private boolean isStatus(StoreOrder order, OrderStatus status) { + return order.getStatus().equals(status); + } +} diff --git a/src/test/java/kitchenpos/fixture/MenuProductFixture.java b/src/test/java/kitchenpos/fixture/MenuProductFixture.java index 6e19a33fb..0d463fb2f 100644 --- a/src/test/java/kitchenpos/fixture/MenuProductFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuProductFixture.java @@ -11,7 +11,8 @@ public class MenuProductFixture { public static MenuProductCreateRequests createRequests(Product product, Integer quantity) { return new MenuProductCreateRequests( - List.of(new MenuProductCreateRequest(product.getId(), new ProductQuantity(quantity)))); + List.of(new MenuProductCreateRequest(product.getId(), + new ProductQuantity(quantity)))); } public static MenuProduct createFired(long quantity) { diff --git a/src/test/java/kitchenpos/fixture/OrderFixture.java b/src/test/java/kitchenpos/fixture/OrderFixture.java index 0c0235106..0b14316bd 100644 --- a/src/test/java/kitchenpos/fixture/OrderFixture.java +++ b/src/test/java/kitchenpos/fixture/OrderFixture.java @@ -1,13 +1,11 @@ package kitchenpos.fixture; import java.util.List; -import java.util.UUID; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.orders.common.domain.Order; import kitchenpos.orders.common.domain.OrderLineItem; -import kitchenpos.orders.common.domain.OrderStatus; import kitchenpos.orders.common.domain.OrderType; -import kitchenpos.orders.store.domain.OrderTable; +import kitchenpos.orders.store.domain.tobe.OrderTable; public class OrderFixture { @@ -51,14 +49,4 @@ public static OrderLineItem createOrderLineItem(Menu menu, Integer quantity) { orderLineItem.setPrice(menu.getPrice()); return orderLineItem; } - - public static Order createEatIn(OrderTable orderTable, Menu menu) { - Order order = new Order(); - order.setId(UUID.randomUUID()); - order.setType(OrderType.EAT_IN); - order.setOrderTable(orderTable); - order.setOrderLineItems(List.of(createOrderLineItem(menu, 2))); - order.setStatus(OrderStatus.WAITING); - return order; - } } diff --git a/src/test/java/kitchenpos/fixture/StoreOrderFixture.java b/src/test/java/kitchenpos/fixture/StoreOrderFixture.java new file mode 100644 index 000000000..9ecf41f0c --- /dev/null +++ b/src/test/java/kitchenpos/fixture/StoreOrderFixture.java @@ -0,0 +1,32 @@ +package kitchenpos.fixture; + +import java.util.List; +import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.domain.OrderType; +import kitchenpos.orders.common.domain.tobe.MenuQuantity; +import kitchenpos.orders.common.domain.tobe.OrderLineItem; +import kitchenpos.orders.store.domain.tobe.OrderTable; +import kitchenpos.orders.store.domain.tobe.StoreOrder; + +public class StoreOrderFixture { + + public static StoreOrder createStoreOrder() { + OrderTable orderTable = OrderTableFixture.createNumber1(); + orderTable.sit(); + return new StoreOrder(createOrderLineItems(), orderTable); + } + + public static StoreOrder createStoreOrder(Menu menu, OrderTable orderTable) { + return new StoreOrder(createOrderLineItems(menu), orderTable); + } + + public static List createOrderLineItems() { + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); + return List.of(new OrderLineItem(menu, new MenuQuantity(OrderType.EAT_IN, 2))); + } + + public static List createOrderLineItems(Menu menu) { + return List.of(new OrderLineItem(menu, new MenuQuantity(OrderType.EAT_IN, 2))); + } +} diff --git a/src/test/java/kitchenpos/menugroups/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menugroups/application/MenuGroupServiceTest.java index dd6b0de99..1bb18bd7d 100644 --- a/src/test/java/kitchenpos/menugroups/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menugroups/application/MenuGroupServiceTest.java @@ -5,7 +5,6 @@ import java.util.List; import kitchenpos.fake.InMemoryMenuGroupRepository; -import kitchenpos.menugroups.application.MenuGroupService; import kitchenpos.menugroups.domain.MenuGroupRepository; import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menugroups.domain.tobe.MenuGroupName; diff --git a/src/test/java/kitchenpos/menugroups/domain/tobe/MenuGroupTest.java b/src/test/java/kitchenpos/menugroups/domain/tobe/MenuGroupTest.java index 09487ddca..98cfb4202 100644 --- a/src/test/java/kitchenpos/menugroups/domain/tobe/MenuGroupTest.java +++ b/src/test/java/kitchenpos/menugroups/domain/tobe/MenuGroupTest.java @@ -3,7 +3,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import kitchenpos.menugroups.domain.tobe.MenuGroup; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 447600a27..8ca548269 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -15,10 +15,10 @@ import kitchenpos.fixture.MenuGroupFixture; import kitchenpos.fixture.ProductFixture; import kitchenpos.menugroups.domain.MenuGroupRepository; +import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; -import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.ui.dto.MenuCreateRequest; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.ProfanityValidator; diff --git a/src/test/java/kitchenpos/orders/common/application/OrderServiceTest.java b/src/test/java/kitchenpos/orders/common/application/OrderServiceTest.java index c3034ab60..3b7c97cc1 100644 --- a/src/test/java/kitchenpos/orders/common/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/orders/common/application/OrderServiceTest.java @@ -18,16 +18,16 @@ import kitchenpos.fixture.OrderTableFixture; import kitchenpos.fixture.ProductFixture; import kitchenpos.menugroups.domain.MenuGroupRepository; +import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; -import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.orders.common.domain.Order; import kitchenpos.orders.common.domain.OrderLineItem; import kitchenpos.orders.common.domain.OrderRepository; import kitchenpos.orders.common.domain.OrderStatus; import kitchenpos.orders.delivery.domain.KitchenridersClient; -import kitchenpos.orders.store.domain.OrderTable; import kitchenpos.orders.store.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.tobe.OrderTable; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.tobe.Product; import org.junit.jupiter.api.BeforeEach; @@ -465,7 +465,7 @@ private OrderLineItem createOrderLineItem(Menu menu) { private OrderTable createOccupiedTable() { OrderTable orderTable = createTable(); - orderTable.setOccupied(true); + orderTable.sit(); return orderTable; } diff --git a/src/test/java/kitchenpos/orders/common/domain/tobe/MenuQuantityTest.java b/src/test/java/kitchenpos/orders/common/domain/tobe/MenuQuantityTest.java index 546fb36f8..4f8a8fc1d 100644 --- a/src/test/java/kitchenpos/orders/common/domain/tobe/MenuQuantityTest.java +++ b/src/test/java/kitchenpos/orders/common/domain/tobe/MenuQuantityTest.java @@ -1,5 +1,7 @@ package kitchenpos.orders.common.domain.tobe; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import kitchenpos.orders.common.domain.OrderType; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; @@ -7,8 +9,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - @DisplayName("MenuQuantity") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class MenuQuantityTest { diff --git a/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemTest.java b/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemTest.java index bcd65f5e6..119dd6354 100644 --- a/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemTest.java +++ b/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemTest.java @@ -1,5 +1,8 @@ package kitchenpos.orders.common.domain.tobe; +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import kitchenpos.fixture.MenuFixture; import kitchenpos.fixture.MenuGroupFixture; import kitchenpos.fixture.ProductFixture; @@ -10,16 +13,14 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThatNoException; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - @DisplayName("OrderLineItem") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class OrderLineItemTest { @Test void 노출되어있지않은_메뉴로_주문라인아이템을_생성하면_예외를_던진다() { - Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), ProductFixture.createFired()); + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); menu.hide(); assertThatThrownBy(() -> createOrderLineItem(menu)) @@ -28,7 +29,8 @@ class OrderLineItemTest { @Test void 주문라인아이템을_생성한다() { - Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), ProductFixture.createFired()); + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); assertThatNoException().isThrownBy(() -> createOrderLineItem(menu)); } diff --git a/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java b/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java index e8277c633..337e62742 100644 --- a/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java +++ b/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java @@ -1,5 +1,10 @@ package kitchenpos.orders.store.domain.tobe; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -7,9 +12,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.assertAll; - @DisplayName("OrderTable") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class OrderTableTest { diff --git a/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java b/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java index 546799aaa..b8569cf35 100644 --- a/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java +++ b/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java @@ -1,49 +1,46 @@ package kitchenpos.orders.store.domain.tobe; -import kitchenpos.fixture.MenuFixture; -import kitchenpos.fixture.MenuGroupFixture; -import kitchenpos.fixture.ProductFixture; -import kitchenpos.menus.domain.tobe.Menu; -import kitchenpos.orders.common.domain.OrderType; -import kitchenpos.orders.common.domain.tobe.MenuQuantity; -import kitchenpos.orders.common.domain.tobe.OrderLineItem; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import kitchenpos.fixture.OrderTableFixture; +import kitchenpos.fixture.StoreOrderFixture; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import java.util.List; - -import static org.assertj.core.api.Assertions.*; - @DisplayName("StoreOrder") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class StoreOrderTest { @Test void 매장주문을_생성_시_테이블이_점유되어있지않으면_예외를_던진다() { - assertThatThrownBy(() -> new StoreOrder(createOrderLineItems(), createOrderTable())) + assertThatThrownBy(() -> new StoreOrder(StoreOrderFixture.createOrderLineItems(), + OrderTableFixture.createNumber1())) .isInstanceOf(IllegalStateException.class); } @Test void 매장주문을_생성한다() { - OrderTable orderTable = createOrderTable(); + OrderTable orderTable = OrderTableFixture.createNumber1(); orderTable.sit(); - assertThatNoException().isThrownBy(() -> new StoreOrder(createOrderLineItems(), orderTable)); + assertThatNoException().isThrownBy( + () -> new StoreOrder(StoreOrderFixture.createOrderLineItems(), orderTable)); } @Test void 매장주문을_접수한다() { - StoreOrder storeOrder = createStoreOrder(); + StoreOrder storeOrder = StoreOrderFixture.createStoreOrder(); assertThatNoException().isThrownBy(storeOrder::accept); } @Test void 매장주문을_접수시_대기상태가_아니면_예외를_던진다() { - StoreOrder storeOrder = createStoreOrder(); + StoreOrder storeOrder = StoreOrderFixture.createStoreOrder(); storeOrder.accept(); assertThatThrownBy(storeOrder::accept) @@ -52,7 +49,7 @@ class StoreOrderTest { @Test void 매장주문을_전달한다() { - StoreOrder storeOrder = createStoreOrder(); + StoreOrder storeOrder = StoreOrderFixture.createStoreOrder(); storeOrder.accept(); assertThatNoException().isThrownBy(storeOrder::serve); @@ -60,7 +57,7 @@ class StoreOrderTest { @Test void 매장주문을_전달시_접수상태가_아니면_예외를_던진다() { - StoreOrder storeOrder = createStoreOrder(); + StoreOrder storeOrder = StoreOrderFixture.createStoreOrder(); assertThatThrownBy(storeOrder::serve) .isInstanceOf(IllegalStateException.class); @@ -68,7 +65,7 @@ class StoreOrderTest { @Test void 매장주문을_완료한다() { - StoreOrder storeOrder = createStoreOrder(); + StoreOrder storeOrder = StoreOrderFixture.createStoreOrder(); storeOrder.accept(); storeOrder.serve(); @@ -77,9 +74,10 @@ class StoreOrderTest { @Test void 매장주문을_완료하면_테이블은_청소된다() { - OrderTable targetTable = createOrderTable(); + OrderTable targetTable = OrderTableFixture.createNumber1(); targetTable.sit(); - StoreOrder storeOrder = new StoreOrder(createOrderLineItems(), targetTable); + StoreOrder storeOrder = new StoreOrder(StoreOrderFixture.createOrderLineItems(), + targetTable); storeOrder.accept(); storeOrder.serve(); @@ -90,24 +88,9 @@ class StoreOrderTest { @Test void 매장주문을_완료시_전달상태가_아니면_예외를_던진다() { - StoreOrder storeOrder = createStoreOrder(); + StoreOrder storeOrder = StoreOrderFixture.createStoreOrder(); assertThatThrownBy(storeOrder::serve) .isInstanceOf(IllegalStateException.class); } - - private List createOrderLineItems() { - Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), ProductFixture.createFired()); - return List.of(new OrderLineItem(menu, new MenuQuantity(OrderType.EAT_IN, 2))); - } - - private OrderTable createOrderTable() { - return new OrderTable("1번테이블"); - } - - private StoreOrder createStoreOrder() { - OrderTable orderTable = createOrderTable(); - orderTable.sit(); - return new StoreOrder(createOrderLineItems(), orderTable); - } } \ No newline at end of file diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index 8ff46ec0c..053fc6584 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -13,11 +13,11 @@ import kitchenpos.fixture.MenuFixture; import kitchenpos.fixture.MenuGroupFixture; import kitchenpos.fixture.ProductFixture; -import kitchenpos.menus.application.MenuProductsService; import kitchenpos.menugroups.domain.MenuGroupRepository; +import kitchenpos.menugroups.domain.tobe.MenuGroup; +import kitchenpos.menus.application.MenuProductsService; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; -import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.ProfanityValidator; import kitchenpos.products.domain.tobe.Product; From 30223f0e7c1768de47266eb0a25c62063c0f1a17 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sat, 22 Jun 2024 01:59:07 +0900 Subject: [PATCH 22/42] =?UTF-8?q?test(OrderTable):=20=EC=A0=90=EC=9C=A0?= =?UTF-8?q?=EB=90=98=EC=A7=80=EC=95=8A=EC=9D=80=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=EC=9D=98=20=EC=86=90=EB=8B=98=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=95=98=EB=A9=B4=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EB=A5=BC=20=EB=8D=98=EC=A7=84=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/domain/tobe/OrderTableTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java b/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java index 337e62742..22129ed10 100644 --- a/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java +++ b/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java @@ -51,4 +51,22 @@ class OrderTableTest { () -> assertThat(target.hasGuest()).isFalse() ); } + + @Test + void 점유되지않은_테이블의_손님수를_변경하면_예외를_던진다(){ + OrderTable target = new OrderTable("1번테이블"); + + assertThatThrownBy(() -> target.changeNumberOfGuests(new NumberOfGuests(5))) + .isInstanceOf(IllegalStateException.class); + } + + @Test + void 점유된_테이블의_손님수를_변경할_수_있다(){ + OrderTable target = new OrderTable("1번테이블"); + target.sit(); + + target.changeNumberOfGuests(new NumberOfGuests(5)); + + assertThat(target.hasGuest()).isTrue(); + } } \ No newline at end of file From 3127efae02543777b619fd8c27b5b9599de90ec1 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sat, 22 Jun 2024 04:14:27 +0900 Subject: [PATCH 23/42] =?UTF-8?q?test(StoreOrder):=20=EB=A7=A4=EC=9E=A5?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=EC=9D=84=20=EC=83=9D=EC=84=B1=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/application/StoreOrderService.java | 2 + .../java/kitchenpos/fixture/MenuFixture.java | 10 ++ .../kitchenpos/fixture/StoreOrderFixture.java | 11 +- .../application/OrderTableServiceTest.java | 2 +- .../application/StoreOrderServiceTest.java | 146 ++++++++++++++++++ 5 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java diff --git a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java index 58769b566..bc31de744 100644 --- a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java +++ b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java @@ -10,6 +10,7 @@ import kitchenpos.orders.store.domain.tobe.OrderTable; import kitchenpos.orders.store.domain.tobe.StoreOrder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service public class StoreOrderService { @@ -25,6 +26,7 @@ public StoreOrderService(StoreOrderRepository storeOrderRepository, this.orderTableRepository = orderTableRepository; } + @Transactional public StoreOrder create(final StoreOrderCreateRequest request) { final List menus = menuRepository.findAllByIdIn(request.getMenuIds()); request.validate(menus); diff --git a/src/test/java/kitchenpos/fixture/MenuFixture.java b/src/test/java/kitchenpos/fixture/MenuFixture.java index 99220f21a..3dbbd35b5 100644 --- a/src/test/java/kitchenpos/fixture/MenuFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuFixture.java @@ -60,4 +60,14 @@ public static Menu createFriedOnePlusOne(MenuGroup menuGroup, Product product, L return new Menu(menuName, menuPrice, menuGroup, displayedMenu, menuProducts); } + + public static Menu SeasonedOnePlusOne(MenuGroup menuGroup, Product product) { + MenuName menuName = new MenuName("양념1+1"); + MenuPrice menuPrice = new MenuPrice(BigDecimal.valueOf(35_000L)); + DisplayedMenu displayedMenu = new DisplayedMenu(true); + MenuProducts menuProducts = new MenuProducts( + List.of(new MenuProduct(product, new ProductQuantity(2)))); + + return new Menu(menuName, menuPrice, menuGroup, displayedMenu, menuProducts); + } } diff --git a/src/test/java/kitchenpos/fixture/StoreOrderFixture.java b/src/test/java/kitchenpos/fixture/StoreOrderFixture.java index 9ecf41f0c..7a53823c4 100644 --- a/src/test/java/kitchenpos/fixture/StoreOrderFixture.java +++ b/src/test/java/kitchenpos/fixture/StoreOrderFixture.java @@ -1,5 +1,6 @@ package kitchenpos.fixture; +import java.util.Arrays; import java.util.List; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.orders.common.domain.OrderType; @@ -16,7 +17,7 @@ public static StoreOrder createStoreOrder() { return new StoreOrder(createOrderLineItems(), orderTable); } - public static StoreOrder createStoreOrder(Menu menu, OrderTable orderTable) { + public static StoreOrder createStoreOrder(OrderTable orderTable, Menu... menu) { return new StoreOrder(createOrderLineItems(menu), orderTable); } @@ -26,7 +27,11 @@ public static List createOrderLineItems() { return List.of(new OrderLineItem(menu, new MenuQuantity(OrderType.EAT_IN, 2))); } - public static List createOrderLineItems(Menu menu) { - return List.of(new OrderLineItem(menu, new MenuQuantity(OrderType.EAT_IN, 2))); + private static List createOrderLineItems(Menu... menu) { + return Arrays.stream(menu).map(StoreOrderFixture::createOrderLineItem).toList(); + } + + private static OrderLineItem createOrderLineItem(Menu menu) { + return new OrderLineItem(menu, new MenuQuantity(OrderType.EAT_IN, 1)); } } diff --git a/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java index 3bf16ce22..454332caf 100644 --- a/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/orders/store/application/OrderTableServiceTest.java @@ -111,7 +111,7 @@ private StoreOrder createStoreOrder(OrderTable orderTable) { Product friedProduct = productRepository.save(ProductFixture.createFired()); Menu friedMenu = menuRepository.save( MenuFixture.createFriedOnePlusOne(chickenMenuGroup, friedProduct)); - return storeOrderRepository.save(StoreOrderFixture.createStoreOrder(friedMenu, orderTable)); + return storeOrderRepository.save(StoreOrderFixture.createStoreOrder(orderTable, friedMenu)); } @Test diff --git a/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java b/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java new file mode 100644 index 000000000..2beb9affb --- /dev/null +++ b/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java @@ -0,0 +1,146 @@ +package kitchenpos.orders.store.application; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.Arrays; +import java.util.List; +import java.util.NoSuchElementException; +import kitchenpos.fake.InMemoryMenuGroupRepository; +import kitchenpos.fake.InMemoryMenuRepository; +import kitchenpos.fake.InMemoryOrderTableRepository; +import kitchenpos.fake.InMemoryProductRepository; +import kitchenpos.fake.InMemoryStoreOrderRepository; +import kitchenpos.fixture.MenuFixture; +import kitchenpos.fixture.MenuGroupFixture; +import kitchenpos.fixture.OrderTableFixture; +import kitchenpos.fixture.ProductFixture; +import kitchenpos.menugroups.domain.MenuGroupRepository; +import kitchenpos.menugroups.domain.tobe.MenuGroup; +import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.application.dto.OrderLineItemRequest; +import kitchenpos.orders.common.application.dto.OrderLineItemRequests; +import kitchenpos.orders.common.domain.OrderStatus; +import kitchenpos.orders.store.application.dto.StoreOrderCreateRequest; +import kitchenpos.orders.store.domain.OrderTableRepository; +import kitchenpos.orders.store.domain.StoreOrderRepository; +import kitchenpos.orders.store.domain.tobe.NumberOfGuests; +import kitchenpos.orders.store.domain.tobe.OrderTable; +import kitchenpos.orders.store.domain.tobe.StoreOrder; +import kitchenpos.products.domain.ProductRepository; +import kitchenpos.products.domain.tobe.Product; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +@DisplayName("OrderService") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +class StoreOrderServiceTest { + + private StoreOrderRepository storeOrderRepository = new InMemoryStoreOrderRepository(); + + private MenuRepository menuRepository = new InMemoryMenuRepository(); + + private OrderTableRepository orderTableRepository = new InMemoryOrderTableRepository(); + + private MenuGroupRepository menuGroupRepository = new InMemoryMenuGroupRepository(); + + private ProductRepository productRepository = new InMemoryProductRepository(); + + private StoreOrderService storeOrderService; + + @BeforeEach + void setUp() { + storeOrderService = new StoreOrderService(storeOrderRepository, menuRepository, + orderTableRepository); + } + + @Test + void 매장주문_생성시_테이블을_빠뜨리면_예외를_던진다() { + MenuGroup menuGroup = createMenuGroup(); + StoreOrderCreateRequest createRequest = new StoreOrderCreateRequest( + createOrderLineItemRequests(createFriedMenu(menuGroup)), + null); + + assertThatThrownBy(() -> storeOrderService.create(createRequest)) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void 매장주문_생성시_손님이_앉아있지_않은_테이블이면_예외를_던진다() { + MenuGroup menuGroup = createMenuGroup(); + OrderTable orderTable = createOrderTable(); + StoreOrderCreateRequest createRequest = new StoreOrderCreateRequest( + createOrderLineItemRequests(createFriedMenu(menuGroup)), + orderTable.getId()); + + assertThatThrownBy(() -> storeOrderService.create(createRequest)) + .isInstanceOf(IllegalStateException.class); + } + + @Test + void 매장주문_하나에_여러_메뉴를_주문할_수_있다() { + StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); + + StoreOrder actual = storeOrderService.create(createRequest); + + assertThat(actual.getId()).isNotNull(); + } + + @Test + void 매장주문이_생성되면_주문은_승인을_WAITING하는_상태가_된다() { + StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); + + StoreOrder actual = storeOrderService.create(createRequest); + + assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING); + } + + private StoreOrderCreateRequest createStoreOrderCreateRequest() { + MenuGroup menuGroup = createMenuGroup(); + OrderTable orderTable = createOrderTableAndSit(); + return new StoreOrderCreateRequest( + createOrderLineItemRequests( + createFriedMenu(menuGroup), + createSeasonedMenu(menuGroup)), + orderTable.getId()); + } + + private MenuGroup createMenuGroup() { + return menuGroupRepository.save(MenuGroupFixture.createChicken()); + } + + private OrderTable createOrderTable() { + return orderTableRepository.save(OrderTableFixture.createNumber1()); + } + + private OrderTable createOrderTableAndSit() { + OrderTable orderTable = createOrderTable(); + orderTable.sit(); + orderTable.changeNumberOfGuests(new NumberOfGuests(3)); + return orderTable; + } + + private Menu createFriedMenu(MenuGroup menuGroup) { + Product product = productRepository.save(ProductFixture.createFired()); + return menuRepository.save(MenuFixture.createFriedOnePlusOne(menuGroup, product)); + } + + private Menu createSeasonedMenu(MenuGroup menuGroup) { + Product product = productRepository.save(ProductFixture.createSeasoned()); + return menuRepository.save(MenuFixture.SeasonedOnePlusOne(menuGroup, product)); + } + + private OrderLineItemRequests createOrderLineItemRequests(Menu... menu) { + List orderLineItemRequests = Arrays.stream(menu) + .map(this::createOrderLineItemRequest).toList(); + return new OrderLineItemRequests(orderLineItemRequests); + } + + private OrderLineItemRequest createOrderLineItemRequest(Menu menu) { + return new OrderLineItemRequest(menu.getId(), 1); + } +} \ No newline at end of file From 378409e3c61d20ef2120656ccc974bbc3d44ab31 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sat, 22 Jun 2024 05:03:40 +0900 Subject: [PATCH 24/42] =?UTF-8?q?feat(StoreOrder):=20=EB=A7=A4=EC=9E=A5?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=EC=9D=84=20=EC=A0=91=EC=88=98,=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC,=20=EC=99=84=EB=A3=8C=EB=A5=BC=20=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/application/StoreOrderService.java | 36 +++++++++ .../application/StoreOrderServiceTest.java | 79 +++++++++++++++++-- 2 files changed, 109 insertions(+), 6 deletions(-) diff --git a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java index bc31de744..e17f88d1e 100644 --- a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java +++ b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.NoSuchElementException; +import java.util.UUID; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.orders.store.application.dto.StoreOrderCreateRequest; @@ -36,4 +37,39 @@ public StoreOrder create(final StoreOrderCreateRequest request) { return storeOrderRepository.save( new StoreOrder(request.toOrderLineItems(menus), orderTable)); } + + @Transactional + public StoreOrder accept(final UUID orderId) { + final StoreOrder storeOrder = storeOrderRepository.findById(orderId) + .orElseThrow(NoSuchElementException::new); + + storeOrder.accept(); + + return storeOrder; + } + + @Transactional + public StoreOrder serve(final UUID orderId) { + final StoreOrder storeOrder = storeOrderRepository.findById(orderId) + .orElseThrow(NoSuchElementException::new); + + storeOrder.serve(); + + return storeOrder; + } + + @Transactional + public StoreOrder complete(final UUID orderId) { + final StoreOrder storeOrder = storeOrderRepository.findById(orderId) + .orElseThrow(NoSuchElementException::new); + + storeOrder.complete(); + + return storeOrder; + } + + @Transactional(readOnly = true) + public List findAll() { + return storeOrderRepository.findAll(); + } } diff --git a/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java b/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java index 2beb9affb..3459a9fd2 100644 --- a/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java +++ b/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java @@ -2,10 +2,10 @@ 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.Arrays; import java.util.List; -import java.util.NoSuchElementException; import kitchenpos.fake.InMemoryMenuGroupRepository; import kitchenpos.fake.InMemoryMenuRepository; import kitchenpos.fake.InMemoryOrderTableRepository; @@ -61,12 +61,11 @@ void setUp() { @Test void 매장주문_생성시_테이블을_빠뜨리면_예외를_던진다() { MenuGroup menuGroup = createMenuGroup(); - StoreOrderCreateRequest createRequest = new StoreOrderCreateRequest( - createOrderLineItemRequests(createFriedMenu(menuGroup)), - null); - assertThatThrownBy(() -> storeOrderService.create(createRequest)) - .isInstanceOf(NoSuchElementException.class); + assertThatThrownBy(() -> storeOrderService.create(new StoreOrderCreateRequest( + createOrderLineItemRequests(createFriedMenu(menuGroup)), + null))) + .isInstanceOf(IllegalArgumentException.class); } @Test @@ -99,6 +98,74 @@ void setUp() { assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING); } + @Test + void WAITING_상태의_매장주문을_승인한다() { + StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); + StoreOrder saved = storeOrderService.create(createRequest); + + storeOrderService.accept(saved.getId()); + + assertThat(saved.getStatus()).isEqualTo(OrderStatus.ACCEPTED); + } + + @Test + void WAITING_상태가_아닌_매장주문을_승인하면_예외를_던진다() { + StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); + StoreOrder saved = storeOrderService.create(createRequest); + + storeOrderService.accept(saved.getId()); + + assertThatThrownBy(() -> storeOrderService.accept(saved.getId())).isInstanceOf( + IllegalStateException.class); + } + + @Test + void ACCEPTED_상태의_매장주문을_SERVED_상태로_변경한다() { + StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); + StoreOrder saved = storeOrderService.create(createRequest); + storeOrderService.accept(saved.getId()); + + storeOrderService.serve(saved.getId()); + + assertThat(saved.getStatus()).isEqualTo(OrderStatus.SERVED); + } + + @Test + void ACCEPTED_상태가_아닌_매장주문을_SERVED_상태로_변경하면_예외를_던진다() { + StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); + StoreOrder saved = storeOrderService.create(createRequest); + + assertThatThrownBy(() -> storeOrderService.serve(saved.getId())) + .isInstanceOf(IllegalStateException.class); + } + + @Test + void SERVED된_매장주문을_완료상태로_변경하면_테이블은_초기값으로_세팅된다() { + MenuGroup menuGroup = createMenuGroup(); + OrderTable orderTable = createOrderTableAndSit(); + StoreOrderCreateRequest createRequest = new StoreOrderCreateRequest( + createOrderLineItemRequests(createFriedMenu(menuGroup)), + orderTable.getId()); + StoreOrder saved = storeOrderService.create(createRequest); + storeOrderService.accept(saved.getId()); + storeOrderService.serve(saved.getId()); + + storeOrderService.complete(saved.getId()); + + assertAll(() -> assertThat(saved.getStatus()).isEqualTo(OrderStatus.COMPLETED), + () -> assertThat(orderTable.isOccupied()).isFalse(), + () -> assertThat(orderTable.getNumberOfGuests()).isZero()); + } + + @Test + void SERVED_상태가_아닌_포장주문을_완료상태로_변경하면_예외를_던진다() { + StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); + StoreOrder saved = storeOrderService.create(createRequest); + + assertThatThrownBy(() -> storeOrderService.complete(saved.getId())).isInstanceOf( + IllegalStateException.class); + } + private StoreOrderCreateRequest createStoreOrderCreateRequest() { MenuGroup menuGroup = createMenuGroup(); OrderTable orderTable = createOrderTableAndSit(); From 3cd532c2b307a260d48f88cedbfc5089990118bd Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sat, 22 Jun 2024 05:12:15 +0900 Subject: [PATCH 25/42] =?UTF-8?q?fix(StoreOrder):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9A=A9=EC=96=B4=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 --- .../store/application/StoreOrderServiceTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java b/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java index 3459a9fd2..53774516f 100644 --- a/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java +++ b/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java @@ -90,7 +90,7 @@ void setUp() { } @Test - void 매장주문이_생성되면_주문은_승인을_WAITING하는_상태가_된다() { + void 매장주문이_생성되면_주문은_승인을_대기하는_상태가_된다() { StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); StoreOrder actual = storeOrderService.create(createRequest); @@ -99,7 +99,7 @@ void setUp() { } @Test - void WAITING_상태의_매장주문을_승인한다() { + void 대기상태의_매장주문을_접수한다() { StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); StoreOrder saved = storeOrderService.create(createRequest); @@ -109,7 +109,7 @@ void setUp() { } @Test - void WAITING_상태가_아닌_매장주문을_승인하면_예외를_던진다() { + void 대기상태가_아닌_매장주문을_접수하면_예외를_던진다() { StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); StoreOrder saved = storeOrderService.create(createRequest); @@ -120,7 +120,7 @@ void setUp() { } @Test - void ACCEPTED_상태의_매장주문을_SERVED_상태로_변경한다() { + void 접수상태의_매장주문을_전달상태로_변경한다() { StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); StoreOrder saved = storeOrderService.create(createRequest); storeOrderService.accept(saved.getId()); @@ -131,7 +131,7 @@ void setUp() { } @Test - void ACCEPTED_상태가_아닌_매장주문을_SERVED_상태로_변경하면_예외를_던진다() { + void 접수상태가_아닌_매장주문을_전달상태로_변경하면_예외를_던진다() { StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); StoreOrder saved = storeOrderService.create(createRequest); @@ -140,7 +140,7 @@ void setUp() { } @Test - void SERVED된_매장주문을_완료상태로_변경하면_테이블은_초기값으로_세팅된다() { + void 전달된_매장주문을_완료상태로_변경하면_테이블은_초기값으로_세팅된다() { MenuGroup menuGroup = createMenuGroup(); OrderTable orderTable = createOrderTableAndSit(); StoreOrderCreateRequest createRequest = new StoreOrderCreateRequest( @@ -158,7 +158,7 @@ void setUp() { } @Test - void SERVED_상태가_아닌_포장주문을_완료상태로_변경하면_예외를_던진다() { + void 전달상태가_아닌_포장주문을_완료상태로_변경하면_예외를_던진다() { StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); StoreOrder saved = storeOrderService.create(createRequest); From 8a4d5b2172c74ce62526d6f9b5f4b4b4e4ea8b1c Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sun, 23 Jun 2024 01:08:00 +0900 Subject: [PATCH 26/42] =?UTF-8?q?fix(Menu):=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kitchenpos/menus/domain/tobe/Menu.java | 9 ++------- .../kitchenpos/menus/domain/tobe/MenuProduct.java | 11 +++-------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java index 0dc399fec..5ccad9b75 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java @@ -37,16 +37,11 @@ protected Menu() { public Menu(MenuName name, MenuPrice price, MenuGroup menuGroup, DisplayedMenu displayed, MenuProducts menuProducts) { - this(UUID.randomUUID(), name, price, menuGroup.getId(), displayed, menuProducts); - } - - public Menu(UUID id, MenuName name, MenuPrice price, UUID menuGroupId, DisplayedMenu displayed, - MenuProducts menuProducts) { validateMenuPrice(price, menuProducts); - this.id = id; + this.id = UUID.randomUUID(); this.name = name; this.price = price; - this.menuGroupId = menuGroupId; + this.menuGroupId = menuGroup.getId(); this.displayed = displayed; this.menuProducts = menuProducts; } diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java index be2f3c0e4..977333a69 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProduct.java @@ -32,17 +32,12 @@ protected MenuProduct() { } public MenuProduct(Product product, int quantity) { - this(null, product.getId(), product.getPrice(), new ProductQuantity(quantity)); + this(product, new ProductQuantity(quantity)); } public MenuProduct(Product product, ProductQuantity quantity) { - this(null, product.getId(), product.getPrice(), quantity); - } - - public MenuProduct(Long seq, UUID productId, BigDecimal price, ProductQuantity quantity) { - this.seq = seq; - this.productId = productId; - this.price = price; + this.productId = product.getId(); + this.price = product.getPrice(); this.quantity = quantity; } From 108f673ce6913040a10d631f8958b19ff5e8f13b Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sun, 23 Jun 2024 01:08:46 +0900 Subject: [PATCH 27/42] =?UTF-8?q?fix(Menu):=20dto=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20ui=20->=20application=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/menus/application/MenuProductsService.java | 2 +- src/main/java/kitchenpos/menus/application/MenuService.java | 2 +- .../menus/{ui => application}/dto/MenuCreateRequest.java | 2 +- .../{ui => application}/dto/MenuProductCreateRequest.java | 2 +- .../{ui => application}/dto/MenuProductCreateRequests.java | 2 +- src/main/java/kitchenpos/menus/ui/MenuRestController.java | 2 +- src/test/java/kitchenpos/fixture/MenuFixture.java | 4 ++-- src/test/java/kitchenpos/fixture/MenuProductFixture.java | 4 ++-- .../kitchenpos/menus/application/MenuProductsServiceTest.java | 4 ++-- .../java/kitchenpos/menus/application/MenuServiceTest.java | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) rename src/main/java/kitchenpos/menus/{ui => application}/dto/MenuCreateRequest.java (97%) rename src/main/java/kitchenpos/menus/{ui => application}/dto/MenuProductCreateRequest.java (94%) rename src/main/java/kitchenpos/menus/{ui => application}/dto/MenuProductCreateRequests.java (95%) diff --git a/src/main/java/kitchenpos/menus/application/MenuProductsService.java b/src/main/java/kitchenpos/menus/application/MenuProductsService.java index e76e06063..a6ded11a1 100644 --- a/src/main/java/kitchenpos/menus/application/MenuProductsService.java +++ b/src/main/java/kitchenpos/menus/application/MenuProductsService.java @@ -6,7 +6,7 @@ import java.util.stream.Collectors; import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.menus.domain.tobe.MenuProducts; -import kitchenpos.menus.ui.dto.MenuProductCreateRequests; +import kitchenpos.menus.application.dto.MenuProductCreateRequests; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.tobe.Product; import org.springframework.stereotype.Service; diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index f87db4770..9bbd4d822 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -9,7 +9,7 @@ import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; import kitchenpos.menus.domain.tobe.MenuProducts; -import kitchenpos.menus.ui.dto.MenuCreateRequest; +import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.products.domain.ProfanityValidator; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/menus/ui/dto/MenuCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java similarity index 97% rename from src/main/java/kitchenpos/menus/ui/dto/MenuCreateRequest.java rename to src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java index 145325f16..e4095c282 100644 --- a/src/main/java/kitchenpos/menus/ui/dto/MenuCreateRequest.java +++ b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.ui.dto; +package kitchenpos.menus.application.dto; import java.util.UUID; import kitchenpos.menugroups.domain.tobe.MenuGroup; diff --git a/src/main/java/kitchenpos/menus/ui/dto/MenuProductCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java similarity index 94% rename from src/main/java/kitchenpos/menus/ui/dto/MenuProductCreateRequest.java rename to src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java index b13703458..b9d0002e3 100644 --- a/src/main/java/kitchenpos/menus/ui/dto/MenuProductCreateRequest.java +++ b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.ui.dto; +package kitchenpos.menus.application.dto; import java.util.UUID; import kitchenpos.menus.domain.tobe.MenuProduct; diff --git a/src/main/java/kitchenpos/menus/ui/dto/MenuProductCreateRequests.java b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java similarity index 95% rename from src/main/java/kitchenpos/menus/ui/dto/MenuProductCreateRequests.java rename to src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java index 83e511bfa..e956fcd59 100644 --- a/src/main/java/kitchenpos/menus/ui/dto/MenuProductCreateRequests.java +++ b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.ui.dto; +package kitchenpos.menus.application.dto; import java.util.List; import java.util.Objects; diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 944291021..7fcae3110 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -6,7 +6,7 @@ import kitchenpos.menus.application.MenuService; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; -import kitchenpos.menus.ui.dto.MenuCreateRequest; +import kitchenpos.menus.application.dto.MenuCreateRequest; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/test/java/kitchenpos/fixture/MenuFixture.java b/src/test/java/kitchenpos/fixture/MenuFixture.java index 3dbbd35b5..d3afe8145 100644 --- a/src/test/java/kitchenpos/fixture/MenuFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuFixture.java @@ -10,8 +10,8 @@ import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.menus.domain.tobe.MenuProducts; import kitchenpos.menus.domain.tobe.ProductQuantity; -import kitchenpos.menus.ui.dto.MenuCreateRequest; -import kitchenpos.menus.ui.dto.MenuProductCreateRequests; +import kitchenpos.menus.application.dto.MenuCreateRequest; +import kitchenpos.menus.application.dto.MenuProductCreateRequests; import kitchenpos.products.domain.tobe.Product; public class MenuFixture { diff --git a/src/test/java/kitchenpos/fixture/MenuProductFixture.java b/src/test/java/kitchenpos/fixture/MenuProductFixture.java index 0d463fb2f..b91d2c1ea 100644 --- a/src/test/java/kitchenpos/fixture/MenuProductFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuProductFixture.java @@ -3,8 +3,8 @@ import java.util.List; import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.menus.domain.tobe.ProductQuantity; -import kitchenpos.menus.ui.dto.MenuProductCreateRequest; -import kitchenpos.menus.ui.dto.MenuProductCreateRequests; +import kitchenpos.menus.application.dto.MenuProductCreateRequest; +import kitchenpos.menus.application.dto.MenuProductCreateRequests; import kitchenpos.products.domain.tobe.Product; public class MenuProductFixture { diff --git a/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java index cae92d052..e5a6bca11 100644 --- a/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java @@ -10,8 +10,8 @@ import kitchenpos.fixture.ProductFixture; import kitchenpos.menus.domain.tobe.MenuProducts; import kitchenpos.menus.domain.tobe.ProductQuantity; -import kitchenpos.menus.ui.dto.MenuProductCreateRequest; -import kitchenpos.menus.ui.dto.MenuProductCreateRequests; +import kitchenpos.menus.application.dto.MenuProductCreateRequest; +import kitchenpos.menus.application.dto.MenuProductCreateRequests; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.tobe.Product; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 8ca548269..326359a1c 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -19,7 +19,7 @@ import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; -import kitchenpos.menus.ui.dto.MenuCreateRequest; +import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.ProfanityValidator; import kitchenpos.products.domain.tobe.Product; From ddcc764a04bb3acc4b33ecdd08ce9f864ddc4e99 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sun, 23 Jun 2024 01:09:04 +0900 Subject: [PATCH 28/42] =?UTF-8?q?fix(Product):=20dto=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20ui=20->=20application=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kitchenpos/products/application/ProductService.java | 2 +- .../products/{ui => application}/dto/ProductCreateRequest.java | 2 +- src/main/java/kitchenpos/products/ui/ProductRestController.java | 2 +- src/test/java/kitchenpos/fixture/ProductFixture.java | 2 +- .../kitchenpos/products/application/ProductServiceTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/kitchenpos/products/{ui => application}/dto/ProductCreateRequest.java (94%) diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index b68addb2c..34ff1ee42 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -10,7 +10,7 @@ import kitchenpos.products.domain.ProfanityValidator; import kitchenpos.products.domain.tobe.Product; import kitchenpos.products.domain.tobe.ProductPrice; -import kitchenpos.products.ui.dto.ProductCreateRequest; +import kitchenpos.products.application.dto.ProductCreateRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/products/ui/dto/ProductCreateRequest.java b/src/main/java/kitchenpos/products/application/dto/ProductCreateRequest.java similarity index 94% rename from src/main/java/kitchenpos/products/ui/dto/ProductCreateRequest.java rename to src/main/java/kitchenpos/products/application/dto/ProductCreateRequest.java index df63c6b42..6a8372bf1 100644 --- a/src/main/java/kitchenpos/products/ui/dto/ProductCreateRequest.java +++ b/src/main/java/kitchenpos/products/application/dto/ProductCreateRequest.java @@ -1,4 +1,4 @@ -package kitchenpos.products.ui.dto; +package kitchenpos.products.application.dto; import java.math.BigDecimal; import kitchenpos.products.domain.ProfanityValidator; diff --git a/src/main/java/kitchenpos/products/ui/ProductRestController.java b/src/main/java/kitchenpos/products/ui/ProductRestController.java index c5bc047e3..5714e00f4 100644 --- a/src/main/java/kitchenpos/products/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/products/ui/ProductRestController.java @@ -6,7 +6,7 @@ import kitchenpos.products.application.ProductService; import kitchenpos.products.domain.tobe.Product; import kitchenpos.products.domain.tobe.ProductPrice; -import kitchenpos.products.ui.dto.ProductCreateRequest; +import kitchenpos.products.application.dto.ProductCreateRequest; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/test/java/kitchenpos/fixture/ProductFixture.java b/src/test/java/kitchenpos/fixture/ProductFixture.java index 87701ec54..3efca42ac 100644 --- a/src/test/java/kitchenpos/fixture/ProductFixture.java +++ b/src/test/java/kitchenpos/fixture/ProductFixture.java @@ -2,7 +2,7 @@ import java.math.BigDecimal; import kitchenpos.products.domain.tobe.Product; -import kitchenpos.products.ui.dto.ProductCreateRequest; +import kitchenpos.products.application.dto.ProductCreateRequest; public class ProductFixture { diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index 053fc6584..b8368cb67 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -22,7 +22,7 @@ import kitchenpos.products.domain.ProfanityValidator; import kitchenpos.products.domain.tobe.Product; import kitchenpos.products.domain.tobe.ProductPrice; -import kitchenpos.products.ui.dto.ProductCreateRequest; +import kitchenpos.products.application.dto.ProductCreateRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; From b0633a83e7fb53a8ecbff7101142d1d842a79512 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sun, 23 Jun 2024 01:53:10 +0900 Subject: [PATCH 29/42] =?UTF-8?q?fix(StoreOrder):=20=EB=A7=A4=EC=9E=A5?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=20=EC=83=9D=EC=84=B1=EC=8B=9C=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=EA=B0=80=20=EA=B2=B9=EC=B9=98=EB=A9=B4=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EB=A5=BC=20=EB=8D=98=EC=A7=84=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dto에 있는 불변식 검증을 도메인으로 옮긴다. --- .../dto/OrderLineItemRequests.java | 6 --- .../orders/common/domain/tobe/Order.java | 7 +++- .../store/application/StoreOrderService.java | 6 +-- .../dto/StoreOrderCreateRequest.java | 11 ++--- .../orders/store/domain/tobe/StoreOrder.java | 5 ++- .../kitchenpos/fixture/StoreOrderFixture.java | 9 ++-- .../store/domain/tobe/StoreOrderTest.java | 41 +++++++++++++++++-- 7 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java index ded9cdec8..26a9f628e 100644 --- a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java +++ b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java @@ -20,12 +20,6 @@ public OrderLineItemRequests(List orderLineItems) { this.orderLineItems = orderLineItems; } - public void validate(List menus) { - if (menus.size() != orderLineItems.size()) { - throw new IllegalArgumentException(); - } - } - public List getMenuIds() { return orderLineItems.stream().map(OrderLineItemRequest::getMenuId).toList(); } diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java b/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java index 985952cad..40b327f5a 100644 --- a/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java @@ -13,6 +13,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.orders.common.domain.OrderStatus; import kitchenpos.orders.common.domain.OrderType; @@ -43,7 +44,11 @@ public abstract class Order { protected Order() { } - public Order(OrderType type, List orderLineItems) { + public Order(OrderType type, List orderLineItems, List menus) { + if (menus.size() != orderLineItems.size()) { + throw new IllegalArgumentException(); + } + this.id = UUID.randomUUID(); this.type = type; this.status = OrderStatus.WAITING; diff --git a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java index e17f88d1e..fc299f3c0 100644 --- a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java +++ b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java @@ -30,12 +30,10 @@ public StoreOrderService(StoreOrderRepository storeOrderRepository, @Transactional public StoreOrder create(final StoreOrderCreateRequest request) { final List menus = menuRepository.findAllByIdIn(request.getMenuIds()); - request.validate(menus); - - OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) + final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) .orElseThrow(NoSuchElementException::new); return storeOrderRepository.save( - new StoreOrder(request.toOrderLineItems(menus), orderTable)); + new StoreOrder(request.toOrderLineItems(menus), menus, orderTable)); } @Transactional diff --git a/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java b/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java index 16ff14fc7..c4fd07ad6 100644 --- a/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java +++ b/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java @@ -13,6 +13,10 @@ public class StoreOrderCreateRequest { private final UUID orderTableId; public StoreOrderCreateRequest(OrderLineItemRequests orderLineItemRequests, UUID orderTableId) { + if (orderTableId == null) { + throw new IllegalArgumentException(); + } + this.orderLineItemRequests = orderLineItemRequests; this.orderTableId = orderTableId; } @@ -21,13 +25,6 @@ public List getMenuIds() { return orderLineItemRequests.getMenuIds(); } - public void validate(List menus) { - orderLineItemRequests.validate(menus); - if (orderTableId == null) { - throw new IllegalArgumentException(); - } - } - public UUID getOrderTableId() { return orderTableId; } diff --git a/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java b/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java index 8fd9902dc..476dcd99f 100644 --- a/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java @@ -5,6 +5,7 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import java.util.List; +import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.orders.common.domain.OrderType; import kitchenpos.orders.common.domain.tobe.Order; import kitchenpos.orders.common.domain.tobe.OrderLineItem; @@ -23,8 +24,8 @@ public class StoreOrder extends Order { protected StoreOrder() { } - public StoreOrder(List orderLineItems, OrderTable orderTable) { - super(OrderType.EAT_IN, orderLineItems); + public StoreOrder(List orderLineItems, List menus, OrderTable orderTable) { + super(OrderType.EAT_IN, orderLineItems, menus); if (!orderTable.isOccupied()) { throw new IllegalStateException(); diff --git a/src/test/java/kitchenpos/fixture/StoreOrderFixture.java b/src/test/java/kitchenpos/fixture/StoreOrderFixture.java index 7a53823c4..221350c1d 100644 --- a/src/test/java/kitchenpos/fixture/StoreOrderFixture.java +++ b/src/test/java/kitchenpos/fixture/StoreOrderFixture.java @@ -14,11 +14,14 @@ public class StoreOrderFixture { public static StoreOrder createStoreOrder() { OrderTable orderTable = OrderTableFixture.createNumber1(); orderTable.sit(); - return new StoreOrder(createOrderLineItems(), orderTable); + + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); + return new StoreOrder(createOrderLineItems(menu), List.of(menu), orderTable); } public static StoreOrder createStoreOrder(OrderTable orderTable, Menu... menu) { - return new StoreOrder(createOrderLineItems(menu), orderTable); + return new StoreOrder(createOrderLineItems(menu), List.of(menu), orderTable); } public static List createOrderLineItems() { @@ -27,7 +30,7 @@ public static List createOrderLineItems() { return List.of(new OrderLineItem(menu, new MenuQuantity(OrderType.EAT_IN, 2))); } - private static List createOrderLineItems(Menu... menu) { + public static List createOrderLineItems(Menu... menu) { return Arrays.stream(menu).map(StoreOrderFixture::createOrderLineItem).toList(); } diff --git a/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java b/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java index b8569cf35..95e9dbdb2 100644 --- a/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java +++ b/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java @@ -4,8 +4,13 @@ import static org.assertj.core.api.Assertions.assertThatNoException; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.util.List; +import kitchenpos.fixture.MenuFixture; +import kitchenpos.fixture.MenuGroupFixture; import kitchenpos.fixture.OrderTableFixture; +import kitchenpos.fixture.ProductFixture; import kitchenpos.fixture.StoreOrderFixture; +import kitchenpos.menus.domain.tobe.Menu; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -17,7 +22,28 @@ class StoreOrderTest { @Test void 매장주문을_생성_시_테이블이_점유되어있지않으면_예외를_던진다() { - assertThatThrownBy(() -> new StoreOrder(StoreOrderFixture.createOrderLineItems(), + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); + + assertThatThrownBy(() -> new StoreOrder( + StoreOrderFixture.createOrderLineItems(menu), + List.of(menu), + OrderTableFixture.createNumber1())) + .isInstanceOf(IllegalStateException.class); + } + + @Test + void 매장주문을_생성_시_메뉴가_겹치면_예외를_던진다() { + OrderTable orderTable = OrderTableFixture.createNumber1(); + orderTable.sit(); + Menu menu1 = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); + Menu menu2 = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); + + assertThatThrownBy(() -> new StoreOrder( + StoreOrderFixture.createOrderLineItems(menu1, menu2), + List.of(menu1, menu2), OrderTableFixture.createNumber1())) .isInstanceOf(IllegalStateException.class); } @@ -26,9 +52,14 @@ class StoreOrderTest { void 매장주문을_생성한다() { OrderTable orderTable = OrderTableFixture.createNumber1(); orderTable.sit(); + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); assertThatNoException().isThrownBy( - () -> new StoreOrder(StoreOrderFixture.createOrderLineItems(), orderTable)); + () -> new StoreOrder( + StoreOrderFixture.createOrderLineItems(menu), + List.of(menu), + orderTable)); } @Test @@ -76,7 +107,11 @@ class StoreOrderTest { void 매장주문을_완료하면_테이블은_청소된다() { OrderTable targetTable = OrderTableFixture.createNumber1(); targetTable.sit(); - StoreOrder storeOrder = new StoreOrder(StoreOrderFixture.createOrderLineItems(), + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); + StoreOrder storeOrder = new StoreOrder( + StoreOrderFixture.createOrderLineItems(menu), + List.of(menu), targetTable); storeOrder.accept(); storeOrder.serve(); From 40dcdc03ef5414d270977c913d19e81ab3f0a503 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sun, 23 Jun 2024 03:16:27 +0900 Subject: [PATCH 30/42] =?UTF-8?q?fix(MenuProduct):=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=83=9D=EC=84=B1=EC=8B=9C=20=EC=83=81?= =?UTF-8?q?=ED=92=88=EC=9D=B4=20=EA=B2=B9=EC=B9=98=EB=A9=B4=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EB=A5=BC=20=EB=8D=98=EC=A7=84=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dto에 있는 불변식 검증을 도메인으로 옮긴다. --- .../menus/domain/tobe/MenuProducts.java | 18 +++++++++++++----- .../java/kitchenpos/fixture/MenuFixture.java | 8 ++++---- .../menus/domain/tobe/MenuProductsTest.java | 18 +++++++++++++++--- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java index 804c0c982..7843dea03 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java @@ -8,8 +8,8 @@ import java.math.BigDecimal; import java.util.Iterator; import java.util.List; -import java.util.Objects; import java.util.stream.Stream; +import kitchenpos.products.domain.tobe.Product; import org.jetbrains.annotations.NotNull; @Embeddable @@ -27,13 +27,21 @@ public class MenuProducts implements Iterable { protected MenuProducts() { } - public MenuProducts(List menuProducts) { - validateMenuProducts(menuProducts); + public MenuProducts(List menuProducts, List products) { + validateMenuProducts(menuProducts, products); this.menuProducts = menuProducts; } - private void validateMenuProducts(List menuProducts) { - if (Objects.isNull(menuProducts) || menuProducts.isEmpty()) { + private void validateMenuProducts(List menuProducts, List products) { + if (menuProducts == null || products == null) { + throw new IllegalArgumentException(); + } + + if (products.size() != menuProducts.size()) { + throw new IllegalArgumentException(); + } + + if (menuProducts.isEmpty()) { throw new IllegalArgumentException(); } } diff --git a/src/test/java/kitchenpos/fixture/MenuFixture.java b/src/test/java/kitchenpos/fixture/MenuFixture.java index d3afe8145..d0ae6fd09 100644 --- a/src/test/java/kitchenpos/fixture/MenuFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuFixture.java @@ -3,6 +3,8 @@ import java.math.BigDecimal; import java.util.List; import kitchenpos.menugroups.domain.tobe.MenuGroup; +import kitchenpos.menus.application.dto.MenuCreateRequest; +import kitchenpos.menus.application.dto.MenuProductCreateRequests; import kitchenpos.menus.domain.tobe.DisplayedMenu; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuName; @@ -10,8 +12,6 @@ import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.menus.domain.tobe.MenuProducts; import kitchenpos.menus.domain.tobe.ProductQuantity; -import kitchenpos.menus.application.dto.MenuCreateRequest; -import kitchenpos.menus.application.dto.MenuProductCreateRequests; import kitchenpos.products.domain.tobe.Product; public class MenuFixture { @@ -56,7 +56,7 @@ public static Menu createFriedOnePlusOne(MenuGroup menuGroup, Product product, L MenuPrice menuPrice = new MenuPrice(BigDecimal.valueOf(price)); DisplayedMenu displayedMenu = new DisplayedMenu(true); MenuProducts menuProducts = new MenuProducts( - List.of(new MenuProduct(product, new ProductQuantity(2)))); + List.of(new MenuProduct(product, new ProductQuantity(2))), List.of(product)); return new Menu(menuName, menuPrice, menuGroup, displayedMenu, menuProducts); } @@ -66,7 +66,7 @@ public static Menu SeasonedOnePlusOne(MenuGroup menuGroup, Product product) { MenuPrice menuPrice = new MenuPrice(BigDecimal.valueOf(35_000L)); DisplayedMenu displayedMenu = new DisplayedMenu(true); MenuProducts menuProducts = new MenuProducts( - List.of(new MenuProduct(product, new ProductQuantity(2)))); + List.of(new MenuProduct(product, new ProductQuantity(2))), List.of(product)); return new Menu(menuName, menuPrice, menuGroup, displayedMenu, menuProducts); } diff --git a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java index b39c5c8bb..8507a5e98 100644 --- a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java +++ b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java @@ -5,6 +5,7 @@ import java.util.List; import kitchenpos.fixture.ProductFixture; +import kitchenpos.products.domain.tobe.Product; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -17,21 +18,32 @@ class MenuProductsTest { @Test void 메뉴상품들이_null일_경우_예외를_던진다() { assertThatThrownBy( - () -> new MenuProducts(null)) + () -> new MenuProducts(null, null)) .isInstanceOf(IllegalArgumentException.class); } @Test void 메뉴상품들이_비어있을_경우_예외를_던진다() { assertThatThrownBy( - () -> new MenuProducts(List.of())) + () -> new MenuProducts(List.of(), List.of())) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 메뉴상품들에_메뉴가_중복되면_예외를_던진다() { + Product product = ProductFixture.createFired(20_000L); + MenuProduct menuProduct = new MenuProduct(product, 2); + + assertThatThrownBy( + () -> new MenuProducts(List.of(menuProduct, menuProduct), List.of(product))) .isInstanceOf(IllegalArgumentException.class); } @Test void 메뉴상품들을_생성할_수_있다() { + Product product = ProductFixture.createFired(20_000L); assertThatNoException().isThrownBy(() -> new MenuProducts( - List.of(new MenuProduct(ProductFixture.createFired(20_000L), 2))) + List.of(new MenuProduct(product, 2)), List.of(product)) ); } } \ No newline at end of file From 7845997ed7eb0bbe21ac1341ee6902737b0c7579 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sun, 23 Jun 2024 03:17:06 +0900 Subject: [PATCH 31/42] =?UTF-8?q?fix(MenuProduct):=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MenuProductsService.java | 48 ------------- .../menus/application/MenuService.java | 22 +++--- .../application/dto/MenuCreateRequest.java | 27 ++++--- .../dto/MenuProductCreateRequest.java | 4 +- .../dto/MenuProductCreateRequests.java | 18 +++-- .../menus/ui/MenuRestController.java | 2 +- .../products/application/ProductService.java | 7 +- .../products/ui/ProductRestController.java | 2 +- .../fixture/MenuProductFixture.java | 4 +- .../kitchenpos/fixture/ProductFixture.java | 2 +- .../application/MenuProductsServiceTest.java | 72 ------------------- .../menus/application/MenuServiceTest.java | 7 +- .../store/domain/tobe/OrderTableTest.java | 4 +- .../application/ProductServiceTest.java | 7 +- 14 files changed, 58 insertions(+), 168 deletions(-) delete mode 100644 src/main/java/kitchenpos/menus/application/MenuProductsService.java delete mode 100644 src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java diff --git a/src/main/java/kitchenpos/menus/application/MenuProductsService.java b/src/main/java/kitchenpos/menus/application/MenuProductsService.java deleted file mode 100644 index a6ded11a1..000000000 --- a/src/main/java/kitchenpos/menus/application/MenuProductsService.java +++ /dev/null @@ -1,48 +0,0 @@ -package kitchenpos.menus.application; - -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; -import java.util.stream.Collectors; -import kitchenpos.menus.domain.tobe.MenuProduct; -import kitchenpos.menus.domain.tobe.MenuProducts; -import kitchenpos.menus.application.dto.MenuProductCreateRequests; -import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.domain.tobe.Product; -import org.springframework.stereotype.Service; - -@Service -public class MenuProductsService { - - private final ProductRepository productRepository; - - public MenuProductsService(ProductRepository productRepository) { - this.productRepository = productRepository; - } - - public MenuProducts create(final MenuProductCreateRequests requests) { - List products = findProducts(requests.getProductIds()); - requests.validateMenuProducts(products); - - return new MenuProducts(createMenuProducts(requests)); - } - - private List createMenuProducts(MenuProductCreateRequests requests) { - return requests.getMenuProducts() - .stream() - .map(request -> { - Product product = findProduct(request.getProductId()); - return request.to(product); - }) - .collect(Collectors.toList()); - } - - private List findProducts(List productIds) { - return productRepository.findAllByIdIn(productIds); - } - - private Product findProduct(UUID productId) { - return productRepository.findById(productId) - .orElseThrow(NoSuchElementException::new); - } -} diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 9bbd4d822..5710c11cc 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -5,12 +5,13 @@ import java.util.UUID; import kitchenpos.menugroups.domain.MenuGroupRepository; import kitchenpos.menugroups.domain.tobe.MenuGroup; +import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; -import kitchenpos.menus.domain.tobe.MenuProducts; -import kitchenpos.menus.application.dto.MenuCreateRequest; +import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.ProfanityValidator; +import kitchenpos.products.domain.tobe.Product; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,27 +20,28 @@ public class MenuService { private final MenuRepository menuRepository; private final MenuGroupRepository menuGroupRepository; + + private final ProductRepository productRepository; private final ProfanityValidator profanityValidator; - private final MenuProductsService menuProductsService; public MenuService( final MenuRepository menuRepository, final MenuGroupRepository menuGroupRepository, - final ProfanityValidator profanityValidator, - final MenuProductsService menuProductsService + ProductRepository productRepository, + final ProfanityValidator profanityValidator ) { this.menuRepository = menuRepository; this.menuGroupRepository = menuGroupRepository; + this.productRepository = productRepository; this.profanityValidator = profanityValidator; - this.menuProductsService = menuProductsService; } @Transactional public Menu create(final MenuCreateRequest request) { request.validateName(profanityValidator); final MenuGroup menuGroup = findMenuGroup(request.getMenuGroupId()); - final MenuProducts menuProducts = menuProductsService.create(request.getMenuProducts()); - return menuRepository.save(request.to(menuGroup, menuProducts)); + List products = findProducts(request.getProductIds()); + return menuRepository.save(request.to(menuGroup, products)); } @Transactional @@ -73,6 +75,10 @@ private MenuGroup findMenuGroup(UUID menuGroupId) { .orElseThrow(NoSuchElementException::new); } + private List findProducts(List productIds) { + return productRepository.findAllByIdIn(productIds); + } + private Menu findMenu(UUID menuId) { return menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java index e4095c282..979ff3ab0 100644 --- a/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java +++ b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java @@ -1,50 +1,55 @@ package kitchenpos.menus.application.dto; +import java.util.List; import java.util.UUID; import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.domain.tobe.DisplayedMenu; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuName; import kitchenpos.menus.domain.tobe.MenuPrice; +import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.menus.domain.tobe.MenuProducts; import kitchenpos.products.domain.ProfanityValidator; +import kitchenpos.products.domain.tobe.Product; public class MenuCreateRequest { - private MenuName name; + private final MenuName name; - private MenuPrice price; + private final MenuPrice price; - private UUID menuGroupId; + private final UUID menuGroupId; - private DisplayedMenu displayed; + private final DisplayedMenu displayed; - private MenuProductCreateRequests menuProducts; + private final MenuProductCreateRequests menuProductCreateRequests; public MenuCreateRequest(MenuName name, MenuPrice price, UUID menuGroupId, DisplayedMenu displayed, - MenuProductCreateRequests menuProducts) { + MenuProductCreateRequests menuProductCreateRequests) { this.name = name; this.price = price; this.menuGroupId = menuGroupId; this.displayed = displayed; - this.menuProducts = menuProducts; + this.menuProductCreateRequests = menuProductCreateRequests; } public void validateName(ProfanityValidator profanityValidator) { profanityValidator.validate(name.getName()); } - public Menu to(MenuGroup menuGroup, MenuProducts menuProducts) { - return new Menu(name, price, menuGroup, displayed, menuProducts); + public Menu to(MenuGroup menuGroup, List products) { + List menuProducts = menuProductCreateRequests.toMenuProducts(products); + return new Menu(name, price, menuGroup, displayed, + new MenuProducts(menuProducts, products)); } public UUID getMenuGroupId() { return menuGroupId; } - public MenuProductCreateRequests getMenuProducts() { - return menuProducts; + public List getProductIds() { + return menuProductCreateRequests.getProductIds(); } public MenuPrice getPrice() { diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java index b9d0002e3..096ba6a46 100644 --- a/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java +++ b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java @@ -7,9 +7,9 @@ public class MenuProductCreateRequest { - private UUID productId; + private final UUID productId; - private ProductQuantity quantity; + private final ProductQuantity quantity; public MenuProductCreateRequest(UUID productId, ProductQuantity quantity) { this.productId = productId; diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java index e956fcd59..384815c48 100644 --- a/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java +++ b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java @@ -1,13 +1,15 @@ package kitchenpos.menus.application.dto; import java.util.List; +import java.util.NoSuchElementException; import java.util.Objects; import java.util.UUID; +import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.products.domain.tobe.Product; public class MenuProductCreateRequests { - private List menuProducts; + private final List menuProducts; public MenuProductCreateRequests(List menuProducts) { if (Objects.isNull(menuProducts) || menuProducts.isEmpty()) { @@ -23,10 +25,16 @@ public List getProductIds() { .toList(); } - public void validateMenuProducts(List products) { - if (products.size() != menuProducts.size()) { - throw new IllegalArgumentException(); - } + public List toMenuProducts(List products) { + return menuProducts.stream() + .map(menuProduct -> menuProduct.to(findProduct(products, menuProduct))) + .toList(); + } + + private Product findProduct(List products, MenuProductCreateRequest menuProduct) { + return products.stream() + .filter(product -> product.getId().equals(menuProduct.getProductId())) + .findFirst().orElseThrow((NoSuchElementException::new)); } public List getMenuProducts() { diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 7fcae3110..3564d1fa4 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -4,9 +4,9 @@ import java.util.List; import java.util.UUID; import kitchenpos.menus.application.MenuService; +import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; -import kitchenpos.menus.application.dto.MenuCreateRequest; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index 34ff1ee42..4aca4c984 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -3,14 +3,13 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; -import kitchenpos.menus.application.MenuProductsService; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.products.application.dto.ProductCreateRequest; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.ProfanityValidator; import kitchenpos.products.domain.tobe.Product; import kitchenpos.products.domain.tobe.ProductPrice; -import kitchenpos.products.application.dto.ProductCreateRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,19 +18,15 @@ public class ProductService { private final ProductRepository productRepository; private final MenuRepository menuRepository; - - private final MenuProductsService menuProductsService; private final ProfanityValidator profanityValidator; public ProductService( final ProductRepository productRepository, final MenuRepository menuRepository, - final MenuProductsService menuProductsService, final ProfanityValidator profanityValidator ) { this.productRepository = productRepository; this.menuRepository = menuRepository; - this.menuProductsService = menuProductsService; this.profanityValidator = profanityValidator; } diff --git a/src/main/java/kitchenpos/products/ui/ProductRestController.java b/src/main/java/kitchenpos/products/ui/ProductRestController.java index 5714e00f4..9ed3cbe0f 100644 --- a/src/main/java/kitchenpos/products/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/products/ui/ProductRestController.java @@ -4,9 +4,9 @@ import java.util.List; import java.util.UUID; import kitchenpos.products.application.ProductService; +import kitchenpos.products.application.dto.ProductCreateRequest; import kitchenpos.products.domain.tobe.Product; import kitchenpos.products.domain.tobe.ProductPrice; -import kitchenpos.products.application.dto.ProductCreateRequest; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/test/java/kitchenpos/fixture/MenuProductFixture.java b/src/test/java/kitchenpos/fixture/MenuProductFixture.java index b91d2c1ea..28d3dfbc6 100644 --- a/src/test/java/kitchenpos/fixture/MenuProductFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuProductFixture.java @@ -1,10 +1,10 @@ package kitchenpos.fixture; import java.util.List; -import kitchenpos.menus.domain.tobe.MenuProduct; -import kitchenpos.menus.domain.tobe.ProductQuantity; import kitchenpos.menus.application.dto.MenuProductCreateRequest; import kitchenpos.menus.application.dto.MenuProductCreateRequests; +import kitchenpos.menus.domain.tobe.MenuProduct; +import kitchenpos.menus.domain.tobe.ProductQuantity; import kitchenpos.products.domain.tobe.Product; public class MenuProductFixture { diff --git a/src/test/java/kitchenpos/fixture/ProductFixture.java b/src/test/java/kitchenpos/fixture/ProductFixture.java index 3efca42ac..3533a23a5 100644 --- a/src/test/java/kitchenpos/fixture/ProductFixture.java +++ b/src/test/java/kitchenpos/fixture/ProductFixture.java @@ -1,8 +1,8 @@ package kitchenpos.fixture; import java.math.BigDecimal; -import kitchenpos.products.domain.tobe.Product; import kitchenpos.products.application.dto.ProductCreateRequest; +import kitchenpos.products.domain.tobe.Product; public class ProductFixture { diff --git a/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java deleted file mode 100644 index e5a6bca11..000000000 --- a/src/test/java/kitchenpos/menus/application/MenuProductsServiceTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package kitchenpos.menus.application; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.util.List; -import java.util.UUID; -import kitchenpos.fake.InMemoryProductRepository; -import kitchenpos.fixture.MenuProductFixture; -import kitchenpos.fixture.ProductFixture; -import kitchenpos.menus.domain.tobe.MenuProducts; -import kitchenpos.menus.domain.tobe.ProductQuantity; -import kitchenpos.menus.application.dto.MenuProductCreateRequest; -import kitchenpos.menus.application.dto.MenuProductCreateRequests; -import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.domain.tobe.Product; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.DisplayNameGeneration; -import org.junit.jupiter.api.DisplayNameGenerator; -import org.junit.jupiter.api.Test; - -@DisplayName("MenuProductsService") -@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -class MenuProductsServiceTest { - - private ProductRepository productRepository = new InMemoryProductRepository(); - - private MenuProductsService menuProductsService; - - @BeforeEach - void setUp() { - menuProductsService = new MenuProductsService(productRepository); - } - - @Test - void 메뉴상품들을_생성한다() { - MenuProductCreateRequests createRequests = MenuProductFixture.createRequests( - createFriedProduct(), 2); - - MenuProducts actual = menuProductsService.create(createRequests); - - assertThat(actual).isNotEmpty(); - } - - @Test - void 메뉴상품들_생성시_메뉴상품들이_null일_경우_예외를_던진다() { - assertThatThrownBy(() -> menuProductsService.create(new MenuProductCreateRequests(null))) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 메뉴상품들_생성시_메뉴상품들이_비어있을_경우_예외를_던진다() { - assertThatThrownBy( - () -> menuProductsService.create(new MenuProductCreateRequests(List.of()))) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 메뉴상품들_생성시_없는_상품으로_생성하려_할_경우_예외를_던진다() { - MenuProductCreateRequests createRequests = new MenuProductCreateRequests( - List.of(new MenuProductCreateRequest(UUID.randomUUID(), new ProductQuantity(1)))); - - assertThatThrownBy( - () -> menuProductsService.create(createRequests)) - .isInstanceOf(IllegalArgumentException.class); - } - - private Product createFriedProduct() { - return productRepository.save(ProductFixture.createFired()); - } -} \ No newline at end of file diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 326359a1c..c18a123e4 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -16,10 +16,10 @@ import kitchenpos.fixture.ProductFixture; import kitchenpos.menugroups.domain.MenuGroupRepository; import kitchenpos.menugroups.domain.tobe.MenuGroup; +import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; -import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.ProfanityValidator; import kitchenpos.products.domain.tobe.Product; @@ -42,9 +42,8 @@ class MenuServiceTest { @BeforeEach void setUp() { - MenuProductsService menuProductService = new MenuProductsService(productRepository); - menuService = new MenuService(menuRepository, menuGroupRepository, profanityValidator, - menuProductService); + menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, + profanityValidator); } @Test diff --git a/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java b/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java index 22129ed10..acc7fe21d 100644 --- a/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java +++ b/src/test/java/kitchenpos/orders/store/domain/tobe/OrderTableTest.java @@ -53,7 +53,7 @@ class OrderTableTest { } @Test - void 점유되지않은_테이블의_손님수를_변경하면_예외를_던진다(){ + void 점유되지않은_테이블의_손님수를_변경하면_예외를_던진다() { OrderTable target = new OrderTable("1번테이블"); assertThatThrownBy(() -> target.changeNumberOfGuests(new NumberOfGuests(5))) @@ -61,7 +61,7 @@ class OrderTableTest { } @Test - void 점유된_테이블의_손님수를_변경할_수_있다(){ + void 점유된_테이블의_손님수를_변경할_수_있다() { OrderTable target = new OrderTable("1번테이블"); target.sit(); diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index b8368cb67..0ad72e78e 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -15,14 +15,13 @@ import kitchenpos.fixture.ProductFixture; import kitchenpos.menugroups.domain.MenuGroupRepository; import kitchenpos.menugroups.domain.tobe.MenuGroup; -import kitchenpos.menus.application.MenuProductsService; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.products.application.dto.ProductCreateRequest; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.ProfanityValidator; import kitchenpos.products.domain.tobe.Product; import kitchenpos.products.domain.tobe.ProductPrice; -import kitchenpos.products.application.dto.ProductCreateRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; @@ -47,9 +46,7 @@ class ProductServiceTest { @BeforeEach void setUp() { - MenuProductsService menuProductService = new MenuProductsService(productRepository); - productService = new ProductService(productRepository, menuRepository, menuProductService, - profanityValidator); + productService = new ProductService(productRepository, menuRepository, profanityValidator); } @Test From 74024f73d76dc233a2908c1b45f6625f61ae3857 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sun, 23 Jun 2024 03:18:31 +0900 Subject: [PATCH 32/42] =?UTF-8?q?refactor(MenuProduct):=20=EC=95=88?= =?UTF-8?q?=EC=93=B0=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/application/dto/MenuProductCreateRequests.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java index 384815c48..5fc5118bc 100644 --- a/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java +++ b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java @@ -36,8 +36,4 @@ private Product findProduct(List products, MenuProductCreateRequest men .filter(product -> product.getId().equals(menuProduct.getProductId())) .findFirst().orElseThrow((NoSuchElementException::new)); } - - public List getMenuProducts() { - return menuProducts; - } } From b93eb1a2bcfac773c9a2b0078984ce4f7a71b2f8 Mon Sep 17 00:00:00 2001 From: hoa0217 Date: Sun, 23 Jun 2024 03:26:13 +0900 Subject: [PATCH 33/42] =?UTF-8?q?feat(StoreOrder):=20Controller=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 --- .../store/ui/StoreOrderRestController.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/main/java/kitchenpos/orders/store/ui/StoreOrderRestController.java diff --git a/src/main/java/kitchenpos/orders/store/ui/StoreOrderRestController.java b/src/main/java/kitchenpos/orders/store/ui/StoreOrderRestController.java new file mode 100644 index 000000000..964746976 --- /dev/null +++ b/src/main/java/kitchenpos/orders/store/ui/StoreOrderRestController.java @@ -0,0 +1,54 @@ +package kitchenpos.orders.store.ui; + +import java.net.URI; +import java.util.List; +import java.util.UUID; +import kitchenpos.orders.store.application.StoreOrderService; +import kitchenpos.orders.store.application.dto.StoreOrderCreateRequest; +import kitchenpos.orders.store.domain.tobe.StoreOrder; +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/store-orders") +@RestController +public class StoreOrderRestController { + + private final StoreOrderService storeOrderService; + + public StoreOrderRestController(final StoreOrderService storeOrderService) { + this.storeOrderService = storeOrderService; + } + + @PostMapping + public ResponseEntity create(@RequestBody final StoreOrderCreateRequest request) { + StoreOrder response = storeOrderService.create(request); + return ResponseEntity.created(URI.create("/api/store-orders/" + response.getId())) + .body(response); + } + + @PutMapping("/{orderId}/accept") + public ResponseEntity accept(@PathVariable final UUID orderId) { + return ResponseEntity.ok(storeOrderService.accept(orderId)); + } + + @PutMapping("/{orderId}/serve") + public ResponseEntity serve(@PathVariable final UUID orderId) { + return ResponseEntity.ok(storeOrderService.serve(orderId)); + } + + @PutMapping("/{orderId}/complete") + public ResponseEntity complete(@PathVariable final UUID orderId) { + return ResponseEntity.ok(storeOrderService.complete(orderId)); + } + + @GetMapping + public ResponseEntity> findAll() { + return ResponseEntity.ok(storeOrderService.findAll()); + } +} From 9873af72b5e1db625d0625ae664795c347e837b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Tue, 2 Jul 2024 15:17:52 +0900 Subject: [PATCH 34/42] =?UTF-8?q?feat(MenuProductValidator):=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=EC=83=81=ED=92=88=EC=9D=84=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/tobe/MenuProductValidator.java | 23 ++++++++ .../menus/domain/tobe/MenuProducts.java | 26 +++------- .../java/kitchenpos/fixture/MenuFixture.java | 4 +- .../domain/tobe/MenuProductValidatorTest.java | 52 +++++++++++++++++++ .../menus/domain/tobe/MenuProductsTest.java | 16 ++---- 5 files changed, 87 insertions(+), 34 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/domain/tobe/MenuProductValidator.java create mode 100644 src/test/java/kitchenpos/menus/domain/tobe/MenuProductValidatorTest.java diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProductValidator.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProductValidator.java new file mode 100644 index 000000000..8bf3e351e --- /dev/null +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProductValidator.java @@ -0,0 +1,23 @@ +package kitchenpos.menus.domain.tobe; + +import java.util.List; +import kitchenpos.products.domain.tobe.Product; +import org.springframework.stereotype.Component; + +@Component +public class MenuProductValidator { + + public void validate(List menuProducts, List products) { + if (menuProducts == null || products == null) { + throw new IllegalArgumentException(); + } + + if (menuProducts.isEmpty() || products.isEmpty()) { + throw new IllegalArgumentException(); + } + + if (products.size() != menuProducts.size()) { + throw new IllegalArgumentException(); + } + } +} diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java index 7843dea03..36d046cff 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java @@ -9,7 +9,6 @@ import java.util.Iterator; import java.util.List; import java.util.stream.Stream; -import kitchenpos.products.domain.tobe.Product; import org.jetbrains.annotations.NotNull; @Embeddable @@ -17,33 +16,22 @@ public class MenuProducts implements Iterable { @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; protected MenuProducts() { } - public MenuProducts(List menuProducts, List products) { - validateMenuProducts(menuProducts, products); - this.menuProducts = menuProducts; - } - - private void validateMenuProducts(List menuProducts, List products) { - if (menuProducts == null || products == null) { + public MenuProducts(List menuProducts) { + if (menuProducts == null || menuProducts.isEmpty()) { throw new IllegalArgumentException(); } - if (products.size() != menuProducts.size()) { - throw new IllegalArgumentException(); - } - - if (menuProducts.isEmpty()) { - throw new IllegalArgumentException(); - } + this.menuProducts = menuProducts; } public BigDecimal calculateSumPrice() { diff --git a/src/test/java/kitchenpos/fixture/MenuFixture.java b/src/test/java/kitchenpos/fixture/MenuFixture.java index d0ae6fd09..6f1de7946 100644 --- a/src/test/java/kitchenpos/fixture/MenuFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuFixture.java @@ -56,7 +56,7 @@ public static Menu createFriedOnePlusOne(MenuGroup menuGroup, Product product, L MenuPrice menuPrice = new MenuPrice(BigDecimal.valueOf(price)); DisplayedMenu displayedMenu = new DisplayedMenu(true); MenuProducts menuProducts = new MenuProducts( - List.of(new MenuProduct(product, new ProductQuantity(2))), List.of(product)); + List.of(new MenuProduct(product, new ProductQuantity(2)))); return new Menu(menuName, menuPrice, menuGroup, displayedMenu, menuProducts); } @@ -66,7 +66,7 @@ public static Menu SeasonedOnePlusOne(MenuGroup menuGroup, Product product) { MenuPrice menuPrice = new MenuPrice(BigDecimal.valueOf(35_000L)); DisplayedMenu displayedMenu = new DisplayedMenu(true); MenuProducts menuProducts = new MenuProducts( - List.of(new MenuProduct(product, new ProductQuantity(2))), List.of(product)); + List.of(new MenuProduct(product, new ProductQuantity(2)))); return new Menu(menuName, menuPrice, menuGroup, displayedMenu, menuProducts); } diff --git a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductValidatorTest.java b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductValidatorTest.java new file mode 100644 index 000000000..f78d13a7c --- /dev/null +++ b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductValidatorTest.java @@ -0,0 +1,52 @@ +package kitchenpos.menus.domain.tobe; + +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import kitchenpos.fixture.ProductFixture; +import kitchenpos.products.domain.tobe.Product; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +@DisplayName("MenuProductValidator") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +class MenuProductValidatorTest { + + private final MenuProductValidator menuProductValidator = new MenuProductValidator(); + + @Test + void 메뉴상품들이_null일_경우_검증을_실패한다() { + assertThatThrownBy( + () -> menuProductValidator.validate(null, null)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 메뉴상품들이_비어있을_경우_검증을_실패한다() { + assertThatThrownBy( + () -> menuProductValidator.validate(List.of(), List.of())) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 메뉴상품들에_메뉴가_중복되면_검증을_실패한다() { + Product product = ProductFixture.createFired(20_000L); + MenuProduct menuProduct = new MenuProduct(product, 2); + + assertThatThrownBy( + () -> menuProductValidator.validate(List.of(menuProduct, menuProduct), + List.of(product))) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 메뉴상품들의_검증을_성공한다() { + Product product = ProductFixture.createFired(20_000L); + assertThatNoException().isThrownBy(() -> menuProductValidator.validate( + List.of(new MenuProduct(product, 2)), List.of(product)) + ); + } +} \ No newline at end of file diff --git a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java index 8507a5e98..9d6ddb79b 100644 --- a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java +++ b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductsTest.java @@ -18,24 +18,14 @@ class MenuProductsTest { @Test void 메뉴상품들이_null일_경우_예외를_던진다() { assertThatThrownBy( - () -> new MenuProducts(null, null)) + () -> new MenuProducts(null)) .isInstanceOf(IllegalArgumentException.class); } @Test void 메뉴상품들이_비어있을_경우_예외를_던진다() { assertThatThrownBy( - () -> new MenuProducts(List.of(), List.of())) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 메뉴상품들에_메뉴가_중복되면_예외를_던진다() { - Product product = ProductFixture.createFired(20_000L); - MenuProduct menuProduct = new MenuProduct(product, 2); - - assertThatThrownBy( - () -> new MenuProducts(List.of(menuProduct, menuProduct), List.of(product))) + () -> new MenuProducts(List.of())) .isInstanceOf(IllegalArgumentException.class); } @@ -43,7 +33,7 @@ class MenuProductsTest { void 메뉴상품들을_생성할_수_있다() { Product product = ProductFixture.createFired(20_000L); assertThatNoException().isThrownBy(() -> new MenuProducts( - List.of(new MenuProduct(product, 2)), List.of(product)) + List.of(new MenuProduct(product, 2))) ); } } \ No newline at end of file From 338db6284f65241a4f54a79ad9faa2010a9781d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Tue, 2 Jul 2024 15:21:10 +0900 Subject: [PATCH 35/42] =?UTF-8?q?refactor(MenuProductMapper):=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=EC=9D=84=20=EB=B0=9B=EC=95=84=20=EB=A9=94=EB=89=B4=20?= =?UTF-8?q?=EC=83=81=ED=92=88=EC=9D=84=20=EC=83=9D=EC=84=B1=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=96=B4=ED=94=8C=EB=A6=AC=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dto의 엔티티 생성로직 제거 --- .../menus/application/MenuProductMapper.java | 62 ++++++++++++++ .../menus/application/MenuService.java | 41 +++++----- .../application/dto/MenuCreateRequest.java | 54 ++----------- .../dto/MenuProductCreateRequest.java | 26 +----- .../dto/MenuProductCreateRequests.java | 39 --------- .../dto/MenuProductsCreateRequest.java | 8 ++ .../java/kitchenpos/fixture/MenuFixture.java | 16 ++-- .../fixture/MenuProductFixture.java | 6 +- .../menus/application/MenuServiceTest.java | 81 ++++++++++--------- 9 files changed, 151 insertions(+), 182 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/application/MenuProductMapper.java delete mode 100644 src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java create mode 100644 src/main/java/kitchenpos/menus/application/dto/MenuProductsCreateRequest.java diff --git a/src/main/java/kitchenpos/menus/application/MenuProductMapper.java b/src/main/java/kitchenpos/menus/application/MenuProductMapper.java new file mode 100644 index 000000000..fc3926073 --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/MenuProductMapper.java @@ -0,0 +1,62 @@ +package kitchenpos.menus.application; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import kitchenpos.menus.application.dto.MenuProductCreateRequest; +import kitchenpos.menus.application.dto.MenuProductsCreateRequest; +import kitchenpos.menus.domain.tobe.MenuProduct; +import kitchenpos.menus.domain.tobe.MenuProductValidator; +import kitchenpos.menus.domain.tobe.MenuProducts; +import kitchenpos.menus.domain.tobe.ProductQuantity; +import kitchenpos.products.domain.ProductRepository; +import kitchenpos.products.domain.tobe.Product; +import org.springframework.stereotype.Component; + +@Component +public class MenuProductMapper { + + private final ProductRepository productRepository; + private final MenuProductValidator menuProductValidator; + + public MenuProductMapper(ProductRepository productRepository, + MenuProductValidator menuProductValidator) { + this.productRepository = productRepository; + this.menuProductValidator = menuProductValidator; + } + + public MenuProducts map(MenuProductsCreateRequest request) { + List productIds = request.menuProducts() + .stream().map(MenuProductCreateRequest::productId) + .toList(); + + List products = productRepository.findAllByIdIn(productIds); + List menuProducts = createMenuProducts(request, products); + menuProductValidator.validate(menuProducts, products); + return new MenuProducts(menuProducts); + } + + private List createMenuProducts(MenuProductsCreateRequest menuProducts, + List products) { + return menuProducts.menuProducts() + .stream() + .map(menuProduct -> createMenuProduct(products, + menuProduct.productId(), + menuProduct.quantity()) + ) + .toList(); + } + + private MenuProduct createMenuProduct(List products, + UUID productId, + ProductQuantity quantity) { + Product product = findProduct(products, productId); + return new MenuProduct(product, quantity); + } + + private Product findProduct(List products, UUID productId) { + return products.stream() + .filter(product -> product.getId().equals(productId)) + .findFirst().orElseThrow((NoSuchElementException::new)); + } +} diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 5710c11cc..af777029d 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -9,9 +9,8 @@ import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; -import kitchenpos.products.domain.ProductRepository; +import kitchenpos.menus.domain.tobe.MenuProducts; import kitchenpos.products.domain.ProfanityValidator; -import kitchenpos.products.domain.tobe.Product; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,30 +19,34 @@ public class MenuService { private final MenuRepository menuRepository; private final MenuGroupRepository menuGroupRepository; - - private final ProductRepository productRepository; private final ProfanityValidator profanityValidator; + private final MenuProductMapper menuProductMapper; - public MenuService( - final MenuRepository menuRepository, - final MenuGroupRepository menuGroupRepository, - ProductRepository productRepository, - final ProfanityValidator profanityValidator - ) { + public MenuService(MenuRepository menuRepository, MenuGroupRepository menuGroupRepository, + ProfanityValidator profanityValidator, MenuProductMapper menuProductMapper) { this.menuRepository = menuRepository; this.menuGroupRepository = menuGroupRepository; - this.productRepository = productRepository; this.profanityValidator = profanityValidator; + this.menuProductMapper = menuProductMapper; } @Transactional public Menu create(final MenuCreateRequest request) { - request.validateName(profanityValidator); - final MenuGroup menuGroup = findMenuGroup(request.getMenuGroupId()); - List products = findProducts(request.getProductIds()); - return menuRepository.save(request.to(menuGroup, products)); + profanityValidator.validate(request.name().getName()); + final MenuGroup menuGroup = findMenuGroup(request.menuGroupId()); + final MenuProducts menuProducts = menuProductMapper.map( + request.menuProductsCreateRequest()); + + final Menu menu = new Menu( + request.name(), + request.price(), + menuGroup, + request.displayed(), + menuProducts); + return menuRepository.save(menu); } + @Transactional public Menu changePrice(final UUID menuId, final MenuPrice request) { final Menu menu = findMenu(menuId); @@ -72,15 +75,11 @@ public List findAll() { private MenuGroup findMenuGroup(UUID menuGroupId) { return menuGroupRepository.findById(menuGroupId) - .orElseThrow(NoSuchElementException::new); - } - - private List findProducts(List productIds) { - return productRepository.findAllByIdIn(productIds); + .orElseThrow(NoSuchElementException::new); } private Menu findMenu(UUID menuId) { return menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); } } diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java index 979ff3ab0..1b0935aeb 100644 --- a/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java +++ b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java @@ -1,58 +1,14 @@ package kitchenpos.menus.application.dto; -import java.util.List; import java.util.UUID; -import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.domain.tobe.DisplayedMenu; -import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuName; import kitchenpos.menus.domain.tobe.MenuPrice; -import kitchenpos.menus.domain.tobe.MenuProduct; -import kitchenpos.menus.domain.tobe.MenuProducts; -import kitchenpos.products.domain.ProfanityValidator; -import kitchenpos.products.domain.tobe.Product; -public class MenuCreateRequest { +public record MenuCreateRequest(MenuName name, + MenuPrice price, + UUID menuGroupId, + DisplayedMenu displayed, + MenuProductsCreateRequest menuProductsCreateRequest) { - private final MenuName name; - - private final MenuPrice price; - - private final UUID menuGroupId; - - private final DisplayedMenu displayed; - - private final MenuProductCreateRequests menuProductCreateRequests; - - public MenuCreateRequest(MenuName name, MenuPrice price, UUID menuGroupId, - DisplayedMenu displayed, - MenuProductCreateRequests menuProductCreateRequests) { - this.name = name; - this.price = price; - this.menuGroupId = menuGroupId; - this.displayed = displayed; - this.menuProductCreateRequests = menuProductCreateRequests; - } - - public void validateName(ProfanityValidator profanityValidator) { - profanityValidator.validate(name.getName()); - } - - public Menu to(MenuGroup menuGroup, List products) { - List menuProducts = menuProductCreateRequests.toMenuProducts(products); - return new Menu(name, price, menuGroup, displayed, - new MenuProducts(menuProducts, products)); - } - - public UUID getMenuGroupId() { - return menuGroupId; - } - - public List getProductIds() { - return menuProductCreateRequests.getProductIds(); - } - - public MenuPrice getPrice() { - return price; - } } diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java index 096ba6a46..61621f6d0 100644 --- a/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java +++ b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequest.java @@ -1,30 +1,10 @@ package kitchenpos.menus.application.dto; +import jakarta.validation.constraints.NotNull; import java.util.UUID; -import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.menus.domain.tobe.ProductQuantity; -import kitchenpos.products.domain.tobe.Product; -public class MenuProductCreateRequest { +public record MenuProductCreateRequest(@NotNull UUID productId, + @NotNull ProductQuantity quantity) { - private final UUID productId; - - private final ProductQuantity quantity; - - public MenuProductCreateRequest(UUID productId, ProductQuantity quantity) { - this.productId = productId; - this.quantity = quantity; - } - - public MenuProduct to(Product product) { - return new MenuProduct(product, quantity); - } - - public UUID getProductId() { - return productId; - } - - public ProductQuantity getQuantity() { - return quantity; - } } diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java b/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java deleted file mode 100644 index 5fc5118bc..000000000 --- a/src/main/java/kitchenpos/menus/application/dto/MenuProductCreateRequests.java +++ /dev/null @@ -1,39 +0,0 @@ -package kitchenpos.menus.application.dto; - -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.UUID; -import kitchenpos.menus.domain.tobe.MenuProduct; -import kitchenpos.products.domain.tobe.Product; - -public class MenuProductCreateRequests { - - private final List menuProducts; - - public MenuProductCreateRequests(List menuProducts) { - if (Objects.isNull(menuProducts) || menuProducts.isEmpty()) { - throw new IllegalArgumentException(); - } - - this.menuProducts = menuProducts; - } - - public List getProductIds() { - return menuProducts.stream() - .map(MenuProductCreateRequest::getProductId) - .toList(); - } - - public List toMenuProducts(List products) { - return menuProducts.stream() - .map(menuProduct -> menuProduct.to(findProduct(products, menuProduct))) - .toList(); - } - - private Product findProduct(List products, MenuProductCreateRequest menuProduct) { - return products.stream() - .filter(product -> product.getId().equals(menuProduct.getProductId())) - .findFirst().orElseThrow((NoSuchElementException::new)); - } -} diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuProductsCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuProductsCreateRequest.java new file mode 100644 index 000000000..4fe086582 --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/dto/MenuProductsCreateRequest.java @@ -0,0 +1,8 @@ +package kitchenpos.menus.application.dto; + +import jakarta.validation.constraints.NotEmpty; +import java.util.List; + +public record MenuProductsCreateRequest(@NotEmpty List menuProducts) { + +} diff --git a/src/test/java/kitchenpos/fixture/MenuFixture.java b/src/test/java/kitchenpos/fixture/MenuFixture.java index 6f1de7946..c543098ab 100644 --- a/src/test/java/kitchenpos/fixture/MenuFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuFixture.java @@ -4,7 +4,7 @@ import java.util.List; import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.application.dto.MenuCreateRequest; -import kitchenpos.menus.application.dto.MenuProductCreateRequests; +import kitchenpos.menus.application.dto.MenuProductsCreateRequest; import kitchenpos.menus.domain.tobe.DisplayedMenu; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuName; @@ -17,27 +17,27 @@ public class MenuFixture { public static MenuCreateRequest createRequest(Long price, MenuGroup menuGroup, Product product, - Integer quantity) { + Integer quantity) { return createRequest("후라이드1+1", price, menuGroup, true, product, quantity); } public static MenuCreateRequest createRequest(String name, Long price, MenuGroup menuGroup, - Product product, - Integer quantity) { + Product product, + Integer quantity) { return createRequest(name, price, menuGroup, true, product, quantity); } public static MenuCreateRequest createRequest(String name, Long price, MenuGroup menuGroup, - Boolean displayed, Product product, Integer quantity) { + Boolean displayed, Product product, Integer quantity) { MenuName menuName = new MenuName(name); MenuPrice menuPrice = new MenuPrice(BigDecimal.valueOf(price)); DisplayedMenu displayedMenu = new DisplayedMenu(displayed); - MenuProductCreateRequests menuProducts = MenuProductFixture.createRequests(product, - quantity); + MenuProductsCreateRequest menuProducts = MenuProductFixture.createRequests(product, + quantity); if (menuGroup != null) { return new MenuCreateRequest(menuName, menuPrice, menuGroup.getId(), displayedMenu, - menuProducts); + menuProducts); } return new MenuCreateRequest(menuName, menuPrice, null, displayedMenu, menuProducts); diff --git a/src/test/java/kitchenpos/fixture/MenuProductFixture.java b/src/test/java/kitchenpos/fixture/MenuProductFixture.java index 28d3dfbc6..b34548138 100644 --- a/src/test/java/kitchenpos/fixture/MenuProductFixture.java +++ b/src/test/java/kitchenpos/fixture/MenuProductFixture.java @@ -2,15 +2,15 @@ import java.util.List; import kitchenpos.menus.application.dto.MenuProductCreateRequest; -import kitchenpos.menus.application.dto.MenuProductCreateRequests; +import kitchenpos.menus.application.dto.MenuProductsCreateRequest; import kitchenpos.menus.domain.tobe.MenuProduct; import kitchenpos.menus.domain.tobe.ProductQuantity; import kitchenpos.products.domain.tobe.Product; public class MenuProductFixture { - public static MenuProductCreateRequests createRequests(Product product, Integer quantity) { - return new MenuProductCreateRequests( + public static MenuProductsCreateRequest createRequests(Product product, Integer quantity) { + return new MenuProductsCreateRequest( List.of(new MenuProductCreateRequest(product.getId(), new ProductQuantity(quantity)))); } diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index c18a123e4..53d3c10b2 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -20,6 +20,7 @@ import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; +import kitchenpos.menus.domain.tobe.MenuProductValidator; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.ProfanityValidator; import kitchenpos.products.domain.tobe.Product; @@ -33,24 +34,26 @@ @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class MenuServiceTest { - private MenuRepository menuRepository = new InMemoryMenuRepository(); - private MenuGroupRepository menuGroupRepository = new InMemoryMenuGroupRepository(); - private ProductRepository productRepository = new InMemoryProductRepository(); - private ProfanityValidator profanityValidator = new FakeProfanityValidator(); + private final MenuRepository menuRepository = new InMemoryMenuRepository(); + private final MenuGroupRepository menuGroupRepository = new InMemoryMenuGroupRepository(); + private final ProductRepository productRepository = new InMemoryProductRepository(); + private final ProfanityValidator profanityValidator = new FakeProfanityValidator(); private MenuService menuService; @BeforeEach void setUp() { - menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, - profanityValidator); + final MenuProductMapper menuProductMapper = new MenuProductMapper(productRepository, + new MenuProductValidator()); + menuService = new MenuService(menuRepository, menuGroupRepository, profanityValidator, + menuProductMapper); } @Test void 상품들을_조합하여_메뉴를_생성한다() { MenuCreateRequest createRequest = MenuFixture.createRequest(30_000L, - createChickenMenuGroup(), - createFriedProduct(), 2); + createChickenMenuGroup(), + createFriedProduct(), 2); Menu actual = menuService.create(createRequest); @@ -60,8 +63,8 @@ void setUp() { @Test void 메뉴에_상품이_1개_이상_존재하지_않으면_예외를_던진다() { MenuCreateRequest createRequest = MenuFixture.createRequest(30_000L, - createChickenMenuGroup(), - createFriedProduct(), 0); + createChickenMenuGroup(), + createFriedProduct(), 0); assertThatIllegalArgumentException().isThrownBy(() -> menuService.create(createRequest)); } @@ -70,8 +73,8 @@ void setUp() { @Test void 메뉴이름에_욕설이나_부적절한_언어를_사용하면_예외를_던진다() { MenuCreateRequest createRequest = MenuFixture.createRequest("욕설", 30_000L, - createChickenMenuGroup(), - createFriedProduct(), 2); + createChickenMenuGroup(), + createFriedProduct(), 2); assertThatIllegalArgumentException().isThrownBy(() -> menuService.create(createRequest)); } @@ -79,38 +82,38 @@ void setUp() { @Test void 메뉴는_메뉴그룹에_속하지않으면_예외를_던진다() { MenuCreateRequest createRequest = MenuFixture.createRequest(30_000L, null, - createFriedProduct(), 2); + createFriedProduct(), 2); assertThatThrownBy(() -> menuService.create(createRequest)).isInstanceOf( - NoSuchElementException.class); + NoSuchElementException.class); } @Test void 메뉴가격은_0보다_작으면_예외를_던진다() { assertThatThrownBy(() -> menuService.create( - MenuFixture.createRequest(-20_000L, createChickenMenuGroup(), - createFriedProduct(), 2))).isInstanceOf( - IllegalArgumentException.class); + MenuFixture.createRequest(-20_000L, createChickenMenuGroup(), + createFriedProduct(), 2))).isInstanceOf( + IllegalArgumentException.class); } @Test void 메뉴가격은_상품가격x상품갯수의_총합을_넘으면_예외를_던진다() { MenuCreateRequest createRequest = MenuFixture.createRequest(50_000L, - createChickenMenuGroup(), - createFriedProduct(), 2); + createChickenMenuGroup(), + createFriedProduct(), 2); assertThatThrownBy(() -> menuService.create(createRequest)).isInstanceOf( - IllegalArgumentException.class); + IllegalArgumentException.class); } @Test void 메뉴가격을_수정한다() { Menu saved = menuService.create( - MenuFixture.createRequest(30_000L, createChickenMenuGroup(), createFriedProduct(), - 2)); + MenuFixture.createRequest(30_000L, createChickenMenuGroup(), createFriedProduct(), + 2)); Menu actual = menuService.changePrice(saved.getId(), - new MenuPrice(BigDecimal.valueOf(40_000L))); + new MenuPrice(BigDecimal.valueOf(40_000L))); assertThat(actual.getPrice()).isEqualTo(BigDecimal.valueOf(40_000L)); } @@ -118,30 +121,30 @@ void setUp() { @Test void 메뉴가격_수정시_0보다_작으면_예외를_던진다() { Menu saved = menuService.create( - MenuFixture.createRequest(30_000L, createChickenMenuGroup(), createFriedProduct(), - 2)); + MenuFixture.createRequest(30_000L, createChickenMenuGroup(), createFriedProduct(), + 2)); assertThatThrownBy(() -> menuService.changePrice(saved.getId(), - new MenuPrice(BigDecimal.valueOf(-40_000L)))).isInstanceOf( - IllegalArgumentException.class); + new MenuPrice(BigDecimal.valueOf(-40_000L)))).isInstanceOf( + IllegalArgumentException.class); } @Test void 메뉴가격_수정시_상품가격x상품갯수의_총합을_넘으면_예외를_던진다() { Menu saved = menuService.create( - MenuFixture.createRequest(30_000L, createChickenMenuGroup(), createFriedProduct(), - 2)); + MenuFixture.createRequest(30_000L, createChickenMenuGroup(), createFriedProduct(), + 2)); assertThatThrownBy(() -> menuService.changePrice(saved.getId(), - MenuFixture.changePriceRequest(50_000L))).isInstanceOf( - IllegalArgumentException.class); + MenuFixture.changePriceRequest(50_000L))).isInstanceOf( + IllegalArgumentException.class); } @Test void 메뉴를_손님들에게_노출한다() { Menu saved = menuService.create( - MenuFixture.createRequest(30_000L, createChickenMenuGroup(), createFriedProduct(), - 2)); + MenuFixture.createRequest(30_000L, createChickenMenuGroup(), createFriedProduct(), + 2)); Menu actual = menuService.display(saved.getId()); @@ -151,8 +154,8 @@ void setUp() { @Test void 메뉴를_손님들에게_숨긴다() { Menu saved = menuService.create( - MenuFixture.createRequest(30_000L, createChickenMenuGroup(), createFriedProduct(), - 2)); + MenuFixture.createRequest(30_000L, createChickenMenuGroup(), createFriedProduct(), + 2)); Menu actual = menuService.hide(saved.getId()); @@ -162,11 +165,11 @@ void setUp() { @Test void 모든_메뉴_목록을_볼_수_있다() { menuService.create( - MenuFixture.createRequest("후라이드2마리", 30_000L, createChickenMenuGroup(), - createFriedProduct(), 2)); + MenuFixture.createRequest("후라이드2마리", 30_000L, createChickenMenuGroup(), + createFriedProduct(), 2)); menuService.create( - MenuFixture.createRequest("후라이드1마리", 20_000L, createChickenMenuGroup(), - createFriedProduct(), 1)); + MenuFixture.createRequest("후라이드1마리", 20_000L, createChickenMenuGroup(), + createFriedProduct(), 1)); List actual = menuService.findAll(); From 9074bc6a28b030b8f18f655ff0c8a2a7a4209cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Tue, 2 Jul 2024 15:24:28 +0900 Subject: [PATCH 36/42] =?UTF-8?q?refactor(MenuProducts):=20stream=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kitchenpos/menus/domain/tobe/Menu.java | 10 ++++++---- .../kitchenpos/menus/domain/tobe/MenuProducts.java | 5 ----- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java index 5ccad9b75..cfde31640 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/Menu.java @@ -36,7 +36,7 @@ protected Menu() { } public Menu(MenuName name, MenuPrice price, MenuGroup menuGroup, DisplayedMenu displayed, - MenuProducts menuProducts) { + MenuProducts menuProducts) { validateMenuPrice(price, menuProducts); this.id = UUID.randomUUID(); this.name = name; @@ -75,9 +75,11 @@ public void hide() { } public void changeMenuProductPrice(UUID productId, ProductPrice price) { - menuProducts.stream() - .filter(menuProduct -> menuProduct.getProductId().equals(productId)) - .forEach(menuProduct -> menuProduct.changePrice(price)); + for (MenuProduct menuProduct : menuProducts) { + if (menuProduct.getProductId().equals(productId)) { + menuProduct.changePrice(price); + } + } if (isOverThanProductSumPrice()) { hide(); diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java index 36d046cff..fa1484c55 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProducts.java @@ -8,7 +8,6 @@ import java.math.BigDecimal; import java.util.Iterator; import java.util.List; -import java.util.stream.Stream; import org.jetbrains.annotations.NotNull; @Embeddable @@ -47,8 +46,4 @@ public BigDecimal calculateSumPrice() { public Iterator iterator() { return menuProducts.iterator(); } - - public Stream stream() { - return menuProducts.stream(); - } } From ebd1a62da2b31604c002111938b98583a37295ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Tue, 2 Jul 2024 17:06:03 +0900 Subject: [PATCH 37/42] =?UTF-8?q?refactor(MenuProductsValidator):=20MenuPr?= =?UTF-8?q?oductValidator=20->=20MenuProductsValidator=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/application/MenuProductMapper.java | 10 +++++----- ...roductValidator.java => MenuProductsValidator.java} | 2 +- .../kitchenpos/menus/application/MenuServiceTest.java | 4 ++-- .../menus/domain/tobe/MenuProductValidatorTest.java | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) rename src/main/java/kitchenpos/menus/domain/tobe/{MenuProductValidator.java => MenuProductsValidator.java} (94%) diff --git a/src/main/java/kitchenpos/menus/application/MenuProductMapper.java b/src/main/java/kitchenpos/menus/application/MenuProductMapper.java index fc3926073..4c760ea0c 100644 --- a/src/main/java/kitchenpos/menus/application/MenuProductMapper.java +++ b/src/main/java/kitchenpos/menus/application/MenuProductMapper.java @@ -6,7 +6,7 @@ import kitchenpos.menus.application.dto.MenuProductCreateRequest; import kitchenpos.menus.application.dto.MenuProductsCreateRequest; import kitchenpos.menus.domain.tobe.MenuProduct; -import kitchenpos.menus.domain.tobe.MenuProductValidator; +import kitchenpos.menus.domain.tobe.MenuProductsValidator; import kitchenpos.menus.domain.tobe.MenuProducts; import kitchenpos.menus.domain.tobe.ProductQuantity; import kitchenpos.products.domain.ProductRepository; @@ -17,12 +17,12 @@ public class MenuProductMapper { private final ProductRepository productRepository; - private final MenuProductValidator menuProductValidator; + private final MenuProductsValidator menuProductsValidator; public MenuProductMapper(ProductRepository productRepository, - MenuProductValidator menuProductValidator) { + MenuProductsValidator menuProductValidator) { this.productRepository = productRepository; - this.menuProductValidator = menuProductValidator; + this.menuProductsValidator = menuProductValidator; } public MenuProducts map(MenuProductsCreateRequest request) { @@ -32,7 +32,7 @@ public MenuProducts map(MenuProductsCreateRequest request) { List products = productRepository.findAllByIdIn(productIds); List menuProducts = createMenuProducts(request, products); - menuProductValidator.validate(menuProducts, products); + menuProductsValidator.validate(menuProducts, products); return new MenuProducts(menuProducts); } diff --git a/src/main/java/kitchenpos/menus/domain/tobe/MenuProductValidator.java b/src/main/java/kitchenpos/menus/domain/tobe/MenuProductsValidator.java similarity index 94% rename from src/main/java/kitchenpos/menus/domain/tobe/MenuProductValidator.java rename to src/main/java/kitchenpos/menus/domain/tobe/MenuProductsValidator.java index 8bf3e351e..843120afd 100644 --- a/src/main/java/kitchenpos/menus/domain/tobe/MenuProductValidator.java +++ b/src/main/java/kitchenpos/menus/domain/tobe/MenuProductsValidator.java @@ -5,7 +5,7 @@ import org.springframework.stereotype.Component; @Component -public class MenuProductValidator { +public class MenuProductsValidator { public void validate(List menuProducts, List products) { if (menuProducts == null || products == null) { diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 53d3c10b2..4e1786c34 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -20,7 +20,7 @@ import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.menus.domain.tobe.MenuPrice; -import kitchenpos.menus.domain.tobe.MenuProductValidator; +import kitchenpos.menus.domain.tobe.MenuProductsValidator; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.domain.ProfanityValidator; import kitchenpos.products.domain.tobe.Product; @@ -44,7 +44,7 @@ class MenuServiceTest { @BeforeEach void setUp() { final MenuProductMapper menuProductMapper = new MenuProductMapper(productRepository, - new MenuProductValidator()); + new MenuProductsValidator()); menuService = new MenuService(menuRepository, menuGroupRepository, profanityValidator, menuProductMapper); } diff --git a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductValidatorTest.java b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductValidatorTest.java index f78d13a7c..01f0fefda 100644 --- a/src/test/java/kitchenpos/menus/domain/tobe/MenuProductValidatorTest.java +++ b/src/test/java/kitchenpos/menus/domain/tobe/MenuProductValidatorTest.java @@ -15,7 +15,7 @@ @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class MenuProductValidatorTest { - private final MenuProductValidator menuProductValidator = new MenuProductValidator(); + private final MenuProductsValidator menuProductValidator = new MenuProductsValidator(); @Test void 메뉴상품들이_null일_경우_검증을_실패한다() { From 04a035988d18a7e604c743a3c804c0f0e2b2b14e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Tue, 2 Jul 2024 17:07:07 +0900 Subject: [PATCH 38/42] =?UTF-8?q?refactor(MenuCreateRequest):=20Validation?= =?UTF-8?q?=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=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 --- .../menus/application/dto/MenuCreateRequest.java | 11 ++++++----- .../java/kitchenpos/menus/ui/MenuRestController.java | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java index 1b0935aeb..82187864c 100644 --- a/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java +++ b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java @@ -1,14 +1,15 @@ package kitchenpos.menus.application.dto; +import jakarta.validation.constraints.NotNull; import java.util.UUID; import kitchenpos.menus.domain.tobe.DisplayedMenu; import kitchenpos.menus.domain.tobe.MenuName; import kitchenpos.menus.domain.tobe.MenuPrice; -public record MenuCreateRequest(MenuName name, - MenuPrice price, - UUID menuGroupId, - DisplayedMenu displayed, - MenuProductsCreateRequest menuProductsCreateRequest) { +public record MenuCreateRequest(@NotNull MenuName name, + @NotNull MenuPrice price, + @NotNull UUID menuGroupId, + @NotNull DisplayedMenu displayed, + @NotNull MenuProductsCreateRequest menuProductsCreateRequest) { } diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 3564d1fa4..dde9743cf 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -1,5 +1,6 @@ package kitchenpos.menus.ui; +import jakarta.validation.Valid; import java.net.URI; import java.util.List; import java.util.UUID; @@ -27,7 +28,7 @@ public MenuRestController(final MenuService menuService) { } @PostMapping - public ResponseEntity create(@RequestBody final MenuCreateRequest request) { + public ResponseEntity create(@RequestBody @Valid final MenuCreateRequest request) { final Menu response = menuService.create(request); return ResponseEntity.created(URI.create("/api/menus/" + response.getId())) .body(response); From e2ab9c1d7703de0cc36bd0c9671ad77a6c704c51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Tue, 2 Jul 2024 17:34:28 +0900 Subject: [PATCH 39/42] =?UTF-8?q?feat(OrderLineItemsValidator):=20?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=20=EC=95=84=EC=9D=B4=ED=85=9C=EC=9D=84=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/domain/tobe/OrderLineItems.java | 4 ++++ .../domain/tobe/OrderLineItemsValidator.java | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsValidator.java diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java index 5625da3b9..d06eba05e 100644 --- a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItems.java @@ -23,6 +23,10 @@ protected OrderLineItems() { } public OrderLineItems(List orderLineItems) { + if (orderLineItems == null || orderLineItems.isEmpty()) { + throw new IllegalArgumentException(); + } + this.orderLineItems = orderLineItems; } } diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsValidator.java b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsValidator.java new file mode 100644 index 000000000..d9d04ea31 --- /dev/null +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsValidator.java @@ -0,0 +1,23 @@ +package kitchenpos.orders.common.domain.tobe; + +import java.util.List; +import kitchenpos.menus.domain.tobe.Menu; +import org.springframework.stereotype.Component; + +@Component +public class OrderLineItemsValidator { + + public void validate(List orderLineItems, List menus){ + if (orderLineItems == null || menus == null) { + throw new IllegalArgumentException(); + } + + if (orderLineItems.isEmpty() || menus.isEmpty()) { + throw new IllegalArgumentException(); + } + + if (orderLineItems.size() != menus.size()) { + throw new IllegalArgumentException(); + } + } +} From 047fd52d56c1e1f12ac89a5391db5f5967194ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Tue, 2 Jul 2024 17:36:49 +0900 Subject: [PATCH 40/42] =?UTF-8?q?refactor(OrderLineItemMapper):=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=EC=9D=84=20=EB=B0=9B=EC=95=84=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=20=EC=95=84=EC=9D=B4=ED=85=9C=EC=9D=84=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EB=8A=94=20=EC=96=B4=ED=94=8C=EB=A6=AC?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=85=98=20=EC=84=9C=EB=B9=84=EC=8A=A4=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 --- .../application/OrderLineItemMapper.java | 64 +++++++++++++++++++ .../application/dto/OrderLineItemRequest.java | 24 +------ .../dto/OrderLineItemRequests.java | 37 ----------- .../dto/OrderLineItemsRequest.java | 8 +++ .../orders/common/domain/tobe/Order.java | 10 +-- .../store/application/StoreOrderService.java | 21 +++--- .../dto/StoreOrderCreateRequest.java | 33 ++-------- .../orders/store/domain/tobe/StoreOrder.java | 5 +- .../kitchenpos/fixture/StoreOrderFixture.java | 19 +++--- .../application/StoreOrderServiceTest.java | 53 +++++++-------- .../store/domain/tobe/StoreOrderTest.java | 43 ++++++------- 11 files changed, 154 insertions(+), 163 deletions(-) create mode 100644 src/main/java/kitchenpos/orders/common/application/OrderLineItemMapper.java delete mode 100644 src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java create mode 100644 src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemsRequest.java diff --git a/src/main/java/kitchenpos/orders/common/application/OrderLineItemMapper.java b/src/main/java/kitchenpos/orders/common/application/OrderLineItemMapper.java new file mode 100644 index 000000000..1e34e28dd --- /dev/null +++ b/src/main/java/kitchenpos/orders/common/application/OrderLineItemMapper.java @@ -0,0 +1,64 @@ +package kitchenpos.orders.common.application; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.application.dto.OrderLineItemRequest; +import kitchenpos.orders.common.application.dto.OrderLineItemsRequest; +import kitchenpos.orders.common.domain.OrderType; +import kitchenpos.orders.common.domain.tobe.MenuQuantity; +import kitchenpos.orders.common.domain.tobe.OrderLineItem; +import kitchenpos.orders.common.domain.tobe.OrderLineItems; +import kitchenpos.orders.common.domain.tobe.OrderLineItemsValidator; +import org.springframework.stereotype.Component; + +@Component +public class OrderLineItemMapper { + + private final MenuRepository menuRepository; + private final OrderLineItemsValidator orderLineItemsValidator; + + public OrderLineItemMapper(MenuRepository menuRepository, + OrderLineItemsValidator orderLineItemsValidator) { + this.menuRepository = menuRepository; + this.orderLineItemsValidator = orderLineItemsValidator; + } + + public OrderLineItems map(OrderType orderType, OrderLineItemsRequest request) { + List menuIds = request.orderLineItems() + .stream().map(OrderLineItemRequest::menuId) + .toList(); + + List menus = menuRepository.findAllByIdIn(menuIds); + List orderLineItems = createOrderLineItems(orderType, request, menus); + orderLineItemsValidator.validate(orderLineItems, menus); + return new OrderLineItems(orderLineItems); + } + + private List createOrderLineItems(OrderType orderType, + OrderLineItemsRequest request, + List menus) { + return request.orderLineItems() + .stream() + .map(orderLineItem -> createOrderLineItem(menus, + orderLineItem.menuId(), + orderType, + orderLineItem.quantity()) + ) + .toList(); + } + + private OrderLineItem createOrderLineItem(List menus, UUID menuId, OrderType orderType, + long quantity) { + Menu menu = findMenu(menus, menuId); + MenuQuantity menuQuantity = new MenuQuantity(orderType, quantity); + return new OrderLineItem(menu, menuQuantity); + } + + private Menu findMenu(List menus, UUID menuId) { + return menus.stream().filter(menu -> menu.getId().equals(menuId)) + .findFirst().orElseThrow((NoSuchElementException::new)); + } +} diff --git a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java index 8a9c1243a..480693155 100644 --- a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java +++ b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequest.java @@ -1,27 +1,9 @@ package kitchenpos.orders.common.application.dto; +import jakarta.validation.constraints.NotNull; import java.util.UUID; -import kitchenpos.menus.domain.tobe.Menu; -import kitchenpos.orders.common.domain.OrderType; -import kitchenpos.orders.common.domain.tobe.MenuQuantity; -import kitchenpos.orders.common.domain.tobe.OrderLineItem; -public class OrderLineItemRequest { +public record OrderLineItemRequest(@NotNull UUID menuId, + long quantity) { - private UUID menuId; - - private long quantity; - - public OrderLineItemRequest(UUID menuId, long quantity) { - this.menuId = menuId; - this.quantity = quantity; - } - - public OrderLineItem toStore(Menu menu, OrderType orderType) { - return new OrderLineItem(menu, new MenuQuantity(orderType, quantity)); - } - - public UUID getMenuId() { - return menuId; - } } diff --git a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java deleted file mode 100644 index 26a9f628e..000000000 --- a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemRequests.java +++ /dev/null @@ -1,37 +0,0 @@ -package kitchenpos.orders.common.application.dto; - -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.UUID; -import kitchenpos.menus.domain.tobe.Menu; -import kitchenpos.orders.common.domain.OrderType; -import kitchenpos.orders.common.domain.tobe.OrderLineItem; - -public class OrderLineItemRequests { - - private final List orderLineItems; - - public OrderLineItemRequests(List orderLineItems) { - if (Objects.isNull(orderLineItems) || orderLineItems.isEmpty()) { - throw new IllegalArgumentException(); - } - - this.orderLineItems = orderLineItems; - } - - public List getMenuIds() { - return orderLineItems.stream().map(OrderLineItemRequest::getMenuId).toList(); - } - - public List toOrderLineItems(List menus, OrderType orderType) { - return orderLineItems.stream() - .map(orderLineItem -> orderLineItem.toStore(findMenu(menus, orderLineItem), - orderType)).toList(); - } - - private Menu findMenu(List menus, OrderLineItemRequest orderLineItem) { - return menus.stream().filter(menu -> menu.getId().equals(orderLineItem.getMenuId())) - .findFirst().orElseThrow((NoSuchElementException::new)); - } -} diff --git a/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemsRequest.java b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemsRequest.java new file mode 100644 index 000000000..16f1cce00 --- /dev/null +++ b/src/main/java/kitchenpos/orders/common/application/dto/OrderLineItemsRequest.java @@ -0,0 +1,8 @@ +package kitchenpos.orders.common.application.dto; + +import jakarta.validation.constraints.NotEmpty; +import java.util.List; + +public record OrderLineItemsRequest(@NotEmpty List orderLineItems) { + +} diff --git a/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java b/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java index 40b327f5a..a2ed44f94 100644 --- a/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java +++ b/src/main/java/kitchenpos/orders/common/domain/tobe/Order.java @@ -11,9 +11,7 @@ import jakarta.persistence.InheritanceType; import jakarta.persistence.Table; import java.time.LocalDateTime; -import java.util.List; import java.util.UUID; -import kitchenpos.menus.domain.tobe.Menu; import kitchenpos.orders.common.domain.OrderStatus; import kitchenpos.orders.common.domain.OrderType; @@ -44,16 +42,12 @@ public abstract class Order { protected Order() { } - public Order(OrderType type, List orderLineItems, List menus) { - if (menus.size() != orderLineItems.size()) { - throw new IllegalArgumentException(); - } - + public Order(OrderType type, OrderLineItems orderLineItems) { this.id = UUID.randomUUID(); this.type = type; this.status = OrderStatus.WAITING; this.orderDateTime = LocalDateTime.now(); - this.orderLineItems = new OrderLineItems(orderLineItems); + this.orderLineItems = orderLineItems; } public void accept() { diff --git a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java index fc299f3c0..256dd6739 100644 --- a/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java +++ b/src/main/java/kitchenpos/orders/store/application/StoreOrderService.java @@ -3,8 +3,9 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; -import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.application.OrderLineItemMapper; +import kitchenpos.orders.common.domain.OrderType; +import kitchenpos.orders.common.domain.tobe.OrderLineItems; import kitchenpos.orders.store.application.dto.StoreOrderCreateRequest; import kitchenpos.orders.store.domain.OrderTableRepository; import kitchenpos.orders.store.domain.StoreOrderRepository; @@ -17,23 +18,25 @@ public class StoreOrderService { private final StoreOrderRepository storeOrderRepository; - private final MenuRepository menuRepository; private final OrderTableRepository orderTableRepository; + private final OrderLineItemMapper orderLineItemMapper; public StoreOrderService(StoreOrderRepository storeOrderRepository, - MenuRepository menuRepository, OrderTableRepository orderTableRepository) { + OrderTableRepository orderTableRepository, OrderLineItemMapper orderLineItemMapper) { this.storeOrderRepository = storeOrderRepository; - this.menuRepository = menuRepository; this.orderTableRepository = orderTableRepository; + this.orderLineItemMapper = orderLineItemMapper; } @Transactional public StoreOrder create(final StoreOrderCreateRequest request) { - final List menus = menuRepository.findAllByIdIn(request.getMenuIds()); - final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) + final OrderLineItems orderLineItems = orderLineItemMapper.map(OrderType.EAT_IN, + request.orderLineItemRequests()); + final OrderTable orderTable = orderTableRepository.findById(request.orderTableId()) .orElseThrow(NoSuchElementException::new); - return storeOrderRepository.save( - new StoreOrder(request.toOrderLineItems(menus), menus, orderTable)); + + final StoreOrder storeOrder = new StoreOrder(orderLineItems, orderTable); + return storeOrderRepository.save(storeOrder); } @Transactional diff --git a/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java b/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java index c4fd07ad6..b4badfb43 100644 --- a/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java +++ b/src/main/java/kitchenpos/orders/store/application/dto/StoreOrderCreateRequest.java @@ -1,35 +1,10 @@ package kitchenpos.orders.store.application.dto; -import java.util.List; +import jakarta.validation.constraints.NotNull; import java.util.UUID; -import kitchenpos.menus.domain.tobe.Menu; -import kitchenpos.orders.common.application.dto.OrderLineItemRequests; -import kitchenpos.orders.common.domain.OrderType; -import kitchenpos.orders.common.domain.tobe.OrderLineItem; +import kitchenpos.orders.common.application.dto.OrderLineItemsRequest; -public class StoreOrderCreateRequest { +public record StoreOrderCreateRequest(@NotNull OrderLineItemsRequest orderLineItemRequests, + @NotNull UUID orderTableId) { - private final OrderLineItemRequests orderLineItemRequests; - private final UUID orderTableId; - - public StoreOrderCreateRequest(OrderLineItemRequests orderLineItemRequests, UUID orderTableId) { - if (orderTableId == null) { - throw new IllegalArgumentException(); - } - - this.orderLineItemRequests = orderLineItemRequests; - this.orderTableId = orderTableId; - } - - public List getMenuIds() { - return orderLineItemRequests.getMenuIds(); - } - - public UUID getOrderTableId() { - return orderTableId; - } - - public List toOrderLineItems(List menus) { - return orderLineItemRequests.toOrderLineItems(menus, OrderType.EAT_IN); - } } diff --git a/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java b/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java index 476dcd99f..a6b2b05cd 100644 --- a/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java +++ b/src/main/java/kitchenpos/orders/store/domain/tobe/StoreOrder.java @@ -9,6 +9,7 @@ import kitchenpos.orders.common.domain.OrderType; import kitchenpos.orders.common.domain.tobe.Order; import kitchenpos.orders.common.domain.tobe.OrderLineItem; +import kitchenpos.orders.common.domain.tobe.OrderLineItems; @Entity public class StoreOrder extends Order { @@ -24,8 +25,8 @@ public class StoreOrder extends Order { protected StoreOrder() { } - public StoreOrder(List orderLineItems, List menus, OrderTable orderTable) { - super(OrderType.EAT_IN, orderLineItems, menus); + public StoreOrder(OrderLineItems orderLineItems, OrderTable orderTable) { + super(OrderType.EAT_IN, orderLineItems); if (!orderTable.isOccupied()) { throw new IllegalStateException(); diff --git a/src/test/java/kitchenpos/fixture/StoreOrderFixture.java b/src/test/java/kitchenpos/fixture/StoreOrderFixture.java index 221350c1d..cd267aba5 100644 --- a/src/test/java/kitchenpos/fixture/StoreOrderFixture.java +++ b/src/test/java/kitchenpos/fixture/StoreOrderFixture.java @@ -6,6 +6,7 @@ import kitchenpos.orders.common.domain.OrderType; import kitchenpos.orders.common.domain.tobe.MenuQuantity; import kitchenpos.orders.common.domain.tobe.OrderLineItem; +import kitchenpos.orders.common.domain.tobe.OrderLineItems; import kitchenpos.orders.store.domain.tobe.OrderTable; import kitchenpos.orders.store.domain.tobe.StoreOrder; @@ -16,22 +17,24 @@ public static StoreOrder createStoreOrder() { orderTable.sit(); Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), - ProductFixture.createFired()); - return new StoreOrder(createOrderLineItems(menu), List.of(menu), orderTable); + ProductFixture.createFired()); + return new StoreOrder(createOrderLineItems(menu), orderTable); } public static StoreOrder createStoreOrder(OrderTable orderTable, Menu... menu) { - return new StoreOrder(createOrderLineItems(menu), List.of(menu), orderTable); + return new StoreOrder(createOrderLineItems(menu), orderTable); } - public static List createOrderLineItems() { + public static OrderLineItems createOrderLineItems() { Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), - ProductFixture.createFired()); - return List.of(new OrderLineItem(menu, new MenuQuantity(OrderType.EAT_IN, 2))); + ProductFixture.createFired()); + return createOrderLineItems(menu); } - public static List createOrderLineItems(Menu... menu) { - return Arrays.stream(menu).map(StoreOrderFixture::createOrderLineItem).toList(); + public static OrderLineItems createOrderLineItems(Menu... menu) { + List orderLineItems = Arrays.stream(menu) + .map(StoreOrderFixture::createOrderLineItem).toList(); + return new OrderLineItems(orderLineItems); } private static OrderLineItem createOrderLineItem(Menu menu) { diff --git a/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java b/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java index 53774516f..6d636fc8e 100644 --- a/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java +++ b/src/test/java/kitchenpos/orders/store/application/StoreOrderServiceTest.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.List; +import java.util.NoSuchElementException; import kitchenpos.fake.InMemoryMenuGroupRepository; import kitchenpos.fake.InMemoryMenuRepository; import kitchenpos.fake.InMemoryOrderTableRepository; @@ -19,9 +20,11 @@ import kitchenpos.menugroups.domain.tobe.MenuGroup; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.domain.tobe.Menu; +import kitchenpos.orders.common.application.OrderLineItemMapper; import kitchenpos.orders.common.application.dto.OrderLineItemRequest; -import kitchenpos.orders.common.application.dto.OrderLineItemRequests; +import kitchenpos.orders.common.application.dto.OrderLineItemsRequest; import kitchenpos.orders.common.domain.OrderStatus; +import kitchenpos.orders.common.domain.tobe.OrderLineItemsValidator; import kitchenpos.orders.store.application.dto.StoreOrderCreateRequest; import kitchenpos.orders.store.domain.OrderTableRepository; import kitchenpos.orders.store.domain.StoreOrderRepository; @@ -54,8 +57,10 @@ class StoreOrderServiceTest { @BeforeEach void setUp() { - storeOrderService = new StoreOrderService(storeOrderRepository, menuRepository, - orderTableRepository); + final OrderLineItemMapper orderLineItemMapper = new OrderLineItemMapper(menuRepository, + new OrderLineItemsValidator()); + storeOrderService = new StoreOrderService(storeOrderRepository, orderTableRepository, + orderLineItemMapper); } @Test @@ -63,9 +68,8 @@ void setUp() { MenuGroup menuGroup = createMenuGroup(); assertThatThrownBy(() -> storeOrderService.create(new StoreOrderCreateRequest( - createOrderLineItemRequests(createFriedMenu(menuGroup)), - null))) - .isInstanceOf(IllegalArgumentException.class); + createOrderLineItemRequests(createFriedMenu(menuGroup)), null))) + .isInstanceOf(NoSuchElementException.class); } @Test @@ -73,11 +77,10 @@ void setUp() { MenuGroup menuGroup = createMenuGroup(); OrderTable orderTable = createOrderTable(); StoreOrderCreateRequest createRequest = new StoreOrderCreateRequest( - createOrderLineItemRequests(createFriedMenu(menuGroup)), - orderTable.getId()); + createOrderLineItemRequests(createFriedMenu(menuGroup)), orderTable.getId()); assertThatThrownBy(() -> storeOrderService.create(createRequest)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @Test @@ -115,8 +118,8 @@ void setUp() { storeOrderService.accept(saved.getId()); - assertThatThrownBy(() -> storeOrderService.accept(saved.getId())).isInstanceOf( - IllegalStateException.class); + assertThatThrownBy(() -> storeOrderService.accept(saved.getId())) + .isInstanceOf(IllegalStateException.class); } @Test @@ -136,7 +139,7 @@ void setUp() { StoreOrder saved = storeOrderService.create(createRequest); assertThatThrownBy(() -> storeOrderService.serve(saved.getId())) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @Test @@ -144,8 +147,8 @@ void setUp() { MenuGroup menuGroup = createMenuGroup(); OrderTable orderTable = createOrderTableAndSit(); StoreOrderCreateRequest createRequest = new StoreOrderCreateRequest( - createOrderLineItemRequests(createFriedMenu(menuGroup)), - orderTable.getId()); + createOrderLineItemRequests(createFriedMenu(menuGroup)), + orderTable.getId()); StoreOrder saved = storeOrderService.create(createRequest); storeOrderService.accept(saved.getId()); storeOrderService.serve(saved.getId()); @@ -153,8 +156,8 @@ void setUp() { storeOrderService.complete(saved.getId()); assertAll(() -> assertThat(saved.getStatus()).isEqualTo(OrderStatus.COMPLETED), - () -> assertThat(orderTable.isOccupied()).isFalse(), - () -> assertThat(orderTable.getNumberOfGuests()).isZero()); + () -> assertThat(orderTable.isOccupied()).isFalse(), + () -> assertThat(orderTable.getNumberOfGuests()).isZero()); } @Test @@ -162,18 +165,18 @@ void setUp() { StoreOrderCreateRequest createRequest = createStoreOrderCreateRequest(); StoreOrder saved = storeOrderService.create(createRequest); - assertThatThrownBy(() -> storeOrderService.complete(saved.getId())).isInstanceOf( - IllegalStateException.class); + assertThatThrownBy(() -> storeOrderService.complete(saved.getId())) + .isInstanceOf(IllegalStateException.class); } private StoreOrderCreateRequest createStoreOrderCreateRequest() { MenuGroup menuGroup = createMenuGroup(); OrderTable orderTable = createOrderTableAndSit(); return new StoreOrderCreateRequest( - createOrderLineItemRequests( - createFriedMenu(menuGroup), - createSeasonedMenu(menuGroup)), - orderTable.getId()); + createOrderLineItemRequests( + createFriedMenu(menuGroup), + createSeasonedMenu(menuGroup)), + orderTable.getId()); } private MenuGroup createMenuGroup() { @@ -201,10 +204,10 @@ private Menu createSeasonedMenu(MenuGroup menuGroup) { return menuRepository.save(MenuFixture.SeasonedOnePlusOne(menuGroup, product)); } - private OrderLineItemRequests createOrderLineItemRequests(Menu... menu) { + private OrderLineItemsRequest createOrderLineItemRequests(Menu... menu) { List orderLineItemRequests = Arrays.stream(menu) - .map(this::createOrderLineItemRequest).toList(); - return new OrderLineItemRequests(orderLineItemRequests); + .map(this::createOrderLineItemRequest).toList(); + return new OrderLineItemsRequest(orderLineItemRequests); } private OrderLineItemRequest createOrderLineItemRequest(Menu menu) { diff --git a/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java b/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java index 95e9dbdb2..06a546a4b 100644 --- a/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java +++ b/src/test/java/kitchenpos/orders/store/domain/tobe/StoreOrderTest.java @@ -4,7 +4,6 @@ import static org.assertj.core.api.Assertions.assertThatNoException; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import java.util.List; import kitchenpos.fixture.MenuFixture; import kitchenpos.fixture.MenuGroupFixture; import kitchenpos.fixture.OrderTableFixture; @@ -23,13 +22,12 @@ class StoreOrderTest { @Test void 매장주문을_생성_시_테이블이_점유되어있지않으면_예외를_던진다() { Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), - ProductFixture.createFired()); + ProductFixture.createFired()); assertThatThrownBy(() -> new StoreOrder( - StoreOrderFixture.createOrderLineItems(menu), - List.of(menu), - OrderTableFixture.createNumber1())) - .isInstanceOf(IllegalStateException.class); + StoreOrderFixture.createOrderLineItems(menu), + OrderTableFixture.createNumber1())) + .isInstanceOf(IllegalStateException.class); } @Test @@ -37,15 +35,14 @@ class StoreOrderTest { OrderTable orderTable = OrderTableFixture.createNumber1(); orderTable.sit(); Menu menu1 = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), - ProductFixture.createFired()); + ProductFixture.createFired()); Menu menu2 = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), - ProductFixture.createFired()); + ProductFixture.createFired()); assertThatThrownBy(() -> new StoreOrder( - StoreOrderFixture.createOrderLineItems(menu1, menu2), - List.of(menu1, menu2), - OrderTableFixture.createNumber1())) - .isInstanceOf(IllegalStateException.class); + StoreOrderFixture.createOrderLineItems(menu1, menu2), + OrderTableFixture.createNumber1())) + .isInstanceOf(IllegalStateException.class); } @Test @@ -53,13 +50,12 @@ class StoreOrderTest { OrderTable orderTable = OrderTableFixture.createNumber1(); orderTable.sit(); Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), - ProductFixture.createFired()); + ProductFixture.createFired()); assertThatNoException().isThrownBy( - () -> new StoreOrder( - StoreOrderFixture.createOrderLineItems(menu), - List.of(menu), - orderTable)); + () -> new StoreOrder( + StoreOrderFixture.createOrderLineItems(menu), + orderTable)); } @Test @@ -75,7 +71,7 @@ class StoreOrderTest { storeOrder.accept(); assertThatThrownBy(storeOrder::accept) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @Test @@ -91,7 +87,7 @@ class StoreOrderTest { StoreOrder storeOrder = StoreOrderFixture.createStoreOrder(); assertThatThrownBy(storeOrder::serve) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @Test @@ -108,11 +104,10 @@ class StoreOrderTest { OrderTable targetTable = OrderTableFixture.createNumber1(); targetTable.sit(); Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), - ProductFixture.createFired()); + ProductFixture.createFired()); StoreOrder storeOrder = new StoreOrder( - StoreOrderFixture.createOrderLineItems(menu), - List.of(menu), - targetTable); + StoreOrderFixture.createOrderLineItems(menu), + targetTable); storeOrder.accept(); storeOrder.serve(); @@ -126,6 +121,6 @@ class StoreOrderTest { StoreOrder storeOrder = StoreOrderFixture.createStoreOrder(); assertThatThrownBy(storeOrder::serve) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } } \ No newline at end of file From d0c81747fc34980cc24eb408bdbfe795ea6f9c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Tue, 2 Jul 2024 17:37:22 +0900 Subject: [PATCH 41/42] =?UTF-8?q?refactor(StoreOrderRestController):=20Val?= =?UTF-8?q?idation=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=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 --- .../orders/store/ui/StoreOrderRestController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/kitchenpos/orders/store/ui/StoreOrderRestController.java b/src/main/java/kitchenpos/orders/store/ui/StoreOrderRestController.java index 964746976..680f3b387 100644 --- a/src/main/java/kitchenpos/orders/store/ui/StoreOrderRestController.java +++ b/src/main/java/kitchenpos/orders/store/ui/StoreOrderRestController.java @@ -1,5 +1,6 @@ package kitchenpos.orders.store.ui; +import jakarta.validation.Valid; import java.net.URI; import java.util.List; import java.util.UUID; @@ -26,10 +27,11 @@ public StoreOrderRestController(final StoreOrderService storeOrderService) { } @PostMapping - public ResponseEntity create(@RequestBody final StoreOrderCreateRequest request) { + public ResponseEntity create( + @RequestBody @Valid final StoreOrderCreateRequest request) { StoreOrder response = storeOrderService.create(request); return ResponseEntity.created(URI.create("/api/store-orders/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{orderId}/accept") From 247cbc01292fd631c2deddb18ff12e815bc26738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=97=88=EC=A0=95=ED=99=94?= Date: Tue, 2 Jul 2024 17:47:56 +0900 Subject: [PATCH 42/42] =?UTF-8?q?test(OrderLineItemsValidator):=20?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=20=EC=95=84=EC=9D=B4=ED=85=9C=EC=9D=84=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/fixture/StoreOrderFixture.java | 8 +-- .../domain/tobe/OrderLineItemsTest.java | 43 ++++++++++++++ .../tobe/OrderLineItemsValidatorTest.java | 59 +++++++++++++++++++ 3 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsTest.java create mode 100644 src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsValidatorTest.java diff --git a/src/test/java/kitchenpos/fixture/StoreOrderFixture.java b/src/test/java/kitchenpos/fixture/StoreOrderFixture.java index cd267aba5..7a7c9fb51 100644 --- a/src/test/java/kitchenpos/fixture/StoreOrderFixture.java +++ b/src/test/java/kitchenpos/fixture/StoreOrderFixture.java @@ -25,19 +25,13 @@ public static StoreOrder createStoreOrder(OrderTable orderTable, Menu... menu) { return new StoreOrder(createOrderLineItems(menu), orderTable); } - public static OrderLineItems createOrderLineItems() { - Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), - ProductFixture.createFired()); - return createOrderLineItems(menu); - } - public static OrderLineItems createOrderLineItems(Menu... menu) { List orderLineItems = Arrays.stream(menu) .map(StoreOrderFixture::createOrderLineItem).toList(); return new OrderLineItems(orderLineItems); } - private static OrderLineItem createOrderLineItem(Menu menu) { + public static OrderLineItem createOrderLineItem(Menu menu) { return new OrderLineItem(menu, new MenuQuantity(OrderType.EAT_IN, 1)); } } diff --git a/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsTest.java b/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsTest.java new file mode 100644 index 000000000..b12ca8336 --- /dev/null +++ b/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsTest.java @@ -0,0 +1,43 @@ +package kitchenpos.orders.common.domain.tobe; + +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import kitchenpos.fixture.MenuFixture; +import kitchenpos.fixture.MenuGroupFixture; +import kitchenpos.fixture.ProductFixture; +import kitchenpos.fixture.StoreOrderFixture; +import kitchenpos.menus.domain.tobe.Menu; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +@DisplayName("OrderLineItems") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +class OrderLineItemsTest { + + @Test + void 주문아이템들이_null일_경우_예외를_던진다() { + assertThatThrownBy( + () -> new OrderLineItems(null)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 주문아이템들이_비어있을_경우_예외를_던진다() { + assertThatThrownBy( + () -> new OrderLineItems(List.of())) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 주문아이템들을_생성할_수_있다() { + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); + OrderLineItem orderLineItem = StoreOrderFixture.createOrderLineItem(menu); + + assertThatNoException().isThrownBy(() -> new OrderLineItems(List.of(orderLineItem))); + } +} \ No newline at end of file diff --git a/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsValidatorTest.java b/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsValidatorTest.java new file mode 100644 index 000000000..a171b125a --- /dev/null +++ b/src/test/java/kitchenpos/orders/common/domain/tobe/OrderLineItemsValidatorTest.java @@ -0,0 +1,59 @@ +package kitchenpos.orders.common.domain.tobe; + +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import kitchenpos.fixture.MenuFixture; +import kitchenpos.fixture.MenuGroupFixture; +import kitchenpos.fixture.ProductFixture; +import kitchenpos.fixture.StoreOrderFixture; +import kitchenpos.menus.domain.tobe.Menu; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +@DisplayName("OrderLineItemsValidator") +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +class OrderLineItemsValidatorTest { + + private final OrderLineItemsValidator orderLineItemsValidator = new OrderLineItemsValidator(); + + @Test + void 주문아이템들이_null일_경우_검증을_실패한다() { + assertThatThrownBy( + () -> orderLineItemsValidator.validate(null, null)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 주문아이템들이_비어있을_경우_검증을_실패한다() { + assertThatThrownBy( + () -> orderLineItemsValidator.validate(List.of(), List.of())) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 주문아이템들에_메뉴가_중복되면_검증을_실패한다() { + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); + OrderLineItem orderLineItem = StoreOrderFixture.createOrderLineItem(menu); + + assertThatThrownBy(() -> orderLineItemsValidator.validate( + List.of(orderLineItem, orderLineItem), + List.of(menu)) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 주문아이템들의_검증을_성공한다() { + Menu menu = MenuFixture.createFriedOnePlusOne(MenuGroupFixture.createChicken(), + ProductFixture.createFired()); + OrderLineItem orderLineItem = StoreOrderFixture.createOrderLineItem(menu); + + assertThatNoException().isThrownBy(() -> orderLineItemsValidator.validate( + List.of(orderLineItem), List.of(menu)) + ); + } +} \ No newline at end of file