From f6e49a2b6ff2ccd458c4636a0404f72a6af3ed0c Mon Sep 17 00:00:00 2001 From: newvelop Date: Sun, 23 Oct 2022 16:38:51 +0900 Subject: [PATCH 1/5] refactor : refactor create method in menu --- .../eatinorders/application/OrderService.java | 4 +- .../eatinorders/domain/OrderLineItem.java | 2 +- .../menus/application/MenuGroupService.java | 4 +- .../menus/application/MenuService.java | 57 ++----- .../java/kitchenpos/menus/domain/Menu.java | 102 ----------- .../kitchenpos/menus/domain/MenuProduct.java | 64 ------- .../menus/dto/MenuCreateRequest.java | 53 ++++++ .../menus/dto/MenuProductRequest.java | 24 +++ .../JpaMenuGroupRepository.java | 4 +- .../{domain => infra}/JpaMenuRepository.java | 4 +- .../menus/tobe/domain/entity/Menu.java | 160 ++++++++++++++++++ .../domain/entity}/MenuGroup.java | 2 +- .../menus/tobe/domain/entity/MenuProduct.java | 92 ++++++++++ .../repository}/MenuGroupRepository.java | 4 +- .../domain/repository}/MenuRepository.java | 4 +- .../menus/ui/MenuGroupRestController.java | 2 +- .../menus/ui/MenuRestController.java | 5 +- .../ProductApplicationService.java | 7 +- src/test/java/kitchenpos/Fixtures.java | 6 +- .../application/OrderServiceTest.java | 2 +- .../InMemoryMenuGroupRepository.java | 4 +- .../application/InMemoryMenuRepository.java | 4 +- .../application/MenuGroupServiceTest.java | 4 +- .../menus/application/MenuServiceTest.java | 60 +++---- .../application/ProductServiceTest.java | 4 +- 25 files changed, 411 insertions(+), 267 deletions(-) delete mode 100644 src/main/java/kitchenpos/menus/domain/Menu.java delete mode 100644 src/main/java/kitchenpos/menus/domain/MenuProduct.java create mode 100644 src/main/java/kitchenpos/menus/dto/MenuCreateRequest.java create mode 100644 src/main/java/kitchenpos/menus/dto/MenuProductRequest.java rename src/main/java/kitchenpos/menus/{domain => infra}/JpaMenuGroupRepository.java (55%) rename src/main/java/kitchenpos/menus/{domain => infra}/JpaMenuRepository.java (77%) create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java rename src/main/java/kitchenpos/menus/{domain => tobe/domain/entity}/MenuGroup.java (93%) create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/entity/MenuProduct.java rename src/main/java/kitchenpos/menus/{domain => tobe/domain/repository}/MenuGroupRepository.java (69%) rename src/main/java/kitchenpos/menus/{domain => tobe/domain/repository}/MenuRepository.java (75%) diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderService.java b/src/main/java/kitchenpos/eatinorders/application/OrderService.java index c20f52c7f..42b187fe5 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderService.java @@ -2,8 +2,8 @@ import kitchenpos.deliveryorders.infra.KitchenridersClient; import kitchenpos.eatinorders.domain.*; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.entity.Menu; +import kitchenpos.menus.tobe.domain.repository.MenuRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java index e1e037caf..4ccc53930 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java @@ -1,6 +1,6 @@ package kitchenpos.eatinorders.domain; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.entity.Menu; import javax.persistence.*; import java.math.BigDecimal; diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index c468893a2..73ee9b5b7 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -1,7 +1,7 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.entity.MenuGroup; +import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index bd7abc092..222045836 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -1,6 +1,12 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.*; +import kitchenpos.menus.dto.MenuCreateRequest; +import kitchenpos.menus.dto.MenuProductRequest; +import kitchenpos.menus.tobe.domain.entity.Menu; +import kitchenpos.menus.tobe.domain.entity.MenuGroup; +import kitchenpos.menus.tobe.domain.entity.MenuProduct; +import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.repository.MenuRepository; import kitchenpos.products.infra.PurgomalumClient; import kitchenpos.products.tobe.domain.entity.Product; import kitchenpos.products.tobe.domain.repository.ProductRepository; @@ -31,57 +37,22 @@ public MenuService( } @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 Menu create(final MenuCreateRequest request) { final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) .orElseThrow(NoSuchElementException::new); - final List menuProductRequests = request.getMenuProducts(); + final List menuProductRequests = request.getMenuProductRequestList(); + if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) { throw new IllegalArgumentException(); } + final List products = productRepository.findAllByIdIn( menuProductRequests.stream() - .map(MenuProduct::getProductId) + .map(MenuProductRequest::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) || purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(); - } - final Menu menu = new Menu(); - menu.setId(UUID.randomUUID()); - menu.setName(name); - menu.setPrice(price); - menu.setMenuGroup(menuGroup); - menu.setDisplayed(request.isDisplayed()); - menu.setMenuProducts(menuProducts); + + Menu menu = Menu.createMenu(request, menuGroup, products, purgomalumClient); return menuRepository.save(menu); } diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menus/domain/Menu.java deleted file mode 100644 index e923a6e5d..000000000 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ /dev/null @@ -1,102 +0,0 @@ -package kitchenpos.menus.domain; - -import javax.persistence.*; -import java.math.BigDecimal; -import java.util.List; -import java.util.UUID; - -@Table(name = "menu") -@Entity -public class Menu { - @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; - - public Menu() { - } - - public UUID getId() { - return id; - } - - public void setId(final UUID id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - - public BigDecimal getPrice() { - return price; - } - - public void setPrice(final BigDecimal price) { - this.price = price; - } - - public MenuGroup getMenuGroup() { - return menuGroup; - } - - public void setMenuGroup(final MenuGroup menuGroup) { - this.menuGroup = menuGroup; - } - - public boolean isDisplayed() { - return displayed; - } - - public void setDisplayed(final boolean displayed) { - this.displayed = displayed; - } - - public List getMenuProducts() { - return menuProducts; - } - - public void setMenuProducts(final List menuProducts) { - this.menuProducts = menuProducts; - } - - public UUID getMenuGroupId() { - return menuGroupId; - } - - public void setMenuGroupId(final UUID menuGroupId) { - this.menuGroupId = menuGroupId; - } -} diff --git a/src/main/java/kitchenpos/menus/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/MenuProduct.java deleted file mode 100644 index 4f7f560c5..000000000 --- a/src/main/java/kitchenpos/menus/domain/MenuProduct.java +++ /dev/null @@ -1,64 +0,0 @@ -package kitchenpos.menus.domain; - -import kitchenpos.products.tobe.domain.entity.Product; - -import javax.persistence.*; -import java.util.UUID; - -@Table(name = "menu_product") -@Entity -public class MenuProduct { - @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; - - public MenuProduct() { - } - - public Long getSeq() { - return seq; - } - - public void setSeq(final Long seq) { - this.seq = seq; - } - - public Product getProduct() { - return product; - } - - public void setProduct(final Product product) { - this.product = product; - } - - public long getQuantity() { - return quantity; - } - - public void setQuantity(final long quantity) { - this.quantity = quantity; - } - - public UUID getProductId() { - return productId; - } - - public void setProductId(final UUID productId) { - this.productId = productId; - } -} diff --git a/src/main/java/kitchenpos/menus/dto/MenuCreateRequest.java b/src/main/java/kitchenpos/menus/dto/MenuCreateRequest.java new file mode 100644 index 000000000..5f77eabd6 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/MenuCreateRequest.java @@ -0,0 +1,53 @@ +package kitchenpos.menus.dto; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +public class MenuCreateRequest { + private UUID menuGroupId; + private List menuProductRequestList; + private BigDecimal price; + private String name; + private boolean displayed; + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public List getMenuProductRequestList() { + return menuProductRequestList; + } + + public BigDecimal getPrice() { + return price; + } + + public String getName() { + return name; + } + + public boolean isDisplayed() { + return displayed; + } + + public void setMenuGroupId(UUID menuGroupId) { + this.menuGroupId = menuGroupId; + } + + public void setMenuProductRequestList(List menuProductRequestList) { + this.menuProductRequestList = menuProductRequestList; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public void setName(String name) { + this.name = name; + } + + public void setDisplayed(boolean displayed) { + this.displayed = displayed; + } +} diff --git a/src/main/java/kitchenpos/menus/dto/MenuProductRequest.java b/src/main/java/kitchenpos/menus/dto/MenuProductRequest.java new file mode 100644 index 000000000..87d73a0e3 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/MenuProductRequest.java @@ -0,0 +1,24 @@ +package kitchenpos.menus.dto; + +import java.util.UUID; + +public class MenuProductRequest { + private UUID productId; + private Long quantity; + + public UUID getProductId() { + return productId; + } + + public Long getQuantity() { + return quantity; + } + + public void setProductId(UUID productId) { + this.productId = productId; + } + + public void setQuantity(Long quantity) { + this.quantity = quantity; + } +} diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/infra/JpaMenuGroupRepository.java similarity index 55% rename from src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java rename to src/main/java/kitchenpos/menus/infra/JpaMenuGroupRepository.java index 233488198..50f01cf8a 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.tobe.domain.entity.MenuGroup; +import kitchenpos.menus.tobe.domain.repository.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 77% rename from src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java rename to src/main/java/kitchenpos/menus/infra/JpaMenuRepository.java index 796499c30..096c0fa6b 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.tobe.domain.entity.Menu; +import kitchenpos.menus.tobe.domain.repository.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/entity/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java new file mode 100644 index 000000000..15467f35c --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java @@ -0,0 +1,160 @@ +package kitchenpos.menus.tobe.domain.entity; + +import kitchenpos.menus.dto.MenuCreateRequest; +import kitchenpos.menus.dto.MenuProductRequest; +import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.products.tobe.domain.entity.Product; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.*; + +@Table(name = "menu") +@Entity +public class Menu { + @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; + + public Menu() { + } + + public UUID getId() { + return id; + } + + public void setId(final UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(final BigDecimal price) { + this.price = price; + } + + public MenuGroup getMenuGroup() { + return menuGroup; + } + + public void setMenuGroup(final MenuGroup menuGroup) { + this.menuGroup = menuGroup; + } + + public boolean isDisplayed() { + return displayed; + } + + public void setDisplayed(final boolean displayed) { + this.displayed = displayed; + } + + public List getMenuProducts() { + return menuProducts; + } + + public void setMenuProducts(final List menuProducts) { + this.menuProducts = menuProducts; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public void setMenuGroupId(final UUID menuGroupId) { + this.menuGroupId = menuGroupId; + } + + public static Menu createMenu(MenuCreateRequest menuCreateRequest, MenuGroup menuGroup, List productList, PurgomalumClient purgomalumClient) { + List menuProductList = createMenuProduct(menuCreateRequest.getMenuProductRequestList(), productList); + + if (isInvalidPrice(menuCreateRequest.getPrice(), menuProductList, productList)) { + throw new IllegalArgumentException("올바르지 않은 가격"); + } + + if (isInvalidName(menuCreateRequest.getName(), purgomalumClient)) { + throw new IllegalArgumentException(); + } + final Menu menu = new Menu(); + menu.setId(UUID.randomUUID()); + menu.setName(menuCreateRequest.getName()); + menu.setPrice(menuCreateRequest.getPrice()); + menu.setMenuGroup(menuGroup); + menu.setDisplayed(menuCreateRequest.isDisplayed()); + menu.setMenuProducts(menuProductList); + return menu; + } + + private static List createMenuProduct(List menuProductRequestList, List productList) { + if (productList.size() != menuProductRequestList.size()) { + throw new IllegalArgumentException(); + } + + return MenuProduct.createMenuProductList(menuProductRequestList, productList); + } + + private static boolean isInvalidPrice(BigDecimal price, List menuProductList, List productList) { + if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { + return true; + } + + BigDecimal sum = BigDecimal.ZERO; + for (MenuProduct menuProduct : menuProductList) { + Product product = productList.stream() + .filter(v -> v.getId().getId().equals(menuProduct.getProduct().getId().getId())).findFirst().orElseThrow(NoSuchElementException::new); + sum = sum.add( + product.getPrice() + .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) + ); + } + + if (price.compareTo(sum) > 0) { + return true; + } + + return false; + } + + private static boolean isInvalidName(String name, PurgomalumClient purgomalumClient) { + return Objects.isNull(name) || purgomalumClient.containsProfanity(name); + } +} diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroup.java b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuGroup.java similarity index 93% rename from src/main/java/kitchenpos/menus/domain/MenuGroup.java rename to src/main/java/kitchenpos/menus/tobe/domain/entity/MenuGroup.java index e65017271..f078eed22 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuGroup.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain.entity; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuProduct.java new file mode 100644 index 000000000..f5c92f97f --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuProduct.java @@ -0,0 +1,92 @@ +package kitchenpos.menus.tobe.domain.entity; + +import kitchenpos.menus.dto.MenuProductRequest; +import kitchenpos.products.tobe.domain.entity.Product; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + +@Table(name = "menu_product") +@Entity +public class MenuProduct { + @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; + + public MenuProduct() { + } + + public Long getSeq() { + return seq; + } + + public void setSeq(final Long seq) { + this.seq = seq; + } + + public Product getProduct() { + return product; + } + + public void setProduct(final Product product) { + this.product = product; + } + + public long getQuantity() { + return quantity; + } + + public void setQuantity(final long quantity) { + this.quantity = quantity; + } + + public UUID getProductId() { + return productId; + } + + public void setProductId(final UUID productId) { + this.productId = productId; + } + + public static List createMenuProductList(List menuProductRequestList, List productList) { + List menuProductList = new ArrayList<>(); + for (final MenuProductRequest menuProductRequest : menuProductRequestList) { + final Product product = productList.stream() + .filter(v -> v.getId().getId().equals(menuProductRequest.getProductId())) + .findFirst().orElseThrow(NoSuchElementException::new); + final MenuProduct menuProduct = create(menuProductRequest, product); + menuProductList.add(menuProduct); + } + return menuProductList; + } + + public static MenuProduct create(MenuProductRequest menuProductRequest, Product product) { + final long quantity = menuProductRequest.getQuantity(); + if (quantity < 0) { + throw new IllegalArgumentException(); + } + final MenuProduct menuProduct = new MenuProduct(); + menuProduct.setProduct(product); + menuProduct.setQuantity(quantity); + return menuProduct; + } +} diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/repository/MenuGroupRepository.java similarity index 69% rename from src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java rename to src/main/java/kitchenpos/menus/tobe/domain/repository/MenuGroupRepository.java index b25e6acbc..b6630dcc2 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/repository/MenuGroupRepository.java @@ -1,4 +1,6 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain.repository; + +import kitchenpos.menus.tobe.domain.entity.MenuGroup; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/menus/domain/MenuRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/repository/MenuRepository.java similarity index 75% rename from src/main/java/kitchenpos/menus/domain/MenuRepository.java rename to src/main/java/kitchenpos/menus/tobe/domain/repository/MenuRepository.java index 5fbaab864..b2739652a 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuRepository.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/repository/MenuRepository.java @@ -1,4 +1,6 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain.repository; + +import kitchenpos.menus.tobe.domain.entity.Menu; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java index 1a5d0fd06..3a9a4101c 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.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.entity.MenuGroup; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 3e3a0e23a..c53aa5959 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -1,7 +1,8 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuService; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.dto.MenuCreateRequest; +import kitchenpos.menus.tobe.domain.entity.Menu; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -19,7 +20,7 @@ public MenuRestController(final MenuService menuService) { } @PostMapping - public ResponseEntity create(@RequestBody final Menu request) { + public ResponseEntity create(@RequestBody final MenuCreateRequest request) { final Menu response = menuService.create(request); return ResponseEntity.created(URI.create("/api/menus/" + response.getId())) .body(response); diff --git a/src/main/java/kitchenpos/products/application/ProductApplicationService.java b/src/main/java/kitchenpos/products/application/ProductApplicationService.java index 09c6cc77a..527a0befd 100644 --- a/src/main/java/kitchenpos/products/application/ProductApplicationService.java +++ b/src/main/java/kitchenpos/products/application/ProductApplicationService.java @@ -1,8 +1,8 @@ package kitchenpos.products.application; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.entity.Menu; +import kitchenpos.menus.tobe.domain.entity.MenuProduct; +import kitchenpos.menus.tobe.domain.repository.MenuRepository; import kitchenpos.products.dto.ProductCreateRequest; import kitchenpos.products.dto.ProductPriceChangeRequest; import kitchenpos.products.dto.ProductResponse; @@ -16,7 +16,6 @@ import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; -import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index 2b7120009..00e4159cd 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -1,9 +1,9 @@ package kitchenpos; import kitchenpos.eatinorders.domain.*; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuProduct; +import kitchenpos.menus.tobe.domain.entity.Menu; +import kitchenpos.menus.tobe.domain.entity.MenuGroup; +import kitchenpos.menus.tobe.domain.entity.MenuProduct; import kitchenpos.products.tobe.domain.entity.Product; import java.math.BigDecimal; diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java index 96bf0f286..2cc7ca6ed 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java @@ -2,7 +2,7 @@ import kitchenpos.eatinorders.domain.*; import kitchenpos.menus.application.InMemoryMenuRepository; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.repository.MenuRepository; 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/menus/application/InMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java index 9b50d73bb..55ca904da 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java @@ -1,7 +1,7 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.entity.MenuGroup; +import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; import java.util.*; diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java index 21ce924ef..3c80dca68 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java @@ -1,7 +1,7 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.entity.Menu; +import kitchenpos.menus.tobe.domain.repository.MenuRepository; import java.util.*; import java.util.stream.Collectors; diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index a5fbc71d1..431629d39 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -1,7 +1,7 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.entity.MenuGroup; +import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; 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/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 19b05243d..c969403b3 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -1,9 +1,11 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuGroupRepository; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.dto.MenuCreateRequest; +import kitchenpos.menus.dto.MenuProductRequest; +import kitchenpos.menus.tobe.domain.entity.Menu; +import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.entity.MenuProduct; +import kitchenpos.menus.tobe.domain.repository.MenuRepository; import kitchenpos.products.application.FakePurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; import kitchenpos.products.infra.PurgomalumClient; @@ -49,7 +51,7 @@ void setUp() { @DisplayName("1개 이상의 등록된 상품으로 메뉴를 등록할 수 있다.") @Test void create() { - final Menu expected = createMenuRequest( + final MenuCreateRequest expected = createMenuRequest( "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId().getId(), 2L) ); final Menu actual = menuService.create(expected); @@ -67,8 +69,8 @@ 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 MenuCreateRequest expected = createMenuRequest("후라이드+후라이드", 19_000L, menuGroupId, true, menuProducts); assertThatThrownBy(() -> menuService.create(expected)) .isInstanceOf(IllegalArgumentException.class); } @@ -84,7 +86,7 @@ private static List menuProducts() { @DisplayName("메뉴에 속한 상품의 수량은 0개 이상이어야 한다.") @Test void createNegativeQuantity() { - final Menu expected = createMenuRequest( + final MenuCreateRequest expected = createMenuRequest( "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId().getId(), -1L) ); assertThatThrownBy(() -> menuService.create(expected)) @@ -96,7 +98,7 @@ void createNegativeQuantity() { @NullSource @ParameterizedTest void create(final BigDecimal price) { - final Menu expected = createMenuRequest( + final MenuCreateRequest expected = createMenuRequest( "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getId().getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) @@ -106,7 +108,7 @@ void create(final BigDecimal price) { @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @Test void createExpensiveMenu() { - final Menu expected = createMenuRequest( + final MenuCreateRequest expected = createMenuRequest( "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getId().getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) @@ -117,7 +119,7 @@ void createExpensiveMenu() { @NullSource @ParameterizedTest void create(final UUID menuGroupId) { - final Menu expected = createMenuRequest( + final MenuCreateRequest expected = createMenuRequest( "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId().getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) @@ -129,7 +131,7 @@ void create(final UUID menuGroupId) { @NullSource @ParameterizedTest void create(final String name) { - final Menu expected = createMenuRequest( + final MenuCreateRequest expected = createMenuRequest( name, 19_000L, menuGroupId, true, createMenuProductRequest(product.getId().getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) @@ -197,54 +199,54 @@ void findAll() { assertThat(actual).hasSize(1); } - private Menu createMenuRequest( + private MenuCreateRequest createMenuRequest( final String name, final long price, final UUID menuGroupId, final boolean displayed, - final MenuProduct... menuProducts + final MenuProductRequest... menuProducts ) { return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); } - private Menu createMenuRequest( + private MenuCreateRequest createMenuRequest( final String name, final BigDecimal price, final UUID menuGroupId, final boolean displayed, - final MenuProduct... menuProducts + final MenuProductRequest... menuProducts ) { return createMenuRequest(name, price, menuGroupId, displayed, Arrays.asList(menuProducts)); } - private Menu createMenuRequest( + private MenuCreateRequest 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 MenuCreateRequest 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; + final MenuCreateRequest menuCreateRequest = new MenuCreateRequest(); + menuCreateRequest.setName(name); + menuCreateRequest.setPrice(price); + menuCreateRequest.setMenuGroupId(menuGroupId); + menuCreateRequest.setDisplayed(displayed); + menuCreateRequest.setMenuProductRequestList(menuProducts); + return menuCreateRequest; } - private static MenuProduct createMenuProductRequest(final UUID productId, final long quantity) { - final MenuProduct menuProduct = new MenuProduct(); + private static MenuProductRequest createMenuProductRequest(final UUID productId, final long quantity) { + final MenuProductRequest menuProduct = new MenuProductRequest(); menuProduct.setProductId(productId); menuProduct.setQuantity(quantity); return menuProduct; diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index af6bb20e4..ec93bb63e 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -1,8 +1,8 @@ package kitchenpos.products.application; import kitchenpos.menus.application.InMemoryMenuRepository; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.entity.Menu; +import kitchenpos.menus.tobe.domain.repository.MenuRepository; import kitchenpos.products.dto.ProductCreateRequest; import kitchenpos.products.dto.ProductPriceChangeRequest; import kitchenpos.products.dto.ProductResponse; From e6a3e236eb78fd1196368ecb65df78078022b81b Mon Sep 17 00:00:00 2001 From: newvelop Date: Sun, 23 Oct 2022 16:59:30 +0900 Subject: [PATCH 2/5] refacot : refactor menu service --- .../menus/application/MenuService.java | 34 +++---------------- .../menus/dto/MenuPriceChangeRequest.java | 15 ++++++++ .../menus/tobe/domain/entity/Menu.java | 17 ++++++++++ .../menus/ui/MenuRestController.java | 3 +- .../menus/application/MenuServiceTest.java | 17 +++++----- 5 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/dto/MenuPriceChangeRequest.java diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 222045836..980ea14b8 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -1,6 +1,7 @@ package kitchenpos.menus.application; import kitchenpos.menus.dto.MenuCreateRequest; +import kitchenpos.menus.dto.MenuPriceChangeRequest; import kitchenpos.menus.dto.MenuProductRequest; import kitchenpos.menus.tobe.domain.entity.Menu; import kitchenpos.menus.tobe.domain.entity.MenuGroup; @@ -57,25 +58,10 @@ public Menu create(final MenuCreateRequest request) { } @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(); - } + public Menu changePrice(final UUID menuId, final MenuPriceChangeRequest request) { 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(); - } - menu.setPrice(price); + menu.changePrice(request.getPrice()); return menu; } @@ -83,18 +69,8 @@ public Menu changePrice(final UUID menuId, final Menu request) { public Menu display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (menu.getPrice().compareTo(sum) > 0) { - throw new IllegalStateException(); - } - menu.setDisplayed(true); + + menu.display(); return menu; } diff --git a/src/main/java/kitchenpos/menus/dto/MenuPriceChangeRequest.java b/src/main/java/kitchenpos/menus/dto/MenuPriceChangeRequest.java new file mode 100644 index 000000000..55cd1056a --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/MenuPriceChangeRequest.java @@ -0,0 +1,15 @@ +package kitchenpos.menus.dto; + +import java.math.BigDecimal; + +public class MenuPriceChangeRequest { + private BigDecimal price; + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java index 15467f35c..6d8f8b48b 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java @@ -8,6 +8,7 @@ import javax.persistence.*; import java.math.BigDecimal; import java.util.*; +import java.util.stream.Collectors; @Table(name = "menu") @Entity @@ -124,6 +125,22 @@ public static Menu createMenu(MenuCreateRequest menuCreateRequest, MenuGroup men return menu; } + public void changePrice(BigDecimal price) { + List products = menuProducts.stream().map(v -> v.getProduct()).collect(Collectors.toList()); + if (isInvalidPrice(price, menuProducts, products)) { + throw new IllegalArgumentException("유효하지 않은 가격"); + } + this.price = price; + } + + public void display() { + List products = menuProducts.stream().map(v -> v.getProduct()).collect(Collectors.toList()); + if (isInvalidPrice(this.price, menuProducts, products)) { + throw new IllegalStateException(); + } + this.setDisplayed(true); + } + private static List createMenuProduct(List menuProductRequestList, List productList) { if (productList.size() != menuProductRequestList.size()) { throw new IllegalArgumentException(); diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index c53aa5959..861a14d84 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -2,6 +2,7 @@ import kitchenpos.menus.application.MenuService; import kitchenpos.menus.dto.MenuCreateRequest; +import kitchenpos.menus.dto.MenuPriceChangeRequest; import kitchenpos.menus.tobe.domain.entity.Menu; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -27,7 +28,7 @@ public ResponseEntity create(@RequestBody final MenuCreateRequest request) } @PutMapping("/{menuId}/price") - public ResponseEntity changePrice(@PathVariable final UUID menuId, @RequestBody final Menu request) { + public ResponseEntity changePrice(@PathVariable final UUID menuId, @RequestBody final MenuPriceChangeRequest request) { return ResponseEntity.ok(menuService.changePrice(menuId, request)); } diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index c969403b3..8be2d0f28 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -1,6 +1,7 @@ package kitchenpos.menus.application; import kitchenpos.menus.dto.MenuCreateRequest; +import kitchenpos.menus.dto.MenuPriceChangeRequest; import kitchenpos.menus.dto.MenuProductRequest; import kitchenpos.menus.tobe.domain.entity.Menu; import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; @@ -142,7 +143,7 @@ void create(final String name) { @Test void changePrice() { final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(16_000L); + final MenuPriceChangeRequest expected = changePriceRequest(16_000L); final Menu actual = menuService.changePrice(menuId, expected); assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); } @@ -153,7 +154,7 @@ void changePrice() { @ParameterizedTest void changePrice(final BigDecimal price) { final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(price); + final MenuPriceChangeRequest expected = changePriceRequest(price); assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) .isInstanceOf(IllegalArgumentException.class); } @@ -162,7 +163,7 @@ void changePrice(final BigDecimal price) { @Test void changePriceToExpensive() { final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(33_000L); + final MenuPriceChangeRequest expected = changePriceRequest(33_000L); assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) .isInstanceOf(IllegalArgumentException.class); } @@ -252,13 +253,13 @@ private static MenuProductRequest createMenuProductRequest(final UUID productId, return menuProduct; } - private Menu changePriceRequest(final long price) { + private MenuPriceChangeRequest 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 MenuPriceChangeRequest changePriceRequest(final BigDecimal price) { + final MenuPriceChangeRequest menuPriceChangeRequest = new MenuPriceChangeRequest(); + menuPriceChangeRequest.setPrice(price); + return menuPriceChangeRequest; } } From 0dff1e91f9dd19c48518326484d9074dc13c40d6 Mon Sep 17 00:00:00 2001 From: newvelop Date: Sun, 23 Oct 2022 17:03:32 +0900 Subject: [PATCH 3/5] refactor : refactor menu group --- .../menus/application/MenuGroupService.java | 12 +++--------- .../menus/dto/MenuGroupCreateRequest.java | 13 +++++++++++++ .../menus/tobe/domain/entity/MenuGroup.java | 11 +++++++++++ .../menus/ui/MenuGroupRestController.java | 3 ++- .../menus/application/MenuGroupServiceTest.java | 13 +++++++------ 5 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/dto/MenuGroupCreateRequest.java diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index 73ee9b5b7..8350891de 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -1,5 +1,6 @@ package kitchenpos.menus.application; +import kitchenpos.menus.dto.MenuGroupCreateRequest; import kitchenpos.menus.tobe.domain.entity.MenuGroup; import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; import org.springframework.stereotype.Service; @@ -18,15 +19,8 @@ public MenuGroupService(final MenuGroupRepository menuGroupRepository) { } @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 MenuGroup create(final MenuGroupCreateRequest request) { + return menuGroupRepository.save(MenuGroup.createMenuGroup(request.getName())); } @Transactional(readOnly = true) diff --git a/src/main/java/kitchenpos/menus/dto/MenuGroupCreateRequest.java b/src/main/java/kitchenpos/menus/dto/MenuGroupCreateRequest.java new file mode 100644 index 000000000..0a4a20416 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/MenuGroupCreateRequest.java @@ -0,0 +1,13 @@ +package kitchenpos.menus.dto; + +public class MenuGroupCreateRequest { + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuGroup.java b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuGroup.java index f078eed22..e13904778 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuGroup.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuGroup.java @@ -4,6 +4,7 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import java.util.Objects; import java.util.UUID; @Table(name = "menu_group") @@ -34,4 +35,14 @@ public String getName() { public void setName(final String name) { this.name = name; } + + public static MenuGroup createMenuGroup(String name) { + if (Objects.isNull(name) || name.isEmpty()) { + throw new IllegalArgumentException(); + } + final MenuGroup menuGroup = new MenuGroup(); + menuGroup.setId(UUID.randomUUID()); + menuGroup.setName(name); + return menuGroup; + } } diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java index 3a9a4101c..93fa420cf 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java @@ -1,6 +1,7 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuGroupService; +import kitchenpos.menus.dto.MenuGroupCreateRequest; import kitchenpos.menus.tobe.domain.entity.MenuGroup; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,7 +19,7 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { } @PostMapping - public ResponseEntity create(@RequestBody final MenuGroup request) { + public ResponseEntity create(@RequestBody final MenuGroupCreateRequest request) { final MenuGroup response = menuGroupService.create(request); return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getId())) .body(response); diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index 431629d39..af39b3e20 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -1,5 +1,6 @@ package kitchenpos.menus.application; +import kitchenpos.menus.dto.MenuGroupCreateRequest; import kitchenpos.menus.tobe.domain.entity.MenuGroup; import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; import org.junit.jupiter.api.BeforeEach; @@ -28,7 +29,7 @@ void setUp() { @DisplayName("메뉴 그룹을 등록할 수 있다.") @Test void create() { - final MenuGroup expected = createMenuGroupRequest("두마리메뉴"); + final MenuGroupCreateRequest expected = createMenuGroupRequest("두마리메뉴"); final MenuGroup actual = menuGroupService.create(expected); assertThat(actual).isNotNull(); assertAll( @@ -41,7 +42,7 @@ void create() { @NullAndEmptySource @ParameterizedTest void create(final String name) { - final MenuGroup expected = createMenuGroupRequest(name); + final MenuGroupCreateRequest expected = createMenuGroupRequest(name); assertThatThrownBy(() -> menuGroupService.create(expected)) .isInstanceOf(IllegalArgumentException.class); } @@ -54,9 +55,9 @@ void findAll() { assertThat(actual).hasSize(1); } - private MenuGroup createMenuGroupRequest(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setName(name); - return menuGroup; + private MenuGroupCreateRequest createMenuGroupRequest(final String name) { + final MenuGroupCreateRequest menuGroupCreateRequest = new MenuGroupCreateRequest(); + menuGroupCreateRequest.setName(name); + return menuGroupCreateRequest; } } From 64575d42773dac1a6be2ee3cca989a1aeb85c6e1 Mon Sep 17 00:00:00 2001 From: newvelop Date: Sun, 23 Oct 2022 17:09:22 +0900 Subject: [PATCH 4/5] refactor : refactor product using menu --- .../kitchenpos/menus/tobe/domain/entity/Menu.java | 11 +++++++++++ .../application/ProductApplicationService.java | 15 +-------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java index 6d8f8b48b..34302e253 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java @@ -171,6 +171,17 @@ private static boolean isInvalidPrice(BigDecimal price, List menuPr return false; } + public BigDecimal getMenuPrice() { + BigDecimal sum = BigDecimal.ZERO; + for (MenuProduct menuProduct : menuProducts) { + sum = sum.add( + menuProduct.getProduct().getPrice() + .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) + ); + } + return sum; + } + private static boolean isInvalidName(String name, PurgomalumClient purgomalumClient) { return Objects.isNull(name) || purgomalumClient.containsProfanity(name); } diff --git a/src/main/java/kitchenpos/products/application/ProductApplicationService.java b/src/main/java/kitchenpos/products/application/ProductApplicationService.java index 527a0befd..06e0f10e2 100644 --- a/src/main/java/kitchenpos/products/application/ProductApplicationService.java +++ b/src/main/java/kitchenpos/products/application/ProductApplicationService.java @@ -58,20 +58,7 @@ public ProductResponse changePrice(final UUID productId, final ProductPriceChang final List menus = menuRepository.findAllByProductId(productId); for (final Menu menu : menus) { BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - if (menuProduct.getProduct().getId().getId().equals(productId)) { - sum = sum.add( - request.getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } else { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - } + sum.add(menu.getMenuPrice()); if (menu.getPrice().compareTo(sum) > 0) { menu.setDisplayed(false); } From 3fd0c46fb322eb855c0c4e7a1f89b6d08780c65b Mon Sep 17 00:00:00 2001 From: newvelop Date: Sun, 23 Oct 2022 18:23:09 +0900 Subject: [PATCH 5/5] refactor : add mapper and response dto --- .../menus/application/MenuGroupService.java | 20 +++-- .../menus/application/MenuService.java | 32 ++++---- .../menus/dto/MenuGroupResponse.java | 32 ++++++++ .../menus/dto/MenuProductResponse.java | 62 ++++++++++++++ .../kitchenpos/menus/dto/MenuResponse.java | 80 +++++++++++++++++++ .../menus/mapper/MenuGroupMapper.java | 19 +++++ .../kitchenpos/menus/mapper/MenuMapper.java | 32 ++++++++ .../menus/mapper/MenuProductMapper.java | 36 +++++++++ .../menus/tobe/domain/entity/MenuProduct.java | 1 - .../menus/ui/MenuGroupRestController.java | 9 ++- .../menus/ui/MenuRestController.java | 13 +-- .../ProductApplicationService.java | 1 - .../application/MenuGroupServiceTest.java | 12 ++- .../menus/application/MenuServiceTest.java | 27 ++++--- 14 files changed, 332 insertions(+), 44 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/dto/MenuGroupResponse.java create mode 100644 src/main/java/kitchenpos/menus/dto/MenuProductResponse.java create mode 100644 src/main/java/kitchenpos/menus/dto/MenuResponse.java create mode 100644 src/main/java/kitchenpos/menus/mapper/MenuGroupMapper.java create mode 100644 src/main/java/kitchenpos/menus/mapper/MenuMapper.java create mode 100644 src/main/java/kitchenpos/menus/mapper/MenuProductMapper.java diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index 8350891de..f3106df7d 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -1,6 +1,8 @@ package kitchenpos.menus.application; import kitchenpos.menus.dto.MenuGroupCreateRequest; +import kitchenpos.menus.dto.MenuGroupResponse; +import kitchenpos.menus.mapper.MenuGroupMapper; import kitchenpos.menus.tobe.domain.entity.MenuGroup; import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; import org.springframework.stereotype.Service; @@ -9,22 +11,30 @@ 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 MenuGroupMapper menuGroupMapper; - public MenuGroupService(final MenuGroupRepository menuGroupRepository) { + public MenuGroupService( + final MenuGroupRepository menuGroupRepository, + final MenuGroupMapper menuGroupMapper + ) { this.menuGroupRepository = menuGroupRepository; + this.menuGroupMapper = menuGroupMapper; } @Transactional - public MenuGroup create(final MenuGroupCreateRequest request) { - return menuGroupRepository.save(MenuGroup.createMenuGroup(request.getName())); + public MenuGroupResponse create(final MenuGroupCreateRequest request) { + MenuGroup menuGroup = menuGroupRepository.save(MenuGroup.createMenuGroup(request.getName())); + return menuGroupMapper.toMenuGroupResponse(menuGroup); } @Transactional(readOnly = true) - public List findAll() { - return menuGroupRepository.findAll(); + public List findAll() { + return menuGroupRepository.findAll().stream().map(v -> menuGroupMapper.toMenuGroupResponse(v)) + .collect(Collectors.toList()); } } diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 980ea14b8..8b8d6e3c4 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -1,8 +1,7 @@ package kitchenpos.menus.application; -import kitchenpos.menus.dto.MenuCreateRequest; -import kitchenpos.menus.dto.MenuPriceChangeRequest; -import kitchenpos.menus.dto.MenuProductRequest; +import kitchenpos.menus.dto.*; +import kitchenpos.menus.mapper.MenuMapper; import kitchenpos.menus.tobe.domain.entity.Menu; import kitchenpos.menus.tobe.domain.entity.MenuGroup; import kitchenpos.menus.tobe.domain.entity.MenuProduct; @@ -24,21 +23,24 @@ public class MenuService { private final MenuGroupRepository menuGroupRepository; private final ProductRepository productRepository; private final PurgomalumClient purgomalumClient; + private final MenuMapper menuMapper; public MenuService( final MenuRepository menuRepository, final MenuGroupRepository menuGroupRepository, final ProductRepository productRepository, - final PurgomalumClient purgomalumClient + final PurgomalumClient purgomalumClient, + final MenuMapper menuMapper ) { this.menuRepository = menuRepository; this.menuGroupRepository = menuGroupRepository; this.productRepository = productRepository; this.purgomalumClient = purgomalumClient; + this.menuMapper = menuMapper; } @Transactional - public Menu create(final MenuCreateRequest request) { + public MenuResponse create(final MenuCreateRequest request) { final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) .orElseThrow(NoSuchElementException::new); final List menuProductRequests = request.getMenuProductRequestList(); @@ -54,36 +56,38 @@ public Menu create(final MenuCreateRequest request) { ); Menu menu = Menu.createMenu(request, menuGroup, products, purgomalumClient); - return menuRepository.save(menu); + menu = menuRepository.save(menu); + return menuMapper.toMenuResponse(menu); } @Transactional - public Menu changePrice(final UUID menuId, final MenuPriceChangeRequest request) { + public MenuResponse changePrice(final UUID menuId, final MenuPriceChangeRequest request) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); menu.changePrice(request.getPrice()); - return menu; + return menuMapper.toMenuResponse(menu); } @Transactional - public Menu display(final UUID menuId) { + public MenuResponse display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); menu.display(); - return menu; + return menuMapper.toMenuResponse(menu); } @Transactional - public Menu hide(final UUID menuId) { + public MenuResponse hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); menu.setDisplayed(false); - return menu; + return menuMapper.toMenuResponse(menu); } @Transactional(readOnly = true) - public List findAll() { - return menuRepository.findAll(); + public List findAll() { + return menuRepository.findAll().stream().map(v -> menuMapper.toMenuResponse(v)) + .collect(Collectors.toList()); } } diff --git a/src/main/java/kitchenpos/menus/dto/MenuGroupResponse.java b/src/main/java/kitchenpos/menus/dto/MenuGroupResponse.java new file mode 100644 index 000000000..87e66a986 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/MenuGroupResponse.java @@ -0,0 +1,32 @@ +package kitchenpos.menus.dto; + +import java.util.UUID; + +public class MenuGroupResponse { + private UUID menuGroupId; + private String name; + + public MenuGroupResponse() { + } + + public MenuGroupResponse(UUID menuGroupId, String name) { + this.menuGroupId = menuGroupId; + this.name = name; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public void setMenuGroupId(UUID menuGroupId) { + this.menuGroupId = menuGroupId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/kitchenpos/menus/dto/MenuProductResponse.java b/src/main/java/kitchenpos/menus/dto/MenuProductResponse.java new file mode 100644 index 000000000..a5bc86770 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/MenuProductResponse.java @@ -0,0 +1,62 @@ +package kitchenpos.menus.dto; + +import java.math.BigDecimal; +import java.util.UUID; + +public class MenuProductResponse { + private Long seq; + private UUID productId; + private long quantity; + private BigDecimal price; + private String name; + + public MenuProductResponse() {} + + public MenuProductResponse(Long seq, UUID productId, long quantity, BigDecimal price, String name) { + this.seq = seq; + this.productId = productId; + this.quantity = quantity; + this.price = price; + this.name = name; + } + + public Long getSeq() { + return seq; + } + + public void setSeq(Long seq) { + this.seq = seq; + } + + public UUID getProductId() { + return productId; + } + + public void setProductId(UUID productId) { + this.productId = productId; + } + + public long getQuantity() { + return quantity; + } + + public void setQuantity(long quantity) { + this.quantity = quantity; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/kitchenpos/menus/dto/MenuResponse.java b/src/main/java/kitchenpos/menus/dto/MenuResponse.java new file mode 100644 index 000000000..ba6103762 --- /dev/null +++ b/src/main/java/kitchenpos/menus/dto/MenuResponse.java @@ -0,0 +1,80 @@ +package kitchenpos.menus.dto; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +public class MenuResponse { + private UUID id; + private String name; + private BigDecimal price; + private boolean displayed; + private MenuGroupResponse menuGroupResponse; + private List menuProductResponseList; + + public MenuResponse() {} + + public MenuResponse( + UUID id, + String name, + BigDecimal price, + boolean displayed, + MenuGroupResponse menuGroupResponse, + List menuProductResponseList + ) { + this.id = id; + this.name = name; + this.price = price; + this.displayed = displayed; + this.menuGroupResponse = menuGroupResponse; + this.menuProductResponseList = menuProductResponseList; + } + + 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 MenuGroupResponse getMenuGroupResponse() { + return menuGroupResponse; + } + + public void setMenuGroupResponse(MenuGroupResponse menuGroupResponse) { + this.menuGroupResponse = menuGroupResponse; + } + + public boolean isDisplayed() { + return displayed; + } + + public void setDisplayed(boolean displayed) { + this.displayed = displayed; + } + + public List getMenuProductResponseList() { + return menuProductResponseList; + } + + public void setMenuProductResponseList(List menuProductResponseList) { + this.menuProductResponseList = menuProductResponseList; + } +} diff --git a/src/main/java/kitchenpos/menus/mapper/MenuGroupMapper.java b/src/main/java/kitchenpos/menus/mapper/MenuGroupMapper.java new file mode 100644 index 000000000..678226afe --- /dev/null +++ b/src/main/java/kitchenpos/menus/mapper/MenuGroupMapper.java @@ -0,0 +1,19 @@ +package kitchenpos.menus.mapper; + +import kitchenpos.menus.dto.MenuGroupResponse; +import kitchenpos.menus.tobe.domain.entity.MenuGroup; +import org.springframework.stereotype.Component; + +@Component +public class MenuGroupMapper { + public MenuGroupResponse toMenuGroupResponse(MenuGroup menuGroup) { + if (menuGroup == null) { + return new MenuGroupResponse(); + } + + return new MenuGroupResponse( + menuGroup.getId(), + menuGroup.getName() + ); + } +} diff --git a/src/main/java/kitchenpos/menus/mapper/MenuMapper.java b/src/main/java/kitchenpos/menus/mapper/MenuMapper.java new file mode 100644 index 000000000..242b12b76 --- /dev/null +++ b/src/main/java/kitchenpos/menus/mapper/MenuMapper.java @@ -0,0 +1,32 @@ +package kitchenpos.menus.mapper; + +import kitchenpos.menus.dto.MenuResponse; +import kitchenpos.menus.tobe.domain.entity.Menu; +import org.springframework.stereotype.Component; + +@Component +public class MenuMapper { + private final MenuGroupMapper menuGroupMapper; + private final MenuProductMapper menuProductMapper; + + public MenuMapper(MenuGroupMapper menuGroupMapper, MenuProductMapper menuProductMapper) { + this.menuGroupMapper = menuGroupMapper; + this.menuProductMapper = menuProductMapper; + } + + public MenuResponse toMenuResponse(Menu menu) { + if (menu == null) { + return new MenuResponse(); + } + + MenuResponse menuResponse = new MenuResponse( + menu.getId(), + menu.getName(), + menu.getPrice(), + menu.isDisplayed(), + menuGroupMapper.toMenuGroupResponse(menu.getMenuGroup()), + menuProductMapper.toMenuProductResponseList(menu.getMenuProducts()) + ); + return menuResponse; + } +} diff --git a/src/main/java/kitchenpos/menus/mapper/MenuProductMapper.java b/src/main/java/kitchenpos/menus/mapper/MenuProductMapper.java new file mode 100644 index 000000000..0147afb4f --- /dev/null +++ b/src/main/java/kitchenpos/menus/mapper/MenuProductMapper.java @@ -0,0 +1,36 @@ +package kitchenpos.menus.mapper; + +import kitchenpos.menus.dto.MenuProductResponse; +import kitchenpos.menus.tobe.domain.entity.MenuProduct; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class MenuProductMapper { + public MenuProductResponse toMenuProductResponse(MenuProduct menuProduct) { + if (menuProduct == null) { + return new MenuProductResponse(); + } + + return new MenuProductResponse( + menuProduct.getSeq(), + menuProduct.getProduct().getId().getId(), + menuProduct.getQuantity(), + menuProduct.getProduct().getPrice(), + menuProduct.getProduct().getName() + ); + } + + public List toMenuProductResponseList(List menuProductList) { + if (menuProductList == null || menuProductList.isEmpty()) { + return new ArrayList<>(); + } + + return menuProductList.stream().map( + v -> toMenuProductResponse(v) + ).collect(Collectors.toList()); + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuProduct.java index f5c92f97f..fde142d1e 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuProduct.java @@ -4,7 +4,6 @@ import kitchenpos.products.tobe.domain.entity.Product; import javax.persistence.*; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java index 93fa420cf..83f25b54b 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java @@ -2,6 +2,7 @@ import kitchenpos.menus.application.MenuGroupService; import kitchenpos.menus.dto.MenuGroupCreateRequest; +import kitchenpos.menus.dto.MenuGroupResponse; import kitchenpos.menus.tobe.domain.entity.MenuGroup; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -19,14 +20,14 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { } @PostMapping - public ResponseEntity create(@RequestBody final MenuGroupCreateRequest request) { - final MenuGroup response = menuGroupService.create(request); - return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getId())) + public ResponseEntity create(@RequestBody final MenuGroupCreateRequest request) { + final MenuGroupResponse response = menuGroupService.create(request); + return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getMenuGroupId())) .body(response); } @GetMapping - public ResponseEntity> findAll() { + public ResponseEntity> findAll() { return ResponseEntity.ok(menuGroupService.findAll()); } } diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 861a14d84..926057f62 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -3,6 +3,7 @@ import kitchenpos.menus.application.MenuService; import kitchenpos.menus.dto.MenuCreateRequest; import kitchenpos.menus.dto.MenuPriceChangeRequest; +import kitchenpos.menus.dto.MenuResponse; import kitchenpos.menus.tobe.domain.entity.Menu; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -21,29 +22,29 @@ public MenuRestController(final MenuService menuService) { } @PostMapping - public ResponseEntity create(@RequestBody final MenuCreateRequest request) { - final Menu response = menuService.create(request); + public ResponseEntity create(@RequestBody final MenuCreateRequest request) { + final MenuResponse 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 MenuPriceChangeRequest request) { + public ResponseEntity changePrice(@PathVariable final UUID menuId, @RequestBody final MenuPriceChangeRequest 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/ProductApplicationService.java b/src/main/java/kitchenpos/products/application/ProductApplicationService.java index 06e0f10e2..201a7ac8a 100644 --- a/src/main/java/kitchenpos/products/application/ProductApplicationService.java +++ b/src/main/java/kitchenpos/products/application/ProductApplicationService.java @@ -1,7 +1,6 @@ package kitchenpos.products.application; import kitchenpos.menus.tobe.domain.entity.Menu; -import kitchenpos.menus.tobe.domain.entity.MenuProduct; import kitchenpos.menus.tobe.domain.repository.MenuRepository; import kitchenpos.products.dto.ProductCreateRequest; import kitchenpos.products.dto.ProductPriceChangeRequest; diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index af39b3e20..e02481ba2 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -1,6 +1,8 @@ package kitchenpos.menus.application; import kitchenpos.menus.dto.MenuGroupCreateRequest; +import kitchenpos.menus.dto.MenuGroupResponse; +import kitchenpos.menus.mapper.MenuGroupMapper; import kitchenpos.menus.tobe.domain.entity.MenuGroup; import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; import org.junit.jupiter.api.BeforeEach; @@ -19,21 +21,23 @@ class MenuGroupServiceTest { private MenuGroupRepository menuGroupRepository; private MenuGroupService menuGroupService; + private MenuGroupMapper menuGroupMapper; @BeforeEach void setUp() { menuGroupRepository = new InMemoryMenuGroupRepository(); - menuGroupService = new MenuGroupService(menuGroupRepository); + menuGroupMapper = new MenuGroupMapper(); + menuGroupService = new MenuGroupService(menuGroupRepository, menuGroupMapper); } @DisplayName("메뉴 그룹을 등록할 수 있다.") @Test void create() { final MenuGroupCreateRequest expected = createMenuGroupRequest("두마리메뉴"); - final MenuGroup actual = menuGroupService.create(expected); + final MenuGroupResponse actual = menuGroupService.create(expected); assertThat(actual).isNotNull(); assertAll( - () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getMenuGroupId()).isNotNull(), () -> assertThat(actual.getName()).isEqualTo(expected.getName()) ); } @@ -51,7 +55,7 @@ void create(final String name) { @Test void findAll() { menuGroupRepository.save(menuGroup("두마리메뉴")); - final List actual = menuGroupService.findAll(); + 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 8be2d0f28..a8e15536a 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -3,9 +3,12 @@ import kitchenpos.menus.dto.MenuCreateRequest; import kitchenpos.menus.dto.MenuPriceChangeRequest; import kitchenpos.menus.dto.MenuProductRequest; +import kitchenpos.menus.dto.MenuResponse; +import kitchenpos.menus.mapper.MenuGroupMapper; +import kitchenpos.menus.mapper.MenuMapper; +import kitchenpos.menus.mapper.MenuProductMapper; import kitchenpos.menus.tobe.domain.entity.Menu; import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository; -import kitchenpos.menus.tobe.domain.entity.MenuProduct; import kitchenpos.menus.tobe.domain.repository.MenuRepository; import kitchenpos.products.application.FakePurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; @@ -34,6 +37,9 @@ class MenuServiceTest { private MenuGroupRepository menuGroupRepository; private ProductRepository productRepository; private PurgomalumClient purgomalumClient; + private MenuGroupMapper menuGroupMapper; + private MenuProductMapper menuProductMapper; + private MenuMapper menuMapper; private MenuService menuService; private UUID menuGroupId; private Product product; @@ -44,7 +50,10 @@ void setUp() { menuGroupRepository = new InMemoryMenuGroupRepository(); productRepository = new InMemoryProductRepository(); purgomalumClient = new FakePurgomalumClient(); - menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalumClient); + menuGroupMapper = new MenuGroupMapper(); + menuProductMapper = new MenuProductMapper(); + menuMapper = new MenuMapper(menuGroupMapper, menuProductMapper); + menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalumClient, menuMapper); menuGroupId = menuGroupRepository.save(menuGroup()).getId(); product = productRepository.save(product("후라이드", 16_000L)); } @@ -55,15 +64,15 @@ void create() { final MenuCreateRequest expected = createMenuRequest( "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId().getId(), 2L) ); - final Menu actual = menuService.create(expected); + final MenuResponse actual = menuService.create(expected); assertThat(actual).isNotNull(); assertAll( () -> assertThat(actual.getId()).isNotNull(), () -> assertThat(actual.getName()).isEqualTo(expected.getName()), () -> assertThat(actual.getPrice()).isEqualTo(expected.getPrice()), - () -> assertThat(actual.getMenuGroup().getId()).isEqualTo(expected.getMenuGroupId()), + () -> assertThat(actual.getMenuGroupResponse().getMenuGroupId()).isEqualTo(expected.getMenuGroupId()), () -> assertThat(actual.isDisplayed()).isEqualTo(expected.isDisplayed()), - () -> assertThat(actual.getMenuProducts()).hasSize(1) + () -> assertThat(actual.getMenuProductResponseList()).hasSize(1) ); } @@ -144,7 +153,7 @@ void create(final String name) { void changePrice() { final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); final MenuPriceChangeRequest expected = changePriceRequest(16_000L); - final Menu actual = menuService.changePrice(menuId, expected); + final MenuResponse actual = menuService.changePrice(menuId, expected); assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); } @@ -172,7 +181,7 @@ void changePriceToExpensive() { @Test void display() { final UUID menuId = menuRepository.save(menu(19_000L, false, menuProduct(product, 2L))).getId(); - final Menu actual = menuService.display(menuId); + final MenuResponse actual = menuService.display(menuId); assertThat(actual.isDisplayed()).isTrue(); } @@ -188,7 +197,7 @@ void displayExpensiveMenu() { @Test void hide() { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))).getId(); - final Menu actual = menuService.hide(menuId); + final MenuResponse actual = menuService.hide(menuId); assertThat(actual.isDisplayed()).isFalse(); } @@ -196,7 +205,7 @@ void hide() { @Test void findAll() { menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); - final List actual = menuService.findAll(); + final List actual = menuService.findAll(); assertThat(actual).hasSize(1); }