From 7e635b353d2b5e188e439b6322dcabff4106e182 Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 16:23:48 +0900 Subject: [PATCH 01/13] =?UTF-8?q?feat:=20to-be=20entity=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/tobe/domain/ToBeMenu.java | 50 +++++++++++++++++++ .../menus/tobe/domain/ToBeMenuGroup.java | 21 ++++++++ .../tobe/domain/ToBeMenuGroupRepository.java | 14 ++++++ .../menus/tobe/domain/ToBeMenuProduct.java | 34 +++++++++++++ .../menus/tobe/domain/ToBeMenuRepository.java | 18 +++++++ 5 files changed, 137 insertions(+) create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroupRepository.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuRepository.java diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java new file mode 100644 index 000000000..ea487f36e --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java @@ -0,0 +1,50 @@ +package kitchenpos.menus.tobe.domain; + +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuProduct; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +@Table(name = "menu") +@Entity +public class ToBeMenu { + @Column(name = "id", columnDefinition = "binary(16)") + @Id + private UUID id; + + @Column(name = "name", nullable = false) + private String name; + + @Column(name = "price", nullable = false) + private BigDecimal price; + + @ManyToOne(optional = false) + @JoinColumn( + name = "menu_group_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") + ) + private MenuGroup menuGroup; + + @Column(name = "displayed", nullable = false) + private boolean displayed; + + @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @JoinColumn( + name = "menu_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") + ) + private List menuProducts; + + @Transient + private UUID menuGroupId; + + protected ToBeMenu() { + } + +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java new file mode 100644 index 000000000..a9bda5423 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java @@ -0,0 +1,21 @@ +package kitchenpos.menus.tobe.domain; + +import kitchenpos.common.values.Name; + +import javax.persistence.*; +import java.util.UUID; + +@Table(name = "menu_group") +@Entity +public class ToBeMenuGroup { + @Column(name = "id", columnDefinition = "binary(16)") + @Id + private UUID id; + + @Embedded + private Name name; + + protected ToBeMenuGroup() { + } + +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroupRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroupRepository.java new file mode 100644 index 000000000..e27760a91 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroupRepository.java @@ -0,0 +1,14 @@ +package kitchenpos.menus.tobe.domain; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface ToBeMenuGroupRepository { + ToBeMenuGroup save(ToBeMenuGroup menuGroup); + + Optional findById(UUID id); + + List findAll(); +} + diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java new file mode 100644 index 000000000..11eebd9fd --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java @@ -0,0 +1,34 @@ +package kitchenpos.menus.tobe.domain; + + +import kitchenpos.products.domain.Product; + +import javax.persistence.*; +import java.util.UUID; + +@Table(name = "menu_product") +@Entity +public class ToBeMenuProduct { + @Column(name = "seq") + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Id + private Long seq; + + @ManyToOne(optional = false) + @JoinColumn( + name = "product_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_product_to_product") + ) + private Product product; + + @Column(name = "quantity", nullable = false) + private long quantity; + + @Transient + private UUID productId; + + protected ToBeMenuProduct() { + } + +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuRepository.java new file mode 100644 index 000000000..621cd386b --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuRepository.java @@ -0,0 +1,18 @@ +package kitchenpos.menus.tobe.domain; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface ToBeMenuRepository { + ToBeMenu save(ToBeMenu menu); + + Optional findById(UUID id); + + List findAll(); + + List findAllByIdIn(List ids); + + List findAllByProductId(UUID productId); +} + From d7dcb5a5e59fa2ce540df95a5c7270a214104920 Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 16:24:28 +0900 Subject: [PATCH 02/13] =?UTF-8?q?doc(menuGroup):=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=EC=97=90=20=EC=9D=B4=EB=A6=84=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4a91e3f71..1ea6c3aa7 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ docker compose -p kitchenpos up -d - 메뉴 그룹을 등록할 수 있다. - 메뉴 그룹의 이름이 올바르지 않으면 등록할 수 없다. - 메뉴 그룹의 이름은 비워 둘 수 없다. + - 메뉴 그룹의 이름에는 비속어가 포함될 수 없다. - 메뉴 그룹의 목록을 조회할 수 있다. ### 메뉴 From 2ec3c6bc2c11df56d31d0802b8fa8b2c411caab9 Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 16:50:29 +0900 Subject: [PATCH 03/13] =?UTF-8?q?refactor(menuGroup):=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=20=EA=B7=B8=EB=A3=B9=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/application/MenuGroupService.java | 39 +++++++----- .../kitchenpos/menus/dto/CreateRequest.java | 15 +++++ .../kitchenpos/menus/dto/MenuGroupDto.java | 31 ++++++++++ .../domain/ToBeJpaMenuGroupRepository.java | 10 ++++ .../tobe/domain/ToBeJpaMenuRepository.java | 16 +++++ .../menus/tobe/domain/ToBeMenu.java | 60 ++++++++++++++++++- .../menus/tobe/domain/ToBeMenuGroup.java | 13 ++++ .../menus/tobe/domain/ToBeMenuProduct.java | 15 +++++ .../menus/ui/MenuGroupRestController.java | 9 +-- .../products/application/ProductService.java | 4 +- ...{CreateReqeust.java => CreateRequest.java} | 6 +- .../products/ui/ProductRestController.java | 4 +- src/test/java/kitchenpos/Fixtures.java | 20 ++++--- .../infra}/FakeApplicationEventPublisher.java | 2 +- .../application/MenuGroupServiceTest.java | 41 ++++++++----- .../menus/application/MenuServiceTest.java | 4 +- .../ProductPriceChangeListenerTest.java | 2 +- .../ToBeInMemoryMenuGroupRepository.java | 26 ++++++++ .../infra/ToBeInMemoryMenuRepository.java | 45 ++++++++++++++ .../application/ProductServiceTest.java | 22 +++---- .../InMemoryProductRepository.java | 2 +- 21 files changed, 318 insertions(+), 68 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/dto/CreateRequest.java create mode 100644 src/main/java/kitchenpos/menus/dto/MenuGroupDto.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuGroupRepository.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuRepository.java rename src/main/java/kitchenpos/products/dto/{CreateReqeust.java => CreateRequest.java} (72%) rename src/test/java/kitchenpos/{products/application => common/infra}/FakeApplicationEventPublisher.java (94%) create mode 100644 src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuGroupRepository.java create mode 100644 src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuRepository.java rename src/test/java/kitchenpos/products/{application => infra}/InMemoryProductRepository.java (95%) diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index c468893a2..9db8c1af3 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -1,36 +1,43 @@ package kitchenpos.menus.application; +import kitchenpos.common.domain.Purgomalum; +import kitchenpos.common.values.Name; import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.dto.CreateRequest; +import kitchenpos.menus.dto.MenuGroupDto; +import kitchenpos.menus.tobe.domain.ToBeMenuGroup; +import kitchenpos.menus.tobe.domain.ToBeMenuGroupRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Objects; -import java.util.UUID; +import java.util.stream.Collectors; @Service public class MenuGroupService { - private final MenuGroupRepository menuGroupRepository; + private final ToBeMenuGroupRepository toBeMenuGroupRepository; + private final Purgomalum purgomalum; - public MenuGroupService(final MenuGroupRepository menuGroupRepository) { - this.menuGroupRepository = menuGroupRepository; + public MenuGroupService(ToBeMenuGroupRepository toBeMenuGroupRepository, + Purgomalum purgomalum) { + this.toBeMenuGroupRepository = toBeMenuGroupRepository; + this.purgomalum = purgomalum; } @Transactional - public MenuGroup create(final MenuGroup request) { - final String name = request.getName(); - if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(); - } - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(UUID.randomUUID()); - menuGroup.setName(name); - return menuGroupRepository.save(menuGroup); + public MenuGroupDto create(final CreateRequest request) { + Name name = new Name(request.getName(), purgomalum); + final ToBeMenuGroup menuGroup = new ToBeMenuGroup(name); + ToBeMenuGroup savedResult = toBeMenuGroupRepository.save(menuGroup); + return MenuGroupDto.from(savedResult); } @Transactional(readOnly = true) - public List findAll() { - return menuGroupRepository.findAll(); + public List findAll() { + return toBeMenuGroupRepository.findAll() + .stream() + .map(MenuGroupDto::from) + .collect(Collectors.toList()); } } diff --git a/src/main/java/kitchenpos/menus/dto/CreateRequest.java b/src/main/java/kitchenpos/menus/dto/CreateRequest.java new file mode 100644 index 000000000..4b18b4b52 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/CreateRequest.java @@ -0,0 +1,15 @@ +package kitchenpos.menus.dto; + +public class CreateRequest { + + private final String name; + + public CreateRequest(String name) { + this.name = name; + } + + public String getName() { + return name; + } + +} diff --git a/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java b/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java new file mode 100644 index 000000000..11bf41208 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java @@ -0,0 +1,31 @@ +package kitchenpos.menus.dto; + +import kitchenpos.common.values.Name; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.ToBeMenuGroup; + +import java.util.UUID; + +public class MenuGroupDto { + + private UUID id; + private Name name; + + public MenuGroupDto(UUID id, Name name) { + this.id = id; + this.name = name; + } + + public UUID getId() { + return id; + } + + public Name getName() { + return name; + } + + public static MenuGroupDto from(ToBeMenuGroup savedResult) { + return new MenuGroupDto(savedResult.getId(), savedResult.getName()); + } + +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuGroupRepository.java new file mode 100644 index 000000000..8f5253406 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuGroupRepository.java @@ -0,0 +1,10 @@ +package kitchenpos.menus.tobe.domain; + +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface ToBeJpaMenuGroupRepository extends ToBeMenuGroupRepository, JpaRepository { +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuRepository.java new file mode 100644 index 000000000..479367fb8 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuRepository.java @@ -0,0 +1,16 @@ +package kitchenpos.menus.tobe.domain; + +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuRepository; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.UUID; + +public interface ToBeJpaMenuRepository extends ToBeMenuRepository, JpaRepository { + @Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId") + @Override + List findAllByProductId(@Param("productId") UUID productId); +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java index ea487f36e..eb6b10653 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java @@ -27,7 +27,7 @@ public class ToBeMenu { columnDefinition = "binary(16)", foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") ) - private MenuGroup menuGroup; + private ToBeMenuGroup menuGroup; @Column(name = "displayed", nullable = false) private boolean displayed; @@ -39,7 +39,7 @@ public class ToBeMenu { columnDefinition = "binary(16)", foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") ) - private List menuProducts; + private List menuProducts; @Transient private UUID menuGroupId; @@ -47,4 +47,60 @@ public class ToBeMenu { protected ToBeMenu() { } + public UUID getId() { + + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public ToBeMenuGroup getMenuGroup() { + return menuGroup; + } + + public void setMenuGroup(ToBeMenuGroup menuGroup) { + this.menuGroup = menuGroup; + } + + public boolean isDisplayed() { + return displayed; + } + + public void setDisplayed(boolean displayed) { + this.displayed = displayed; + } + + public List getMenuProducts() { + return menuProducts; + } + + public void setMenuProducts(List menuProducts) { + this.menuProducts = menuProducts; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public void setMenuGroupId(UUID menuGroupId) { + this.menuGroupId = menuGroupId; + } } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java index a9bda5423..9544d2386 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java @@ -18,4 +18,17 @@ public class ToBeMenuGroup { protected ToBeMenuGroup() { } + public ToBeMenuGroup(final Name name) { + this.id = UUID.randomUUID(); + this.name = name; + } + + public UUID getId() { + return id; + } + + public Name getName() { + return name; + } + } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java index 11eebd9fd..109cfe029 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java @@ -31,4 +31,19 @@ public class ToBeMenuProduct { protected ToBeMenuProduct() { } + public Long getSeq() { + return seq; + } + + public Product getProduct() { + return product; + } + + public long getQuantity() { + return quantity; + } + + public UUID getProductId() { + return productId; + } } diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java index 1a5d0fd06..7732c2725 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java @@ -1,7 +1,8 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuGroupService; -import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.dto.CreateRequest; +import kitchenpos.menus.dto.MenuGroupDto; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,14 +19,14 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { } @PostMapping - public ResponseEntity create(@RequestBody final MenuGroup request) { - final MenuGroup response = menuGroupService.create(request); + public ResponseEntity create(@RequestBody final CreateRequest request) { + final MenuGroupDto response = menuGroupService.create(request); return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getId())) .body(response); } @GetMapping - public ResponseEntity> findAll() { + public ResponseEntity> findAll() { return ResponseEntity.ok(menuGroupService.findAll()); } } diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index 702a0ce84..c40e62c7d 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -5,7 +5,7 @@ import kitchenpos.common.values.Name; import kitchenpos.common.values.Price; import kitchenpos.products.dto.ChangePriceRequest; -import kitchenpos.products.dto.CreateReqeust; +import kitchenpos.products.dto.CreateRequest; import kitchenpos.products.dto.ProductDto; import kitchenpos.products.event.ProductPriceChangeEvent; import kitchenpos.products.domain.Product; @@ -36,7 +36,7 @@ public ProductService( } @Transactional - public ProductDto create(final CreateReqeust request) { + public ProductDto create(final CreateRequest request) { final Name name = new Name(request.getName(), purgomalum); final Price price = new Price(request.getPrice()); final Product product = new Product(name, price); diff --git a/src/main/java/kitchenpos/products/dto/CreateReqeust.java b/src/main/java/kitchenpos/products/dto/CreateRequest.java similarity index 72% rename from src/main/java/kitchenpos/products/dto/CreateReqeust.java rename to src/main/java/kitchenpos/products/dto/CreateRequest.java index 23ae398b3..bd5f850f1 100644 --- a/src/main/java/kitchenpos/products/dto/CreateReqeust.java +++ b/src/main/java/kitchenpos/products/dto/CreateRequest.java @@ -2,15 +2,15 @@ import java.math.BigDecimal; -public class CreateReqeust { +public class CreateRequest { private String name; private BigDecimal price; - public CreateReqeust() { + public CreateRequest() { } - public CreateReqeust(String name, BigDecimal price) { + public CreateRequest(String name, BigDecimal price) { this.name = name; this.price = price; } diff --git a/src/main/java/kitchenpos/products/ui/ProductRestController.java b/src/main/java/kitchenpos/products/ui/ProductRestController.java index 97fddbbaf..e0e066aa9 100644 --- a/src/main/java/kitchenpos/products/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/products/ui/ProductRestController.java @@ -2,7 +2,7 @@ import kitchenpos.products.application.ProductService; import kitchenpos.products.dto.ChangePriceRequest; -import kitchenpos.products.dto.CreateReqeust; +import kitchenpos.products.dto.CreateRequest; import kitchenpos.products.domain.Product; import kitchenpos.products.dto.ProductDto; import org.springframework.http.ResponseEntity; @@ -22,7 +22,7 @@ public ProductRestController(final ProductService productService) { } @PostMapping - public ResponseEntity create(@RequestBody final CreateReqeust request) { + public ResponseEntity create(@RequestBody final CreateRequest request) { final ProductDto response = productService.create(request); return ResponseEntity.created(URI.create("/api/products/" + response.getId())) .body(response); diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index 7bdef3ee3..b7b4b86d5 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -7,6 +7,7 @@ import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuProduct; import kitchenpos.common.infra.FakePurgomalum; +import kitchenpos.menus.tobe.domain.ToBeMenuGroup; import kitchenpos.products.domain.Product; import java.math.BigDecimal; @@ -31,22 +32,25 @@ public static Menu menu(final long price, final boolean displayed, final MenuPro menu.setId(UUID.randomUUID()); menu.setName("후라이드+후라이드"); menu.setPrice(BigDecimal.valueOf(price)); - menu.setMenuGroup(menuGroup()); + menu.setMenuGroup(asisMenuGroup()); menu.setDisplayed(displayed); menu.setMenuProducts(Arrays.asList(menuProducts)); return menu; } - public static MenuGroup menuGroup() { - return menuGroup("두마리메뉴"); - } - - public static MenuGroup menuGroup(final String name) { - final MenuGroup menuGroup = new MenuGroup(); + public static MenuGroup asisMenuGroup() { + MenuGroup menuGroup = new MenuGroup(); menuGroup.setId(UUID.randomUUID()); - menuGroup.setName(name); + menuGroup.setName("후라이드+후라이드"); return menuGroup; } + public static ToBeMenuGroup menuGroup() { + return menuGroup(new Name("후라이드+후라이드", FakePurgomalum.create())); + } + + public static ToBeMenuGroup menuGroup(final Name name) { + return new ToBeMenuGroup(name); + } public static MenuProduct menuProduct() { final MenuProduct menuProduct = new MenuProduct(); diff --git a/src/test/java/kitchenpos/products/application/FakeApplicationEventPublisher.java b/src/test/java/kitchenpos/common/infra/FakeApplicationEventPublisher.java similarity index 94% rename from src/test/java/kitchenpos/products/application/FakeApplicationEventPublisher.java rename to src/test/java/kitchenpos/common/infra/FakeApplicationEventPublisher.java index b7bc0bd1f..48527912f 100644 --- a/src/test/java/kitchenpos/products/application/FakeApplicationEventPublisher.java +++ b/src/test/java/kitchenpos/common/infra/FakeApplicationEventPublisher.java @@ -1,4 +1,4 @@ -package kitchenpos.products.application; +package kitchenpos.common.infra; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index a5fbc71d1..5bef6edbb 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -1,7 +1,14 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.common.domain.Purgomalum; +import kitchenpos.common.exception.KitchenPosException; +import kitchenpos.common.infra.FakePurgomalum; +import kitchenpos.common.values.Name; import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.dto.CreateRequest; +import kitchenpos.menus.dto.MenuGroupDto; +import kitchenpos.menus.infra.ToBeInMemoryMenuGroupRepository; +import kitchenpos.menus.tobe.domain.ToBeMenuGroupRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -14,26 +21,29 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertTrue; class MenuGroupServiceTest { - private MenuGroupRepository menuGroupRepository; + private ToBeMenuGroupRepository toBeMenuGroupRepository; + private Purgomalum purgomalum; private MenuGroupService menuGroupService; @BeforeEach void setUp() { - menuGroupRepository = new InMemoryMenuGroupRepository(); - menuGroupService = new MenuGroupService(menuGroupRepository); + toBeMenuGroupRepository = new ToBeInMemoryMenuGroupRepository(); + purgomalum = FakePurgomalum.create(); + menuGroupService = new MenuGroupService(toBeMenuGroupRepository, purgomalum); } @DisplayName("메뉴 그룹을 등록할 수 있다.") @Test void create() { - final MenuGroup expected = createMenuGroupRequest("두마리메뉴"); - final MenuGroup actual = menuGroupService.create(expected); + final CreateRequest request = createMenuGroupRequest("두마리메뉴"); + final MenuGroupDto actual = menuGroupService.create(request); assertThat(actual).isNotNull(); assertAll( () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()) + () -> assertTrue(actual.getName().equalValue(request.getName())) ); } @@ -41,22 +51,21 @@ void create() { @NullAndEmptySource @ParameterizedTest void create(final String name) { - final MenuGroup expected = createMenuGroupRequest(name); - assertThatThrownBy(() -> menuGroupService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + final CreateRequest request = createMenuGroupRequest(name); + assertThatThrownBy(() -> menuGroupService.create(request)) + .isInstanceOf(KitchenPosException.class); } @DisplayName("메뉴 그룹의 목록을 조회할 수 있다.") @Test void findAll() { - menuGroupRepository.save(menuGroup("두마리메뉴")); - final List actual = menuGroupService.findAll(); + Name name = new Name("두마리메뉴", purgomalum); + toBeMenuGroupRepository.save(menuGroup(name)); + final List actual = menuGroupService.findAll(); assertThat(actual).hasSize(1); } - private MenuGroup createMenuGroupRequest(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setName(name); - return menuGroup; + private CreateRequest createMenuGroupRequest(final String name) { + return new CreateRequest(name); } } diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 313e3bef2..f9e39dd15 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -6,7 +6,7 @@ import kitchenpos.menus.domain.MenuProduct; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.common.infra.FakePurgomalum; -import kitchenpos.products.application.InMemoryProductRepository; +import kitchenpos.products.infra.InMemoryProductRepository; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; import org.junit.jupiter.api.BeforeEach; @@ -42,7 +42,7 @@ void setUp() { productRepository = new InMemoryProductRepository(); purgomalum = FakePurgomalum.create(); menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalum); - menuGroupId = menuGroupRepository.save(menuGroup()).getId(); + menuGroupId = menuGroupRepository.save(asisMenuGroup()).getId(); product = productRepository.save(product("후라이드", 16_000L)); } diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 68952909b..1d2ad088a 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -2,7 +2,7 @@ import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.products.application.InMemoryProductRepository; +import kitchenpos.products.infra.InMemoryProductRepository; import kitchenpos.products.event.ProductPriceChangeEvent; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; diff --git a/src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuGroupRepository.java new file mode 100644 index 000000000..b7091cf4d --- /dev/null +++ b/src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuGroupRepository.java @@ -0,0 +1,26 @@ +package kitchenpos.menus.infra; + +import kitchenpos.menus.tobe.domain.ToBeMenuGroup; +import kitchenpos.menus.tobe.domain.ToBeMenuGroupRepository; + +import java.util.*; + +public class ToBeInMemoryMenuGroupRepository implements ToBeMenuGroupRepository { + private final Map menuGroups = new HashMap<>(); + + @Override + public ToBeMenuGroup save(final ToBeMenuGroup menuGroup) { + menuGroups.put(menuGroup.getId(), menuGroup); + return menuGroup; + } + + @Override + public Optional findById(final UUID id) { + return Optional.ofNullable(menuGroups.get(id)); + } + + @Override + public List findAll() { + return new ArrayList<>(menuGroups.values()); + } +} diff --git a/src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuRepository.java new file mode 100644 index 000000000..ce5c7bb65 --- /dev/null +++ b/src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuRepository.java @@ -0,0 +1,45 @@ +package kitchenpos.menus.infra; + +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.ToBeMenu; +import kitchenpos.menus.tobe.domain.ToBeMenuRepository; + +import java.util.*; +import java.util.stream.Collectors; + +public class ToBeInMemoryMenuRepository implements ToBeMenuRepository { + private final Map menus = new HashMap<>(); + + @Override + public ToBeMenu save(final ToBeMenu menu) { + menus.put(menu.getId(), menu); + return menu; + } + + @Override + public Optional findById(final UUID id) { + return Optional.ofNullable(menus.get(id)); + } + + @Override + public List findAll() { + return new ArrayList<>(menus.values()); + } + + @Override + public List findAllByIdIn(final List ids) { + return menus.values() + .stream() + .filter(menu -> ids.contains(menu.getId())) + .collect(Collectors.toList()); + } + + @Override + public List findAllByProductId(final UUID productId) { + return menus.values() + .stream() + .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProduct().getId().equals(productId))) + .collect(Collectors.toList()); + } +} diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index 09b91520e..d123ceebe 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -2,15 +2,17 @@ import kitchenpos.common.domain.Purgomalum; import kitchenpos.common.exception.KitchenPosExceptionType; +import kitchenpos.common.infra.FakeApplicationEventPublisher; import kitchenpos.common.infra.FakePurgomalum; import kitchenpos.menus.application.InMemoryMenuRepository; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.products.dto.ChangePriceRequest; -import kitchenpos.products.dto.CreateReqeust; +import kitchenpos.products.dto.CreateRequest; import kitchenpos.products.dto.ProductDto; import kitchenpos.products.event.ProductPriceChangeEvent; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; +import kitchenpos.products.infra.InMemoryProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -32,7 +34,7 @@ class ProductServiceTest { private ProductRepository productRepository; private MenuRepository menuRepository; - private Purgomalum purgomalumClient; + private Purgomalum purgomalum; private ProductService productService; private FakeApplicationEventPublisher publisher; @@ -40,15 +42,15 @@ class ProductServiceTest { void setUp() { productRepository = new InMemoryProductRepository(); menuRepository = new InMemoryMenuRepository(); - purgomalumClient = FakePurgomalum.create(); + purgomalum = FakePurgomalum.create(); publisher = new FakeApplicationEventPublisher(); - productService = new ProductService(productRepository, purgomalumClient, publisher); + productService = new ProductService(productRepository, purgomalum, publisher); } @DisplayName("상품을 등록할 수 있다.") @Test void create() { - final CreateReqeust request = createProductRequest("후라이드", 16_000L); + final CreateRequest request = createProductRequest("후라이드", 16_000L); final ProductDto actual = productService.create(request); assertThat(actual).isNotNull(); assertAll( @@ -63,7 +65,7 @@ void create() { @NullSource @ParameterizedTest void create(final BigDecimal price) { - final CreateReqeust request = createProductRequest("후라이드", price); + final CreateRequest request = createProductRequest("후라이드", price); assertThrows(KitchenPosExceptionType.BAD_REQUEST, () -> productService.create(request)); } @@ -72,7 +74,7 @@ void create(final BigDecimal price) { @NullSource @ParameterizedTest void create(final String name) { - final CreateReqeust request = createProductRequest(name, 16_000L); + final CreateRequest request = createProductRequest(name, 16_000L); assertThrows(KitchenPosExceptionType.BAD_REQUEST, () -> productService.create(request)); } @@ -113,12 +115,12 @@ void findAll() { assertThat(actual).hasSize(2); } - private CreateReqeust createProductRequest(final String name, final long price) { + private CreateRequest createProductRequest(final String name, final long price) { return createProductRequest(name, BigDecimal.valueOf(price)); } - private CreateReqeust createProductRequest(final String name, final BigDecimal price) { - return new CreateReqeust(name, price); + private CreateRequest createProductRequest(final String name, final BigDecimal price) { + return new CreateRequest(name, price); } private ChangePriceRequest changePriceRequest(final long price) { diff --git a/src/test/java/kitchenpos/products/application/InMemoryProductRepository.java b/src/test/java/kitchenpos/products/infra/InMemoryProductRepository.java similarity index 95% rename from src/test/java/kitchenpos/products/application/InMemoryProductRepository.java rename to src/test/java/kitchenpos/products/infra/InMemoryProductRepository.java index 2fd78e96d..f228793b2 100644 --- a/src/test/java/kitchenpos/products/application/InMemoryProductRepository.java +++ b/src/test/java/kitchenpos/products/infra/InMemoryProductRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.products.application; +package kitchenpos.products.infra; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; From 9468aeb14364ee6ddf0d8a3fb3c044fe553a8651 Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 16:52:04 +0900 Subject: [PATCH 04/13] =?UTF-8?q?refactor(menuGroup):=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/{domain => infra}/JpaMenuGroupRepository.java | 4 +++- .../kitchenpos/menus/{domain => infra}/JpaMenuRepository.java | 4 +++- .../tobe/{domain => infra}/ToBeJpaMenuGroupRepository.java | 4 +++- .../menus/tobe/{domain => infra}/ToBeJpaMenuRepository.java | 4 +++- .../kitchenpos/menus/application/MenuGroupServiceTest.java | 3 +-- .../{ => tobe}/infra/ToBeInMemoryMenuGroupRepository.java | 2 +- .../menus/{ => tobe}/infra/ToBeInMemoryMenuRepository.java | 2 +- 7 files changed, 15 insertions(+), 8 deletions(-) rename src/main/java/kitchenpos/menus/{domain => infra}/JpaMenuGroupRepository.java (60%) rename src/main/java/kitchenpos/menus/{domain => infra}/JpaMenuRepository.java (80%) rename src/main/java/kitchenpos/menus/tobe/{domain => infra}/ToBeJpaMenuGroupRepository.java (66%) rename src/main/java/kitchenpos/menus/tobe/{domain => infra}/ToBeJpaMenuRepository.java (80%) rename src/test/java/kitchenpos/menus/{ => tobe}/infra/ToBeInMemoryMenuGroupRepository.java (95%) rename src/test/java/kitchenpos/menus/{ => tobe}/infra/ToBeInMemoryMenuRepository.java (97%) diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/infra/JpaMenuGroupRepository.java similarity index 60% rename from src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java rename to src/main/java/kitchenpos/menus/infra/JpaMenuGroupRepository.java index 233488198..4e9fbf1b9 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/infra/JpaMenuGroupRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.infra; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menus/infra/JpaMenuRepository.java similarity index 80% rename from src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java rename to src/main/java/kitchenpos/menus/infra/JpaMenuRepository.java index 796499c30..1fae56e05 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/infra/JpaMenuRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.infra; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuGroupRepository.java similarity index 66% rename from src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuGroupRepository.java rename to src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuGroupRepository.java index 8f5253406..fac9d6012 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuGroupRepository.java @@ -1,7 +1,9 @@ -package kitchenpos.menus.tobe.domain; +package kitchenpos.menus.tobe.infra; import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.ToBeMenuGroup; +import kitchenpos.menus.tobe.domain.ToBeMenuGroupRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuRepository.java b/src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuRepository.java similarity index 80% rename from src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuRepository.java rename to src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuRepository.java index 479367fb8..0b3101557 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeJpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuRepository.java @@ -1,7 +1,9 @@ -package kitchenpos.menus.tobe.domain; +package kitchenpos.menus.tobe.infra; import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.ToBeMenu; +import kitchenpos.menus.tobe.domain.ToBeMenuRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index 5bef6edbb..abbfdcd9c 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -4,10 +4,9 @@ import kitchenpos.common.exception.KitchenPosException; import kitchenpos.common.infra.FakePurgomalum; import kitchenpos.common.values.Name; -import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.dto.CreateRequest; import kitchenpos.menus.dto.MenuGroupDto; -import kitchenpos.menus.infra.ToBeInMemoryMenuGroupRepository; +import kitchenpos.menus.tobe.infra.ToBeInMemoryMenuGroupRepository; import kitchenpos.menus.tobe.domain.ToBeMenuGroupRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuGroupRepository.java similarity index 95% rename from src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuGroupRepository.java rename to src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuGroupRepository.java index b7091cf4d..ead3b6433 100644 --- a/src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuGroupRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.infra; +package kitchenpos.menus.tobe.infra; import kitchenpos.menus.tobe.domain.ToBeMenuGroup; import kitchenpos.menus.tobe.domain.ToBeMenuGroupRepository; diff --git a/src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java similarity index 97% rename from src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuRepository.java rename to src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java index ce5c7bb65..a3ca629d3 100644 --- a/src/test/java/kitchenpos/menus/infra/ToBeInMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.infra; +package kitchenpos.menus.tobe.infra; import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; From a74067150d343e9d3c97274dc5f045668683d0fe Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 16:57:55 +0900 Subject: [PATCH 05/13] =?UTF-8?q?refactor(menuGroup):=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=EC=B2=B4=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F?= =?UTF-8?q?=20tobe=20=EC=A0=91=EB=91=90=EC=82=AC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/application/MenuGroupService.java | 18 +++++----- .../menus/application/MenuService.java | 2 ++ .../kitchenpos/menus/domain/MenuGroup.java | 27 +++++++-------- .../kitchenpos/menus/dto/MenuGroupDto.java | 3 +- .../menus/tobe/domain/ToBeMenu.java | 7 ++-- .../menus/tobe/domain/ToBeMenuGroup.java | 34 ------------------- .../tobe/domain/ToBeMenuGroupRepository.java | 14 -------- .../infra/ToBeJpaMenuGroupRepository.java | 12 ------- src/test/java/kitchenpos/Fixtures.java | 19 ++++------- .../application/OrderServiceTest.java | 2 +- .../application/MenuGroupServiceTest.java | 12 +++---- .../menus/application/MenuServiceTest.java | 6 ++-- .../ProductPriceChangeListenerTest.java | 1 + .../InMemoryMenuGroupRepository.java | 2 +- .../InMemoryMenuRepository.java | 2 +- .../ToBeInMemoryMenuGroupRepository.java | 26 -------------- .../application/ProductServiceTest.java | 2 +- 17 files changed, 47 insertions(+), 142 deletions(-) delete mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java delete mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroupRepository.java delete mode 100644 src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuGroupRepository.java rename src/test/java/kitchenpos/menus/{application => infra}/InMemoryMenuGroupRepository.java (94%) rename src/test/java/kitchenpos/menus/{application => infra}/InMemoryMenuRepository.java (96%) delete mode 100644 src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuGroupRepository.java diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index 9db8c1af3..36ffd2a8a 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -2,12 +2,10 @@ import kitchenpos.common.domain.Purgomalum; import kitchenpos.common.values.Name; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.dto.CreateRequest; import kitchenpos.menus.dto.MenuGroupDto; -import kitchenpos.menus.tobe.domain.ToBeMenuGroup; -import kitchenpos.menus.tobe.domain.ToBeMenuGroupRepository; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,26 +14,26 @@ @Service public class MenuGroupService { - private final ToBeMenuGroupRepository toBeMenuGroupRepository; + private final MenuGroupRepository menuGroupRepository; private final Purgomalum purgomalum; - public MenuGroupService(ToBeMenuGroupRepository toBeMenuGroupRepository, + public MenuGroupService(MenuGroupRepository menuGroupRepository, Purgomalum purgomalum) { - this.toBeMenuGroupRepository = toBeMenuGroupRepository; + this.menuGroupRepository = menuGroupRepository; this.purgomalum = purgomalum; } @Transactional public MenuGroupDto create(final CreateRequest request) { Name name = new Name(request.getName(), purgomalum); - final ToBeMenuGroup menuGroup = new ToBeMenuGroup(name); - ToBeMenuGroup savedResult = toBeMenuGroupRepository.save(menuGroup); + final MenuGroup menuGroup = new MenuGroup(name); + MenuGroup savedResult = menuGroupRepository.save(menuGroup); return MenuGroupDto.from(savedResult); } @Transactional(readOnly = true) public List findAll() { - return toBeMenuGroupRepository.findAll() + return menuGroupRepository.findAll() .stream() .map(MenuGroupDto::from) .collect(Collectors.toList()); diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 889da873a..fc722dbd2 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -2,6 +2,8 @@ import kitchenpos.common.domain.Purgomalum; import kitchenpos.menus.domain.*; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; import org.springframework.stereotype.Service; diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroup.java b/src/main/java/kitchenpos/menus/domain/MenuGroup.java index e65017271..4fb1d19b4 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/menus/domain/MenuGroup.java @@ -1,9 +1,8 @@ package kitchenpos.menus.domain; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import kitchenpos.common.values.Name; + +import javax.persistence.*; import java.util.UUID; @Table(name = "menu_group") @@ -13,25 +12,23 @@ public class MenuGroup { @Id private UUID id; - @Column(name = "name", nullable = false) - private String name; + @Embedded + private Name name; - public MenuGroup() { + protected MenuGroup() { } - public UUID getId() { - return id; + public MenuGroup(final Name name) { + this.id = UUID.randomUUID(); + this.name = name; } - public void setId(final UUID id) { - this.id = id; + public UUID getId() { + return id; } - public String getName() { + public Name getName() { return name; } - public void setName(final String name) { - this.name = name; - } } diff --git a/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java b/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java index 11bf41208..b63f2e16e 100644 --- a/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java +++ b/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java @@ -2,7 +2,6 @@ import kitchenpos.common.values.Name; import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.tobe.domain.ToBeMenuGroup; import java.util.UUID; @@ -24,7 +23,7 @@ public Name getName() { return name; } - public static MenuGroupDto from(ToBeMenuGroup savedResult) { + public static MenuGroupDto from(MenuGroup savedResult) { return new MenuGroupDto(savedResult.getId(), savedResult.getName()); } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java index eb6b10653..3e90dd4e2 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java @@ -1,7 +1,6 @@ package kitchenpos.menus.tobe.domain; import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuProduct; import javax.persistence.*; import java.math.BigDecimal; @@ -27,7 +26,7 @@ public class ToBeMenu { columnDefinition = "binary(16)", foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") ) - private ToBeMenuGroup menuGroup; + private MenuGroup menuGroup; @Column(name = "displayed", nullable = false) private boolean displayed; @@ -72,11 +71,11 @@ public void setPrice(BigDecimal price) { this.price = price; } - public ToBeMenuGroup getMenuGroup() { + public MenuGroup getMenuGroup() { return menuGroup; } - public void setMenuGroup(ToBeMenuGroup menuGroup) { + public void setMenuGroup(MenuGroup menuGroup) { this.menuGroup = menuGroup; } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java deleted file mode 100644 index 9544d2386..000000000 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroup.java +++ /dev/null @@ -1,34 +0,0 @@ -package kitchenpos.menus.tobe.domain; - -import kitchenpos.common.values.Name; - -import javax.persistence.*; -import java.util.UUID; - -@Table(name = "menu_group") -@Entity -public class ToBeMenuGroup { - @Column(name = "id", columnDefinition = "binary(16)") - @Id - private UUID id; - - @Embedded - private Name name; - - protected ToBeMenuGroup() { - } - - public ToBeMenuGroup(final Name name) { - this.id = UUID.randomUUID(); - this.name = name; - } - - public UUID getId() { - return id; - } - - public Name getName() { - return name; - } - -} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroupRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroupRepository.java deleted file mode 100644 index e27760a91..000000000 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuGroupRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package kitchenpos.menus.tobe.domain; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -public interface ToBeMenuGroupRepository { - ToBeMenuGroup save(ToBeMenuGroup menuGroup); - - Optional findById(UUID id); - - List findAll(); -} - diff --git a/src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuGroupRepository.java deleted file mode 100644 index fac9d6012..000000000 --- a/src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuGroupRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package kitchenpos.menus.tobe.infra; - -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; -import kitchenpos.menus.tobe.domain.ToBeMenuGroup; -import kitchenpos.menus.tobe.domain.ToBeMenuGroupRepository; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.UUID; - -public interface ToBeJpaMenuGroupRepository extends ToBeMenuGroupRepository, JpaRepository { -} diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index b7b4b86d5..0fc5056f1 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -1,13 +1,12 @@ package kitchenpos; +import kitchenpos.common.infra.FakePurgomalum; import kitchenpos.common.values.Name; import kitchenpos.common.values.Price; import kitchenpos.eatinorders.domain.*; import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.common.infra.FakePurgomalum; -import kitchenpos.menus.tobe.domain.ToBeMenuGroup; +import kitchenpos.menus.domain.MenuGroup; import kitchenpos.products.domain.Product; import java.math.BigDecimal; @@ -32,24 +31,18 @@ public static Menu menu(final long price, final boolean displayed, final MenuPro menu.setId(UUID.randomUUID()); menu.setName("후라이드+후라이드"); menu.setPrice(BigDecimal.valueOf(price)); - menu.setMenuGroup(asisMenuGroup()); + menu.setMenuGroup(menuGroup()); menu.setDisplayed(displayed); menu.setMenuProducts(Arrays.asList(menuProducts)); return menu; } - public static MenuGroup asisMenuGroup() { - MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(UUID.randomUUID()); - menuGroup.setName("후라이드+후라이드"); - return menuGroup; - } - public static ToBeMenuGroup menuGroup() { + public static MenuGroup menuGroup() { return menuGroup(new Name("후라이드+후라이드", FakePurgomalum.create())); } - public static ToBeMenuGroup menuGroup(final Name name) { - return new ToBeMenuGroup(name); + public static MenuGroup menuGroup(final Name name) { + return new MenuGroup(name); } public static MenuProduct menuProduct() { diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java index 96bf0f286..213dfc06b 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java @@ -1,7 +1,7 @@ package kitchenpos.eatinorders.application; import kitchenpos.eatinorders.domain.*; -import kitchenpos.menus.application.InMemoryMenuRepository; +import kitchenpos.menus.infra.InMemoryMenuRepository; import kitchenpos.menus.domain.MenuRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index abbfdcd9c..df9cff682 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -6,8 +6,8 @@ import kitchenpos.common.values.Name; import kitchenpos.menus.dto.CreateRequest; import kitchenpos.menus.dto.MenuGroupDto; -import kitchenpos.menus.tobe.infra.ToBeInMemoryMenuGroupRepository; -import kitchenpos.menus.tobe.domain.ToBeMenuGroupRepository; +import kitchenpos.menus.infra.InMemoryMenuGroupRepository; +import kitchenpos.menus.domain.MenuGroupRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -23,15 +23,15 @@ import static org.junit.jupiter.api.Assertions.assertTrue; class MenuGroupServiceTest { - private ToBeMenuGroupRepository toBeMenuGroupRepository; + private MenuGroupRepository menuGroupRepository; private Purgomalum purgomalum; private MenuGroupService menuGroupService; @BeforeEach void setUp() { - toBeMenuGroupRepository = new ToBeInMemoryMenuGroupRepository(); + menuGroupRepository = new InMemoryMenuGroupRepository(); purgomalum = FakePurgomalum.create(); - menuGroupService = new MenuGroupService(toBeMenuGroupRepository, purgomalum); + menuGroupService = new MenuGroupService(menuGroupRepository, purgomalum); } @DisplayName("메뉴 그룹을 등록할 수 있다.") @@ -59,7 +59,7 @@ void create(final String name) { @Test void findAll() { Name name = new Name("두마리메뉴", purgomalum); - toBeMenuGroupRepository.save(menuGroup(name)); + menuGroupRepository.save(menuGroup(name)); final List actual = menuGroupService.findAll(); assertThat(actual).hasSize(1); } diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index f9e39dd15..eb23a5f7d 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -2,10 +2,12 @@ import kitchenpos.common.domain.Purgomalum; import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.domain.MenuProduct; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.common.infra.FakePurgomalum; +import kitchenpos.menus.infra.InMemoryMenuRepository; +import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.infra.InMemoryMenuGroupRepository; import kitchenpos.products.infra.InMemoryProductRepository; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; @@ -42,7 +44,7 @@ void setUp() { productRepository = new InMemoryProductRepository(); purgomalum = FakePurgomalum.create(); menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalum); - menuGroupId = menuGroupRepository.save(asisMenuGroup()).getId(); + menuGroupId = menuGroupRepository.save(menuGroup()).getId(); product = productRepository.save(product("후라이드", 16_000L)); } diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 1d2ad088a..219f35a5b 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -2,6 +2,7 @@ import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.infra.InMemoryMenuRepository; import kitchenpos.products.infra.InMemoryProductRepository; import kitchenpos.products.event.ProductPriceChangeEvent; import kitchenpos.products.domain.Product; diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menus/infra/InMemoryMenuGroupRepository.java similarity index 94% rename from src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java rename to src/test/java/kitchenpos/menus/infra/InMemoryMenuGroupRepository.java index 9b50d73bb..d726e79eb 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menus/infra/InMemoryMenuGroupRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.application; +package kitchenpos.menus.infra; import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuGroupRepository; diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/infra/InMemoryMenuRepository.java similarity index 96% rename from src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java rename to src/test/java/kitchenpos/menus/infra/InMemoryMenuRepository.java index 971ded7e3..d9dc152cc 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menus/infra/InMemoryMenuRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.application; +package kitchenpos.menus.infra; import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; diff --git a/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuGroupRepository.java deleted file mode 100644 index ead3b6433..000000000 --- a/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuGroupRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package kitchenpos.menus.tobe.infra; - -import kitchenpos.menus.tobe.domain.ToBeMenuGroup; -import kitchenpos.menus.tobe.domain.ToBeMenuGroupRepository; - -import java.util.*; - -public class ToBeInMemoryMenuGroupRepository implements ToBeMenuGroupRepository { - private final Map menuGroups = new HashMap<>(); - - @Override - public ToBeMenuGroup save(final ToBeMenuGroup menuGroup) { - menuGroups.put(menuGroup.getId(), menuGroup); - return menuGroup; - } - - @Override - public Optional findById(final UUID id) { - return Optional.ofNullable(menuGroups.get(id)); - } - - @Override - public List findAll() { - return new ArrayList<>(menuGroups.values()); - } -} diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index d123ceebe..bfde19252 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -4,7 +4,7 @@ import kitchenpos.common.exception.KitchenPosExceptionType; import kitchenpos.common.infra.FakeApplicationEventPublisher; import kitchenpos.common.infra.FakePurgomalum; -import kitchenpos.menus.application.InMemoryMenuRepository; +import kitchenpos.menus.infra.InMemoryMenuRepository; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.products.dto.ChangePriceRequest; import kitchenpos.products.dto.CreateRequest; From 51089c98d12db43dc078f7847a9d89b06a89e377 Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 19:48:12 +0900 Subject: [PATCH 06/13] =?UTF-8?q?refactor(menu):=20=EB=A9=94=EB=89=B4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/annotation/Validator.java | 17 ++ .../common/util/CollectionUtils.java | 19 ++ .../common/{ => util}/ComparisonUtils.java | 2 +- .../java/kitchenpos/common/values/Price.java | 37 +++- .../eatinorders/application/OrderService.java | 14 +- .../eatinorders/domain/OrderLineItem.java | 7 +- .../menus/application/MenuGroupService.java | 4 +- .../menus/application/MenuProductService.java | 44 +++++ .../menus/application/MenuService.java | 165 ++++++++---------- .../menus/application/MenuValidator.java | 52 ++++++ .../ProductPriceChangeListener.java | 30 ++-- .../menus/dto/ChangePriceMenuRequest.java | 18 ++ ...quest.java => CreateMenuGroupRequest.java} | 4 +- .../menus/dto/CreateMenuProductRequest.java | 30 ++++ .../menus/dto/CreateMenuRequest.java | 44 +++++ .../java/kitchenpos/menus/dto/MenuDto.java | 67 +++++++ .../menus/tobe/domain/ToBeMenu.java | 35 +++- .../menus/tobe/domain/ToBeMenuProduct.java | 34 ++-- .../menus/ui/MenuGroupRestController.java | 4 +- .../menus/ui/MenuRestController.java | 16 +- .../application/ProductValidator.java | 33 ++++ .../products/domain/ProductRepository.java | 1 + src/test/java/kitchenpos/Fixtures.java | 52 +++--- .../common/ComparisonUtilsTest.java | 1 + .../application/OrderServiceTest.java | 6 +- .../application/MenuGroupServiceTest.java | 15 +- .../menus/application/MenuServiceTest.java | 165 +++++++++--------- .../ProductPriceChangeListenerTest.java | 13 +- .../infra/ToBeInMemoryMenuRepository.java | 2 +- 29 files changed, 653 insertions(+), 278 deletions(-) create mode 100644 src/main/java/kitchenpos/common/annotation/Validator.java create mode 100644 src/main/java/kitchenpos/common/util/CollectionUtils.java rename src/main/java/kitchenpos/common/{ => util}/ComparisonUtils.java (95%) create mode 100644 src/main/java/kitchenpos/menus/application/MenuProductService.java create mode 100644 src/main/java/kitchenpos/menus/application/MenuValidator.java create mode 100644 src/main/java/kitchenpos/menus/dto/ChangePriceMenuRequest.java rename src/main/java/kitchenpos/menus/dto/{CreateRequest.java => CreateMenuGroupRequest.java} (62%) create mode 100644 src/main/java/kitchenpos/menus/dto/CreateMenuProductRequest.java create mode 100644 src/main/java/kitchenpos/menus/dto/CreateMenuRequest.java create mode 100644 src/main/java/kitchenpos/menus/dto/MenuDto.java create mode 100644 src/main/java/kitchenpos/products/application/ProductValidator.java diff --git a/src/main/java/kitchenpos/common/annotation/Validator.java b/src/main/java/kitchenpos/common/annotation/Validator.java new file mode 100644 index 000000000..eb4d9c48f --- /dev/null +++ b/src/main/java/kitchenpos/common/annotation/Validator.java @@ -0,0 +1,17 @@ +package kitchenpos.common.annotation; + +import org.springframework.core.annotation.AliasFor; +import org.springframework.stereotype.Component; + +import java.lang.annotation.*; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Component +public @interface Validator { + + @AliasFor(annotation = Component.class) + String value() default ""; + +} diff --git a/src/main/java/kitchenpos/common/util/CollectionUtils.java b/src/main/java/kitchenpos/common/util/CollectionUtils.java new file mode 100644 index 000000000..caf0f38a0 --- /dev/null +++ b/src/main/java/kitchenpos/common/util/CollectionUtils.java @@ -0,0 +1,19 @@ +package kitchenpos.common.util; + +import kitchenpos.common.exception.KitchenPosException; +import org.springframework.lang.Nullable; + +import java.util.Collection; + +public class CollectionUtils { + + private CollectionUtils() { + } + + public static void requireNonEmpty(@Nullable Collection collection, KitchenPosException exception) { + if (collection == null || collection.isEmpty()) { + throw exception; + } + } + +} diff --git a/src/main/java/kitchenpos/common/ComparisonUtils.java b/src/main/java/kitchenpos/common/util/ComparisonUtils.java similarity index 95% rename from src/main/java/kitchenpos/common/ComparisonUtils.java rename to src/main/java/kitchenpos/common/util/ComparisonUtils.java index 3993f4750..d00589a97 100644 --- a/src/main/java/kitchenpos/common/ComparisonUtils.java +++ b/src/main/java/kitchenpos/common/util/ComparisonUtils.java @@ -1,4 +1,4 @@ -package kitchenpos.common; +package kitchenpos.common.util; import java.math.BigDecimal; diff --git a/src/main/java/kitchenpos/common/values/Price.java b/src/main/java/kitchenpos/common/values/Price.java index bcf4e0deb..287b6b63e 100644 --- a/src/main/java/kitchenpos/common/values/Price.java +++ b/src/main/java/kitchenpos/common/values/Price.java @@ -1,20 +1,21 @@ package kitchenpos.common.values; +import kitchenpos.common.util.ComparisonUtils; import kitchenpos.common.exception.KitchenPosException; import kitchenpos.common.exception.KitchenPosExceptionType; import javax.persistence.Column; import javax.persistence.Embeddable; import java.math.BigDecimal; -import java.util.Map; import java.util.Objects; -import static java.math.BigDecimal.ZERO; -import static kitchenpos.common.ComparisonUtils.lessThan; +import static kitchenpos.common.util.ComparisonUtils.lessThan; @Embeddable public class Price { + public static final Price ZERO = new Price(BigDecimal.ZERO); + @Column(name = "price", nullable = false) private BigDecimal value; @@ -31,7 +32,7 @@ public Price(final BigDecimal value) { } private static void validate(BigDecimal value) { - if (value == null || lessThan(value, ZERO)) { + if (value == null || lessThan(value, BigDecimal.ZERO)) { String message = String.format("가격이 %s 이므로", value); throw new KitchenPosException(message, KitchenPosExceptionType.BAD_REQUEST); } @@ -42,7 +43,7 @@ public BigDecimal getValue() { } public boolean equalValue(BigDecimal value) { - return this.value.equals(value); + return ComparisonUtils.isEqual(this.value, value); } @Override @@ -58,11 +59,29 @@ public int hashCode() { return Objects.hash(value); } - public BigDecimal multiply(BigDecimal bigDecimal) { - return value.multiply(bigDecimal); + public Price add(Price price) { + BigDecimal result = value.add(price.value); + return new Price(result); + } + + public Price multiply(int number) { + return multiply(BigDecimal.valueOf(number)); } - public BigDecimal multiply(long bigDecimal) { - return value.multiply(BigDecimal.valueOf(bigDecimal)); + public Price multiply(long number) { + return multiply(BigDecimal.valueOf(number)); } + public Price multiply(BigDecimal number) { + BigDecimal result = value.multiply(number); + return new Price(result); + } + + + public boolean isGreaterThan(Price price) { + return ComparisonUtils.greaterThan(value, price.value); + } + + public boolean isLessThan(Price price) { + return ComparisonUtils.lessThan(value, price.value); + } } diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderService.java b/src/main/java/kitchenpos/eatinorders/application/OrderService.java index c20f52c7f..6e87902d4 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderService.java @@ -4,6 +4,8 @@ import kitchenpos.eatinorders.domain.*; import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.ToBeMenu; +import kitchenpos.menus.tobe.domain.ToBeMenuRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -15,13 +17,13 @@ @Service public class OrderService { private final OrderRepository orderRepository; - private final MenuRepository menuRepository; + private final ToBeMenuRepository menuRepository; private final OrderTableRepository orderTableRepository; private final KitchenridersClient kitchenridersClient; public OrderService( final OrderRepository orderRepository, - final MenuRepository menuRepository, + final ToBeMenuRepository menuRepository, final OrderTableRepository orderTableRepository, final KitchenridersClient kitchenridersClient ) { @@ -41,7 +43,7 @@ public Order create(final Order request) { if (Objects.isNull(orderLineItemRequests) || orderLineItemRequests.isEmpty()) { throw new IllegalArgumentException(); } - final List menus = menuRepository.findAllByIdIn( + final List menus = menuRepository.findAllByIdIn( orderLineItemRequests.stream() .map(OrderLineItem::getMenuId) .collect(Collectors.toList()) @@ -57,12 +59,12 @@ public Order create(final Order request) { throw new IllegalArgumentException(); } } - final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) + final ToBeMenu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) .orElseThrow(NoSuchElementException::new); if (!menu.isDisplayed()) { throw new IllegalStateException(); } - if (menu.getPrice().compareTo(orderLineItemRequest.getPrice()) != 0) { + if (menu.getPrice().equalValue(orderLineItemRequest.getPrice())) { throw new IllegalArgumentException(); } final OrderLineItem orderLineItem = new OrderLineItem(); @@ -106,7 +108,7 @@ public Order accept(final UUID orderId) { for (final OrderLineItem orderLineItem : order.getOrderLineItems()) { sum = orderLineItem.getMenu() .getPrice() - .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())); + .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())).getValue(); } kitchenridersClient.requestDelivery(orderId, sum, order.getDeliveryAddress()); } diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java index e1e037caf..116963904 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java @@ -1,6 +1,7 @@ package kitchenpos.eatinorders.domain; import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.ToBeMenu; import javax.persistence.*; import java.math.BigDecimal; @@ -20,7 +21,7 @@ public class OrderLineItem { columnDefinition = "binary(16)", foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu") ) - private Menu menu; + private ToBeMenu menu; @Column(name = "quantity", nullable = false) private long quantity; @@ -42,11 +43,11 @@ public void setSeq(final Long seq) { this.seq = seq; } - public Menu getMenu() { + public ToBeMenu getMenu() { return menu; } - public void setMenu(final Menu menu) { + public void setMenu(final ToBeMenu menu) { this.menu = menu; } diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index 36ffd2a8a..d979f10d7 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -2,7 +2,7 @@ import kitchenpos.common.domain.Purgomalum; import kitchenpos.common.values.Name; -import kitchenpos.menus.dto.CreateRequest; +import kitchenpos.menus.dto.CreateMenuGroupRequest; import kitchenpos.menus.dto.MenuGroupDto; import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuGroupRepository; @@ -24,7 +24,7 @@ public MenuGroupService(MenuGroupRepository menuGroupRepository, } @Transactional - public MenuGroupDto create(final CreateRequest request) { + public MenuGroupDto create(final CreateMenuGroupRequest request) { Name name = new Name(request.getName(), purgomalum); final MenuGroup menuGroup = new MenuGroup(name); MenuGroup savedResult = menuGroupRepository.save(menuGroup); diff --git a/src/main/java/kitchenpos/menus/application/MenuProductService.java b/src/main/java/kitchenpos/menus/application/MenuProductService.java new file mode 100644 index 000000000..e2f5b0e1e --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/MenuProductService.java @@ -0,0 +1,44 @@ +package kitchenpos.menus.application; + +import kitchenpos.common.exception.KitchenPosException; +import kitchenpos.menus.dto.CreateMenuProductRequest; +import kitchenpos.menus.tobe.domain.ToBeMenuProduct; +import kitchenpos.products.application.ProductValidator; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.Collectors; + +import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; +import static kitchenpos.common.exception.KitchenPosExceptionType.NOT_FOUND; + +@Service +public class MenuProductService { + + private final ProductValidator productValidator; + + public MenuProductService(final ProductValidator productValidator) { + this.productValidator = productValidator; + } + + public List create(final List request) { + if (Objects.isNull(request) || request.isEmpty()) { + throw new KitchenPosException("메뉴 구성 상품이 없으므로", BAD_REQUEST); + } + + List productIds = request.stream() + .map(CreateMenuProductRequest::getProductId) + .collect(Collectors.toList()); + + productValidator.isExistProducts(productIds); + + return request.stream() + .map(e -> new ToBeMenuProduct(e.getProductId(), e.getQuantity())) + .collect(Collectors.toList()); + } + +} diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index fc722dbd2..b8e845054 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -1,144 +1,117 @@ package kitchenpos.menus.application; import kitchenpos.common.domain.Purgomalum; +import kitchenpos.common.exception.KitchenPosException; +import kitchenpos.common.util.CollectionUtils; +import kitchenpos.common.values.Name; +import kitchenpos.common.values.Price; import kitchenpos.menus.domain.*; import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuGroupRepository; -import kitchenpos.products.domain.Product; +import kitchenpos.menus.dto.ChangePriceMenuRequest; +import kitchenpos.menus.dto.CreateMenuProductRequest; +import kitchenpos.menus.dto.CreateMenuRequest; +import kitchenpos.menus.dto.MenuDto; +import kitchenpos.menus.tobe.domain.ToBeMenu; +import kitchenpos.menus.tobe.domain.ToBeMenuProduct; +import kitchenpos.menus.tobe.domain.ToBeMenuRepository; +import kitchenpos.products.application.ProductValidator; import kitchenpos.products.domain.ProductRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; +import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; +import static kitchenpos.common.exception.KitchenPosExceptionType.NOT_FOUND; + @Service public class MenuService { + private final MenuValidator menuValidator; + private final ProductValidator productValidator; + private final MenuProductService menuProductService; private final MenuRepository menuRepository; + private final ToBeMenuRepository toBeMenuRepository; private final MenuGroupRepository menuGroupRepository; private final ProductRepository productRepository; private final Purgomalum purgomalum; public MenuService( - final MenuRepository menuRepository, - final MenuGroupRepository menuGroupRepository, - final ProductRepository productRepository, - final Purgomalum purgomalum + final MenuValidator menuValidator, + final ProductValidator productValidator, + final MenuProductService menuProductService, + final MenuRepository menuRepository, + final ToBeMenuRepository toBeMenuRepository, + final MenuGroupRepository menuGroupRepository, + final ProductRepository productRepository, + final Purgomalum purgomalum ) { + this.menuValidator = menuValidator; + this.productValidator = productValidator; + this.menuProductService = menuProductService; this.menuRepository = menuRepository; + this.toBeMenuRepository = toBeMenuRepository; this.menuGroupRepository = menuGroupRepository; this.productRepository = productRepository; this.purgomalum = purgomalum; } @Transactional - public Menu create(final Menu request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } + public MenuDto create(final CreateMenuRequest request) { + List menuProductRequests = request.getMenuProducts(); + CollectionUtils.requireNonEmpty(menuProductRequests,new KitchenPosException("메뉴 구성 상품이 없으므로", BAD_REQUEST)); final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) - .orElseThrow(NoSuchElementException::new); - final List menuProductRequests = request.getMenuProducts(); - if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) { - throw new IllegalArgumentException(); - } - final List products = productRepository.findAllByIdIn( - menuProductRequests.stream() - .map(MenuProduct::getProductId) - .collect(Collectors.toList()) + .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 메뉴 그룹을", NOT_FOUND)); + + final Price price = new Price(request.getPrice()); + + productValidator.isExistProducts( + menuProductRequests.stream() + .map(CreateMenuProductRequest::getProductId) + .collect(Collectors.toList()) ); - if (products.size() != menuProductRequests.size()) { - throw new IllegalArgumentException(); - } - final List menuProducts = new ArrayList<>(); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProductRequest : menuProductRequests) { - final long quantity = menuProductRequest.getQuantity(); - if (quantity < 0) { - throw new IllegalArgumentException(); - } - final Product product = productRepository.findById(menuProductRequest.getProductId()) - .orElseThrow(NoSuchElementException::new); - sum = sum.add( - product.getPrice() - .multiply(BigDecimal.valueOf(quantity)) - ); - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setProduct(product); - menuProduct.setQuantity(quantity); - menuProducts.add(menuProduct); - } - if (price.compareTo(sum) > 0) { - throw new IllegalArgumentException(); - } - final String name = request.getName(); - if (Objects.isNull(name) || purgomalum.containsProfanity(name)) { - throw new IllegalArgumentException(); - } - final Menu menu = new Menu(); - menu.setId(UUID.randomUUID()); - menu.setName(name); - menu.setPrice(price); - menu.setMenuGroup(menuGroup); - menu.setDisplayed(request.isDisplayed()); - menu.setMenuProducts(menuProducts); - return menuRepository.save(menu); + + final List menuProducts = menuProductService.create(menuProductRequests); + menuValidator.validatePrice(price, menuProducts); + final Name name = new Name(request.getName(), purgomalum); + final ToBeMenu menu = new ToBeMenu(name, price, menuGroup, menuProducts, request.isDisplayed()); + ToBeMenu result = toBeMenuRepository.save(menu); + return MenuDto.from(result); } @Transactional - public Menu changePrice(final UUID menuId, final Menu request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } - final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (price.compareTo(sum) > 0) { - throw new IllegalArgumentException(); - } + public MenuDto changePrice(final UUID menuId, final ChangePriceMenuRequest request) { + final ToBeMenu menu = toBeMenuRepository.findById(menuId) + .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 메뉴를", NOT_FOUND)); + + Price price = new Price(request.getPrice()); + menuValidator.validatePrice(price, menu.getMenuProducts()); menu.setPrice(price); - return menu; + return MenuDto.from(menu); } @Transactional - public Menu display(final UUID menuId) { - final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (menu.getPrice().compareTo(sum) > 0) { - throw new IllegalStateException(); - } + public MenuDto display(final UUID menuId) { + final ToBeMenu menu = toBeMenuRepository.findById(menuId) + .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 메뉴를", NOT_FOUND)); + menuValidator.validatePrice(menu.getPrice(), menu.getMenuProducts()); menu.setDisplayed(true); - return menu; + return MenuDto.from(menu); } @Transactional - public Menu hide(final UUID menuId) { - final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + public MenuDto hide(final UUID menuId) { + final ToBeMenu menu = toBeMenuRepository.findById(menuId) + .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 메뉴를", NOT_FOUND)); menu.setDisplayed(false); - return menu; + return MenuDto.from(menu); } @Transactional(readOnly = true) - public List findAll() { - return menuRepository.findAll(); + public List findAll() { + return toBeMenuRepository.findAll().stream() + .map(MenuDto::from) + .collect(Collectors.toList()); } } diff --git a/src/main/java/kitchenpos/menus/application/MenuValidator.java b/src/main/java/kitchenpos/menus/application/MenuValidator.java new file mode 100644 index 000000000..d6ea54607 --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/MenuValidator.java @@ -0,0 +1,52 @@ +package kitchenpos.menus.application; + +import kitchenpos.common.annotation.Validator; +import kitchenpos.common.exception.KitchenPosException; +import kitchenpos.common.values.Price; +import kitchenpos.menus.dto.CreateMenuProductRequest; +import kitchenpos.menus.dto.CreateMenuRequest; +import kitchenpos.menus.tobe.domain.ToBeMenuProduct; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.Collectors; + +import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; + +@Validator +public class MenuValidator { + + private final ProductRepository productRepository; + + public MenuValidator(ProductRepository productRepository) { + this.productRepository = productRepository; + } + + public void validatePrice(CreateMenuRequest request) { + final List menuProductRequests = request.getMenuProducts(); + if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) { + throw new KitchenPosException("메뉴 구성 상품이 없으므로", BAD_REQUEST); + } + + + } + + public void validatePrice(Price price, List menuProducts) { + List products = productRepository.findAllByIdIn(menuProducts.stream() + .map(ToBeMenuProduct::getProductId) + .collect(Collectors.toList())); + Map productMap = products.stream() + .collect(Collectors.toMap(Product::getId, product -> product)); + final Price sum = menuProducts.stream() + .map(e -> productMap.get(e.getProductId()).getPrice().multiply(e.getQuantity())) + .reduce(Price.ZERO, Price::add); + + if (price.isGreaterThan(sum)) { + throw new KitchenPosException("메뉴 가격이 구성 상품 가격보다 작으므로", BAD_REQUEST); + } + } +} diff --git a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java b/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java index 76d9a3844..287986abf 100644 --- a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java +++ b/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java @@ -2,6 +2,9 @@ import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.dto.MenuDto; +import kitchenpos.menus.tobe.domain.ToBeMenu; +import kitchenpos.menus.tobe.domain.ToBeMenuRepository; import kitchenpos.products.event.ProductPriceChangeEvent; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionPhase; @@ -10,31 +13,34 @@ import java.math.BigDecimal; import java.util.List; -import static kitchenpos.common.ComparisonUtils.greaterThan; +import static kitchenpos.common.util.ComparisonUtils.greaterThan; @Component public class ProductPriceChangeListener { - private final MenuRepository menuRepository; + private final MenuValidator menuValidator; + private final ToBeMenuRepository menuRepository; - public ProductPriceChangeListener(MenuRepository menuRepository) { + public ProductPriceChangeListener(MenuValidator menuValidator, ToBeMenuRepository menuRepository) { + this.menuValidator = menuValidator; this.menuRepository = menuRepository; } @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT) public void hideMenuBasedOnMenuAndMenuProductPrice(ProductPriceChangeEvent event) { - final List menus = menuRepository.findAllByProductId(event.getProductId()); + final List menus = menuRepository.findAllByProductId(event.getProductId()); + menus.stream().filter(this::isMenuPriceGreaterThanSumOfMenuProducts) - .forEach(e -> e.setDisplayed(false)); // TODO 향후 Menu의 도메인 로직으로 이관 + .forEach(ToBeMenu::hide); } - private boolean isMenuPriceGreaterThanSumOfMenuProducts(Menu menu) { - BigDecimal sum = menu.getMenuProducts().stream() - .reduce(BigDecimal.ZERO, (acc, e) -> { - BigDecimal sumOfEachMenuProduct = e.getProduct().getPrice().multiply(e.getQuantity()); - return acc.add(sumOfEachMenuProduct); - }, BigDecimal::add); - return greaterThan(menu.getPrice(), sum); + private boolean isMenuPriceGreaterThanSumOfMenuProducts(ToBeMenu menu) { + try { + menuValidator.validatePrice(menu.getPrice(), menu.getMenuProducts()); + return false; + } catch (Exception e) { + return true; + } } } diff --git a/src/main/java/kitchenpos/menus/dto/ChangePriceMenuRequest.java b/src/main/java/kitchenpos/menus/dto/ChangePriceMenuRequest.java new file mode 100644 index 000000000..f1b76f3e5 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/ChangePriceMenuRequest.java @@ -0,0 +1,18 @@ +package kitchenpos.menus.dto; + +import java.math.BigDecimal; +import java.util.UUID; + +public class ChangePriceMenuRequest { + + private final BigDecimal price; + + public ChangePriceMenuRequest(BigDecimal price) { + this.price = price; + } + + public BigDecimal getPrice() { + return price; + } + +} diff --git a/src/main/java/kitchenpos/menus/dto/CreateRequest.java b/src/main/java/kitchenpos/menus/dto/CreateMenuGroupRequest.java similarity index 62% rename from src/main/java/kitchenpos/menus/dto/CreateRequest.java rename to src/main/java/kitchenpos/menus/dto/CreateMenuGroupRequest.java index 4b18b4b52..69baebe26 100644 --- a/src/main/java/kitchenpos/menus/dto/CreateRequest.java +++ b/src/main/java/kitchenpos/menus/dto/CreateMenuGroupRequest.java @@ -1,10 +1,10 @@ package kitchenpos.menus.dto; -public class CreateRequest { +public class CreateMenuGroupRequest { private final String name; - public CreateRequest(String name) { + public CreateMenuGroupRequest(String name) { this.name = name; } diff --git a/src/main/java/kitchenpos/menus/dto/CreateMenuProductRequest.java b/src/main/java/kitchenpos/menus/dto/CreateMenuProductRequest.java new file mode 100644 index 000000000..f36550e13 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/CreateMenuProductRequest.java @@ -0,0 +1,30 @@ +package kitchenpos.menus.dto; + +import kitchenpos.products.domain.Product; + +import java.util.UUID; + +public class CreateMenuProductRequest { + + private Long seq; + private long quantity; + private UUID productId; + + public CreateMenuProductRequest(UUID productId, long quantity) { + this.productId = productId; + this.quantity = quantity; + } + + public Long getSeq() { + return seq; + } + + public long getQuantity() { + return quantity; + } + + public UUID getProductId() { + return productId; + } + +} diff --git a/src/main/java/kitchenpos/menus/dto/CreateMenuRequest.java b/src/main/java/kitchenpos/menus/dto/CreateMenuRequest.java new file mode 100644 index 000000000..8dc1e26b9 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/CreateMenuRequest.java @@ -0,0 +1,44 @@ +package kitchenpos.menus.dto; + +import kitchenpos.menus.domain.MenuProduct; +import kitchenpos.menus.tobe.domain.ToBeMenuProduct; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +public class CreateMenuRequest { + private final String name; + private final BigDecimal price; + private final UUID menuGroupId; + private final boolean displayed; + private final List menuProducts; + + public CreateMenuRequest(String name, BigDecimal price, UUID menuGroupId, boolean displayed, List menuProducts) { + this.name = name; + this.price = price; + this.menuGroupId = menuGroupId; + this.displayed = displayed; + this.menuProducts = menuProducts; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public boolean isDisplayed() { + return displayed; + } + + public List getMenuProducts() { + return menuProducts; + } +} diff --git a/src/main/java/kitchenpos/menus/dto/MenuDto.java b/src/main/java/kitchenpos/menus/dto/MenuDto.java new file mode 100644 index 000000000..767d2f0cd --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/MenuDto.java @@ -0,0 +1,67 @@ +package kitchenpos.menus.dto; + +import kitchenpos.common.values.Name; +import kitchenpos.common.values.Price; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.ToBeMenu; +import kitchenpos.menus.tobe.domain.ToBeMenuProduct; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +public class MenuDto { + + private UUID id; + private Name name; + private Price price; + private MenuGroup menuGroup; + private boolean displayed; + private List menuProducts; + private UUID menuGroupId; + + public MenuDto() { + } + + public UUID getId() { + return id; + } + + public Name getName() { + return name; + } + + public Price getPrice() { + return price; + } + + public MenuGroup getMenuGroup() { + return menuGroup; + } + + public boolean isDisplayed() { + return displayed; + } + + public List getMenuProducts() { + return menuProducts; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public static MenuDto from(ToBeMenu menu) { + final MenuDto menuDto = new MenuDto(); + menuDto.id = menu.getId(); + menuDto.name = menu.getName(); + menuDto.price = menu.getPrice(); + menuDto.menuGroup = menu.getMenuGroup(); + menuDto.displayed = menu.isDisplayed(); + menuDto.menuProducts = menu.getMenuProducts(); + menuDto.menuGroupId = menu.getMenuGroupId(); + + return menuDto; + } + +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java index 3e90dd4e2..0f570b065 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java @@ -1,9 +1,10 @@ package kitchenpos.menus.tobe.domain; +import kitchenpos.common.values.Name; +import kitchenpos.common.values.Price; import kitchenpos.menus.domain.MenuGroup; import javax.persistence.*; -import java.math.BigDecimal; import java.util.List; import java.util.UUID; @@ -15,10 +16,10 @@ public class ToBeMenu { private UUID id; @Column(name = "name", nullable = false) - private String name; + private Name name; @Column(name = "price", nullable = false) - private BigDecimal price; + private Price price; @ManyToOne(optional = false) @JoinColumn( @@ -43,7 +44,16 @@ public class ToBeMenu { @Transient private UUID menuGroupId; - protected ToBeMenu() { + // TODO + public ToBeMenu() { + } + public ToBeMenu(Name name, Price price, MenuGroup menuGroup, List menuProducts, boolean displayed) { + this.id = UUID.randomUUID(); + this.name = name; + this.price = price; + this.menuGroup = menuGroup; + this.menuProducts = menuProducts; + this.displayed = displayed; } public UUID getId() { @@ -55,19 +65,19 @@ public void setId(UUID id) { this.id = id; } - public String getName() { + public Name getName() { return name; } - public void setName(String name) { + public void setName(Name name) { this.name = name; } - public BigDecimal getPrice() { + public Price getPrice() { return price; } - public void setPrice(BigDecimal price) { + public void setPrice(Price price) { this.price = price; } @@ -102,4 +112,13 @@ public UUID getMenuGroupId() { public void setMenuGroupId(UUID menuGroupId) { this.menuGroupId = menuGroupId; } + + public void display() { + this.displayed = true; + } + + public void hide() { + this.displayed = false; + } + } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java index 109cfe029..d2209821d 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java @@ -14,30 +14,40 @@ public class ToBeMenuProduct { @Id private Long seq; - @ManyToOne(optional = false) - @JoinColumn( - name = "product_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_product") - ) - private Product product; - @Column(name = "quantity", nullable = false) private long quantity; @Transient private UUID productId; - protected ToBeMenuProduct() { + + public ToBeMenuProduct(UUID productId, long quantity) { + this.productId = productId; + this.quantity = quantity; + } + public ToBeMenuProduct(Long seq, UUID productId, long quantity) { + this.seq = seq; + this.productId = productId; + this.quantity = quantity; + } + + public void setSeq(Long seq) { + this.seq = seq; + } + + + public void setQuantity(long quantity) { + this.quantity = quantity; + } + + public void setProductId(UUID productId) { + this.productId = productId; } public Long getSeq() { return seq; } - public Product getProduct() { - return product; - } public long getQuantity() { return quantity; diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java index 7732c2725..8cff69c9d 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java @@ -1,7 +1,7 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuGroupService; -import kitchenpos.menus.dto.CreateRequest; +import kitchenpos.menus.dto.CreateMenuGroupRequest; import kitchenpos.menus.dto.MenuGroupDto; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -19,7 +19,7 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { } @PostMapping - public ResponseEntity create(@RequestBody final CreateRequest request) { + public ResponseEntity create(@RequestBody final CreateMenuGroupRequest request) { final MenuGroupDto response = menuGroupService.create(request); return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getId())) .body(response); diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 3e3a0e23a..be71c1ad3 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -2,9 +2,13 @@ import kitchenpos.menus.application.MenuService; import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.dto.ChangePriceMenuRequest; +import kitchenpos.menus.dto.CreateMenuRequest; +import kitchenpos.menus.dto.MenuDto; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.net.URI; import java.util.List; import java.util.UUID; @@ -19,29 +23,29 @@ public MenuRestController(final MenuService menuService) { } @PostMapping - public ResponseEntity create(@RequestBody final Menu request) { - final Menu response = menuService.create(request); + public ResponseEntity create(@RequestBody final CreateMenuRequest request) { + final MenuDto response = menuService.create(request); return ResponseEntity.created(URI.create("/api/menus/" + response.getId())) .body(response); } @PutMapping("/{menuId}/price") - public ResponseEntity changePrice(@PathVariable final UUID menuId, @RequestBody final Menu request) { + public ResponseEntity changePrice(@PathVariable final UUID menuId, @RequestBody final ChangePriceMenuRequest request) { return ResponseEntity.ok(menuService.changePrice(menuId, request)); } @PutMapping("/{menuId}/display") - public ResponseEntity display(@PathVariable final UUID menuId) { + public ResponseEntity display(@PathVariable final UUID menuId) { return ResponseEntity.ok(menuService.display(menuId)); } @PutMapping("/{menuId}/hide") - public ResponseEntity hide(@PathVariable final UUID menuId) { + public ResponseEntity hide(@PathVariable final UUID menuId) { return ResponseEntity.ok(menuService.hide(menuId)); } @GetMapping - public ResponseEntity> findAll() { + public ResponseEntity> findAll() { return ResponseEntity.ok(menuService.findAll()); } } diff --git a/src/main/java/kitchenpos/products/application/ProductValidator.java b/src/main/java/kitchenpos/products/application/ProductValidator.java new file mode 100644 index 000000000..76ec7728b --- /dev/null +++ b/src/main/java/kitchenpos/products/application/ProductValidator.java @@ -0,0 +1,33 @@ +package kitchenpos.products.application; + +import kitchenpos.common.annotation.Validator; +import kitchenpos.common.exception.KitchenPosException; +import kitchenpos.menus.dto.CreateMenuProductRequest; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +import static kitchenpos.common.exception.KitchenPosExceptionType.NOT_FOUND; + +@Validator +public class ProductValidator { + + private final ProductRepository productRepository; + + public ProductValidator(ProductRepository productRepository) { + this.productRepository = productRepository; + } + + public void isExistProducts(List productIds) { + List products = productRepository.findAllByIdIn(productIds); + + if (products.size() != productIds.size()) { + String message = String.format("상품=%s 중 일부를 ", productIds); + throw new KitchenPosException(message, NOT_FOUND); + } + } +} diff --git a/src/main/java/kitchenpos/products/domain/ProductRepository.java b/src/main/java/kitchenpos/products/domain/ProductRepository.java index 3637e4232..16c2b06cb 100644 --- a/src/main/java/kitchenpos/products/domain/ProductRepository.java +++ b/src/main/java/kitchenpos/products/domain/ProductRepository.java @@ -12,5 +12,6 @@ public interface ProductRepository { List findAll(); List findAllByIdIn(List ids); + } diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index 0fc5056f1..caa1d0273 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -4,12 +4,11 @@ import kitchenpos.common.values.Name; import kitchenpos.common.values.Price; import kitchenpos.eatinorders.domain.*; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuProduct; import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.ToBeMenu; +import kitchenpos.menus.tobe.domain.ToBeMenuProduct; import kitchenpos.products.domain.Product; -import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Random; @@ -18,23 +17,24 @@ public class Fixtures { public static final UUID INVALID_ID = new UUID(0L, 0L); - public static Menu menu() { + public static ToBeMenu menu() { return menu(19_000L, true, menuProduct()); } - public static Menu menu(final long price, final MenuProduct... menuProducts) { + public static ToBeMenu menu(final long price, final ToBeMenuProduct... menuProducts) { return menu(price, false, menuProducts); } - public static Menu menu(final long price, final boolean displayed, final MenuProduct... menuProducts) { - final Menu menu = new Menu(); - menu.setId(UUID.randomUUID()); - menu.setName("후라이드+후라이드"); - menu.setPrice(BigDecimal.valueOf(price)); - menu.setMenuGroup(menuGroup()); - menu.setDisplayed(displayed); - menu.setMenuProducts(Arrays.asList(menuProducts)); - return menu; + public static ToBeMenu menu(final long price, final boolean displayed, final ToBeMenuProduct... menuProducts) { + Name createdName = new Name("후라이드+후라이드", FakePurgomalum.create()); + Price createdPrice = new Price(price); + return new ToBeMenu( + createdName, + createdPrice, + menuGroup(), + Arrays.asList(menuProducts), + displayed + ); } public static MenuGroup menuGroup() { @@ -45,20 +45,20 @@ public static MenuGroup menuGroup(final Name name) { return new MenuGroup(name); } - public static MenuProduct menuProduct() { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product()); - menuProduct.setQuantity(2L); - return menuProduct; + public static ToBeMenuProduct menuProduct() { + return new ToBeMenuProduct( + new Random().nextLong(), + product().getId(), + 2L + ); } - public static MenuProduct menuProduct(final Product product, final long quantity) { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product); - menuProduct.setQuantity(quantity); - return menuProduct; + public static ToBeMenuProduct menuProduct(final Product product, final long quantity) { + return new ToBeMenuProduct( + new Random().nextLong(), + product.getId(), + quantity + ); } public static Order order(final OrderStatus status, final String deliveryAddress) { diff --git a/src/test/java/kitchenpos/common/ComparisonUtilsTest.java b/src/test/java/kitchenpos/common/ComparisonUtilsTest.java index bb1e89cf4..b39630869 100644 --- a/src/test/java/kitchenpos/common/ComparisonUtilsTest.java +++ b/src/test/java/kitchenpos/common/ComparisonUtilsTest.java @@ -1,5 +1,6 @@ package kitchenpos.common; +import kitchenpos.common.util.ComparisonUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java index 213dfc06b..2ff289e6d 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java @@ -3,6 +3,8 @@ import kitchenpos.eatinorders.domain.*; import kitchenpos.menus.infra.InMemoryMenuRepository; import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.ToBeMenuRepository; +import kitchenpos.menus.tobe.infra.ToBeInMemoryMenuRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -20,7 +22,7 @@ class OrderServiceTest { private OrderRepository orderRepository; - private MenuRepository menuRepository; + private ToBeMenuRepository menuRepository; private OrderTableRepository orderTableRepository; private FakeKitchenridersClient kitchenridersClient; private OrderService orderService; @@ -28,7 +30,7 @@ class OrderServiceTest { @BeforeEach void setUp() { orderRepository = new InMemoryOrderRepository(); - menuRepository = new InMemoryMenuRepository(); + menuRepository = new ToBeInMemoryMenuRepository(); orderTableRepository = new InMemoryOrderTableRepository(); kitchenridersClient = new FakeKitchenridersClient(); orderService = new OrderService(orderRepository, menuRepository, orderTableRepository, kitchenridersClient); diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index df9cff682..f8f01cb85 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -4,7 +4,7 @@ import kitchenpos.common.exception.KitchenPosException; import kitchenpos.common.infra.FakePurgomalum; import kitchenpos.common.values.Name; -import kitchenpos.menus.dto.CreateRequest; +import kitchenpos.menus.dto.CreateMenuGroupRequest; import kitchenpos.menus.dto.MenuGroupDto; import kitchenpos.menus.infra.InMemoryMenuGroupRepository; import kitchenpos.menus.domain.MenuGroupRepository; @@ -17,6 +17,8 @@ import java.util.List; import static kitchenpos.Fixtures.menuGroup; +import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; +import static kitchenpos.util.KitchenPostExceptionAssertionUtils.assertThrows; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; @@ -37,7 +39,7 @@ void setUp() { @DisplayName("메뉴 그룹을 등록할 수 있다.") @Test void create() { - final CreateRequest request = createMenuGroupRequest("두마리메뉴"); + final CreateMenuGroupRequest request = createMenuGroupRequest("두마리메뉴"); final MenuGroupDto actual = menuGroupService.create(request); assertThat(actual).isNotNull(); assertAll( @@ -50,9 +52,8 @@ void create() { @NullAndEmptySource @ParameterizedTest void create(final String name) { - final CreateRequest request = createMenuGroupRequest(name); - assertThatThrownBy(() -> menuGroupService.create(request)) - .isInstanceOf(KitchenPosException.class); + final CreateMenuGroupRequest request = createMenuGroupRequest(name); + assertThrows(BAD_REQUEST, () -> menuGroupService.create(request)); } @DisplayName("메뉴 그룹의 목록을 조회할 수 있다.") @@ -64,7 +65,7 @@ void findAll() { assertThat(actual).hasSize(1); } - private CreateRequest createMenuGroupRequest(final String name) { - return new CreateRequest(name); + private CreateMenuGroupRequest createMenuGroupRequest(final String name) { + return new CreateMenuGroupRequest(name); } } diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index eb23a5f7d..306440e96 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -1,16 +1,24 @@ package kitchenpos.menus.application; import kitchenpos.common.domain.Purgomalum; +import kitchenpos.common.exception.KitchenPosException; +import kitchenpos.common.exception.KitchenPosExceptionType; +import kitchenpos.common.values.Price; import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.domain.MenuRepository; import kitchenpos.common.infra.FakePurgomalum; +import kitchenpos.menus.dto.ChangePriceMenuRequest; +import kitchenpos.menus.dto.CreateMenuProductRequest; +import kitchenpos.menus.dto.CreateMenuRequest; +import kitchenpos.menus.dto.MenuDto; import kitchenpos.menus.infra.InMemoryMenuRepository; import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.infra.InMemoryMenuGroupRepository; +import kitchenpos.menus.tobe.infra.ToBeInMemoryMenuRepository; +import kitchenpos.products.application.ProductValidator; import kitchenpos.products.infra.InMemoryProductRepository; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; +import kitchenpos.util.KitchenPostExceptionAssertionUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -24,12 +32,20 @@ import java.util.*; import static kitchenpos.Fixtures.*; +import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; +import static kitchenpos.common.exception.KitchenPosExceptionType.NOT_FOUND; +import static kitchenpos.util.KitchenPostExceptionAssertionUtils.assertThrows; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertTrue; class MenuServiceTest { - private MenuRepository menuRepository; + private ProductValidator productValidator; + private MenuValidator menuValidator; + private MenuProductService menuProductService; + private InMemoryMenuRepository menuRepository; + private ToBeInMemoryMenuRepository toBeMenuRepository; private MenuGroupRepository menuGroupRepository; private ProductRepository productRepository; private Purgomalum purgomalum; @@ -40,10 +56,17 @@ class MenuServiceTest { @BeforeEach void setUp() { menuRepository = new InMemoryMenuRepository(); + toBeMenuRepository = new ToBeInMemoryMenuRepository(); menuGroupRepository = new InMemoryMenuGroupRepository(); productRepository = new InMemoryProductRepository(); purgomalum = FakePurgomalum.create(); - menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalum); + productValidator = new ProductValidator(productRepository); + menuValidator = new MenuValidator(productRepository); + menuProductService = new MenuProductService(productValidator); + menuService = new MenuService( + menuValidator, productValidator, menuProductService, menuRepository, + toBeMenuRepository, menuGroupRepository, productRepository, purgomalum + ); menuGroupId = menuGroupRepository.save(menuGroup()).getId(); product = productRepository.save(product("후라이드", 16_000L)); } @@ -51,15 +74,15 @@ void setUp() { @DisplayName("1개 이상의 등록된 상품으로 메뉴를 등록할 수 있다.") @Test void create() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final CreateMenuRequest expected = createMenuRequest( + "후라이드+후라이드", 19_000L, menuGroupId, true, createToBeMenuProductRequest(product.getId(), 2L) ); - final Menu actual = menuService.create(expected); + final MenuDto actual = menuService.create(expected); assertThat(actual).isNotNull(); assertAll( () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()), - () -> assertThat(actual.getPrice()).isEqualTo(expected.getPrice()), + () -> assertTrue(actual.getName().equalValue(expected.getName())), + () -> assertTrue(actual.getPrice().equalValue(expected.getPrice())), () -> assertThat(actual.getMenuGroup().getId()).isEqualTo(expected.getMenuGroupId()), () -> assertThat(actual.isDisplayed()).isEqualTo(expected.isDisplayed()), () -> assertThat(actual.getMenuProducts()).hasSize(1) @@ -69,28 +92,27 @@ void create() { @DisplayName("상품이 없으면 등록할 수 없다.") @MethodSource("menuProducts") @ParameterizedTest - void create(final List menuProducts) { - final Menu expected = createMenuRequest("후라이드+후라이드", 19_000L, menuGroupId, true, menuProducts); + void create(final List menuProducts) { + final CreateMenuRequest expected = createMenuRequest("후라이드+후라이드", 19_000L, menuGroupId, true, menuProducts); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(KitchenPosException.class); } private static List menuProducts() { return Arrays.asList( null, Arguments.of(Collections.emptyList()), - Arguments.of(Arrays.asList(createMenuProductRequest(INVALID_ID, 2L))) + Arguments.of(Arrays.asList(createToBeMenuProductRequest(INVALID_ID, 2L))) ); } @DisplayName("메뉴에 속한 상품의 수량은 0개 이상이어야 한다.") @Test void createNegativeQuantity() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), -1L) + final CreateMenuRequest expected = createMenuRequest( + "후라이드+후라이드", 19_000L, menuGroupId, true, createToBeMenuProductRequest(product.getId(), -1L) ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + assertThrows(BAD_REQUEST, () -> menuService.create(expected)); } @DisplayName("메뉴의 가격이 올바르지 않으면 등록할 수 없다.") @@ -98,32 +120,29 @@ void createNegativeQuantity() { @NullSource @ParameterizedTest void create(final BigDecimal price) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final CreateMenuRequest expected = createMenuRequest( + "후라이드+후라이드", price, menuGroupId, true, createToBeMenuProductRequest(product.getId(), 2L) ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + assertThrows(BAD_REQUEST, () -> menuService.create(expected)); } @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @Test void createExpensiveMenu() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final CreateMenuRequest expected = createMenuRequest( + "후라이드+후라이드", 33_000L, menuGroupId, true, createToBeMenuProductRequest(product.getId(), 2L) ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + assertThrows(BAD_REQUEST, () -> menuService.create(expected)); } @DisplayName("메뉴는 특정 메뉴 그룹에 속해야 한다.") @NullSource @ParameterizedTest void create(final UUID menuGroupId) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final CreateMenuRequest expected = createMenuRequest( + "후라이드+후라이드", 19_000L, menuGroupId, true, createToBeMenuProductRequest(product.getId(), 2L) ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(NoSuchElementException.class); + assertThrows(NOT_FOUND, () -> menuService.create(expected)); } @DisplayName("메뉴의 이름이 올바르지 않으면 등록할 수 없다.") @@ -131,20 +150,20 @@ void create(final UUID menuGroupId) { @NullSource @ParameterizedTest void create(final String name) { - final Menu expected = createMenuRequest( - name, 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final CreateMenuRequest expected = createMenuRequest( + name, 19_000L, menuGroupId, true, createToBeMenuProductRequest(product.getId(), 2L) ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + + assertThrows(BAD_REQUEST, () -> menuService.create(expected)); } @DisplayName("메뉴의 가격을 변경할 수 있다.") @Test void changePrice() { - final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(16_000L); - final Menu actual = menuService.changePrice(menuId, expected); - assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); + final UUID menuId = toBeMenuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); + final ChangePriceMenuRequest request = changePriceRequest(16_000L); + final MenuDto actual = menuService.changePrice(menuId, request); + assertTrue(actual.getPrice().equalValue(request.getPrice())); } @DisplayName("메뉴의 가격이 올바르지 않으면 변경할 수 없다.") @@ -152,113 +171,101 @@ void changePrice() { @NullSource @ParameterizedTest void changePrice(final BigDecimal price) { - final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(price); - assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) - .isInstanceOf(IllegalArgumentException.class); + final UUID menuId = toBeMenuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); + final ChangePriceMenuRequest request = changePriceRequest(price); + assertThrows(BAD_REQUEST, () -> menuService.changePrice(menuId, request)); } @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @Test void changePriceToExpensive() { - final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(33_000L); - assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) - .isInstanceOf(IllegalArgumentException.class); + final UUID menuId = toBeMenuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); + final ChangePriceMenuRequest request = changePriceRequest(33_000L); + assertThrows(BAD_REQUEST, () -> menuService.changePrice(menuId, request)); } @DisplayName("메뉴를 노출할 수 있다.") @Test void display() { - final UUID menuId = menuRepository.save(menu(19_000L, false, menuProduct(product, 2L))).getId(); - final Menu actual = menuService.display(menuId); + final UUID menuId = toBeMenuRepository.save(menu(19_000L, false, menuProduct(product, 2L))).getId(); + final MenuDto actual = menuService.display(menuId); assertThat(actual.isDisplayed()).isTrue(); } @DisplayName("메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 높을 경우 메뉴를 노출할 수 없다.") @Test void displayExpensiveMenu() { - final UUID menuId = menuRepository.save(menu(33_000L, false, menuProduct(product, 2L))).getId(); - assertThatThrownBy(() -> menuService.display(menuId)) - .isInstanceOf(IllegalStateException.class); + final UUID menuId = toBeMenuRepository.save(menu(33_000L, false, menuProduct(product, 2L))).getId(); + assertThrows(BAD_REQUEST, () -> menuService.display(menuId)); } @DisplayName("메뉴를 숨길 수 있다.") @Test void hide() { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))).getId(); - final Menu actual = menuService.hide(menuId); + final UUID menuId = toBeMenuRepository.save(menu(19_000L, true, menuProduct(product, 2L))).getId(); + final MenuDto actual = menuService.hide(menuId); assertThat(actual.isDisplayed()).isFalse(); } @DisplayName("메뉴의 목록을 조회할 수 있다.") @Test void findAll() { - menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); - final List actual = menuService.findAll(); + toBeMenuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); + final List actual = menuService.findAll(); assertThat(actual).hasSize(1); } - private Menu createMenuRequest( + private CreateMenuRequest createMenuRequest( final String name, final long price, final UUID menuGroupId, final boolean displayed, - final MenuProduct... menuProducts + final CreateMenuProductRequest... menuProducts ) { return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); } - private Menu createMenuRequest( + private CreateMenuRequest createMenuRequest( final String name, final BigDecimal price, final UUID menuGroupId, final boolean displayed, - final MenuProduct... menuProducts + final CreateMenuProductRequest... menuProducts ) { return createMenuRequest(name, price, menuGroupId, displayed, Arrays.asList(menuProducts)); } - private Menu createMenuRequest( + private CreateMenuRequest createMenuRequest( final String name, final long price, final UUID menuGroupId, final boolean displayed, - final List menuProducts + final List menuProducts ) { return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); } - private Menu createMenuRequest( + private CreateMenuRequest createMenuRequest( final String name, final BigDecimal price, final UUID menuGroupId, final boolean displayed, - final List menuProducts + final List menuProducts ) { - final Menu menu = new Menu(); - menu.setName(name); - menu.setPrice(price); - menu.setMenuGroupId(menuGroupId); - menu.setDisplayed(displayed); - menu.setMenuProducts(menuProducts); - return menu; + return new CreateMenuRequest( + name, price, menuGroupId, displayed, menuProducts + ); } - private static MenuProduct createMenuProductRequest(final UUID productId, final long quantity) { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setProductId(productId); - menuProduct.setQuantity(quantity); - return menuProduct; + private static CreateMenuProductRequest createToBeMenuProductRequest(final UUID productId, final long quantity) { + return new CreateMenuProductRequest(productId, quantity); } - private Menu changePriceRequest(final long price) { + private ChangePriceMenuRequest changePriceRequest(final long price) { return changePriceRequest(BigDecimal.valueOf(price)); } - private Menu changePriceRequest(final BigDecimal price) { - final Menu menu = new Menu(); - menu.setPrice(price); - return menu; + private ChangePriceMenuRequest changePriceRequest(final BigDecimal price) { + return new ChangePriceMenuRequest(price); } } diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 219f35a5b..269026e15 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -3,6 +3,9 @@ import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.infra.InMemoryMenuRepository; +import kitchenpos.menus.tobe.domain.ToBeMenu; +import kitchenpos.menus.tobe.domain.ToBeMenuRepository; +import kitchenpos.menus.tobe.infra.ToBeInMemoryMenuRepository; import kitchenpos.products.infra.InMemoryProductRepository; import kitchenpos.products.event.ProductPriceChangeEvent; import kitchenpos.products.domain.Product; @@ -16,20 +19,22 @@ class ProductPriceChangeListenerTest { private ProductRepository productRepository; - private MenuRepository menuRepository; + private ToBeMenuRepository menuRepository; + private MenuValidator menuValidator; private ProductPriceChangeListener productPriceChangeListener; @BeforeEach void setUp() { productRepository = new InMemoryProductRepository(); - menuRepository = new InMemoryMenuRepository(); - productPriceChangeListener = new ProductPriceChangeListener(menuRepository); + menuRepository = new ToBeInMemoryMenuRepository(); + menuValidator = new MenuValidator(productRepository); + productPriceChangeListener = new ProductPriceChangeListener(menuValidator, menuRepository); } @Test void hideMenuBasedOnMenuAndMenuProductPrice() { final Product product = productRepository.save(product("후라이드", 8_000L)); - final Menu menu = menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); + final ToBeMenu menu = menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); final ProductPriceChangeEvent event = new ProductPriceChangeEvent(product.getId()); productPriceChangeListener.hideMenuBasedOnMenuAndMenuProductPrice(event); diff --git a/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java index a3ca629d3..21ac596e3 100644 --- a/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java @@ -39,7 +39,7 @@ public List findAllByIdIn(final List ids) { public List findAllByProductId(final UUID productId) { return menus.values() .stream() - .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProduct().getId().equals(productId))) + .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProductId().equals(productId))) .collect(Collectors.toList()); } } From 66cfe6605669f9b97bc87df2c9706636ad6a21fb Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 19:59:23 +0900 Subject: [PATCH 07/13] =?UTF-8?q?refactor(menu):=20=EB=A9=94=EB=89=B4=20to?= =?UTF-8?q?be=20=EC=A0=91=EB=91=90=EC=82=AC=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kitchenpos/common/values/Price.java | 2 +- .../eatinorders/application/OrderService.java | 12 +- .../eatinorders/domain/OrderLineItem.java | 7 +- .../menus/application/MenuGroupService.java | 4 +- .../menus/application/MenuProductService.java | 9 +- .../menus/application/MenuService.java | 31 ++--- .../menus/application/MenuValidator.java | 6 +- .../ProductPriceChangeListener.java | 16 +-- .../java/kitchenpos/menus/domain/Menu.java | 45 +++++-- .../kitchenpos/menus/domain/MenuProduct.java | 49 +++---- .../menus/dto/ChangePriceMenuRequest.java | 1 - .../menus/dto/CreateMenuProductRequest.java | 2 - .../menus/dto/CreateMenuRequest.java | 3 - .../java/kitchenpos/menus/dto/MenuDto.java | 11 +- .../menus/infra/JpaMenuRepository.java | 2 +- .../menus/tobe/domain/ToBeMenu.java | 124 ------------------ .../menus/tobe/domain/ToBeMenuProduct.java | 59 --------- .../menus/tobe/domain/ToBeMenuRepository.java | 18 --- .../tobe/infra/ToBeJpaMenuRepository.java | 18 --- .../menus/ui/MenuRestController.java | 2 - .../products/application/ProductService.java | 4 +- .../application/ProductValidator.java | 3 - .../products/ui/ProductRestController.java | 2 +- src/test/java/kitchenpos/Fixtures.java | 20 +-- .../common/ComparisonUtilsTest.java | 3 +- .../infra/FakeApplicationEventPublisher.java | 1 - .../kitchenpos/common/values/NameTest.java | 5 - .../kitchenpos/common/values/PriceTest.java | 1 - .../application/OrderServiceTest.java | 8 +- .../application/MenuGroupServiceTest.java | 4 +- .../menus/application/MenuServiceTest.java | 26 ++-- .../ProductPriceChangeListenerTest.java | 15 +-- .../menus/infra/InMemoryMenuRepository.java | 2 +- .../infra/ToBeInMemoryMenuRepository.java | 45 ------- .../application/ProductServiceTest.java | 8 +- .../KitchenPostExceptionAssertionUtils.java | 1 - 36 files changed, 133 insertions(+), 436 deletions(-) delete mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java delete mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java delete mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuRepository.java delete mode 100644 src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuRepository.java delete mode 100644 src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java diff --git a/src/main/java/kitchenpos/common/values/Price.java b/src/main/java/kitchenpos/common/values/Price.java index 287b6b63e..c59d8f876 100644 --- a/src/main/java/kitchenpos/common/values/Price.java +++ b/src/main/java/kitchenpos/common/values/Price.java @@ -1,8 +1,8 @@ package kitchenpos.common.values; -import kitchenpos.common.util.ComparisonUtils; import kitchenpos.common.exception.KitchenPosException; import kitchenpos.common.exception.KitchenPosExceptionType; +import kitchenpos.common.util.ComparisonUtils; import javax.persistence.Column; import javax.persistence.Embeddable; diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderService.java b/src/main/java/kitchenpos/eatinorders/application/OrderService.java index 6e87902d4..f59288026 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderService.java @@ -4,8 +4,6 @@ import kitchenpos.eatinorders.domain.*; import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.menus.tobe.domain.ToBeMenu; -import kitchenpos.menus.tobe.domain.ToBeMenuRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,13 +15,13 @@ @Service public class OrderService { private final OrderRepository orderRepository; - private final ToBeMenuRepository menuRepository; + private final MenuRepository menuRepository; private final OrderTableRepository orderTableRepository; private final KitchenridersClient kitchenridersClient; public OrderService( final OrderRepository orderRepository, - final ToBeMenuRepository menuRepository, + final MenuRepository menuRepository, final OrderTableRepository orderTableRepository, final KitchenridersClient kitchenridersClient ) { @@ -43,7 +41,7 @@ public Order create(final Order request) { if (Objects.isNull(orderLineItemRequests) || orderLineItemRequests.isEmpty()) { throw new IllegalArgumentException(); } - final List menus = menuRepository.findAllByIdIn( + final List menus = menuRepository.findAllByIdIn( orderLineItemRequests.stream() .map(OrderLineItem::getMenuId) .collect(Collectors.toList()) @@ -59,12 +57,12 @@ public Order create(final Order request) { throw new IllegalArgumentException(); } } - final ToBeMenu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) + final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) .orElseThrow(NoSuchElementException::new); if (!menu.isDisplayed()) { throw new IllegalStateException(); } - if (menu.getPrice().equalValue(orderLineItemRequest.getPrice())) { + if (!menu.getPrice().equalValue(orderLineItemRequest.getPrice())) { throw new IllegalArgumentException(); } final OrderLineItem orderLineItem = new OrderLineItem(); diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java index 116963904..e1e037caf 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java @@ -1,7 +1,6 @@ package kitchenpos.eatinorders.domain; import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.tobe.domain.ToBeMenu; import javax.persistence.*; import java.math.BigDecimal; @@ -21,7 +20,7 @@ public class OrderLineItem { columnDefinition = "binary(16)", foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu") ) - private ToBeMenu menu; + private Menu menu; @Column(name = "quantity", nullable = false) private long quantity; @@ -43,11 +42,11 @@ public void setSeq(final Long seq) { this.seq = seq; } - public ToBeMenu getMenu() { + public Menu getMenu() { return menu; } - public void setMenu(final ToBeMenu menu) { + public void setMenu(final Menu menu) { this.menu = menu; } diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index d979f10d7..eb51f7699 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -2,10 +2,10 @@ import kitchenpos.common.domain.Purgomalum; import kitchenpos.common.values.Name; -import kitchenpos.menus.dto.CreateMenuGroupRequest; -import kitchenpos.menus.dto.MenuGroupDto; import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.dto.CreateMenuGroupRequest; +import kitchenpos.menus.dto.MenuGroupDto; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/menus/application/MenuProductService.java b/src/main/java/kitchenpos/menus/application/MenuProductService.java index e2f5b0e1e..500185d56 100644 --- a/src/main/java/kitchenpos/menus/application/MenuProductService.java +++ b/src/main/java/kitchenpos/menus/application/MenuProductService.java @@ -2,10 +2,8 @@ import kitchenpos.common.exception.KitchenPosException; import kitchenpos.menus.dto.CreateMenuProductRequest; -import kitchenpos.menus.tobe.domain.ToBeMenuProduct; +import kitchenpos.menus.domain.MenuProduct; import kitchenpos.products.application.ProductValidator; -import kitchenpos.products.domain.Product; -import kitchenpos.products.domain.ProductRepository; import org.springframework.stereotype.Service; import java.util.List; @@ -14,7 +12,6 @@ import java.util.stream.Collectors; import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; -import static kitchenpos.common.exception.KitchenPosExceptionType.NOT_FOUND; @Service public class MenuProductService { @@ -25,7 +22,7 @@ public MenuProductService(final ProductValidator productValidator) { this.productValidator = productValidator; } - public List create(final List request) { + public List create(final List request) { if (Objects.isNull(request) || request.isEmpty()) { throw new KitchenPosException("메뉴 구성 상품이 없으므로", BAD_REQUEST); } @@ -37,7 +34,7 @@ public List create(final List request productValidator.isExistProducts(productIds); return request.stream() - .map(e -> new ToBeMenuProduct(e.getProductId(), e.getQuantity())) + .map(e -> new MenuProduct(e.getProductId(), e.getQuantity())) .collect(Collectors.toList()); } diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index b8e845054..622b9440b 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -5,22 +5,21 @@ import kitchenpos.common.util.CollectionUtils; import kitchenpos.common.values.Name; import kitchenpos.common.values.Price; -import kitchenpos.menus.domain.*; import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.dto.ChangePriceMenuRequest; import kitchenpos.menus.dto.CreateMenuProductRequest; import kitchenpos.menus.dto.CreateMenuRequest; import kitchenpos.menus.dto.MenuDto; -import kitchenpos.menus.tobe.domain.ToBeMenu; -import kitchenpos.menus.tobe.domain.ToBeMenuProduct; -import kitchenpos.menus.tobe.domain.ToBeMenuRepository; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuProduct; +import kitchenpos.menus.domain.MenuRepository; import kitchenpos.products.application.ProductValidator; -import kitchenpos.products.domain.ProductRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; @@ -32,9 +31,7 @@ public class MenuService { private final ProductValidator productValidator; private final MenuProductService menuProductService; private final MenuRepository menuRepository; - private final ToBeMenuRepository toBeMenuRepository; private final MenuGroupRepository menuGroupRepository; - private final ProductRepository productRepository; private final Purgomalum purgomalum; public MenuService( @@ -42,18 +39,14 @@ public MenuService( final ProductValidator productValidator, final MenuProductService menuProductService, final MenuRepository menuRepository, - final ToBeMenuRepository toBeMenuRepository, final MenuGroupRepository menuGroupRepository, - final ProductRepository productRepository, final Purgomalum purgomalum ) { this.menuValidator = menuValidator; this.productValidator = productValidator; this.menuProductService = menuProductService; this.menuRepository = menuRepository; - this.toBeMenuRepository = toBeMenuRepository; this.menuGroupRepository = menuGroupRepository; - this.productRepository = productRepository; this.purgomalum = purgomalum; } @@ -72,17 +65,17 @@ public MenuDto create(final CreateMenuRequest request) { .collect(Collectors.toList()) ); - final List menuProducts = menuProductService.create(menuProductRequests); + final List menuProducts = menuProductService.create(menuProductRequests); menuValidator.validatePrice(price, menuProducts); final Name name = new Name(request.getName(), purgomalum); - final ToBeMenu menu = new ToBeMenu(name, price, menuGroup, menuProducts, request.isDisplayed()); - ToBeMenu result = toBeMenuRepository.save(menu); + final Menu menu = new Menu(name, price, menuGroup, menuProducts, request.isDisplayed()); + Menu result = menuRepository.save(menu); return MenuDto.from(result); } @Transactional public MenuDto changePrice(final UUID menuId, final ChangePriceMenuRequest request) { - final ToBeMenu menu = toBeMenuRepository.findById(menuId) + final Menu menu = menuRepository.findById(menuId) .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 메뉴를", NOT_FOUND)); Price price = new Price(request.getPrice()); @@ -93,7 +86,7 @@ public MenuDto changePrice(final UUID menuId, final ChangePriceMenuRequest reque @Transactional public MenuDto display(final UUID menuId) { - final ToBeMenu menu = toBeMenuRepository.findById(menuId) + final Menu menu = menuRepository.findById(menuId) .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 메뉴를", NOT_FOUND)); menuValidator.validatePrice(menu.getPrice(), menu.getMenuProducts()); menu.setDisplayed(true); @@ -102,7 +95,7 @@ public MenuDto display(final UUID menuId) { @Transactional public MenuDto hide(final UUID menuId) { - final ToBeMenu menu = toBeMenuRepository.findById(menuId) + final Menu menu = menuRepository.findById(menuId) .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 메뉴를", NOT_FOUND)); menu.setDisplayed(false); return MenuDto.from(menu); @@ -110,7 +103,7 @@ public MenuDto hide(final UUID menuId) { @Transactional(readOnly = true) public List findAll() { - return toBeMenuRepository.findAll().stream() + return menuRepository.findAll().stream() .map(MenuDto::from) .collect(Collectors.toList()); } diff --git a/src/main/java/kitchenpos/menus/application/MenuValidator.java b/src/main/java/kitchenpos/menus/application/MenuValidator.java index d6ea54607..af9f05404 100644 --- a/src/main/java/kitchenpos/menus/application/MenuValidator.java +++ b/src/main/java/kitchenpos/menus/application/MenuValidator.java @@ -5,7 +5,7 @@ import kitchenpos.common.values.Price; import kitchenpos.menus.dto.CreateMenuProductRequest; import kitchenpos.menus.dto.CreateMenuRequest; -import kitchenpos.menus.tobe.domain.ToBeMenuProduct; +import kitchenpos.menus.domain.MenuProduct; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; @@ -35,9 +35,9 @@ public void validatePrice(CreateMenuRequest request) { } - public void validatePrice(Price price, List menuProducts) { + public void validatePrice(Price price, List menuProducts) { List products = productRepository.findAllByIdIn(menuProducts.stream() - .map(ToBeMenuProduct::getProductId) + .map(MenuProduct::getProductId) .collect(Collectors.toList())); Map productMap = products.stream() .collect(Collectors.toMap(Product::getId, product -> product)); diff --git a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java b/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java index 287986abf..3063489a5 100644 --- a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java +++ b/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java @@ -2,40 +2,34 @@ import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.menus.dto.MenuDto; -import kitchenpos.menus.tobe.domain.ToBeMenu; -import kitchenpos.menus.tobe.domain.ToBeMenuRepository; import kitchenpos.products.event.ProductPriceChangeEvent; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; -import java.math.BigDecimal; import java.util.List; -import static kitchenpos.common.util.ComparisonUtils.greaterThan; - @Component public class ProductPriceChangeListener { private final MenuValidator menuValidator; - private final ToBeMenuRepository menuRepository; + private final MenuRepository menuRepository; - public ProductPriceChangeListener(MenuValidator menuValidator, ToBeMenuRepository menuRepository) { + public ProductPriceChangeListener(MenuValidator menuValidator, MenuRepository menuRepository) { this.menuValidator = menuValidator; this.menuRepository = menuRepository; } @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT) public void hideMenuBasedOnMenuAndMenuProductPrice(ProductPriceChangeEvent event) { - final List menus = menuRepository.findAllByProductId(event.getProductId()); + final List menus = menuRepository.findAllByProductId(event.getProductId()); menus.stream().filter(this::isMenuPriceGreaterThanSumOfMenuProducts) - .forEach(ToBeMenu::hide); + .forEach(Menu::hide); } - private boolean isMenuPriceGreaterThanSumOfMenuProducts(ToBeMenu menu) { + private boolean isMenuPriceGreaterThanSumOfMenuProducts(Menu menu) { try { menuValidator.validatePrice(menu.getPrice(), menu.getMenuProducts()); return false; diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menus/domain/Menu.java index e923a6e5d..ca11f5801 100644 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/Menu.java @@ -1,7 +1,9 @@ package kitchenpos.menus.domain; +import kitchenpos.common.values.Name; +import kitchenpos.common.values.Price; + import javax.persistence.*; -import java.math.BigDecimal; import java.util.List; import java.util.UUID; @@ -13,10 +15,10 @@ public class Menu { private UUID id; @Column(name = "name", nullable = false) - private String name; + private Name name; @Column(name = "price", nullable = false) - private BigDecimal price; + private Price price; @ManyToOne(optional = false) @JoinColumn( @@ -41,30 +43,40 @@ public class Menu { @Transient private UUID menuGroupId; + // TODO public Menu() { } + public Menu(Name name, Price price, MenuGroup menuGroup, List menuProducts, boolean displayed) { + this.id = UUID.randomUUID(); + this.name = name; + this.price = price; + this.menuGroup = menuGroup; + this.menuProducts = menuProducts; + this.displayed = displayed; + } public UUID getId() { + return id; } - public void setId(final UUID id) { + public void setId(UUID id) { this.id = id; } - public String getName() { + public Name getName() { return name; } - public void setName(final String name) { + public void setName(Name name) { this.name = name; } - public BigDecimal getPrice() { + public Price getPrice() { return price; } - public void setPrice(final BigDecimal price) { + public void setPrice(Price price) { this.price = price; } @@ -72,7 +84,7 @@ public MenuGroup getMenuGroup() { return menuGroup; } - public void setMenuGroup(final MenuGroup menuGroup) { + public void setMenuGroup(MenuGroup menuGroup) { this.menuGroup = menuGroup; } @@ -80,7 +92,7 @@ public boolean isDisplayed() { return displayed; } - public void setDisplayed(final boolean displayed) { + public void setDisplayed(boolean displayed) { this.displayed = displayed; } @@ -88,7 +100,7 @@ public List getMenuProducts() { return menuProducts; } - public void setMenuProducts(final List menuProducts) { + public void setMenuProducts(List menuProducts) { this.menuProducts = menuProducts; } @@ -96,7 +108,16 @@ public UUID getMenuGroupId() { return menuGroupId; } - public void setMenuGroupId(final UUID menuGroupId) { + public void setMenuGroupId(UUID menuGroupId) { this.menuGroupId = menuGroupId; } + + public void display() { + this.displayed = true; + } + + public void hide() { + this.displayed = false; + } + } diff --git a/src/main/java/kitchenpos/menus/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/MenuProduct.java index d4fc1913d..26e6e6037 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/MenuProduct.java @@ -1,8 +1,6 @@ package kitchenpos.menus.domain; -import kitchenpos.products.domain.Product; - import javax.persistence.*; import java.util.UUID; @@ -14,53 +12,48 @@ public class MenuProduct { @Id private Long seq; - @ManyToOne(optional = false) - @JoinColumn( - name = "product_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_product") - ) - private Product product; - @Column(name = "quantity", nullable = false) private long quantity; - @Transient + @Column(name = "product_id", columnDefinition = "binary(16)", nullable = false) private UUID productId; - public MenuProduct() { + protected MenuProduct() { } - public Long getSeq() { - return seq; + public MenuProduct(UUID productId, long quantity) { + this.productId = productId; + this.quantity = quantity; + } + public MenuProduct(Long seq, UUID productId, long quantity) { + this.seq = seq; + this.productId = productId; + this.quantity = quantity; } - public void setSeq(final Long seq) { + public void setSeq(Long seq) { this.seq = seq; } - public Product getProduct() { - return product; + + public void setQuantity(long quantity) { + this.quantity = quantity; } - public void setProduct(final Product product) { - this.product = product; + public void setProductId(UUID productId) { + this.productId = productId; } - public long getQuantity() { - return quantity; + public Long getSeq() { + return seq; } - public void setQuantity(final long quantity) { - this.quantity = quantity; + + public long getQuantity() { + return quantity; } public UUID getProductId() { return productId; } - - public void setProductId(final UUID productId) { - this.productId = productId; - } - } diff --git a/src/main/java/kitchenpos/menus/dto/ChangePriceMenuRequest.java b/src/main/java/kitchenpos/menus/dto/ChangePriceMenuRequest.java index f1b76f3e5..58dc5ffe8 100644 --- a/src/main/java/kitchenpos/menus/dto/ChangePriceMenuRequest.java +++ b/src/main/java/kitchenpos/menus/dto/ChangePriceMenuRequest.java @@ -1,7 +1,6 @@ package kitchenpos.menus.dto; import java.math.BigDecimal; -import java.util.UUID; public class ChangePriceMenuRequest { diff --git a/src/main/java/kitchenpos/menus/dto/CreateMenuProductRequest.java b/src/main/java/kitchenpos/menus/dto/CreateMenuProductRequest.java index f36550e13..b5bba6761 100644 --- a/src/main/java/kitchenpos/menus/dto/CreateMenuProductRequest.java +++ b/src/main/java/kitchenpos/menus/dto/CreateMenuProductRequest.java @@ -1,7 +1,5 @@ package kitchenpos.menus.dto; -import kitchenpos.products.domain.Product; - import java.util.UUID; public class CreateMenuProductRequest { diff --git a/src/main/java/kitchenpos/menus/dto/CreateMenuRequest.java b/src/main/java/kitchenpos/menus/dto/CreateMenuRequest.java index 8dc1e26b9..1f710484e 100644 --- a/src/main/java/kitchenpos/menus/dto/CreateMenuRequest.java +++ b/src/main/java/kitchenpos/menus/dto/CreateMenuRequest.java @@ -1,8 +1,5 @@ package kitchenpos.menus.dto; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.tobe.domain.ToBeMenuProduct; - import java.math.BigDecimal; import java.util.List; import java.util.UUID; diff --git a/src/main/java/kitchenpos/menus/dto/MenuDto.java b/src/main/java/kitchenpos/menus/dto/MenuDto.java index 767d2f0cd..d8fd25138 100644 --- a/src/main/java/kitchenpos/menus/dto/MenuDto.java +++ b/src/main/java/kitchenpos/menus/dto/MenuDto.java @@ -3,10 +3,9 @@ import kitchenpos.common.values.Name; import kitchenpos.common.values.Price; import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.tobe.domain.ToBeMenu; -import kitchenpos.menus.tobe.domain.ToBeMenuProduct; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuProduct; -import java.math.BigDecimal; import java.util.List; import java.util.UUID; @@ -17,7 +16,7 @@ public class MenuDto { private Price price; private MenuGroup menuGroup; private boolean displayed; - private List menuProducts; + private List menuProducts; private UUID menuGroupId; public MenuDto() { @@ -43,7 +42,7 @@ public boolean isDisplayed() { return displayed; } - public List getMenuProducts() { + public List getMenuProducts() { return menuProducts; } @@ -51,7 +50,7 @@ public UUID getMenuGroupId() { return menuGroupId; } - public static MenuDto from(ToBeMenu menu) { + public static MenuDto from(Menu menu) { final MenuDto menuDto = new MenuDto(); menuDto.id = menu.getId(); menuDto.name = menu.getName(); diff --git a/src/main/java/kitchenpos/menus/infra/JpaMenuRepository.java b/src/main/java/kitchenpos/menus/infra/JpaMenuRepository.java index 1fae56e05..80c93da76 100644 --- a/src/main/java/kitchenpos/menus/infra/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/infra/JpaMenuRepository.java @@ -10,7 +10,7 @@ import java.util.UUID; public interface JpaMenuRepository extends MenuRepository, JpaRepository { - @Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId") + @Query("select m from Menu m join m.menuProducts mp where mp.productId = :productId") @Override List findAllByProductId(@Param("productId") UUID productId); } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java deleted file mode 100644 index 0f570b065..000000000 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenu.java +++ /dev/null @@ -1,124 +0,0 @@ -package kitchenpos.menus.tobe.domain; - -import kitchenpos.common.values.Name; -import kitchenpos.common.values.Price; -import kitchenpos.menus.domain.MenuGroup; - -import javax.persistence.*; -import java.util.List; -import java.util.UUID; - -@Table(name = "menu") -@Entity -public class ToBeMenu { - @Column(name = "id", columnDefinition = "binary(16)") - @Id - private UUID id; - - @Column(name = "name", nullable = false) - private Name name; - - @Column(name = "price", nullable = false) - private Price price; - - @ManyToOne(optional = false) - @JoinColumn( - name = "menu_group_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") - ) - private MenuGroup menuGroup; - - @Column(name = "displayed", nullable = false) - private boolean displayed; - - @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) - @JoinColumn( - name = "menu_id", - nullable = false, - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") - ) - private List menuProducts; - - @Transient - private UUID menuGroupId; - - // TODO - public ToBeMenu() { - } - public ToBeMenu(Name name, Price price, MenuGroup menuGroup, List menuProducts, boolean displayed) { - this.id = UUID.randomUUID(); - this.name = name; - this.price = price; - this.menuGroup = menuGroup; - this.menuProducts = menuProducts; - this.displayed = displayed; - } - - public UUID getId() { - - return id; - } - - public void setId(UUID id) { - this.id = id; - } - - public Name getName() { - return name; - } - - public void setName(Name name) { - this.name = name; - } - - public Price getPrice() { - return price; - } - - public void setPrice(Price price) { - this.price = price; - } - - public MenuGroup getMenuGroup() { - return menuGroup; - } - - public void setMenuGroup(MenuGroup menuGroup) { - this.menuGroup = menuGroup; - } - - public boolean isDisplayed() { - return displayed; - } - - public void setDisplayed(boolean displayed) { - this.displayed = displayed; - } - - public List getMenuProducts() { - return menuProducts; - } - - public void setMenuProducts(List menuProducts) { - this.menuProducts = menuProducts; - } - - public UUID getMenuGroupId() { - return menuGroupId; - } - - public void setMenuGroupId(UUID menuGroupId) { - this.menuGroupId = menuGroupId; - } - - public void display() { - this.displayed = true; - } - - public void hide() { - this.displayed = false; - } - -} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java deleted file mode 100644 index d2209821d..000000000 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuProduct.java +++ /dev/null @@ -1,59 +0,0 @@ -package kitchenpos.menus.tobe.domain; - - -import kitchenpos.products.domain.Product; - -import javax.persistence.*; -import java.util.UUID; - -@Table(name = "menu_product") -@Entity -public class ToBeMenuProduct { - @Column(name = "seq") - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Id - private Long seq; - - @Column(name = "quantity", nullable = false) - private long quantity; - - @Transient - private UUID productId; - - - public ToBeMenuProduct(UUID productId, long quantity) { - this.productId = productId; - this.quantity = quantity; - } - public ToBeMenuProduct(Long seq, UUID productId, long quantity) { - this.seq = seq; - this.productId = productId; - this.quantity = quantity; - } - - public void setSeq(Long seq) { - this.seq = seq; - } - - - public void setQuantity(long quantity) { - this.quantity = quantity; - } - - public void setProductId(UUID productId) { - this.productId = productId; - } - - public Long getSeq() { - return seq; - } - - - public long getQuantity() { - return quantity; - } - - public UUID getProductId() { - return productId; - } -} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuRepository.java deleted file mode 100644 index 621cd386b..000000000 --- a/src/main/java/kitchenpos/menus/tobe/domain/ToBeMenuRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package kitchenpos.menus.tobe.domain; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -public interface ToBeMenuRepository { - ToBeMenu save(ToBeMenu menu); - - Optional findById(UUID id); - - List findAll(); - - List findAllByIdIn(List ids); - - List findAllByProductId(UUID productId); -} - diff --git a/src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuRepository.java b/src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuRepository.java deleted file mode 100644 index 0b3101557..000000000 --- a/src/main/java/kitchenpos/menus/tobe/infra/ToBeJpaMenuRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package kitchenpos.menus.tobe.infra; - -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.menus.tobe.domain.ToBeMenu; -import kitchenpos.menus.tobe.domain.ToBeMenuRepository; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; -import java.util.UUID; - -public interface ToBeJpaMenuRepository extends ToBeMenuRepository, JpaRepository { - @Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId") - @Override - List findAllByProductId(@Param("productId") UUID productId); -} diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index be71c1ad3..7ef38c0e3 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -1,14 +1,12 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuService; -import kitchenpos.menus.domain.Menu; import kitchenpos.menus.dto.ChangePriceMenuRequest; import kitchenpos.menus.dto.CreateMenuRequest; import kitchenpos.menus.dto.MenuDto; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.math.BigDecimal; import java.net.URI; import java.util.List; import java.util.UUID; diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index c40e62c7d..87190ce56 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -4,12 +4,12 @@ import kitchenpos.common.exception.KitchenPosException; import kitchenpos.common.values.Name; import kitchenpos.common.values.Price; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.dto.ChangePriceRequest; import kitchenpos.products.dto.CreateRequest; import kitchenpos.products.dto.ProductDto; import kitchenpos.products.event.ProductPriceChangeEvent; -import kitchenpos.products.domain.Product; -import kitchenpos.products.domain.ProductRepository; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/products/application/ProductValidator.java b/src/main/java/kitchenpos/products/application/ProductValidator.java index 76ec7728b..cd112b9c9 100644 --- a/src/main/java/kitchenpos/products/application/ProductValidator.java +++ b/src/main/java/kitchenpos/products/application/ProductValidator.java @@ -2,14 +2,11 @@ import kitchenpos.common.annotation.Validator; import kitchenpos.common.exception.KitchenPosException; -import kitchenpos.menus.dto.CreateMenuProductRequest; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; -import org.springframework.stereotype.Component; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; import static kitchenpos.common.exception.KitchenPosExceptionType.NOT_FOUND; diff --git a/src/main/java/kitchenpos/products/ui/ProductRestController.java b/src/main/java/kitchenpos/products/ui/ProductRestController.java index e0e066aa9..8e6ec6759 100644 --- a/src/main/java/kitchenpos/products/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/products/ui/ProductRestController.java @@ -1,9 +1,9 @@ package kitchenpos.products.ui; import kitchenpos.products.application.ProductService; +import kitchenpos.products.domain.Product; import kitchenpos.products.dto.ChangePriceRequest; import kitchenpos.products.dto.CreateRequest; -import kitchenpos.products.domain.Product; import kitchenpos.products.dto.ProductDto; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index caa1d0273..c14a6f4e2 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -5,8 +5,8 @@ import kitchenpos.common.values.Price; import kitchenpos.eatinorders.domain.*; import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.tobe.domain.ToBeMenu; -import kitchenpos.menus.tobe.domain.ToBeMenuProduct; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuProduct; import kitchenpos.products.domain.Product; import java.time.LocalDateTime; @@ -17,18 +17,18 @@ public class Fixtures { public static final UUID INVALID_ID = new UUID(0L, 0L); - public static ToBeMenu menu() { + public static Menu menu() { return menu(19_000L, true, menuProduct()); } - public static ToBeMenu menu(final long price, final ToBeMenuProduct... menuProducts) { + public static Menu menu(final long price, final MenuProduct... menuProducts) { return menu(price, false, menuProducts); } - public static ToBeMenu menu(final long price, final boolean displayed, final ToBeMenuProduct... menuProducts) { + public static Menu menu(final long price, final boolean displayed, final MenuProduct... menuProducts) { Name createdName = new Name("후라이드+후라이드", FakePurgomalum.create()); Price createdPrice = new Price(price); - return new ToBeMenu( + return new Menu( createdName, createdPrice, menuGroup(), @@ -45,16 +45,16 @@ public static MenuGroup menuGroup(final Name name) { return new MenuGroup(name); } - public static ToBeMenuProduct menuProduct() { - return new ToBeMenuProduct( + public static MenuProduct menuProduct() { + return new MenuProduct( new Random().nextLong(), product().getId(), 2L ); } - public static ToBeMenuProduct menuProduct(final Product product, final long quantity) { - return new ToBeMenuProduct( + public static MenuProduct menuProduct(final Product product, final long quantity) { + return new MenuProduct( new Random().nextLong(), product.getId(), quantity diff --git a/src/test/java/kitchenpos/common/ComparisonUtilsTest.java b/src/test/java/kitchenpos/common/ComparisonUtilsTest.java index b39630869..ff055b085 100644 --- a/src/test/java/kitchenpos/common/ComparisonUtilsTest.java +++ b/src/test/java/kitchenpos/common/ComparisonUtilsTest.java @@ -7,7 +7,8 @@ import java.math.BigDecimal; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; class ComparisonUtilsTest { diff --git a/src/test/java/kitchenpos/common/infra/FakeApplicationEventPublisher.java b/src/test/java/kitchenpos/common/infra/FakeApplicationEventPublisher.java index 48527912f..d6bcb37ee 100644 --- a/src/test/java/kitchenpos/common/infra/FakeApplicationEventPublisher.java +++ b/src/test/java/kitchenpos/common/infra/FakeApplicationEventPublisher.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Optional; public class FakeApplicationEventPublisher implements ApplicationEventPublisher { private static final List events = new ArrayList<>(); diff --git a/src/test/java/kitchenpos/common/values/NameTest.java b/src/test/java/kitchenpos/common/values/NameTest.java index d8b6c200a..879fd0381 100644 --- a/src/test/java/kitchenpos/common/values/NameTest.java +++ b/src/test/java/kitchenpos/common/values/NameTest.java @@ -1,17 +1,12 @@ package kitchenpos.common.values; -import kitchenpos.common.exception.KitchenPosException; -import kitchenpos.common.exception.KitchenPosExceptionType; import kitchenpos.common.infra.FakePurgomalum; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.springframework.web.client.HttpClientErrorException; import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; -import static kitchenpos.common.exception.KitchenPosExceptionType.METHOD_NOT_ALLOWED; -import static kitchenpos.util.KitchenPostExceptionAssertionUtils.assertEqualsExceptionType; import static kitchenpos.util.KitchenPostExceptionAssertionUtils.assertThrows; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/kitchenpos/common/values/PriceTest.java b/src/test/java/kitchenpos/common/values/PriceTest.java index 263270dd4..694f6c3b2 100644 --- a/src/test/java/kitchenpos/common/values/PriceTest.java +++ b/src/test/java/kitchenpos/common/values/PriceTest.java @@ -1,6 +1,5 @@ package kitchenpos.common.values; -import kitchenpos.common.exception.KitchenPosExceptionType; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java index 2ff289e6d..cc7defc0d 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java @@ -1,10 +1,8 @@ package kitchenpos.eatinorders.application; import kitchenpos.eatinorders.domain.*; -import kitchenpos.menus.infra.InMemoryMenuRepository; import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.menus.tobe.domain.ToBeMenuRepository; -import kitchenpos.menus.tobe.infra.ToBeInMemoryMenuRepository; +import kitchenpos.menus.infra.InMemoryMenuRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -22,7 +20,7 @@ class OrderServiceTest { private OrderRepository orderRepository; - private ToBeMenuRepository menuRepository; + private MenuRepository menuRepository; private OrderTableRepository orderTableRepository; private FakeKitchenridersClient kitchenridersClient; private OrderService orderService; @@ -30,7 +28,7 @@ class OrderServiceTest { @BeforeEach void setUp() { orderRepository = new InMemoryOrderRepository(); - menuRepository = new ToBeInMemoryMenuRepository(); + menuRepository = new InMemoryMenuRepository(); orderTableRepository = new InMemoryOrderTableRepository(); kitchenridersClient = new FakeKitchenridersClient(); orderService = new OrderService(orderRepository, menuRepository, orderTableRepository, kitchenridersClient); diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index f8f01cb85..732d4434a 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -1,13 +1,12 @@ package kitchenpos.menus.application; import kitchenpos.common.domain.Purgomalum; -import kitchenpos.common.exception.KitchenPosException; import kitchenpos.common.infra.FakePurgomalum; import kitchenpos.common.values.Name; +import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.dto.CreateMenuGroupRequest; import kitchenpos.menus.dto.MenuGroupDto; import kitchenpos.menus.infra.InMemoryMenuGroupRepository; -import kitchenpos.menus.domain.MenuGroupRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -20,7 +19,6 @@ import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; import static kitchenpos.util.KitchenPostExceptionAssertionUtils.assertThrows; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 306440e96..a3482a378 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -2,23 +2,18 @@ import kitchenpos.common.domain.Purgomalum; import kitchenpos.common.exception.KitchenPosException; -import kitchenpos.common.exception.KitchenPosExceptionType; -import kitchenpos.common.values.Price; -import kitchenpos.menus.domain.Menu; import kitchenpos.common.infra.FakePurgomalum; +import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.dto.ChangePriceMenuRequest; import kitchenpos.menus.dto.CreateMenuProductRequest; import kitchenpos.menus.dto.CreateMenuRequest; import kitchenpos.menus.dto.MenuDto; -import kitchenpos.menus.infra.InMemoryMenuRepository; -import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.infra.InMemoryMenuGroupRepository; -import kitchenpos.menus.tobe.infra.ToBeInMemoryMenuRepository; +import kitchenpos.menus.infra.InMemoryMenuRepository; import kitchenpos.products.application.ProductValidator; -import kitchenpos.products.infra.InMemoryProductRepository; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; -import kitchenpos.util.KitchenPostExceptionAssertionUtils; +import kitchenpos.products.infra.InMemoryProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -29,7 +24,10 @@ import org.junit.jupiter.params.provider.ValueSource; import java.math.BigDecimal; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.UUID; import static kitchenpos.Fixtures.*; import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; @@ -44,8 +42,7 @@ class MenuServiceTest { private ProductValidator productValidator; private MenuValidator menuValidator; private MenuProductService menuProductService; - private InMemoryMenuRepository menuRepository; - private ToBeInMemoryMenuRepository toBeMenuRepository; + private InMemoryMenuRepository toBeMenuRepository; private MenuGroupRepository menuGroupRepository; private ProductRepository productRepository; private Purgomalum purgomalum; @@ -55,8 +52,7 @@ class MenuServiceTest { @BeforeEach void setUp() { - menuRepository = new InMemoryMenuRepository(); - toBeMenuRepository = new ToBeInMemoryMenuRepository(); + toBeMenuRepository = new InMemoryMenuRepository(); menuGroupRepository = new InMemoryMenuGroupRepository(); productRepository = new InMemoryProductRepository(); purgomalum = FakePurgomalum.create(); @@ -64,8 +60,8 @@ void setUp() { menuValidator = new MenuValidator(productRepository); menuProductService = new MenuProductService(productValidator); menuService = new MenuService( - menuValidator, productValidator, menuProductService, menuRepository, - toBeMenuRepository, menuGroupRepository, productRepository, purgomalum + menuValidator, productValidator, menuProductService, + toBeMenuRepository, menuGroupRepository, purgomalum ); menuGroupId = menuGroupRepository.save(menuGroup()).getId(); product = productRepository.save(product("후라이드", 16_000L)); diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 269026e15..3823ab26d 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -3,30 +3,27 @@ import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.infra.InMemoryMenuRepository; -import kitchenpos.menus.tobe.domain.ToBeMenu; -import kitchenpos.menus.tobe.domain.ToBeMenuRepository; -import kitchenpos.menus.tobe.infra.ToBeInMemoryMenuRepository; -import kitchenpos.products.infra.InMemoryProductRepository; -import kitchenpos.products.event.ProductPriceChangeEvent; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; +import kitchenpos.products.event.ProductPriceChangeEvent; +import kitchenpos.products.infra.InMemoryProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static kitchenpos.Fixtures.*; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; class ProductPriceChangeListenerTest { private ProductRepository productRepository; - private ToBeMenuRepository menuRepository; + private MenuRepository menuRepository; private MenuValidator menuValidator; private ProductPriceChangeListener productPriceChangeListener; @BeforeEach void setUp() { productRepository = new InMemoryProductRepository(); - menuRepository = new ToBeInMemoryMenuRepository(); + menuRepository = new InMemoryMenuRepository(); menuValidator = new MenuValidator(productRepository); productPriceChangeListener = new ProductPriceChangeListener(menuValidator, menuRepository); } @@ -34,7 +31,7 @@ void setUp() { @Test void hideMenuBasedOnMenuAndMenuProductPrice() { final Product product = productRepository.save(product("후라이드", 8_000L)); - final ToBeMenu menu = menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); + final Menu menu = menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); final ProductPriceChangeEvent event = new ProductPriceChangeEvent(product.getId()); productPriceChangeListener.hideMenuBasedOnMenuAndMenuProductPrice(event); diff --git a/src/test/java/kitchenpos/menus/infra/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/infra/InMemoryMenuRepository.java index d9dc152cc..902ae7c35 100644 --- a/src/test/java/kitchenpos/menus/infra/InMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menus/infra/InMemoryMenuRepository.java @@ -37,7 +37,7 @@ public List findAllByIdIn(final List ids) { public List findAllByProductId(final UUID productId) { return menus.values() .stream() - .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProduct().getId().equals(productId))) + .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProductId().equals(productId))) .collect(Collectors.toList()); } } diff --git a/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java deleted file mode 100644 index 21ac596e3..000000000 --- a/src/test/java/kitchenpos/menus/tobe/infra/ToBeInMemoryMenuRepository.java +++ /dev/null @@ -1,45 +0,0 @@ -package kitchenpos.menus.tobe.infra; - -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.menus.tobe.domain.ToBeMenu; -import kitchenpos.menus.tobe.domain.ToBeMenuRepository; - -import java.util.*; -import java.util.stream.Collectors; - -public class ToBeInMemoryMenuRepository implements ToBeMenuRepository { - private final Map menus = new HashMap<>(); - - @Override - public ToBeMenu save(final ToBeMenu menu) { - menus.put(menu.getId(), menu); - return menu; - } - - @Override - public Optional findById(final UUID id) { - return Optional.ofNullable(menus.get(id)); - } - - @Override - public List findAll() { - return new ArrayList<>(menus.values()); - } - - @Override - public List findAllByIdIn(final List ids) { - return menus.values() - .stream() - .filter(menu -> ids.contains(menu.getId())) - .collect(Collectors.toList()); - } - - @Override - public List findAllByProductId(final UUID productId) { - return menus.values() - .stream() - .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProductId().equals(productId))) - .collect(Collectors.toList()); - } -} diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index bfde19252..ee05a1ad4 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -4,14 +4,12 @@ import kitchenpos.common.exception.KitchenPosExceptionType; import kitchenpos.common.infra.FakeApplicationEventPublisher; import kitchenpos.common.infra.FakePurgomalum; -import kitchenpos.menus.infra.InMemoryMenuRepository; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.dto.ChangePriceRequest; import kitchenpos.products.dto.CreateRequest; import kitchenpos.products.dto.ProductDto; import kitchenpos.products.event.ProductPriceChangeEvent; -import kitchenpos.products.domain.Product; -import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.infra.InMemoryProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -33,7 +31,6 @@ class ProductServiceTest { private ProductRepository productRepository; - private MenuRepository menuRepository; private Purgomalum purgomalum; private ProductService productService; private FakeApplicationEventPublisher publisher; @@ -41,7 +38,6 @@ class ProductServiceTest { @BeforeEach void setUp() { productRepository = new InMemoryProductRepository(); - menuRepository = new InMemoryMenuRepository(); purgomalum = FakePurgomalum.create(); publisher = new FakeApplicationEventPublisher(); productService = new ProductService(productRepository, purgomalum, publisher); diff --git a/src/test/java/kitchenpos/util/KitchenPostExceptionAssertionUtils.java b/src/test/java/kitchenpos/util/KitchenPostExceptionAssertionUtils.java index 8e7e3171c..e8481606d 100644 --- a/src/test/java/kitchenpos/util/KitchenPostExceptionAssertionUtils.java +++ b/src/test/java/kitchenpos/util/KitchenPostExceptionAssertionUtils.java @@ -3,7 +3,6 @@ import kitchenpos.common.exception.KitchenPosException; import kitchenpos.common.exception.KitchenPosExceptionType; import org.junit.jupiter.api.Assertions; - import org.junit.jupiter.api.function.Executable; import static org.junit.jupiter.api.Assertions.assertTrue; From 693182c9cabf691769d5571f68d287aa4d19d91f Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 20:06:39 +0900 Subject: [PATCH 08/13] =?UTF-8?q?refactor(menu):=20=EA=B0=80=EA=B2=A9=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/application/MenuValidator.java | 20 ++++++------------- .../ProductPriceChangeListener.java | 11 ++-------- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/src/main/java/kitchenpos/menus/application/MenuValidator.java b/src/main/java/kitchenpos/menus/application/MenuValidator.java index af9f05404..7dd0ef09f 100644 --- a/src/main/java/kitchenpos/menus/application/MenuValidator.java +++ b/src/main/java/kitchenpos/menus/application/MenuValidator.java @@ -3,15 +3,12 @@ import kitchenpos.common.annotation.Validator; import kitchenpos.common.exception.KitchenPosException; import kitchenpos.common.values.Price; -import kitchenpos.menus.dto.CreateMenuProductRequest; -import kitchenpos.menus.dto.CreateMenuRequest; import kitchenpos.menus.domain.MenuProduct; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; @@ -26,16 +23,7 @@ public MenuValidator(ProductRepository productRepository) { this.productRepository = productRepository; } - public void validatePrice(CreateMenuRequest request) { - final List menuProductRequests = request.getMenuProducts(); - if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) { - throw new KitchenPosException("메뉴 구성 상품이 없으므로", BAD_REQUEST); - } - - - } - - public void validatePrice(Price price, List menuProducts) { + public boolean isMenuPriceGreaterThanSumOfMenuProducts(Price price, List menuProducts) { List products = productRepository.findAllByIdIn(menuProducts.stream() .map(MenuProduct::getProductId) .collect(Collectors.toList())); @@ -45,8 +33,12 @@ public void validatePrice(Price price, List menuProducts) { .map(e -> productMap.get(e.getProductId()).getPrice().multiply(e.getQuantity())) .reduce(Price.ZERO, Price::add); - if (price.isGreaterThan(sum)) { + return price.isGreaterThan(sum); + } + public void validatePrice(Price price, List menuProducts) { + if (isMenuPriceGreaterThanSumOfMenuProducts(price, menuProducts)) { throw new KitchenPosException("메뉴 가격이 구성 상품 가격보다 작으므로", BAD_REQUEST); } } + } diff --git a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java b/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java index 3063489a5..c28a9ef55 100644 --- a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java +++ b/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java @@ -25,16 +25,9 @@ public ProductPriceChangeListener(MenuValidator menuValidator, MenuRepository me public void hideMenuBasedOnMenuAndMenuProductPrice(ProductPriceChangeEvent event) { final List menus = menuRepository.findAllByProductId(event.getProductId()); - menus.stream().filter(this::isMenuPriceGreaterThanSumOfMenuProducts) + menus.stream() + .filter(e -> menuValidator.isMenuPriceGreaterThanSumOfMenuProducts(e.getPrice(), e.getMenuProducts())) .forEach(Menu::hide); } - private boolean isMenuPriceGreaterThanSumOfMenuProducts(Menu menu) { - try { - menuValidator.validatePrice(menu.getPrice(), menu.getMenuProducts()); - return false; - } catch (Exception e) { - return true; - } - } } From 2d0c25abc20e50e8a2e803410a237048cb822cab Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 20:13:48 +0900 Subject: [PATCH 09/13] =?UTF-8?q?refactor(menuGroup):=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EB=81=8A=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kitchenpos/common/values/Price.java | 6 -- .../menus/application/MenuService.java | 8 +-- .../java/kitchenpos/menus/domain/Menu.java | 55 +++---------------- .../java/kitchenpos/menus/dto/MenuDto.java | 6 -- src/test/java/kitchenpos/Fixtures.java | 2 +- .../menus/application/MenuServiceTest.java | 2 +- 6 files changed, 15 insertions(+), 64 deletions(-) diff --git a/src/main/java/kitchenpos/common/values/Price.java b/src/main/java/kitchenpos/common/values/Price.java index c59d8f876..8ae18e07e 100644 --- a/src/main/java/kitchenpos/common/values/Price.java +++ b/src/main/java/kitchenpos/common/values/Price.java @@ -64,9 +64,6 @@ public Price add(Price price) { return new Price(result); } - public Price multiply(int number) { - return multiply(BigDecimal.valueOf(number)); - } public Price multiply(long number) { return multiply(BigDecimal.valueOf(number)); } @@ -81,7 +78,4 @@ public boolean isGreaterThan(Price price) { return ComparisonUtils.greaterThan(value, price.value); } - public boolean isLessThan(Price price) { - return ComparisonUtils.lessThan(value, price.value); - } } diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 622b9440b..821b7f2ae 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -68,7 +68,7 @@ public MenuDto create(final CreateMenuRequest request) { final List menuProducts = menuProductService.create(menuProductRequests); menuValidator.validatePrice(price, menuProducts); final Name name = new Name(request.getName(), purgomalum); - final Menu menu = new Menu(name, price, menuGroup, menuProducts, request.isDisplayed()); + final Menu menu = new Menu(name, price, menuGroup.getId(), menuProducts, request.isDisplayed()); Menu result = menuRepository.save(menu); return MenuDto.from(result); } @@ -80,7 +80,7 @@ public MenuDto changePrice(final UUID menuId, final ChangePriceMenuRequest reque Price price = new Price(request.getPrice()); menuValidator.validatePrice(price, menu.getMenuProducts()); - menu.setPrice(price); + menu.changePrice(price); return MenuDto.from(menu); } @@ -89,7 +89,7 @@ public MenuDto display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 메뉴를", NOT_FOUND)); menuValidator.validatePrice(menu.getPrice(), menu.getMenuProducts()); - menu.setDisplayed(true); + menu.display(); return MenuDto.from(menu); } @@ -97,7 +97,7 @@ public MenuDto display(final UUID menuId) { public MenuDto hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 메뉴를", NOT_FOUND)); - menu.setDisplayed(false); + menu.hide(); return MenuDto.from(menu); } diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menus/domain/Menu.java index ca11f5801..03e11b7a2 100644 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/Menu.java @@ -20,14 +20,6 @@ public class Menu { @Column(name = "price", nullable = false) private Price price; - @ManyToOne(optional = false) - @JoinColumn( - name = "menu_group_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") - ) - private MenuGroup menuGroup; - @Column(name = "displayed", nullable = false) private boolean displayed; @@ -40,17 +32,16 @@ public class Menu { ) private List menuProducts; - @Transient + @Column(name = "menu_group_id", insertable = false, updatable = false) private UUID menuGroupId; - // TODO - public Menu() { + protected Menu() { } - public Menu(Name name, Price price, MenuGroup menuGroup, List menuProducts, boolean displayed) { + public Menu(Name name, Price price, UUID menuGroupId, List menuProducts, boolean displayed) { this.id = UUID.randomUUID(); this.name = name; this.price = price; - this.menuGroup = menuGroup; + this.menuGroupId = menuGroupId; this.menuProducts = menuProducts; this.displayed = displayed; } @@ -60,58 +51,27 @@ public UUID getId() { return id; } - public void setId(UUID id) { - this.id = id; - } public Name getName() { return name; } - public void setName(Name name) { - this.name = name; - } - public Price getPrice() { return price; } - public void setPrice(Price price) { - this.price = price; - } - - public MenuGroup getMenuGroup() { - return menuGroup; - } - - public void setMenuGroup(MenuGroup menuGroup) { - this.menuGroup = menuGroup; + public UUID getMenuGroupId() { + return this.menuGroupId; } public boolean isDisplayed() { return displayed; } - public void setDisplayed(boolean displayed) { - this.displayed = displayed; - } - public List getMenuProducts() { return menuProducts; } - public void setMenuProducts(List menuProducts) { - this.menuProducts = menuProducts; - } - - public UUID getMenuGroupId() { - return menuGroupId; - } - - public void setMenuGroupId(UUID menuGroupId) { - this.menuGroupId = menuGroupId; - } - public void display() { this.displayed = true; } @@ -120,4 +80,7 @@ public void hide() { this.displayed = false; } + public void changePrice(Price price) { + this.price = price; + } } diff --git a/src/main/java/kitchenpos/menus/dto/MenuDto.java b/src/main/java/kitchenpos/menus/dto/MenuDto.java index d8fd25138..d9d40b9b7 100644 --- a/src/main/java/kitchenpos/menus/dto/MenuDto.java +++ b/src/main/java/kitchenpos/menus/dto/MenuDto.java @@ -14,7 +14,6 @@ public class MenuDto { private UUID id; private Name name; private Price price; - private MenuGroup menuGroup; private boolean displayed; private List menuProducts; private UUID menuGroupId; @@ -34,10 +33,6 @@ public Price getPrice() { return price; } - public MenuGroup getMenuGroup() { - return menuGroup; - } - public boolean isDisplayed() { return displayed; } @@ -55,7 +50,6 @@ public static MenuDto from(Menu menu) { menuDto.id = menu.getId(); menuDto.name = menu.getName(); menuDto.price = menu.getPrice(); - menuDto.menuGroup = menu.getMenuGroup(); menuDto.displayed = menu.isDisplayed(); menuDto.menuProducts = menu.getMenuProducts(); menuDto.menuGroupId = menu.getMenuGroupId(); diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index c14a6f4e2..b5227ac8d 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -31,7 +31,7 @@ public static Menu menu(final long price, final boolean displayed, final MenuPro return new Menu( createdName, createdPrice, - menuGroup(), + menuGroup().getId(), Arrays.asList(menuProducts), displayed ); diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index a3482a378..62a56040e 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -79,7 +79,7 @@ void create() { () -> assertThat(actual.getId()).isNotNull(), () -> assertTrue(actual.getName().equalValue(expected.getName())), () -> assertTrue(actual.getPrice().equalValue(expected.getPrice())), - () -> assertThat(actual.getMenuGroup().getId()).isEqualTo(expected.getMenuGroupId()), + () -> assertThat(actual.getMenuGroupId()).isEqualTo(expected.getMenuGroupId()), () -> assertThat(actual.isDisplayed()).isEqualTo(expected.isDisplayed()), () -> assertThat(actual.getMenuProducts()).hasSize(1) ); From 1102fec25b2f2ccc6f8e3f9d9b02995e854a6e8e Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 20:14:03 +0900 Subject: [PATCH 10/13] =?UTF-8?q?feat(quantity):=20VO=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/common/values/Quantity.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/main/java/kitchenpos/common/values/Quantity.java diff --git a/src/main/java/kitchenpos/common/values/Quantity.java b/src/main/java/kitchenpos/common/values/Quantity.java new file mode 100644 index 000000000..baaf24d1e --- /dev/null +++ b/src/main/java/kitchenpos/common/values/Quantity.java @@ -0,0 +1,41 @@ +package kitchenpos.common.values; + +import kitchenpos.common.domain.Purgomalum; + +import javax.persistence.Column; +import java.util.Objects; + +public class Quantity { + + @Column(name = "quantity", nullable = false) + private Long value; + + + protected Quantity() { + } + + public Quantity(final Long value) { + this.value = value; + } + + public Long getValue() { + return value; + } + + public boolean equalValue(Long value) { + return this.value.equals(value); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Quantity quantity = (Quantity) o; + return Objects.equals(value, quantity.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} From aae4bd09267f80f601cc3a47ffbe9b746c49cd6c Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 20:22:26 +0900 Subject: [PATCH 11/13] =?UTF-8?q?feat(quantity):=20=EC=99=84=EC=A0=84=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EC=A0=81=EC=9A=A9,=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/common/values/Quantity.java | 9 +++++- .../menus/application/MenuProductService.java | 3 +- .../menus/application/MenuValidator.java | 2 +- .../kitchenpos/menus/domain/MenuProduct.java | 24 +++++--------- src/test/java/kitchenpos/Fixtures.java | 5 +-- .../common/values/QuantityTest.java | 31 +++++++++++++++++++ 6 files changed, 52 insertions(+), 22 deletions(-) create mode 100644 src/test/java/kitchenpos/common/values/QuantityTest.java diff --git a/src/main/java/kitchenpos/common/values/Quantity.java b/src/main/java/kitchenpos/common/values/Quantity.java index baaf24d1e..0850f673c 100644 --- a/src/main/java/kitchenpos/common/values/Quantity.java +++ b/src/main/java/kitchenpos/common/values/Quantity.java @@ -1,20 +1,27 @@ package kitchenpos.common.values; import kitchenpos.common.domain.Purgomalum; +import kitchenpos.common.exception.KitchenPosException; +import kitchenpos.common.exception.KitchenPosExceptionType; import javax.persistence.Column; +import javax.persistence.Embeddable; import java.util.Objects; +@Embeddable public class Quantity { @Column(name = "quantity", nullable = false) private Long value; - protected Quantity() { } public Quantity(final Long value) { + if (value < 0) { + String message = String.format("수량이 %s 이므로", value); + throw new KitchenPosException(message, KitchenPosExceptionType.BAD_REQUEST); + } this.value = value; } diff --git a/src/main/java/kitchenpos/menus/application/MenuProductService.java b/src/main/java/kitchenpos/menus/application/MenuProductService.java index 500185d56..712e8c8a4 100644 --- a/src/main/java/kitchenpos/menus/application/MenuProductService.java +++ b/src/main/java/kitchenpos/menus/application/MenuProductService.java @@ -1,6 +1,7 @@ package kitchenpos.menus.application; import kitchenpos.common.exception.KitchenPosException; +import kitchenpos.common.values.Quantity; import kitchenpos.menus.dto.CreateMenuProductRequest; import kitchenpos.menus.domain.MenuProduct; import kitchenpos.products.application.ProductValidator; @@ -34,7 +35,7 @@ public List create(final List request) { productValidator.isExistProducts(productIds); return request.stream() - .map(e -> new MenuProduct(e.getProductId(), e.getQuantity())) + .map(e -> new MenuProduct(e.getProductId(), new Quantity(e.getQuantity()))) .collect(Collectors.toList()); } diff --git a/src/main/java/kitchenpos/menus/application/MenuValidator.java b/src/main/java/kitchenpos/menus/application/MenuValidator.java index 7dd0ef09f..b9578206f 100644 --- a/src/main/java/kitchenpos/menus/application/MenuValidator.java +++ b/src/main/java/kitchenpos/menus/application/MenuValidator.java @@ -30,7 +30,7 @@ public boolean isMenuPriceGreaterThanSumOfMenuProducts(Price price, List productMap = products.stream() .collect(Collectors.toMap(Product::getId, product -> product)); final Price sum = menuProducts.stream() - .map(e -> productMap.get(e.getProductId()).getPrice().multiply(e.getQuantity())) + .map(e -> productMap.get(e.getProductId()).getPrice().multiply(e.getQuantity().getValue())) .reduce(Price.ZERO, Price::add); return price.isGreaterThan(sum); diff --git a/src/main/java/kitchenpos/menus/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/MenuProduct.java index 26e6e6037..5887a86ff 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/MenuProduct.java @@ -1,6 +1,8 @@ package kitchenpos.menus.domain; +import kitchenpos.common.values.Quantity; + import javax.persistence.*; import java.util.UUID; @@ -12,8 +14,8 @@ public class MenuProduct { @Id private Long seq; - @Column(name = "quantity", nullable = false) - private long quantity; + @Embedded + private Quantity quantity; @Column(name = "product_id", columnDefinition = "binary(16)", nullable = false) private UUID productId; @@ -21,35 +23,23 @@ public class MenuProduct { protected MenuProduct() { } - public MenuProduct(UUID productId, long quantity) { + public MenuProduct(UUID productId, Quantity quantity) { this.productId = productId; this.quantity = quantity; } - public MenuProduct(Long seq, UUID productId, long quantity) { + public MenuProduct(Long seq, UUID productId, Quantity quantity) { this.seq = seq; this.productId = productId; this.quantity = quantity; } - public void setSeq(Long seq) { - this.seq = seq; - } - - - public void setQuantity(long quantity) { - this.quantity = quantity; - } - - public void setProductId(UUID productId) { - this.productId = productId; - } public Long getSeq() { return seq; } - public long getQuantity() { + public Quantity getQuantity() { return quantity; } diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index b5227ac8d..55bcdf903 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -3,6 +3,7 @@ import kitchenpos.common.infra.FakePurgomalum; import kitchenpos.common.values.Name; import kitchenpos.common.values.Price; +import kitchenpos.common.values.Quantity; import kitchenpos.eatinorders.domain.*; import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.Menu; @@ -49,7 +50,7 @@ public static MenuProduct menuProduct() { return new MenuProduct( new Random().nextLong(), product().getId(), - 2L + new Quantity(2L) ); } @@ -57,7 +58,7 @@ public static MenuProduct menuProduct(final Product product, final long quantity return new MenuProduct( new Random().nextLong(), product.getId(), - quantity + new Quantity(quantity) ); } diff --git a/src/test/java/kitchenpos/common/values/QuantityTest.java b/src/test/java/kitchenpos/common/values/QuantityTest.java new file mode 100644 index 000000000..486734344 --- /dev/null +++ b/src/test/java/kitchenpos/common/values/QuantityTest.java @@ -0,0 +1,31 @@ +package kitchenpos.common.values; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static kitchenpos.common.exception.KitchenPosExceptionType.BAD_REQUEST; +import static kitchenpos.util.KitchenPostExceptionAssertionUtils.assertThrows; +import static org.junit.jupiter.api.Assertions.*; + + +class QuantityTest { + + @DisplayName("[정상] 가격을 생성합니다.") + @Test + void create() { + final Quantity quantity = new Quantity(1000L); + assertAll( + () -> assertNotNull(quantity), + () -> assertTrue(quantity.equalValue(1000L)) + ); + } + + @DisplayName("[예외] 음수로 가격을 생성할 수 없습니다.") + @Test + void create_exception1() { + assertThrows(BAD_REQUEST, () -> new Quantity(-1L)); + } + +} From 716390f20a8cb690e17a936f1b1c2cec5b1344ea Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 21:56:16 +0900 Subject: [PATCH 12/13] =?UTF-8?q?refactor:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8?= =?UTF-8?q?=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/domain/AggregateRoot.java | 33 +++++++++++ .../ProductPriceChangeListener.java | 2 +- .../products/application/ProductService.java | 3 +- .../kitchenpos/products/domain/Product.java | 7 +-- .../ProductPriceChangeEvent.java | 2 +- src/test/java/kitchenpos/IntegrationTest.java | 25 ++++++++ .../ProductPriceChangeListenerTest.java | 2 +- .../ProductServiceIntegrationTest.java | 58 +++++++++++++++++++ .../application/ProductServiceTest.java | 5 +- 9 files changed, 126 insertions(+), 11 deletions(-) create mode 100644 src/main/java/kitchenpos/common/domain/AggregateRoot.java rename src/main/java/kitchenpos/products/{event => domain}/ProductPriceChangeEvent.java (87%) create mode 100644 src/test/java/kitchenpos/IntegrationTest.java create mode 100644 src/test/java/kitchenpos/products/application/ProductServiceIntegrationTest.java diff --git a/src/main/java/kitchenpos/common/domain/AggregateRoot.java b/src/main/java/kitchenpos/common/domain/AggregateRoot.java new file mode 100644 index 000000000..84c53477e --- /dev/null +++ b/src/main/java/kitchenpos/common/domain/AggregateRoot.java @@ -0,0 +1,33 @@ +package kitchenpos.common.domain; + +import org.springframework.data.domain.AfterDomainEventPublication; +import org.springframework.data.domain.DomainEvents; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public interface AggregateRoot { + + ThreadLocal> threadLocal = ThreadLocal.withInitial(ArrayList::new); + + default Object register(Object event) { + if (event == null) { + return event; + } + threadLocal.get().add(event); + return event; + } + + @AfterDomainEventPublication + default void clear() { + threadLocal.get().clear(); + } + + @DomainEvents + default List domainEvents() { + return new ArrayList<>(threadLocal.get()); + } + +} diff --git a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java b/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java index c28a9ef55..935bf038d 100644 --- a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java +++ b/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java @@ -2,7 +2,7 @@ import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.products.event.ProductPriceChangeEvent; +import kitchenpos.products.domain.ProductPriceChangeEvent; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index 87190ce56..fa9d693e7 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -9,7 +9,6 @@ import kitchenpos.products.dto.ChangePriceRequest; import kitchenpos.products.dto.CreateRequest; import kitchenpos.products.dto.ProductDto; -import kitchenpos.products.event.ProductPriceChangeEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -50,7 +49,7 @@ public ProductDto changePrice(final UUID productId, final ChangePriceRequest req final Product product = productRepository.findById(productId) .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 상품을", NOT_FOUND)); product.changePrice(price); - publisher.publishEvent(new ProductPriceChangeEvent(product.getId())); + productRepository.save(product); return ProductDto.from(product); } diff --git a/src/main/java/kitchenpos/products/domain/Product.java b/src/main/java/kitchenpos/products/domain/Product.java index b7e284092..96c0189c5 100644 --- a/src/main/java/kitchenpos/products/domain/Product.java +++ b/src/main/java/kitchenpos/products/domain/Product.java @@ -1,5 +1,6 @@ package kitchenpos.products.domain; +import kitchenpos.common.domain.AggregateRoot; import kitchenpos.common.values.Name; import kitchenpos.common.values.Price; @@ -9,7 +10,7 @@ @Table(name = "product") @Entity -public class Product { +public class Product implements AggregateRoot { @Column(name = "id", columnDefinition = "binary(16)") @Id private UUID id; @@ -33,11 +34,9 @@ public UUID getId() { return id; } - public void changePrice(BigDecimal price) { - this.changePrice(new Price(price)); - } public void changePrice(Price price) { this.price = price; + register(new ProductPriceChangeEvent(this.id)); } public Name getName() { diff --git a/src/main/java/kitchenpos/products/event/ProductPriceChangeEvent.java b/src/main/java/kitchenpos/products/domain/ProductPriceChangeEvent.java similarity index 87% rename from src/main/java/kitchenpos/products/event/ProductPriceChangeEvent.java rename to src/main/java/kitchenpos/products/domain/ProductPriceChangeEvent.java index 4f5ad5b85..2382cbbfc 100644 --- a/src/main/java/kitchenpos/products/event/ProductPriceChangeEvent.java +++ b/src/main/java/kitchenpos/products/domain/ProductPriceChangeEvent.java @@ -1,4 +1,4 @@ -package kitchenpos.products.event; +package kitchenpos.products.domain; import java.util.UUID; diff --git a/src/test/java/kitchenpos/IntegrationTest.java b/src/test/java/kitchenpos/IntegrationTest.java new file mode 100644 index 000000000..a1b85f5e7 --- /dev/null +++ b/src/test/java/kitchenpos/IntegrationTest.java @@ -0,0 +1,25 @@ +package kitchenpos; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Lazy; +import org.springframework.test.context.TestConstructor; +import org.springframework.test.context.event.ApplicationEvents; +import org.springframework.test.context.event.RecordApplicationEvents; + +import javax.transaction.Transactional; + +@Transactional +@RecordApplicationEvents +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public abstract class IntegrationTest { + + /** + * 생성자 주입시 하위 클래스에서 매번 @Lazy 를 달아주어야 하는 불편함이 있습니다. + * 그래서 사용성을 고려해 직접 Autowiring 합니다! + */ + @Autowired + protected ApplicationEvents applicationEvents; + +} diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 3823ab26d..d2677155f 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -4,8 +4,8 @@ import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.infra.InMemoryMenuRepository; import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductPriceChangeEvent; import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.event.ProductPriceChangeEvent; import kitchenpos.products.infra.InMemoryProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/products/application/ProductServiceIntegrationTest.java b/src/test/java/kitchenpos/products/application/ProductServiceIntegrationTest.java new file mode 100644 index 000000000..09d135861 --- /dev/null +++ b/src/test/java/kitchenpos/products/application/ProductServiceIntegrationTest.java @@ -0,0 +1,58 @@ +package kitchenpos.products.application; + +import kitchenpos.IntegrationTest; +import kitchenpos.common.exception.KitchenPosExceptionType; +import kitchenpos.products.domain.ProductPriceChangeEvent; +import kitchenpos.products.domain.ProductRepository; +import kitchenpos.products.dto.ChangePriceRequest; +import kitchenpos.products.dto.ProductDto; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.test.context.event.ApplicationEvents; + +import java.math.BigDecimal; +import java.util.UUID; + +import static kitchenpos.Fixtures.product; +import static kitchenpos.util.KitchenPostExceptionAssertionUtils.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ProductServiceIntegrationTest extends IntegrationTest { + + private final ProductService productService; + private final ProductRepository productRepository; + + public ProductServiceIntegrationTest(ProductService productService, + ProductRepository productRepository) { + this.productService = productService; + this.productRepository = productRepository; + } + + @DisplayName("가격 변경시 상품의 가격 변경 이벤트가 발행되어야 한다.") + @Test + void changePrice_success() { + final UUID productId = productRepository.save(product("후라이드", 16_000L)).getId(); + final ChangePriceRequest request = new ChangePriceRequest(BigDecimal.valueOf(15_000L)); + final ProductDto actual = productService.changePrice(productId, request); + assertTrue(actual.getPrice().equalValue(request.getPrice())); + + var event = applicationEvents.stream(ProductPriceChangeEvent.class) + .filter(e -> e.getProductId().equals(productId)) + .findFirst(); + assertTrue(event.isPresent()); + } + + @DisplayName("가격 변경 중 실패시 상품의 가격 변경 이벤트가 발행되어선 안된다.") + @Test + void changePrice_fail() { + final UUID productId = productRepository.save(product("후라이드", 16_000L)).getId(); + final ChangePriceRequest expected = new ChangePriceRequest(BigDecimal.valueOf(-1000L)); + assertThrows(KitchenPosExceptionType.BAD_REQUEST, () -> productService.changePrice(productId, expected)); + + var event = applicationEvents.stream(ProductPriceChangeEvent.class) + .filter(e -> e.getProductId().equals(productId)) + .findFirst(); + assertTrue(event.isEmpty()); + } + +} diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index ee05a1ad4..068415178 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -5,11 +5,11 @@ import kitchenpos.common.infra.FakeApplicationEventPublisher; import kitchenpos.common.infra.FakePurgomalum; import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductPriceChangeEvent; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.dto.ChangePriceRequest; import kitchenpos.products.dto.CreateRequest; import kitchenpos.products.dto.ProductDto; -import kitchenpos.products.event.ProductPriceChangeEvent; import kitchenpos.products.infra.InMemoryProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -17,6 +17,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullSource; import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.test.context.event.RecordApplicationEvents; import java.math.BigDecimal; import java.util.List; @@ -98,7 +99,7 @@ void changePrice(final BigDecimal price) { void changePriceInMenu() { final Product product = productRepository.save(product("후라이드", 16_000L)); productService.changePrice(product.getId(), changePriceRequest(8_000L)); - ProductPriceChangeEvent event = (ProductPriceChangeEvent) publisher.pop(); + ProductPriceChangeEvent event = (ProductPriceChangeEvent) product.domainEvents().get(0); assertThat(event.getProductId()).isEqualTo(product.getId()); } From cdcde3653635cc17bdf83363332531d145a8cef7 Mon Sep 17 00:00:00 2001 From: jordy-torvalds Date: Sun, 17 Sep 2023 22:01:09 +0900 Subject: [PATCH 13/13] =?UTF-8?q?style:=20=ED=8F=AC=EB=A7=B7=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20=EC=9E=84=ED=8F=AC=ED=8A=B8=20=EC=B5=9C?= =?UTF-8?q?=EC=A0=84=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/domain/AggregateRoot.java | 4 +- .../exception/KitchenPosExceptionType.java | 8 +- .../common/infra/DefaultPurgomalum.java | 6 +- .../java/kitchenpos/common/values/Name.java | 2 +- .../java/kitchenpos/common/values/Price.java | 3 +- .../kitchenpos/common/values/Quantity.java | 1 - .../eatinorders/application/OrderService.java | 32 ++++---- .../application/OrderTableService.java | 6 +- .../kitchenpos/eatinorders/domain/Order.java | 14 ++-- .../eatinorders/domain/OrderLineItem.java | 6 +- .../eatinorders/ui/OrderRestController.java | 2 +- .../ui/OrderTableRestController.java | 6 +- .../menus/application/MenuGroupService.java | 6 +- .../menus/application/MenuProductService.java | 2 +- .../menus/application/MenuService.java | 8 +- .../menus/application/MenuValidator.java | 3 +- .../java/kitchenpos/menus/domain/Menu.java | 9 ++- .../kitchenpos/menus/domain/MenuProduct.java | 1 + .../menus/dto/CreateMenuGroupRequest.java | 14 ++-- .../java/kitchenpos/menus/dto/MenuDto.java | 25 +++--- .../kitchenpos/menus/dto/MenuGroupDto.java | 30 ++++---- .../menus/ui/MenuGroupRestController.java | 2 +- .../menus/ui/MenuRestController.java | 2 +- .../products/application/ProductService.java | 2 +- .../kitchenpos/products/domain/Product.java | 1 - .../kitchenpos/products/dto/ProductDto.java | 76 +++++++++---------- .../products/ui/ProductRestController.java | 2 +- 27 files changed, 135 insertions(+), 138 deletions(-) diff --git a/src/main/java/kitchenpos/common/domain/AggregateRoot.java b/src/main/java/kitchenpos/common/domain/AggregateRoot.java index 84c53477e..08b5ab9d1 100644 --- a/src/main/java/kitchenpos/common/domain/AggregateRoot.java +++ b/src/main/java/kitchenpos/common/domain/AggregateRoot.java @@ -3,13 +3,13 @@ import org.springframework.data.domain.AfterDomainEventPublication; import org.springframework.data.domain.DomainEvents; +import javax.persistence.Transient; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; public interface AggregateRoot { + @Transient ThreadLocal> threadLocal = ThreadLocal.withInitial(ArrayList::new); default Object register(Object event) { diff --git a/src/main/java/kitchenpos/common/exception/KitchenPosExceptionType.java b/src/main/java/kitchenpos/common/exception/KitchenPosExceptionType.java index 3df94f8f6..f0383026d 100644 --- a/src/main/java/kitchenpos/common/exception/KitchenPosExceptionType.java +++ b/src/main/java/kitchenpos/common/exception/KitchenPosExceptionType.java @@ -2,10 +2,10 @@ public enum KitchenPosExceptionType implements KitchenPosThrowable { - BAD_REQUEST( "잘못된 요청입니다."), - METHOD_NOT_ALLOWED( "허용되지 않은 기능입니다."), - NOT_FOUND( "찾을 수 없습니다."), - INTERNAL_SERVER_ERROR( "서버 내부 에러입니다."), + BAD_REQUEST("잘못된 요청입니다."), + METHOD_NOT_ALLOWED("허용되지 않은 기능입니다."), + NOT_FOUND("찾을 수 없습니다."), + INTERNAL_SERVER_ERROR("서버 내부 에러입니다."), ; private final String message; diff --git a/src/main/java/kitchenpos/common/infra/DefaultPurgomalum.java b/src/main/java/kitchenpos/common/infra/DefaultPurgomalum.java index beeefce78..9274b46a9 100644 --- a/src/main/java/kitchenpos/common/infra/DefaultPurgomalum.java +++ b/src/main/java/kitchenpos/common/infra/DefaultPurgomalum.java @@ -19,9 +19,9 @@ public DefaultPurgomalum(final RestTemplateBuilder restTemplateBuilder) { @Override public boolean containsProfanity(final String text) { final URI url = UriComponentsBuilder.fromUriString("https://www.purgomalum.com/service/containsprofanity") - .queryParam("text", text) - .build() - .toUri(); + .queryParam("text", text) + .build() + .toUri(); return Boolean.parseBoolean(restTemplate.getForObject(url, String.class)); } } diff --git a/src/main/java/kitchenpos/common/values/Name.java b/src/main/java/kitchenpos/common/values/Name.java index 307f5bd49..e750a4f84 100644 --- a/src/main/java/kitchenpos/common/values/Name.java +++ b/src/main/java/kitchenpos/common/values/Name.java @@ -28,7 +28,7 @@ private static void validate(String value, Purgomalum purgomalum) { String message = String.format("이름이 %s 이므로", value); throw new KitchenPosException(message, KitchenPosExceptionType.BAD_REQUEST); } - if(purgomalum.containsProfanity(value)) { + if (purgomalum.containsProfanity(value)) { String message = String.format("이름=%s 에 비속어가 포함되어 있으므로", value); throw new KitchenPosException(message, KitchenPosExceptionType.BAD_REQUEST); } diff --git a/src/main/java/kitchenpos/common/values/Price.java b/src/main/java/kitchenpos/common/values/Price.java index 8ae18e07e..46be911cf 100644 --- a/src/main/java/kitchenpos/common/values/Price.java +++ b/src/main/java/kitchenpos/common/values/Price.java @@ -26,6 +26,7 @@ protected Price() { public Price(final Long value) { this(BigDecimal.valueOf(value)); } + public Price(final BigDecimal value) { validate(value); this.value = value; @@ -67,13 +68,13 @@ public Price add(Price price) { public Price multiply(long number) { return multiply(BigDecimal.valueOf(number)); } + public Price multiply(BigDecimal number) { BigDecimal result = value.multiply(number); return new Price(result); } - public boolean isGreaterThan(Price price) { return ComparisonUtils.greaterThan(value, price.value); } diff --git a/src/main/java/kitchenpos/common/values/Quantity.java b/src/main/java/kitchenpos/common/values/Quantity.java index 0850f673c..1cc3e218e 100644 --- a/src/main/java/kitchenpos/common/values/Quantity.java +++ b/src/main/java/kitchenpos/common/values/Quantity.java @@ -1,6 +1,5 @@ package kitchenpos.common.values; -import kitchenpos.common.domain.Purgomalum; import kitchenpos.common.exception.KitchenPosException; import kitchenpos.common.exception.KitchenPosExceptionType; diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderService.java b/src/main/java/kitchenpos/eatinorders/application/OrderService.java index f59288026..99270e101 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderService.java @@ -20,10 +20,10 @@ public class OrderService { private final KitchenridersClient kitchenridersClient; public OrderService( - final OrderRepository orderRepository, - final MenuRepository menuRepository, - final OrderTableRepository orderTableRepository, - final KitchenridersClient kitchenridersClient + final OrderRepository orderRepository, + final MenuRepository menuRepository, + final OrderTableRepository orderTableRepository, + final KitchenridersClient kitchenridersClient ) { this.orderRepository = orderRepository; this.menuRepository = menuRepository; @@ -42,9 +42,9 @@ public Order create(final Order request) { throw new IllegalArgumentException(); } final List menus = menuRepository.findAllByIdIn( - orderLineItemRequests.stream() - .map(OrderLineItem::getMenuId) - .collect(Collectors.toList()) + orderLineItemRequests.stream() + .map(OrderLineItem::getMenuId) + .collect(Collectors.toList()) ); if (menus.size() != orderLineItemRequests.size()) { throw new IllegalArgumentException(); @@ -58,7 +58,7 @@ public Order create(final Order request) { } } final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (!menu.isDisplayed()) { throw new IllegalStateException(); } @@ -85,7 +85,7 @@ public Order create(final Order request) { } if (type == OrderType.EAT_IN) { final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (!orderTable.isOccupied()) { throw new IllegalStateException(); } @@ -97,7 +97,7 @@ public Order create(final Order request) { @Transactional public Order accept(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getStatus() != OrderStatus.WAITING) { throw new IllegalStateException(); } @@ -105,8 +105,8 @@ public Order accept(final UUID orderId) { BigDecimal sum = BigDecimal.ZERO; for (final OrderLineItem orderLineItem : order.getOrderLineItems()) { sum = orderLineItem.getMenu() - .getPrice() - .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())).getValue(); + .getPrice() + .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())).getValue(); } kitchenridersClient.requestDelivery(orderId, sum, order.getDeliveryAddress()); } @@ -117,7 +117,7 @@ public Order accept(final UUID orderId) { @Transactional public Order serve(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getStatus() != OrderStatus.ACCEPTED) { throw new IllegalStateException(); } @@ -128,7 +128,7 @@ public Order serve(final UUID orderId) { @Transactional public Order startDelivery(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getType() != OrderType.DELIVERY) { throw new IllegalStateException(); } @@ -142,7 +142,7 @@ public Order startDelivery(final UUID orderId) { @Transactional public Order completeDelivery(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getStatus() != OrderStatus.DELIVERING) { throw new IllegalStateException(); } @@ -153,7 +153,7 @@ public Order completeDelivery(final UUID orderId) { @Transactional public Order complete(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); final OrderType type = order.getType(); final OrderStatus status = order.getStatus(); if (type == OrderType.DELIVERY) { diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java b/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java index 1df7e345f..7b4744c50 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java @@ -39,7 +39,7 @@ public OrderTable create(final OrderTable request) { @Transactional public OrderTable sit(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); orderTable.setOccupied(true); return orderTable; } @@ -47,7 +47,7 @@ public OrderTable sit(final UUID orderTableId) { @Transactional public OrderTable clear(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { throw new IllegalStateException(); } @@ -63,7 +63,7 @@ public OrderTable changeNumberOfGuests(final UUID orderTableId, final OrderTable throw new IllegalArgumentException(); } final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (!orderTable.isOccupied()) { throw new IllegalStateException(); } diff --git a/src/main/java/kitchenpos/eatinorders/domain/Order.java b/src/main/java/kitchenpos/eatinorders/domain/Order.java index c6e630c90..71b58c135 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/Order.java +++ b/src/main/java/kitchenpos/eatinorders/domain/Order.java @@ -25,10 +25,10 @@ public class Order { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( - name = "order_id", - nullable = false, - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") + name = "order_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") ) private List orderLineItems; @@ -37,9 +37,9 @@ public class Order { @ManyToOne @JoinColumn( - name = "order_table_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_orders_to_order_table") + name = "order_table_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_orders_to_order_table") ) private OrderTable orderTable; diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java index e1e037caf..426edadf7 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java @@ -16,9 +16,9 @@ public class OrderLineItem { @ManyToOne(optional = false) @JoinColumn( - name = "menu_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu") + name = "menu_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu") ) private Menu menu; diff --git a/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java b/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java index 1c2741f73..e0e3d69d8 100644 --- a/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java +++ b/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java @@ -22,7 +22,7 @@ public OrderRestController(final OrderService orderService) { public ResponseEntity create(@RequestBody final Order request) { final Order response = orderService.create(request); return ResponseEntity.created(URI.create("/api/orders/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{orderId}/accept") diff --git a/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java b/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java index 120c28d1d..eaaa85aec 100644 --- a/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java @@ -22,7 +22,7 @@ public OrderTableRestController(final OrderTableService orderTableService) { public ResponseEntity create(@RequestBody final OrderTable request) { final OrderTable response = orderTableService.create(request); return ResponseEntity.created(URI.create("/api/order-tables/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{orderTableId}/sit") @@ -37,8 +37,8 @@ public ResponseEntity clear(@PathVariable final UUID orderTableId) { @PutMapping("/{orderTableId}/number-of-guests") public ResponseEntity changeNumberOfGuests( - @PathVariable final UUID orderTableId, - @RequestBody final OrderTable request + @PathVariable final UUID orderTableId, + @RequestBody final OrderTable request ) { return ResponseEntity.ok(orderTableService.changeNumberOfGuests(orderTableId, request)); } diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index eb51f7699..d661798e7 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -34,8 +34,8 @@ public MenuGroupDto create(final CreateMenuGroupRequest request) { @Transactional(readOnly = true) public List findAll() { return menuGroupRepository.findAll() - .stream() - .map(MenuGroupDto::from) - .collect(Collectors.toList()); + .stream() + .map(MenuGroupDto::from) + .collect(Collectors.toList()); } } diff --git a/src/main/java/kitchenpos/menus/application/MenuProductService.java b/src/main/java/kitchenpos/menus/application/MenuProductService.java index 712e8c8a4..6cd81064d 100644 --- a/src/main/java/kitchenpos/menus/application/MenuProductService.java +++ b/src/main/java/kitchenpos/menus/application/MenuProductService.java @@ -2,8 +2,8 @@ import kitchenpos.common.exception.KitchenPosException; import kitchenpos.common.values.Quantity; -import kitchenpos.menus.dto.CreateMenuProductRequest; import kitchenpos.menus.domain.MenuProduct; +import kitchenpos.menus.dto.CreateMenuProductRequest; import kitchenpos.products.application.ProductValidator; 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 821b7f2ae..d127cd0d3 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -5,15 +5,11 @@ import kitchenpos.common.util.CollectionUtils; import kitchenpos.common.values.Name; import kitchenpos.common.values.Price; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.domain.*; import kitchenpos.menus.dto.ChangePriceMenuRequest; import kitchenpos.menus.dto.CreateMenuProductRequest; import kitchenpos.menus.dto.CreateMenuRequest; import kitchenpos.menus.dto.MenuDto; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.domain.MenuRepository; import kitchenpos.products.application.ProductValidator; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -53,7 +49,7 @@ public MenuService( @Transactional public MenuDto create(final CreateMenuRequest request) { List menuProductRequests = request.getMenuProducts(); - CollectionUtils.requireNonEmpty(menuProductRequests,new KitchenPosException("메뉴 구성 상품이 없으므로", BAD_REQUEST)); + CollectionUtils.requireNonEmpty(menuProductRequests, new KitchenPosException("메뉴 구성 상품이 없으므로", BAD_REQUEST)); final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 메뉴 그룹을", NOT_FOUND)); diff --git a/src/main/java/kitchenpos/menus/application/MenuValidator.java b/src/main/java/kitchenpos/menus/application/MenuValidator.java index b9578206f..87c29d372 100644 --- a/src/main/java/kitchenpos/menus/application/MenuValidator.java +++ b/src/main/java/kitchenpos/menus/application/MenuValidator.java @@ -35,10 +35,11 @@ public boolean isMenuPriceGreaterThanSumOfMenuProducts(Price price, List menuProducts) { if (isMenuPriceGreaterThanSumOfMenuProducts(price, menuProducts)) { throw new KitchenPosException("메뉴 가격이 구성 상품 가격보다 작으므로", BAD_REQUEST); } } - + } diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menus/domain/Menu.java index 03e11b7a2..35ba34350 100644 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/Menu.java @@ -25,10 +25,10 @@ public class Menu { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( - name = "menu_id", - nullable = false, - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") + name = "menu_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") ) private List menuProducts; @@ -37,6 +37,7 @@ public class Menu { protected Menu() { } + public Menu(Name name, Price price, UUID menuGroupId, List menuProducts, boolean displayed) { this.id = UUID.randomUUID(); this.name = name; diff --git a/src/main/java/kitchenpos/menus/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/MenuProduct.java index 5887a86ff..64260a579 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/MenuProduct.java @@ -27,6 +27,7 @@ public MenuProduct(UUID productId, Quantity quantity) { this.productId = productId; this.quantity = quantity; } + public MenuProduct(Long seq, UUID productId, Quantity quantity) { this.seq = seq; this.productId = productId; diff --git a/src/main/java/kitchenpos/menus/dto/CreateMenuGroupRequest.java b/src/main/java/kitchenpos/menus/dto/CreateMenuGroupRequest.java index 69baebe26..5aca61143 100644 --- a/src/main/java/kitchenpos/menus/dto/CreateMenuGroupRequest.java +++ b/src/main/java/kitchenpos/menus/dto/CreateMenuGroupRequest.java @@ -2,14 +2,14 @@ public class CreateMenuGroupRequest { - private final String name; + private final String name; - public CreateMenuGroupRequest(String name) { - this.name = name; - } + public CreateMenuGroupRequest(String name) { + this.name = name; + } - public String getName() { - return name; - } + public String getName() { + return name; + } } diff --git a/src/main/java/kitchenpos/menus/dto/MenuDto.java b/src/main/java/kitchenpos/menus/dto/MenuDto.java index d9d40b9b7..759106f9d 100644 --- a/src/main/java/kitchenpos/menus/dto/MenuDto.java +++ b/src/main/java/kitchenpos/menus/dto/MenuDto.java @@ -2,7 +2,6 @@ import kitchenpos.common.values.Name; import kitchenpos.common.values.Price; -import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuProduct; @@ -21,6 +20,18 @@ public class MenuDto { public MenuDto() { } + public static MenuDto from(Menu menu) { + final MenuDto menuDto = new MenuDto(); + menuDto.id = menu.getId(); + menuDto.name = menu.getName(); + menuDto.price = menu.getPrice(); + menuDto.displayed = menu.isDisplayed(); + menuDto.menuProducts = menu.getMenuProducts(); + menuDto.menuGroupId = menu.getMenuGroupId(); + + return menuDto; + } + public UUID getId() { return id; } @@ -45,16 +56,4 @@ public UUID getMenuGroupId() { return menuGroupId; } - public static MenuDto from(Menu menu) { - final MenuDto menuDto = new MenuDto(); - menuDto.id = menu.getId(); - menuDto.name = menu.getName(); - menuDto.price = menu.getPrice(); - menuDto.displayed = menu.isDisplayed(); - menuDto.menuProducts = menu.getMenuProducts(); - menuDto.menuGroupId = menu.getMenuGroupId(); - - return menuDto; - } - } diff --git a/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java b/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java index b63f2e16e..b553148a2 100644 --- a/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java +++ b/src/main/java/kitchenpos/menus/dto/MenuGroupDto.java @@ -7,24 +7,24 @@ public class MenuGroupDto { - private UUID id; - private Name name; + private UUID id; + private Name name; - public MenuGroupDto(UUID id, Name name) { - this.id = id; - this.name = name; - } + public MenuGroupDto(UUID id, Name name) { + this.id = id; + this.name = name; + } - public UUID getId() { - return id; - } + public static MenuGroupDto from(MenuGroup savedResult) { + return new MenuGroupDto(savedResult.getId(), savedResult.getName()); + } - public Name getName() { - return name; - } + public UUID getId() { + return id; + } - public static MenuGroupDto from(MenuGroup savedResult) { - return new MenuGroupDto(savedResult.getId(), savedResult.getName()); - } + public Name getName() { + return name; + } } diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java index 8cff69c9d..8e9d1cc5b 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java @@ -22,7 +22,7 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { public ResponseEntity create(@RequestBody final CreateMenuGroupRequest request) { final MenuGroupDto response = menuGroupService.create(request); return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getId())) - .body(response); + .body(response); } @GetMapping diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 7ef38c0e3..427071a6c 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -24,7 +24,7 @@ public MenuRestController(final MenuService menuService) { public ResponseEntity create(@RequestBody final CreateMenuRequest request) { final MenuDto response = menuService.create(request); return ResponseEntity.created(URI.create("/api/menus/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{menuId}/price") diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index fa9d693e7..08cf643b7 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -47,7 +47,7 @@ public ProductDto create(final CreateRequest request) { public ProductDto changePrice(final UUID productId, final ChangePriceRequest request) { final Price price = new Price(request.getPrice()); final Product product = productRepository.findById(productId) - .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 상품을", NOT_FOUND)); + .orElseThrow(() -> new KitchenPosException("요청하신 ID에 해당하는 상품을", NOT_FOUND)); product.changePrice(price); productRepository.save(product); return ProductDto.from(product); diff --git a/src/main/java/kitchenpos/products/domain/Product.java b/src/main/java/kitchenpos/products/domain/Product.java index 96c0189c5..bf6b2cefa 100644 --- a/src/main/java/kitchenpos/products/domain/Product.java +++ b/src/main/java/kitchenpos/products/domain/Product.java @@ -5,7 +5,6 @@ import kitchenpos.common.values.Price; import javax.persistence.*; -import java.math.BigDecimal; import java.util.UUID; @Table(name = "product") diff --git a/src/main/java/kitchenpos/products/dto/ProductDto.java b/src/main/java/kitchenpos/products/dto/ProductDto.java index be328c127..9c821ebda 100644 --- a/src/main/java/kitchenpos/products/dto/ProductDto.java +++ b/src/main/java/kitchenpos/products/dto/ProductDto.java @@ -8,42 +8,42 @@ public class ProductDto { - private UUID id; - private Name name; - private Price price; - - public ProductDto() { - } - - public UUID getId() { - return id; - } - - public void setId(UUID id) { - this.id = id; - } - - public Name getName() { - return name; - } - - public void setName(Name name) { - this.name = name; - } - - public Price getPrice() { - return price; - } - - public void setPrice(Price price) { - this.price = price; - } - - public static ProductDto from(Product product) { - ProductDto result = new ProductDto(); - result.id = product.getId(); - result.name = product.getName(); - result.price = product.getPrice(); - return result; - } + private UUID id; + private Name name; + private Price price; + + public ProductDto() { + } + + public static ProductDto from(Product product) { + ProductDto result = new ProductDto(); + result.id = product.getId(); + result.name = product.getName(); + result.price = product.getPrice(); + return result; + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public Name getName() { + return name; + } + + public void setName(Name name) { + this.name = name; + } + + public Price getPrice() { + return price; + } + + public void setPrice(Price price) { + this.price = price; + } } diff --git a/src/main/java/kitchenpos/products/ui/ProductRestController.java b/src/main/java/kitchenpos/products/ui/ProductRestController.java index 8e6ec6759..2882f0538 100644 --- a/src/main/java/kitchenpos/products/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/products/ui/ProductRestController.java @@ -25,7 +25,7 @@ public ProductRestController(final ProductService productService) { public ResponseEntity create(@RequestBody final CreateRequest request) { final ProductDto response = productService.create(request); return ResponseEntity.created(URI.create("/api/products/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{productId}/price")