Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2단계 - 리팩터링(메뉴) #233

Open
wants to merge 6 commits into
base: eleeje97
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
12 changes: 2 additions & 10 deletions src/main/java/kitchenpos/menus/application/MenuGroupService.java
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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);
}

Expand Down
102 changes: 29 additions & 73 deletions src/main/java/kitchenpos/menus/application/MenuService.java
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -31,107 +35,59 @@ 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<MenuProduct> 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<Product> products = productRepository.findAllByIdIn(
menuProductRequests.stream()
request.getMenuProducts().stream()
.map(MenuProduct::getProductId)
.collect(Collectors.toList())
);
if (products.size() != menuProductRequests.size()) {
throw new IllegalArgumentException();
}
final List<MenuProduct> 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<MenuProduct> menuProducts = request.getMenuProducts().stream()
.map(menuProduct -> {
Product product = productRepository.findById(menuProduct.getProductId())
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Menu Service 에서 Product 도메인과의 결합을 제거해볼수 있을까요 ?
외부 도메인과 협력을 해야하는 로직들을 DomainService로 정의해볼수 있을것 같습니다 😄

.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) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

가격 변경 로직이 깔끔하게 정리되었네요 👍

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;
}

@Transactional
public Menu display(final UUID menuId) {
final Menu menu = menuRepository.findById(menuId)
.orElseThrow(NoSuchElementException::new);
BigDecimal sum = BigDecimal.ZERO;
for (final MenuProduct menuProduct : menu.getMenuProducts()) {
sum = sum.add(
menuProduct.getProduct()
.getPrice()
.multiply(BigDecimal.valueOf(menuProduct.getQuantity()))
);
}
if (menu.getPrice().compareTo(sum) > 0) {
throw new IllegalStateException();
}
menu.setDisplayed(true);
menu.display();
return menu;
}

@Transactional
public Menu hide(final UUID menuId) {
final Menu menu = menuRepository.findById(menuId)
.orElseThrow(NoSuchElementException::new);
menu.setDisplayed(false);
menu.hide();
return menu;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<MenuGroup, UUID> {
}
2 changes: 2 additions & 0 deletions src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import java.util.List;
import java.util.UUID;

import kitchenpos.menus.tobe.domain.Menu;

public interface JpaMenuRepository extends MenuRepository, JpaRepository<Menu, UUID> {
@Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId")
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/kitchenpos/menus/domain/MenuRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
24 changes: 24 additions & 0 deletions src/main/java/kitchenpos/menus/tobe/domain/DisplayedName.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Loading