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..f3106df7d 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -1,36 +1,40 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +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; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Objects; import java.util.UUID; +import java.util.stream.Collectors; @Service public class MenuGroupService { private final MenuGroupRepository menuGroupRepository; + private final 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 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 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 bd7abc092..8b8d6e3c4 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.*; +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; +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; @@ -17,126 +23,71 @@ 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 Menu request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } + public MenuResponse 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); - return menuRepository.save(menu); + + Menu menu = Menu.createMenu(request, menuGroup, products, purgomalumClient); + menu = menuRepository.save(menu); + return menuMapper.toMenuResponse(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 MenuResponse 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); - return menu; + menu.changePrice(request.getPrice()); + 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); - 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); - return menu; + + menu.display(); + 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/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/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/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/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/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/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/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/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/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java new file mode 100644 index 000000000..34302e253 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/entity/Menu.java @@ -0,0 +1,188 @@ +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.*; +import java.util.stream.Collectors; + +@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; + } + + 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(); + } + + 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; + } + + 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/menus/domain/MenuGroup.java b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuGroup.java similarity index 61% rename from src/main/java/kitchenpos/menus/domain/MenuGroup.java rename to src/main/java/kitchenpos/menus/tobe/domain/entity/MenuGroup.java index e65017271..e13904778 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuGroup.java @@ -1,9 +1,10 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain.entity; 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") @@ -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/tobe/domain/entity/MenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuProduct.java new file mode 100644 index 000000000..fde142d1e --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/entity/MenuProduct.java @@ -0,0 +1,91 @@ +package kitchenpos.menus.tobe.domain.entity; + +import kitchenpos.menus.dto.MenuProductRequest; +import kitchenpos.products.tobe.domain.entity.Product; + +import javax.persistence.*; +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..83f25b54b 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java @@ -1,7 +1,9 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuGroupService; -import kitchenpos.menus.domain.MenuGroup; +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.*; @@ -18,14 +20,14 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { } @PostMapping - public ResponseEntity create(@RequestBody final MenuGroup 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 3e3a0e23a..926057f62 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -1,7 +1,10 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuService; -import kitchenpos.menus.domain.Menu; +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.*; @@ -19,29 +22,29 @@ public MenuRestController(final MenuService menuService) { } @PostMapping - public ResponseEntity create(@RequestBody final Menu request) { - final Menu response = menuService.create(request); + public ResponseEntity create(@RequestBody final 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 Menu 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 09c6cc77a..201a7ac8a 100644 --- a/src/main/java/kitchenpos/products/application/ProductApplicationService.java +++ b/src/main/java/kitchenpos/products/application/ProductApplicationService.java @@ -1,8 +1,7 @@ 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.repository.MenuRepository; import kitchenpos.products.dto.ProductCreateRequest; import kitchenpos.products.dto.ProductPriceChangeRequest; import kitchenpos.products.dto.ProductResponse; @@ -16,7 +15,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; @@ -59,20 +57,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); } 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..e02481ba2 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -1,7 +1,10 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +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; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -18,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 MenuGroup expected = createMenuGroupRequest("두마리메뉴"); - final MenuGroup actual = menuGroupService.create(expected); + final MenuGroupCreateRequest expected = createMenuGroupRequest("두마리메뉴"); + final MenuGroupResponse actual = menuGroupService.create(expected); assertThat(actual).isNotNull(); assertAll( - () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getMenuGroupId()).isNotNull(), () -> assertThat(actual.getName()).isEqualTo(expected.getName()) ); } @@ -41,7 +46,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); } @@ -50,13 +55,13 @@ 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); } - 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; } } diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 19b05243d..a8e15536a 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -1,9 +1,15 @@ 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.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.repository.MenuRepository; import kitchenpos.products.application.FakePurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; import kitchenpos.products.infra.PurgomalumClient; @@ -31,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; @@ -41,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)); } @@ -49,26 +61,26 @@ 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); + 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) ); } @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 +96,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 +108,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 +118,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 +129,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 +141,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)) @@ -140,8 +152,8 @@ 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 Menu actual = menuService.changePrice(menuId, expected); + final MenuPriceChangeRequest expected = changePriceRequest(16_000L); + final MenuResponse actual = menuService.changePrice(menuId, expected); assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); } @@ -151,7 +163,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); } @@ -160,7 +172,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); } @@ -169,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(); } @@ -185,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(); } @@ -193,70 +205,70 @@ 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); } - 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; } - 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; } } 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;