diff --git a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/clients/purgomalum/DefaultPurgomalumClient.java similarity index 76% rename from src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java rename to src/main/java/kitchenpos/clients/purgomalum/DefaultPurgomalumClient.java index 87dba885c..bed21047d 100644 --- a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/clients/purgomalum/DefaultPurgomalumClient.java @@ -1,5 +1,6 @@ -package kitchenpos.products.infra; +package kitchenpos.clients.purgomalum; +import kitchenpos.products.tobe.domain.PurgomalumClient; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @@ -8,7 +9,7 @@ import java.net.URI; @Component -public class DefaultPurgomalumClient implements PurgomalumClient { +public class DefaultPurgomalumClient implements PurgomalumClient, kitchenpos.menus.tobe.domain.PurgomalumClient { private final RestTemplate restTemplate; public DefaultPurgomalumClient(final RestTemplateBuilder restTemplateBuilder) { @@ -18,9 +19,9 @@ public DefaultPurgomalumClient(final RestTemplateBuilder restTemplateBuilder) { @Override public boolean containsProfanity(final String text) { final URI url = UriComponentsBuilder.fromUriString("https://www.purgomalum.com/service/containsprofanity") - .queryParam("text", text) - .build() - .toUri(); + .queryParam("text", text) + .build() + .toUri(); return Boolean.parseBoolean(restTemplate.getForObject(url, String.class)); } } diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderService.java b/src/main/java/kitchenpos/eatinorders/application/OrderService.java index c20f52c7f..ad45015d1 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.Menu; +import kitchenpos.menus.tobe.domain.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..e95215a1b 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.Menu; import javax.persistence.*; import java.math.BigDecimal; diff --git a/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java b/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java new file mode 100644 index 000000000..cc867c674 --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java @@ -0,0 +1,45 @@ +package kitchenpos.menus.application; + +import kitchenpos.menus.application.dto.MenuCreateProductRequest; +import kitchenpos.menus.tobe.domain.MenuProduct; +import kitchenpos.menus.tobe.domain.MenuProducts; +import kitchenpos.products.tobe.domain.Product; +import kitchenpos.products.tobe.domain.ProductRepository; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class MenuAntiCorruptionService { + + private final ProductRepository productRepository; + + public MenuAntiCorruptionService(ProductRepository productRepository) { + this.productRepository = productRepository; + } + + public MenuProducts createMenuProducts(List menuCreateProductRequests) { + Assert.isTrue(!Objects.isNull(menuCreateProductRequests) && !menuCreateProductRequests.isEmpty(), "메뉴 상품 정보가 누락되었습니다."); + + final List products = productRepository.findAllByIdIn( + menuCreateProductRequests.stream() + .map(MenuCreateProductRequest::getProductId) + .collect(Collectors.toList()) + ); + Assert.isTrue(products.size() == menuCreateProductRequests.size(), "메뉴 상품 정보가 등록 된 상품 정보와 일치하지 않습니다."); + + var productMap = products.stream() + .map(it -> new kitchenpos.menus.tobe.domain.Product(it.getId(), it.getPrice())) + .collect(Collectors.toMap(kitchenpos.menus.tobe.domain.Product::getProductId, Function.identity())); + + var menuProducts = menuCreateProductRequests.stream().map(it -> { + var product = productMap.get(it.getProductId()); + return MenuProduct.newOne(product, it.getQuantity()); + }).collect(Collectors.toList()); + + return MenuProducts.newOne(menuProducts); + } +} diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index c468893a2..7b4734331 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -1,13 +1,12 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.application.dto.MenuGroupCreateRequest; +import kitchenpos.menus.tobe.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Objects; -import java.util.UUID; @Service public class MenuGroupService { @@ -18,14 +17,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); + public MenuGroup create(final MenuGroupCreateRequest request) { + var menuGroup = MenuGroup.newOne(request.getName()); return menuGroupRepository.save(menuGroup); } diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index d010bfc15..45b35a133 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -1,137 +1,58 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.*; -import kitchenpos.products.tobe.domain.Product; -import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.menus.application.dto.MenuCreateRequest; +import kitchenpos.menus.application.dto.MenuPriceChangeRequest; +import kitchenpos.menus.tobe.domain.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; -import java.util.stream.Collectors; @Service public class MenuService { private final MenuRepository menuRepository; private final MenuGroupRepository menuGroupRepository; - private final ProductRepository productRepository; + private final MenuAntiCorruptionService antiCorruptionService; private final PurgomalumClient purgomalumClient; - public MenuService( - final MenuRepository menuRepository, - final MenuGroupRepository menuGroupRepository, - final ProductRepository productRepository, - final PurgomalumClient purgomalumClient - ) { + public MenuService(MenuRepository menuRepository, MenuGroupRepository menuGroupRepository, MenuAntiCorruptionService antiCorruptionService, PurgomalumClient purgomalumClient) { this.menuRepository = menuRepository; this.menuGroupRepository = menuGroupRepository; - this.productRepository = productRepository; + this.antiCorruptionService = antiCorruptionService; this.purgomalumClient = purgomalumClient; } @Transactional - public Menu create(final Menu request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } - final 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()) - ); - 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); + public Menu create(final MenuCreateRequest request) { + final var menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) + .orElseThrow(NotFoundMenuException::new); + final var menuProducts = antiCorruptionService.createMenuProducts(request.getMenuProducts()); + final var menu = Menu.newOne(request.getName(), request.getPrice(), request.isDisplayed(), menuGroup, menuProducts, purgomalumClient); return menuRepository.save(menu); } @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); + .orElseThrow(NotFoundMenuException::new); + menu.updateMenuPrice(request.getPrice()); return 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(); - } - menu.setDisplayed(true); + .orElseThrow(NotFoundMenuException::new); + menu.display(); return menu; } @Transactional public Menu hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); - menu.setDisplayed(false); + .orElseThrow(NotFoundMenuException::new); + menu.hide(); return menu; } @@ -139,4 +60,12 @@ public Menu hide(final UUID menuId) { public List findAll() { return menuRepository.findAll(); } + + @Transactional + public void changeProductPrice(final UUID productId, final BigDecimal productPrice) { + final List menus = menuRepository.findAllByProductId(productId); + for (final Menu menu : menus) { + menu.updateMenuProductPrice(productId, productPrice); + } + } } diff --git a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java b/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java deleted file mode 100644 index 69e6701e8..000000000 --- a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java +++ /dev/null @@ -1,40 +0,0 @@ -package kitchenpos.menus.application; - -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.products.tobe.domain.ProductPriceChangeEventProduct; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -import javax.transaction.Transactional; -import java.math.BigDecimal; -import java.util.List; - -@Component -public class ProductPriceChangeListener { - private final MenuRepository menuRepository; - - public ProductPriceChangeListener(MenuRepository menuRepository) { - this.menuRepository = menuRepository; - } - - @Transactional - @EventListener - public void listen(ProductPriceChangeEventProduct event) { - final List menus = menuRepository.findAllByProductId(event.getId()); - for (final Menu menu : menus) { - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (menu.getPrice().compareTo(sum) > 0) { - menu.setDisplayed(false); - } - } - } -} diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuCreateProductRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuCreateProductRequest.java new file mode 100644 index 000000000..ffd33d73a --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/dto/MenuCreateProductRequest.java @@ -0,0 +1,24 @@ +package kitchenpos.menus.application.dto; + +import javax.validation.constraints.NotNull; +import java.util.UUID; + +public class MenuCreateProductRequest { + @NotNull + private final UUID productId; + @NotNull + private final Long quantity; + + public MenuCreateProductRequest(UUID productId, Long quantity) { + this.productId = productId; + this.quantity = quantity; + } + + public UUID getProductId() { + return productId; + } + + public Long getQuantity() { + return quantity; + } +} diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java new file mode 100644 index 000000000..3d03b5fa1 --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java @@ -0,0 +1,48 @@ +package kitchenpos.menus.application.dto; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +public class MenuCreateRequest { + @NotNull + private final String name; + @NotNull + private final BigDecimal price; + @NotNull + private final UUID menuGroupId; + @NotNull + private final boolean displayed; + @NotEmpty + private final List menuProducts; + + public MenuCreateRequest(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/application/dto/MenuGroupCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuGroupCreateRequest.java new file mode 100644 index 000000000..f7cab9c45 --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/dto/MenuGroupCreateRequest.java @@ -0,0 +1,13 @@ +package kitchenpos.menus.application.dto; + +public class MenuGroupCreateRequest { + private final String name; + + public MenuGroupCreateRequest(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuPriceChangeRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuPriceChangeRequest.java new file mode 100644 index 000000000..382fb2841 --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/dto/MenuPriceChangeRequest.java @@ -0,0 +1,18 @@ +package kitchenpos.menus.application.dto; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +public class MenuPriceChangeRequest { + @NotNull + private final BigDecimal price; + + + public MenuPriceChangeRequest(BigDecimal price) { + this.price = price; + } + + public BigDecimal getPrice() { + return price; + } +} 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 276955c22..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.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/infra/listener/ProductPriceChangeListener.java b/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java new file mode 100644 index 000000000..f57334e41 --- /dev/null +++ b/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java @@ -0,0 +1,21 @@ +package kitchenpos.menus.infra.listener; + +import kitchenpos.menus.application.MenuService; +import kitchenpos.shared.event.ProductPriceChangeEvent; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +public class ProductPriceChangeListener { + + private final MenuService menuService; + + public ProductPriceChangeListener(MenuService menuService) { + this.menuService = menuService; + } + + @TransactionalEventListener + public void listen(ProductPriceChangeEvent event) { + menuService.changeProductPrice(event.getId(), event.getProductPrice()); + } +} diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/infra/repository/JpaMenuGroupRepository.java similarity index 56% rename from src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java rename to src/main/java/kitchenpos/menus/infra/repository/JpaMenuGroupRepository.java index 233488198..cded4b9cf 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/infra/repository/JpaMenuGroupRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.infra.repository; +import kitchenpos.menus.tobe.domain.MenuGroup; +import kitchenpos.menus.tobe.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/repository/JpaMenuRepository.java similarity index 61% rename from src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java rename to src/main/java/kitchenpos/menus/infra/repository/JpaMenuRepository.java index 796499c30..4bcbd29d5 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/infra/repository/JpaMenuRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.infra.repository; +import kitchenpos.menus.tobe.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.Menu; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -8,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.menuProducts mp where mp.product.productId = :productId") @Override List findAllByProductId(@Param("productId") UUID productId); } diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/infra/ui/MenuGroupRestController.java similarity index 83% rename from src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java rename to src/main/java/kitchenpos/menus/infra/ui/MenuGroupRestController.java index 1a5d0fd06..b0465a3fb 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/infra/ui/MenuGroupRestController.java @@ -1,7 +1,8 @@ -package kitchenpos.menus.ui; +package kitchenpos.menus.infra.ui; import kitchenpos.menus.application.MenuGroupService; -import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.application.dto.MenuGroupCreateRequest; +import kitchenpos.menus.tobe.domain.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/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/infra/ui/MenuRestController.java similarity index 78% rename from src/main/java/kitchenpos/menus/ui/MenuRestController.java rename to src/main/java/kitchenpos/menus/infra/ui/MenuRestController.java index 3e3a0e23a..e35cb28d5 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/infra/ui/MenuRestController.java @@ -1,7 +1,9 @@ -package kitchenpos.menus.ui; +package kitchenpos.menus.infra.ui; import kitchenpos.menus.application.MenuService; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.application.dto.MenuCreateRequest; +import kitchenpos.menus.application.dto.MenuPriceChangeRequest; +import kitchenpos.menus.tobe.domain.Menu; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -19,14 +21,14 @@ 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); } @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/main/java/kitchenpos/menus/tobe/domain/AmountPolicy.java b/src/main/java/kitchenpos/menus/tobe/domain/AmountPolicy.java new file mode 100644 index 000000000..e32f05fea --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/AmountPolicy.java @@ -0,0 +1,25 @@ +package kitchenpos.menus.tobe.domain; + +public class AmountPolicy { + public static void validRegistrableMenuPrice(MenuPrice menuPrice, MenuProducts menuProducts) { + if (isAmountOver(menuPrice, menuProducts)) { + throw new NotRegistrableMenuPriceException(); + } + } + + public static void validUpdatableMenuPrice(MenuPrice menuPrice, MenuProducts menuProducts) { + if (isAmountOver(menuPrice, menuProducts)) { + throw new NotUpdatableMenuPriceException(); + } + } + + public static void validDisplayableMenuPrice(MenuPrice menuPrice, MenuProducts menuProducts) { + if (isAmountOver(menuPrice, menuProducts)) { + throw new NotDisplayableMenuPriceException(); + } + } + + public static boolean isAmountOver(MenuPrice menuPrice, MenuProducts menuProducts) { + return menuPrice.getPrice().compareTo(menuProducts.getAmount()) > 0; + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java new file mode 100644 index 000000000..d86697595 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java @@ -0,0 +1,98 @@ +package kitchenpos.menus.tobe.domain; + +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; + + @Embedded + private MenuPrice menuPrice; + + @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; + + @Embedded + private MenuProducts menuProducts; + + public static Menu newOne(String name, BigDecimal price, boolean displayed, MenuGroup menuGroup, MenuProducts menuProducts, PurgomalumClient purgomalumClient) { + var menuPrice = new MenuPrice(price); + MenuNamePolicy.validMenuName(name, purgomalumClient); + AmountPolicy.validRegistrableMenuPrice(menuPrice, menuProducts); + return new Menu(UUID.randomUUID(), name, menuPrice, menuGroup, displayed, menuProducts); + } + + public Menu() { + } + + public Menu(UUID id, String name, MenuPrice menuPrice, MenuGroup menuGroup, boolean displayed, MenuProducts menuProducts) { + this.id = id; + this.name = name; + this.menuPrice = menuPrice; + this.menuGroup = menuGroup; + this.displayed = displayed; + this.menuProducts = menuProducts; + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return menuPrice.getPrice(); + } + + public MenuGroup getMenuGroup() { + return menuGroup; + } + + public boolean isDisplayed() { + return displayed; + } + + public List getMenuProducts() { + return this.menuProducts.getMenuProducts(); + } + + public void updateMenuProductPrice(UUID productId, BigDecimal productPrice) { + this.menuProducts.updateProductPrice(productId, productPrice); + if (AmountPolicy.isAmountOver(this.menuPrice, this.menuProducts)) { + this.displayed = false; + } + } + + public void updateMenuPrice(BigDecimal price) { + MenuPrice newMenuPrice = new MenuPrice(price); + AmountPolicy.validUpdatableMenuPrice(newMenuPrice, this.menuProducts); + this.menuPrice = newMenuPrice; + } + + public void display() { + AmountPolicy.validDisplayableMenuPrice(this.menuPrice, this.menuProducts); + this.displayed = true; + } + + public void hide() { + this.displayed = false; + } +} diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroup.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java similarity index 63% rename from src/main/java/kitchenpos/menus/domain/MenuGroup.java rename to src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java index e65017271..d7ac52d42 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java @@ -1,9 +1,12 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; + +import org.springframework.util.Assert; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import java.util.Objects; import java.util.UUID; @Table(name = "menu_group") @@ -16,22 +19,25 @@ public class MenuGroup { @Column(name = "name", nullable = false) private String name; - public MenuGroup() { + public static MenuGroup newOne(String name) { + Assert.isTrue(!Objects.isNull(name) && !name.isEmpty(), name); + return new MenuGroup(UUID.randomUUID(), name); } - public UUID getId() { - return id; + public MenuGroup() { } - public void setId(final UUID id) { + public MenuGroup(UUID id, String name) { this.id = id; + this.name = name; + } + + public UUID getId() { + return id; } public String getName() { return name; } - public void setName(final String name) { - this.name = name; - } } diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroupRepository.java similarity index 86% rename from src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java rename to src/main/java/kitchenpos/menus/tobe/domain/MenuGroupRepository.java index b25e6acbc..dcf1595ba 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroupRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuNamePolicy.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuNamePolicy.java new file mode 100644 index 000000000..0ecb3cff2 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuNamePolicy.java @@ -0,0 +1,11 @@ +package kitchenpos.menus.tobe.domain; + +import java.util.Objects; + +public class MenuNamePolicy { + public static void validMenuName(String name, PurgomalumClient purgomalumClient) { + if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { + throw new ProfanityContainsMenuNameException(); + } + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java new file mode 100644 index 000000000..c61aa4cde --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java @@ -0,0 +1,26 @@ +package kitchenpos.menus.tobe.domain; + +import org.springframework.util.Assert; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.math.BigDecimal; +import java.util.Objects; + +@Embeddable +public class MenuPrice { + @Column(name = "price", nullable = false) + private BigDecimal price; + + public MenuPrice() { + } + + public MenuPrice(BigDecimal price) { + Assert.isTrue(!Objects.isNull(price) && price.compareTo(BigDecimal.ZERO) > 0, "메뉴의 가격은 0보다 커야합니다."); + this.price = price; + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java new file mode 100644 index 000000000..80e0404cc --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java @@ -0,0 +1,46 @@ +package kitchenpos.menus.tobe.domain; + + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.UUID; + +@Table(name = "menu_product") +@Entity +public class MenuProduct { + @Column(name = "seq") + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Id + private Long seq; + + @Column(name = "quantity", nullable = false) + private long quantity; + + @Embedded + private Product product; + + public static MenuProduct newOne(Product product, long quantity) { + return new MenuProduct(null, quantity, product); + } + + public MenuProduct() { + } + + public MenuProduct(Long seq, long quantity, Product product) { + this.seq = seq; + this.quantity = quantity; + this.product = product; + } + + public UUID getProductId() { + return this.product.getProductId(); + } + + public BigDecimal getProductPrice() { + return this.product.getProductPrice().multiply(BigDecimal.valueOf(this.quantity)); + } + + public void updateProductPrice(BigDecimal productPrice) { + this.product.updatePrice(productPrice); + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java new file mode 100644 index 000000000..aa7c3db87 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java @@ -0,0 +1,53 @@ +package kitchenpos.menus.tobe.domain; + +import org.springframework.util.Assert; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +@Embeddable +public class MenuProducts { + + @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; + + public static MenuProducts newOne(List menuProducts) { + Assert.isTrue(!Objects.isNull(menuProducts) && !menuProducts.isEmpty(), "메뉴 상품 정보가 누락되었습니다."); + return new MenuProducts(menuProducts); + } + + public MenuProducts() { + + } + + public MenuProducts(List menuProducts) { + this.menuProducts = menuProducts; + } + + public List getMenuProducts() { + return this.menuProducts; + } + + public BigDecimal getAmount() { + return this.menuProducts.stream() + .map(MenuProduct::getProductPrice) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + public void updateProductPrice(UUID productId, BigDecimal productPrice) { + this.menuProducts.stream() + .filter(it -> it.getProductId().equals(productId)) + .findFirst() + .orElseThrow(NotFoundProductException::new) + .updateProductPrice(productPrice); + } +} diff --git a/src/main/java/kitchenpos/menus/domain/MenuRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuRepository.java similarity index 78% rename from src/main/java/kitchenpos/menus/domain/MenuRepository.java rename to src/main/java/kitchenpos/menus/tobe/domain/MenuRepository.java index 5fbaab864..eb0fa0c15 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuRepository.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuRepository.java @@ -1,4 +1,6 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; + +import kitchenpos.menus.tobe.domain.Menu; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/menus/tobe/domain/NotDisplayableMenuPriceException.java b/src/main/java/kitchenpos/menus/tobe/domain/NotDisplayableMenuPriceException.java new file mode 100644 index 000000000..d2268801d --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/NotDisplayableMenuPriceException.java @@ -0,0 +1,7 @@ +package kitchenpos.menus.tobe.domain; + +public class NotDisplayableMenuPriceException extends IllegalStateException { + public NotDisplayableMenuPriceException() { + super("상품 총 가격이 메뉴의 가격보다 높아 전시할 수 없습니다."); + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/NotFoundMenuException.java b/src/main/java/kitchenpos/menus/tobe/domain/NotFoundMenuException.java new file mode 100644 index 000000000..f91f85ead --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/NotFoundMenuException.java @@ -0,0 +1,9 @@ +package kitchenpos.menus.tobe.domain; + +import java.util.NoSuchElementException; + +public class NotFoundMenuException extends NoSuchElementException { + public NotFoundMenuException() { + super("메뉴를 찾을 수 없습니다."); + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/NotFoundProductException.java b/src/main/java/kitchenpos/menus/tobe/domain/NotFoundProductException.java new file mode 100644 index 000000000..a9be1565a --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/NotFoundProductException.java @@ -0,0 +1,7 @@ +package kitchenpos.menus.tobe.domain; + +public class NotFoundProductException extends IllegalArgumentException { + public NotFoundProductException() { + super("상품을 찾을 수가 없습니다."); + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/NotRegistrableMenuPriceException.java b/src/main/java/kitchenpos/menus/tobe/domain/NotRegistrableMenuPriceException.java new file mode 100644 index 000000000..57d81c517 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/NotRegistrableMenuPriceException.java @@ -0,0 +1,8 @@ +package kitchenpos.menus.tobe.domain; + +public class NotRegistrableMenuPriceException extends IllegalArgumentException { + public NotRegistrableMenuPriceException() { + super("등록할 수 없는 가격정보입니다."); + } +} + \ No newline at end of file diff --git a/src/main/java/kitchenpos/menus/tobe/domain/NotUpdatableMenuPriceException.java b/src/main/java/kitchenpos/menus/tobe/domain/NotUpdatableMenuPriceException.java new file mode 100644 index 000000000..203349cd1 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/NotUpdatableMenuPriceException.java @@ -0,0 +1,7 @@ +package kitchenpos.menus.tobe.domain; + +public class NotUpdatableMenuPriceException extends IllegalArgumentException { + public NotUpdatableMenuPriceException() { + super("수정할 수 없는 가격정보입니다."); + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/Product.java b/src/main/java/kitchenpos/menus/tobe/domain/Product.java new file mode 100644 index 000000000..46fd373e2 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/Product.java @@ -0,0 +1,35 @@ +package kitchenpos.menus.tobe.domain; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.math.BigDecimal; +import java.util.UUID; + +@Embeddable +public class Product { + @Column(name = "product_id") + private UUID productId; + + @Column(name = "price") + private BigDecimal productPrice; + + public Product() { + } + + public Product(UUID productId, BigDecimal productPrice) { + this.productId = productId; + this.productPrice = productPrice; + } + + public UUID getProductId() { + return productId; + } + + public BigDecimal getProductPrice() { + return productPrice; + } + + public void updatePrice(BigDecimal productPrice) { + this.productPrice = productPrice; + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ProfanityContainsMenuNameException.java b/src/main/java/kitchenpos/menus/tobe/domain/ProfanityContainsMenuNameException.java new file mode 100644 index 000000000..0e9476dbe --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/ProfanityContainsMenuNameException.java @@ -0,0 +1,7 @@ +package kitchenpos.menus.tobe.domain; + +public class ProfanityContainsMenuNameException extends IllegalArgumentException { + public ProfanityContainsMenuNameException() { + super("비속어가 포함 된 메뉴 이름입니다."); + } +} diff --git a/src/main/java/kitchenpos/products/infra/PurgomalumClient.java b/src/main/java/kitchenpos/menus/tobe/domain/PurgomalumClient.java similarity index 68% rename from src/main/java/kitchenpos/products/infra/PurgomalumClient.java rename to src/main/java/kitchenpos/menus/tobe/domain/PurgomalumClient.java index 4002a2bb8..4be378eb2 100644 --- a/src/main/java/kitchenpos/products/infra/PurgomalumClient.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/PurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.products.infra; +package kitchenpos.menus.tobe.domain; public interface PurgomalumClient { boolean containsProfanity(String text); diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index a766a51c6..ae45e13f8 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -6,7 +6,7 @@ import kitchenpos.products.tobe.domain.ProductName; import kitchenpos.products.tobe.domain.ProductPrice; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.products.tobe.domain.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/products/tobe/domain/JpaProductRepository.java b/src/main/java/kitchenpos/products/infra/repository/JpaProductRepository.java similarity index 62% rename from src/main/java/kitchenpos/products/tobe/domain/JpaProductRepository.java rename to src/main/java/kitchenpos/products/infra/repository/JpaProductRepository.java index 4204f5f80..7a34f56a3 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/JpaProductRepository.java +++ b/src/main/java/kitchenpos/products/infra/repository/JpaProductRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.products.tobe.domain; +package kitchenpos.products.infra.repository; +import kitchenpos.products.tobe.domain.Product; +import kitchenpos.products.tobe.domain.ProductRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/kitchenpos/products/ui/ProductRestController.java b/src/main/java/kitchenpos/products/infra/ui/ProductRestController.java similarity index 97% rename from src/main/java/kitchenpos/products/ui/ProductRestController.java rename to src/main/java/kitchenpos/products/infra/ui/ProductRestController.java index a1a9498a8..50e3b9730 100644 --- a/src/main/java/kitchenpos/products/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/products/infra/ui/ProductRestController.java @@ -1,4 +1,4 @@ -package kitchenpos.products.ui; +package kitchenpos.products.infra.ui; import kitchenpos.products.application.ProductService; import kitchenpos.products.application.dto.ProductRequest; diff --git a/src/main/java/kitchenpos/products/tobe/domain/Product.java b/src/main/java/kitchenpos/products/tobe/domain/Product.java index 06480439d..54811366d 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/Product.java +++ b/src/main/java/kitchenpos/products/tobe/domain/Product.java @@ -1,6 +1,7 @@ package kitchenpos.products.tobe.domain; +import kitchenpos.shared.event.ProductPriceChangeEvent; import org.springframework.data.domain.AbstractAggregateRoot; import javax.persistence.*; @@ -47,6 +48,6 @@ public BigDecimal getPrice() { public void changePrice(final ProductPrice productPrice) { this.price = productPrice; - registerEvent(new ProductPriceChangeEventProduct(this.id)); + registerEvent(new ProductPriceChangeEvent(this.id, this.getPrice())); } } diff --git a/src/main/java/kitchenpos/products/tobe/domain/ProductName.java b/src/main/java/kitchenpos/products/tobe/domain/ProductName.java index 92d4aafe7..0f6164e2f 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/ProductName.java +++ b/src/main/java/kitchenpos/products/tobe/domain/ProductName.java @@ -1,7 +1,5 @@ package kitchenpos.products.tobe.domain; -import kitchenpos.products.infra.PurgomalumClient; - import javax.persistence.Column; import javax.persistence.Embeddable; import java.util.Objects; diff --git a/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEventProduct.java b/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEventProduct.java deleted file mode 100644 index ef2373851..000000000 --- a/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEventProduct.java +++ /dev/null @@ -1,15 +0,0 @@ -package kitchenpos.products.tobe.domain; - -import java.util.UUID; - -public class ProductPriceChangeEventProduct { - private UUID id; - - public ProductPriceChangeEventProduct( UUID id) { - this.id = id; - } - - public UUID getId() { - return id; - } -} diff --git a/src/main/java/kitchenpos/products/tobe/domain/PurgomalumClient.java b/src/main/java/kitchenpos/products/tobe/domain/PurgomalumClient.java new file mode 100644 index 000000000..d2bed1485 --- /dev/null +++ b/src/main/java/kitchenpos/products/tobe/domain/PurgomalumClient.java @@ -0,0 +1,5 @@ +package kitchenpos.products.tobe.domain; + +public interface PurgomalumClient { + boolean containsProfanity(String text); +} diff --git a/src/main/java/kitchenpos/shared/event/ProductPriceChangeEvent.java b/src/main/java/kitchenpos/shared/event/ProductPriceChangeEvent.java new file mode 100644 index 000000000..9f8c0ba5a --- /dev/null +++ b/src/main/java/kitchenpos/shared/event/ProductPriceChangeEvent.java @@ -0,0 +1,22 @@ +package kitchenpos.shared.event; + +import java.math.BigDecimal; +import java.util.UUID; + +public class ProductPriceChangeEvent { + private final UUID id; + private final BigDecimal productPrice; + + public ProductPriceChangeEvent(UUID id, BigDecimal productPrice) { + this.id = id; + this.productPrice = productPrice; + } + + public UUID getId() { + return id; + } + + public BigDecimal getProductPrice() { + return this.productPrice; + } +} diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index 347a57f63..d91bac540 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -1,9 +1,6 @@ package kitchenpos; import kitchenpos.eatinorders.domain.*; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuProduct; import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.tobe.domain.ProductName; import kitchenpos.products.tobe.domain.ProductPrice; @@ -14,54 +11,11 @@ import java.util.Random; import java.util.UUID; -public class Fixtures { - public static final UUID INVALID_ID = new UUID(0L, 0L); - - public static Menu menu() { - return menu(19_000L, true, menuProduct()); - } - - public static Menu menu(final long price, final MenuProduct... menuProducts) { - return menu(price, false, menuProducts); - } - - public static Menu menu(final long price, final boolean displayed, final MenuProduct... menuProducts) { - final Menu menu = new Menu(); - menu.setId(UUID.randomUUID()); - menu.setName("후라이드+후라이드"); - menu.setPrice(BigDecimal.valueOf(price)); - menu.setMenuGroup(menuGroup()); - menu.setDisplayed(displayed); - menu.setMenuProducts(Arrays.asList(menuProducts)); - return menu; - } +import static kitchenpos.MenuFixture.menu; - public static MenuGroup menuGroup() { - return menuGroup("두마리메뉴"); - } - - public static MenuGroup menuGroup(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(UUID.randomUUID()); - menuGroup.setName(name); - return menuGroup; - } - - public static MenuProduct menuProduct() { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product()); - menuProduct.setQuantity(2L); - return menuProduct; - } +public class Fixtures { - 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 final UUID INVALID_ID = new UUID(0L, 0L); public static Order order(final OrderStatus status, final String deliveryAddress) { final Order order = new Order(); diff --git a/src/test/java/kitchenpos/MenuFixture.java b/src/test/java/kitchenpos/MenuFixture.java new file mode 100644 index 000000000..fe29b0b52 --- /dev/null +++ b/src/test/java/kitchenpos/MenuFixture.java @@ -0,0 +1,42 @@ +package kitchenpos; + +import kitchenpos.menus.tobe.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.*; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Random; +import java.util.UUID; + +public class MenuFixture { + public static final UUID INVALID_ID = new UUID(0L, 0L); + + public static Menu menu() { + return menu(19_000L, true, menuProduct()); + } + + public static Menu menu(final long price, final MenuProduct... menuProducts) { + return menu(price, false, menuProducts); + } + + public static Menu menu(final long price, final boolean displayed, final MenuProduct... menuProducts) { + return new Menu(UUID.randomUUID(), "후라이드+후라이드", new MenuPrice(BigDecimal.valueOf(price)), menuGroup(), displayed, + new MenuProducts(Arrays.asList(menuProducts))); + } + + public static MenuGroup menuGroup() { + return menuGroup("두마리메뉴"); + } + + public static MenuGroup menuGroup(final String name) { + return new MenuGroup(UUID.randomUUID(), name); + } + + public static MenuProduct menuProduct() { + return new MenuProduct(new Random().nextLong(), 2L, new Product(UUID.randomUUID(), BigDecimal.valueOf(16_000))); + } + + public static MenuProduct menuProduct(final Product product, final long quantity) { + return new MenuProduct(new Random().nextLong(), quantity, new Product(product.getProductId(), product.getProductPrice())); + } +} diff --git a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java b/src/test/java/kitchenpos/clients/FakePurgomalumClient.java similarity index 64% rename from src/test/java/kitchenpos/products/application/FakePurgomalumClient.java rename to src/test/java/kitchenpos/clients/FakePurgomalumClient.java index 3c4114798..b35b6940e 100644 --- a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java +++ b/src/test/java/kitchenpos/clients/FakePurgomalumClient.java @@ -1,11 +1,11 @@ -package kitchenpos.products.application; +package kitchenpos.clients; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.products.tobe.domain.PurgomalumClient; import java.util.Arrays; import java.util.List; -public class FakePurgomalumClient implements PurgomalumClient { +public class FakePurgomalumClient implements PurgomalumClient, kitchenpos.menus.tobe.domain.PurgomalumClient { private static final List profanities; static { diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java index 96bf0f286..3d765cb5e 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.MenuRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -13,6 +13,8 @@ import java.util.*; import static kitchenpos.Fixtures.*; +import static kitchenpos.MenuFixture.menu; +import static kitchenpos.MenuFixture.menuProduct; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java index 9b50d73bb..73d88c1f0 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.MenuGroup; +import kitchenpos.menus.tobe.domain.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 971ded7e3..b3e19c4e1 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.Menu; +import kitchenpos.menus.tobe.domain.MenuRepository; import java.util.*; import java.util.stream.Collectors; @@ -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/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index a5fbc71d1..cc052b4d3 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -1,7 +1,8 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.application.dto.MenuGroupCreateRequest; +import kitchenpos.menus.tobe.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -10,7 +11,7 @@ import java.util.List; -import static kitchenpos.Fixtures.menuGroup; +import static kitchenpos.MenuFixture.menuGroup; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; @@ -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,7 @@ 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) { + return new MenuGroupCreateRequest(name); } } diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 9503ecc3b..7334723ee 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -1,14 +1,17 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuGroupRepository; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.products.application.FakePurgomalumClient; +import kitchenpos.MenuFixture; +import kitchenpos.menus.application.dto.MenuCreateProductRequest; +import kitchenpos.menus.application.dto.MenuCreateRequest; +import kitchenpos.menus.application.dto.MenuPriceChangeRequest; +import kitchenpos.menus.tobe.domain.Menu; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.Product; +import kitchenpos.clients.FakePurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; -import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.menus.tobe.domain.PurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -22,6 +25,7 @@ import java.util.*; import static kitchenpos.Fixtures.*; +import static kitchenpos.MenuFixture.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; @@ -29,6 +33,7 @@ class MenuServiceTest { private MenuRepository menuRepository; private MenuGroupRepository menuGroupRepository; + private MenuAntiCorruptionService menuAntiCorruptionService; private ProductRepository productRepository; private PurgomalumClient purgomalumClient; private MenuService menuService; @@ -41,54 +46,56 @@ void setUp() { menuGroupRepository = new InMemoryMenuGroupRepository(); productRepository = new InMemoryProductRepository(); purgomalumClient = new FakePurgomalumClient(); - menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalumClient); + menuAntiCorruptionService = new MenuAntiCorruptionService(productRepository); + menuService = new MenuService(menuRepository, menuGroupRepository, menuAntiCorruptionService, purgomalumClient); menuGroupId = menuGroupRepository.save(menuGroup()).getId(); - product = productRepository.save(product("후라이드", 16_000L)); + var savedProduct = productRepository.save(product()); + product = new Product(savedProduct.getId(), savedProduct.getPrice()); } @DisplayName("1개 이상의 등록된 상품으로 메뉴를 등록할 수 있다.") @Test void create() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final MenuCreateRequest expected = createMenuRequest( + "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getProductId(), 2L) ); final Menu actual = menuService.create(expected); assertThat(actual).isNotNull(); assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()), - () -> assertThat(actual.getPrice()).isEqualTo(expected.getPrice()), - () -> assertThat(actual.getMenuGroup().getId()).isEqualTo(expected.getMenuGroupId()), - () -> assertThat(actual.isDisplayed()).isEqualTo(expected.isDisplayed()), - () -> assertThat(actual.getMenuProducts()).hasSize(1) + () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getName()).isEqualTo(expected.getName()), + () -> assertThat(actual.getPrice()).isEqualTo(expected.getPrice()), + () -> assertThat(actual.getMenuGroup().getId()).isEqualTo(expected.getMenuGroupId()), + () -> assertThat(actual.isDisplayed()).isEqualTo(expected.isDisplayed()), + () -> assertThat(actual.getMenuProducts()).hasSize(1) ); } @DisplayName("상품이 없으면 등록할 수 없다.") @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); + .isInstanceOf(IllegalArgumentException.class); } private static List menuProducts() { return Arrays.asList( - null, - Arguments.of(Collections.emptyList()), - Arguments.of(Arrays.asList(createMenuProductRequest(INVALID_ID, 2L))) + null, + Arguments.of(Collections.emptyList()), + Arguments.of(Arrays.asList(createMenuProductRequest(MenuFixture.INVALID_ID, 2L))) ); } @DisplayName("메뉴에 속한 상품의 수량은 0개 이상이어야 한다.") @Test void createNegativeQuantity() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), -1L) + final MenuCreateRequest expected = createMenuRequest( + "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getProductId(), -1L) ); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴의 가격이 올바르지 않으면 등록할 수 없다.") @@ -96,32 +103,32 @@ void createNegativeQuantity() { @NullSource @ParameterizedTest void create(final BigDecimal price) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final MenuCreateRequest expected = createMenuRequest( + "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getProductId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @Test void createExpensiveMenu() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final MenuCreateRequest expected = createMenuRequest( + "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getProductId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴는 특정 메뉴 그룹에 속해야 한다.") @NullSource @ParameterizedTest void create(final UUID menuGroupId) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final MenuCreateRequest expected = createMenuRequest( + "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getProductId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(NoSuchElementException.class); + .isInstanceOf(NoSuchElementException.class); } @DisplayName("메뉴의 이름이 올바르지 않으면 등록할 수 없다.") @@ -129,18 +136,18 @@ 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 MenuCreateRequest expected = createMenuRequest( + name, 19_000L, menuGroupId, true, createMenuProductRequest(product.getProductId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴의 가격을 변경할 수 있다.") @Test void changePrice() { final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(16_000L); + final MenuPriceChangeRequest expected = changePriceRequest(16_000L); final Menu actual = menuService.changePrice(menuId, expected); assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); } @@ -151,18 +158,18 @@ 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); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @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); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴를 노출할 수 있다.") @@ -178,7 +185,7 @@ void display() { void displayExpensiveMenu() { final UUID menuId = menuRepository.save(menu(33_000L, false, menuProduct(product, 2L))).getId(); assertThatThrownBy(() -> menuService.display(menuId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("메뉴를 숨길 수 있다.") @@ -197,66 +204,55 @@ void findAll() { assertThat(actual).hasSize(1); } - private Menu createMenuRequest( - final String name, - final long price, - final UUID menuGroupId, - final boolean displayed, - final MenuProduct... menuProducts + private MenuCreateRequest createMenuRequest( + final String name, + final long price, + final UUID menuGroupId, + final boolean displayed, + final MenuCreateProductRequest... menuProducts ) { return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); } - private Menu createMenuRequest( - final String name, - final BigDecimal price, - final UUID menuGroupId, - final boolean displayed, - final MenuProduct... menuProducts + private MenuCreateRequest createMenuRequest( + final String name, + final BigDecimal price, + final UUID menuGroupId, + final boolean displayed, + final MenuCreateProductRequest... menuProducts ) { return createMenuRequest(name, price, menuGroupId, displayed, Arrays.asList(menuProducts)); } - private Menu createMenuRequest( - final String name, - final long price, - final UUID menuGroupId, - final boolean displayed, - final List menuProducts + private MenuCreateRequest createMenuRequest( + final String name, + final long price, + final UUID menuGroupId, + final boolean displayed, + final List menuProducts ) { return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); } - private Menu createMenuRequest( - final String name, - final BigDecimal price, - final UUID menuGroupId, - final boolean displayed, - final List menuProducts + private MenuCreateRequest createMenuRequest( + final String name, + final BigDecimal price, + final UUID menuGroupId, + final boolean displayed, + final List menuProducts ) { - final Menu menu = new Menu(); - menu.setName(name); - menu.setPrice(price); - menu.setMenuGroupId(menuGroupId); - menu.setDisplayed(displayed); - menu.setMenuProducts(menuProducts); - return menu; + return new MenuCreateRequest(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 MenuCreateProductRequest createMenuProductRequest(final UUID productId, final long quantity) { + return new MenuCreateProductRequest(productId, quantity); } - private Menu changePriceRequest(final long price) { - return changePriceRequest(BigDecimal.valueOf(price)); + private MenuPriceChangeRequest changePriceRequest(BigDecimal price) { + return new MenuPriceChangeRequest(price); } - private Menu changePriceRequest(final BigDecimal price) { - final Menu menu = new Menu(); - menu.setPrice(price); - return menu; + private MenuPriceChangeRequest changePriceRequest(long price) { + return new MenuPriceChangeRequest(BigDecimal.valueOf(price)); } } diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 2757ee7ab..e5d3ff6fa 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -1,16 +1,22 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.Menu; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.MenuRepository; +import kitchenpos.menus.infra.listener.ProductPriceChangeListener; +import kitchenpos.menus.tobe.domain.Product; +import kitchenpos.clients.FakePurgomalumClient; +import kitchenpos.menus.tobe.domain.PurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; -import kitchenpos.products.tobe.domain.Product; -import kitchenpos.products.tobe.domain.ProductPriceChangeEventProduct; +import kitchenpos.shared.event.ProductPriceChangeEvent; import kitchenpos.products.tobe.domain.ProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static kitchenpos.Fixtures.*; +import static kitchenpos.MenuFixture.menu; +import static kitchenpos.MenuFixture.menuProduct; import static org.assertj.core.api.Assertions.assertThat; @@ -18,22 +24,31 @@ class ProductPriceChangeListenerTest { private ProductPriceChangeListener productPriceChangeListener; private MenuRepository menuRepository; - private Product product; + private MenuGroupRepository menuGroupRepository; private ProductRepository productRepository; + private MenuAntiCorruptionService menuAntiCorruptionService; + private PurgomalumClient purgomalumClient; + private MenuService menuService; + private Product product; @BeforeEach void setUp() { menuRepository = new InMemoryMenuRepository(); - productPriceChangeListener = new ProductPriceChangeListener(menuRepository); + menuGroupRepository = new InMemoryMenuGroupRepository(); productRepository = new InMemoryProductRepository(); - product = productRepository.save(product("후라이드", 16_000L)); + purgomalumClient = new FakePurgomalumClient(); + menuAntiCorruptionService = new MenuAntiCorruptionService(productRepository); + menuService = new MenuService(menuRepository, menuGroupRepository, menuAntiCorruptionService, purgomalumClient); + productPriceChangeListener = new ProductPriceChangeListener(menuService); + var savedProduct = productRepository.save(product()); + product = new Product(savedProduct.getId(), savedProduct.getPrice()); } @DisplayName("상품의 가격이 변경될 때 메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 크면 메뉴가 숨겨진다.") @Test void changePriceInMenu() { final Menu menu = menuRepository.save(menu(19_000L, menuProduct(product, 2L))); - productPriceChangeListener.listen(new ProductPriceChangeEventProduct(product.getId())); + productPriceChangeListener.listen(new ProductPriceChangeEvent(product.getProductId(), product.getProductPrice())); assertThat(menu.isDisplayed()).isFalse(); } diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index 1380b59a1..26ae08533 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -1,9 +1,10 @@ package kitchenpos.products.application; +import kitchenpos.clients.FakePurgomalumClient; import kitchenpos.products.application.dto.ProductRequest; import kitchenpos.products.application.dto.ProductResponse; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.products.tobe.domain.PurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test;