diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderService.java b/src/main/java/kitchenpos/eatinorders/application/OrderService.java index c20f52c7f..e245ec5e5 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderService.java @@ -2,7 +2,7 @@ import kitchenpos.deliveryorders.infra.KitchenridersClient; import kitchenpos.eatinorders.domain.*; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.domain.MenuRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -105,7 +105,7 @@ public Order accept(final UUID orderId) { BigDecimal sum = BigDecimal.ZERO; for (final OrderLineItem orderLineItem : order.getOrderLineItems()) { sum = orderLineItem.getMenu() - .getPrice() + .getPrice().getAmount() .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())); } kitchenridersClient.requestDelivery(orderId, sum, order.getDeliveryAddress()); diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java index e1e037caf..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/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index c468893a2..eea93f08e 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -1,13 +1,11 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.MenuGroup; import kitchenpos.menus.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 { @@ -19,13 +17,7 @@ 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); + final MenuGroup menuGroup = new MenuGroup(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 4d5204bb8..9f9588b92 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -1,13 +1,17 @@ package kitchenpos.menus.application; import kitchenpos.menus.domain.*; +import kitchenpos.menus.tobe.domain.Menu; +import kitchenpos.menus.tobe.domain.MenuProduct; +import kitchenpos.menus.tobe.domain.MenuGroup; +import kitchenpos.menus.tobe.dto.MenuCreateRequestDto; +import kitchenpos.menus.tobe.dto.MenuPriceChangeRequestDto; import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.infra.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -31,80 +35,43 @@ public MenuService( } @Transactional - public Menu create(final Menu request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } + public Menu create(final MenuCreateRequestDto request) { final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) - .orElseThrow(NoSuchElementException::new); - final List menuProductRequests = request.getMenuProducts(); - if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) { + .orElseThrow(NoSuchElementException::new); + + if (Objects.isNull(request.getMenuProducts()) || request.getMenuProducts().isEmpty()) { throw new IllegalArgumentException(); } + final List products = productRepository.findAllByIdIn( - menuProductRequests.stream() + request.getMenuProducts().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)) { + + if (products.size() != request.getMenuProducts().size()) { 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); + + List menuProducts = request.getMenuProducts().stream() + .map(menuProduct -> { + Product product = productRepository.findById(menuProduct.getProductId()) + .orElseThrow(NoSuchElementException::new); + return new MenuProduct(product, menuProduct.getQuantity()); + }) + .collect(Collectors.toList()); + + final Menu menu = new Menu(request.getName(), request.getPrice(), + menuGroup, request.isDisplayed(), 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 MenuPriceChangeRequestDto request) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (price.compareTo(sum) > 0) { - throw new IllegalArgumentException(); - } - menu.setPrice(price); + menu.changePrice(request.getPrice()); return menu; } @@ -112,18 +79,7 @@ public Menu changePrice(final UUID menuId, final Menu request) { public Menu display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (menu.getPrice().compareTo(sum) > 0) { - throw new IllegalStateException(); - } - menu.setDisplayed(true); + menu.display(); return menu; } @@ -131,7 +87,7 @@ public Menu display(final UUID menuId) { public Menu hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); - menu.setDisplayed(false); + menu.hide(); return menu; } diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java index 233488198..02be454a3 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java @@ -3,6 +3,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; +import kitchenpos.menus.tobe.domain.MenuGroup; public interface JpaMenuGroupRepository extends MenuGroupRepository, JpaRepository { } diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java index 796499c30..ee5d8bc6f 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java @@ -7,6 +7,8 @@ import java.util.List; import java.util.UUID; +import kitchenpos.menus.tobe.domain.Menu; + public interface JpaMenuRepository extends MenuRepository, JpaRepository { @Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId") @Override diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java b/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java index b25e6acbc..f94a02e3e 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import kitchenpos.menus.tobe.domain.MenuGroup; public interface MenuGroupRepository { MenuGroup save(MenuGroup menuGroup); diff --git a/src/main/java/kitchenpos/menus/domain/MenuRepository.java b/src/main/java/kitchenpos/menus/domain/MenuRepository.java index 5fbaab864..fcfa1584e 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuRepository.java +++ b/src/main/java/kitchenpos/menus/domain/MenuRepository.java @@ -4,6 +4,8 @@ import java.util.Optional; import java.util.UUID; +import kitchenpos.menus.tobe.domain.Menu; + public interface MenuRepository { Menu save(Menu menu); diff --git a/src/main/java/kitchenpos/menus/tobe/domain/DisplayedName.java b/src/main/java/kitchenpos/menus/tobe/domain/DisplayedName.java new file mode 100644 index 000000000..6bf90bc7d --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/DisplayedName.java @@ -0,0 +1,24 @@ +package kitchenpos.menus.tobe.domain; + +import kitchenpos.products.infra.PurgomalumClient; + +import java.util.Objects; + + +public class DisplayedName { + private String name; + + public DisplayedName() { + } + + public DisplayedName(String name, PurgomalumClient purgomalumClient) { + if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { + throw new IllegalArgumentException(); + } + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java similarity index 51% rename from src/main/java/kitchenpos/menus/domain/Menu.java rename to src/main/java/kitchenpos/menus/tobe/domain/Menu.java index 020be93f4..4483bc85e 100644 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java @@ -1,4 +1,6 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; + +import kitchenpos.products.infra.PurgomalumClient; import javax.persistence.*; import java.math.BigDecimal; @@ -13,29 +15,31 @@ public class Menu { private UUID id; @Column(name = "name", nullable = false) - private String name; + @Embedded + private DisplayedName name; @Column(name = "price", nullable = false) - private BigDecimal price; + @Embedded + private MenuPrice price; @ManyToOne(optional = false) @JoinColumn( - name = "menu_group_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") + 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") + name = "menu_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") ) + @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) private List menuProducts; @Transient @@ -44,68 +48,75 @@ public class Menu { public Menu() { } - public UUID getId() { - return id; + public Menu(String name, Long price, MenuGroup menuGroup, boolean displayed, + List menuProducts, PurgomalumClient purgomalumClient) { + this.id = UUID.randomUUID(); + this.name = new DisplayedName(name, purgomalumClient); + this.price = new MenuPrice(price); + this.menuGroup = menuGroup; + this.displayed = displayed; + this.menuProducts = menuProducts; + validateIfMenuPriceIsGreaterThanSumOfProductPrice(); } - public void setId(final UUID id) { - this.id = id; + public UUID getId() { + return id; } - public String getName() { + public DisplayedName getName() { return name; } - public void setName(final String name) { - this.name = name; - } - - public BigDecimal getPrice() { + public MenuPrice 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 void changePrice(Long amount) { + validateIfMenuPriceIsGreaterThanSumOfProductPrice(); + price.changeAmount(amount); + } + + public void display() { + validateIfMenuPriceIsGreaterThanSumOfProductPrice(); + this.displayed = true; + } + + public void hide() { + this.displayed = false; } public void hideMenuIfMenuPriceIsGreaterThanSumOfProductPrice() { - if (price.compareTo(getSumOfProductPrice()) > 0) { - setDisplayed(false); + if (isMenuPriceGreaterThanSumOfProductPrice()) { + hide(); + } + } + + private void validateIfMenuPriceIsGreaterThanSumOfProductPrice() { + if (isMenuPriceGreaterThanSumOfProductPrice()) { + throw new IllegalArgumentException(); } } + private boolean isMenuPriceGreaterThanSumOfProductPrice() { + return price.compareTo(getSumOfProductPrice()) > 0; + } + private BigDecimal getSumOfProductPrice() { BigDecimal sum = BigDecimal.ZERO; for (final MenuProduct menuProduct : menuProducts) { diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroup.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java similarity index 60% rename from src/main/java/kitchenpos/menus/domain/MenuGroup.java rename to src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java index e65017271..838999d9e 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java @@ -1,9 +1,7 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; +import java.util.Objects; import java.util.UUID; @Table(name = "menu_group") @@ -19,19 +17,19 @@ public class MenuGroup { public MenuGroup() { } - public UUID getId() { - return id; + public MenuGroup(String name) { + if (Objects.isNull(name) || name.isEmpty()) { + throw new IllegalArgumentException(); + } + this.id = UUID.randomUUID(); + this.name = name; } - public void setId(final UUID id) { - this.id = id; + 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/tobe/domain/MenuPrice.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java new file mode 100644 index 000000000..994252b6d --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java @@ -0,0 +1,35 @@ +package kitchenpos.menus.tobe.domain; + +import java.math.BigDecimal; +import java.util.Objects; + +public class MenuPrice { + private BigDecimal amount; + + public MenuPrice() { + } + + public MenuPrice(Long amount) { + validateIfAmountIsLessThanZero(amount); + this.amount = BigDecimal.valueOf(amount); + } + + public BigDecimal getAmount() { + return amount; + } + + public int compareTo(BigDecimal val) { + return amount.compareTo(val); + } + + public void changeAmount(Long amount) { + validateIfAmountIsLessThanZero(amount); + this.amount = BigDecimal.valueOf(amount); + } + + private void validateIfAmountIsLessThanZero(Long amount) { + if (Objects.isNull(amount) || amount.compareTo(0L) < 0) { + throw new IllegalArgumentException(); + } + } +} diff --git a/src/main/java/kitchenpos/menus/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java similarity index 60% rename from src/main/java/kitchenpos/menus/domain/MenuProduct.java rename to src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java index 276955c22..eac322c07 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; import kitchenpos.products.tobe.domain.Product; @@ -15,14 +15,14 @@ public class MenuProduct { @ManyToOne(optional = false) @JoinColumn( - name = "product_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_product") + 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; + private Long quantity; @Transient private UUID productId; @@ -30,35 +30,27 @@ public class MenuProduct { public MenuProduct() { } - public Long getSeq() { - return seq; + public MenuProduct(Product product, Long quantity) { + if (quantity < 0) { + throw new IllegalArgumentException(); + } + this.product = product; + this.quantity = quantity; } - public void setSeq(final Long seq) { - this.seq = seq; + public Long getSeq() { + return seq; } public Product getProduct() { return product; } - public void setProduct(final Product product) { - this.product = product; - } - - public long getQuantity() { + 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/tobe/dto/MenuCreateRequestDto.java b/src/main/java/kitchenpos/menus/tobe/dto/MenuCreateRequestDto.java new file mode 100644 index 000000000..018168404 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/dto/MenuCreateRequestDto.java @@ -0,0 +1,42 @@ +package kitchenpos.menus.tobe.dto; + +import kitchenpos.menus.tobe.domain.MenuProduct; + +import java.util.List; +import java.util.UUID; + +public class MenuCreateRequestDto { + private String name; + private Long price; + private UUID menuGroupId; + private boolean displayed; + private List menuProducts; + + public MenuCreateRequestDto(String name, Long 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 Long 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/tobe/dto/MenuPriceChangeRequestDto.java b/src/main/java/kitchenpos/menus/tobe/dto/MenuPriceChangeRequestDto.java new file mode 100644 index 000000000..cff2ba072 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/dto/MenuPriceChangeRequestDto.java @@ -0,0 +1,16 @@ +package kitchenpos.menus.tobe.dto; + +public class MenuPriceChangeRequestDto { + private Long price; + + public MenuPriceChangeRequestDto() { + } + + public MenuPriceChangeRequestDto(Long price) { + this.price = price; + } + + public Long getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java index 1a5d0fd06..af8c59263 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java @@ -1,7 +1,7 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuGroupService; -import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.MenuGroup; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 3e3a0e23a..574e62567 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -1,7 +1,9 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuService; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.Menu; +import kitchenpos.menus.tobe.dto.MenuCreateRequestDto; +import kitchenpos.menus.tobe.dto.MenuPriceChangeRequestDto; 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 MenuCreateRequestDto 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 MenuPriceChangeRequestDto request) { return ResponseEntity.ok(menuService.changePrice(menuId, request)); } diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index a69cd4f9b..a5d04b2a6 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -1,6 +1,6 @@ package kitchenpos.products.application; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.domain.ProductRepository; diff --git a/src/main/java/kitchenpos/products/tobe/domain/DisplayedName.java b/src/main/java/kitchenpos/products/tobe/domain/DisplayedName.java index fb6793ee9..5c9309e57 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/DisplayedName.java +++ b/src/main/java/kitchenpos/products/tobe/domain/DisplayedName.java @@ -5,10 +5,9 @@ import java.util.Objects; public class DisplayedName { - private final String name; + private String name; - public DisplayedName(String name) { - this.name = name; + public DisplayedName() { } public DisplayedName(String name, PurgomalumClient purgomalumClient) { diff --git a/src/main/java/kitchenpos/products/tobe/dto/PriceChangeRequestDto.java b/src/main/java/kitchenpos/products/tobe/dto/PriceChangeRequestDto.java index 9be2f0d1f..6adf21de9 100644 --- a/src/main/java/kitchenpos/products/tobe/dto/PriceChangeRequestDto.java +++ b/src/main/java/kitchenpos/products/tobe/dto/PriceChangeRequestDto.java @@ -1,7 +1,5 @@ package kitchenpos.products.tobe.dto; -import java.math.BigDecimal; - public class PriceChangeRequestDto { private Long price; diff --git a/src/main/java/kitchenpos/products/tobe/dto/ProductCreateRequestDto.java b/src/main/java/kitchenpos/products/tobe/dto/ProductCreateRequestDto.java index 13a612fff..813c2c3ce 100644 --- a/src/main/java/kitchenpos/products/tobe/dto/ProductCreateRequestDto.java +++ b/src/main/java/kitchenpos/products/tobe/dto/ProductCreateRequestDto.java @@ -1,7 +1,5 @@ package kitchenpos.products.tobe.dto; -import java.math.BigDecimal; - public class ProductCreateRequestDto { private String name; private Long price; diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index be71e707f..ff7fd02a2 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -1,11 +1,10 @@ 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.Menu; +import kitchenpos.menus.tobe.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.MenuProduct; import kitchenpos.products.application.FakePurgomalumClient; -import kitchenpos.products.infra.DefaultPurgomalumClient; import kitchenpos.products.infra.PurgomalumClient; import kitchenpos.products.tobe.domain.Product; @@ -28,14 +27,8 @@ public static Menu menu(final long price, final MenuProduct... 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; + return new Menu("후라이드+후라이드", price, menuGroup(), displayed, + Arrays.asList(menuProducts), purgomalumClient); } public static MenuGroup menuGroup() { @@ -43,26 +36,15 @@ public static MenuGroup menuGroup() { } public static MenuGroup menuGroup(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(UUID.randomUUID()); - menuGroup.setName(name); - return menuGroup; + return new MenuGroup(name); } public static MenuProduct menuProduct() { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product()); - menuProduct.setQuantity(2L); - return menuProduct; + return menuProduct(product(), 2L); } public static MenuProduct menuProduct(final Product product, final long quantity) { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product); - menuProduct.setQuantity(quantity); - return menuProduct; + return new MenuProduct(product, quantity); } public static Order order(final OrderStatus status, final String deliveryAddress) { diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java index 9b50d73bb..0cb98ae18 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 java.util.*; diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java index 971ded7e3..a499eff16 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java @@ -1,6 +1,6 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.domain.MenuRepository; import java.util.*; diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index a5fbc71d1..1bac8b08f 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -1,7 +1,7 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.MenuGroup; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -41,8 +41,7 @@ void create() { @NullAndEmptySource @ParameterizedTest void create(final String name) { - final MenuGroup expected = createMenuGroupRequest(name); - assertThatThrownBy(() -> menuGroupService.create(expected)) + assertThatThrownBy(() -> menuGroupService.create(createMenuGroupRequest(name))) .isInstanceOf(IllegalArgumentException.class); } @@ -55,8 +54,6 @@ void findAll() { } private MenuGroup createMenuGroupRequest(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setName(name); - return menuGroup; + return menuGroup(name); } } diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index a93964736..8b827eb71 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -1,9 +1,11 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuGroupRepository; -import kitchenpos.menus.domain.MenuProduct; import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.Menu; +import kitchenpos.menus.tobe.domain.MenuProduct; +import kitchenpos.menus.tobe.dto.MenuCreateRequestDto; +import kitchenpos.menus.tobe.dto.MenuPriceChangeRequestDto; import kitchenpos.products.application.FakePurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; import kitchenpos.products.domain.ProductRepository; @@ -49,15 +51,15 @@ void setUp() { @DisplayName("1개 이상의 등록된 상품으로 메뉴를 등록할 수 있다.") @Test void create() { - final Menu expected = createMenuRequest( + final MenuCreateRequestDto expected = createMenuRequest( "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 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.getName().getName()).isEqualTo(expected.getName()), + () -> assertThat(actual.getPrice().getAmount().longValue()).isEqualTo(expected.getPrice()), () -> assertThat(actual.getMenuGroup().getId()).isEqualTo(expected.getMenuGroupId()), () -> assertThat(actual.isDisplayed()).isEqualTo(expected.isDisplayed()), () -> assertThat(actual.getMenuProducts()).hasSize(1) @@ -68,8 +70,7 @@ void create() { @MethodSource("menuProducts") @ParameterizedTest void create(final List menuProducts) { - final Menu expected = createMenuRequest("후라이드+후라이드", 19_000L, menuGroupId, true, menuProducts); - assertThatThrownBy(() -> menuService.create(expected)) + assertThatThrownBy(() -> menuService.create(createMenuRequest("후라이드+후라이드", 19_000L, menuGroupId, true, menuProducts))) .isInstanceOf(IllegalArgumentException.class); } @@ -84,7 +85,7 @@ private static List menuProducts() { @DisplayName("메뉴에 속한 상품의 수량은 0개 이상이어야 한다.") @Test void createNegativeQuantity() { - final Menu expected = createMenuRequest( + final MenuCreateRequestDto expected = createMenuRequest( "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), -1L) ); assertThatThrownBy(() -> menuService.create(expected)) @@ -96,17 +97,16 @@ void createNegativeQuantity() { @NullSource @ParameterizedTest void create(final BigDecimal price) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - assertThatThrownBy(() -> menuService.create(expected)) + assertThatThrownBy(() -> menuService.create(createMenuRequest( + "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + ))) .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @Test void createExpensiveMenu() { - final Menu expected = createMenuRequest( + final MenuCreateRequestDto expected = createMenuRequest( "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) @@ -117,7 +117,7 @@ void createExpensiveMenu() { @NullSource @ParameterizedTest void create(final UUID menuGroupId) { - final Menu expected = createMenuRequest( + final MenuCreateRequestDto expected = createMenuRequest( "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) @@ -129,7 +129,7 @@ void create(final UUID menuGroupId) { @NullSource @ParameterizedTest void create(final String name) { - final Menu expected = createMenuRequest( + final MenuCreateRequestDto expected = createMenuRequest( name, 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) @@ -140,7 +140,7 @@ void create(final String name) { @Test void changePrice() { final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(16_000L); + final MenuPriceChangeRequestDto expected = changePriceRequest(16_000L); final Menu actual = menuService.changePrice(menuId, expected); assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); } @@ -151,7 +151,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 MenuPriceChangeRequestDto expected = changePriceRequest(price); assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) .isInstanceOf(IllegalArgumentException.class); } @@ -160,7 +160,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 MenuPriceChangeRequestDto expected = changePriceRequest(33_000L); assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) .isInstanceOf(IllegalArgumentException.class); } @@ -197,66 +197,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 MenuCreateRequestDto createMenuRequest( + final String name, + final BigDecimal price, + final UUID menuGroupId, + final boolean displayed, + final MenuProduct... menuProducts ) { - return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); + return createMenuRequest(name, price.longValue(), menuGroupId, displayed, menuProducts); } - private Menu createMenuRequest( - final String name, - final BigDecimal price, - final UUID menuGroupId, - final boolean displayed, - final MenuProduct... menuProducts + private MenuCreateRequestDto createMenuRequest( + final String name, + final BigDecimal price, + final UUID menuGroupId, + final boolean displayed, + final List menuProducts ) { - return createMenuRequest(name, price, menuGroupId, displayed, Arrays.asList(menuProducts)); + return createMenuRequest(name, price.longValue(), menuGroupId, displayed, menuProducts); } - private Menu createMenuRequest( + private MenuCreateRequestDto createMenuRequest( final String name, final long price, final UUID menuGroupId, final boolean displayed, - final List menuProducts + final MenuProduct... menuProducts ) { - return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); + return createMenuRequest(name, price, menuGroupId, displayed, Arrays.asList(menuProducts)); } - private Menu createMenuRequest( - final String name, - final BigDecimal price, - final UUID menuGroupId, - final boolean displayed, - final List menuProducts + private MenuCreateRequestDto createMenuRequest( + final String name, + final long 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 MenuCreateRequestDto(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; + return new MenuProduct(product(), quantity); } - private Menu changePriceRequest(final long price) { + private MenuPriceChangeRequestDto 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 MenuPriceChangeRequestDto changePriceRequest(final BigDecimal price) { + return new MenuPriceChangeRequestDto(price.longValue()); } } diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index c1e724371..dc700d42d 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.Menu; import kitchenpos.products.domain.ProductRepository; import kitchenpos.products.infra.PurgomalumClient; import kitchenpos.products.tobe.domain.Product;