diff --git a/src/main/java/kitchenpos/global/exception/GlobalRestControllerAdvice.java b/src/main/java/kitchenpos/global/exception/GlobalRestControllerAdvice.java
new file mode 100644
index 000000000..d2915e4c7
--- /dev/null
+++ b/src/main/java/kitchenpos/global/exception/GlobalRestControllerAdvice.java
@@ -0,0 +1,23 @@
+package kitchenpos.global.exception;
+
+import kitchenpos.global.exception.dto.ErrorCode;
+import kitchenpos.global.exception.dto.ExceptionResponse;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.util.NoSuchElementException;
+
+@RestControllerAdvice
+public class GlobalRestControllerAdvice {
+
+ @ResponseBody
+ @ExceptionHandler(NoSuchElementException.class)
+ public ExceptionResponse noSuchElementExceptionHandler(NoSuchElementException exception) {
+ return new ExceptionResponse(
+ ErrorCode.NO_SUCH_ELEMENT.getCode(),
+ ErrorCode.NO_SUCH_ELEMENT.getMessage()
+ );
+ }
+
+}
diff --git a/src/main/java/kitchenpos/global/exception/custom/NotFoundProductException.java b/src/main/java/kitchenpos/global/exception/custom/NotFoundProductException.java
new file mode 100644
index 000000000..58f28229e
--- /dev/null
+++ b/src/main/java/kitchenpos/global/exception/custom/NotFoundProductException.java
@@ -0,0 +1,8 @@
+package kitchenpos.global.exception.custom;
+
+import java.util.NoSuchElementException;
+
+public class NotFoundProductException extends NoSuchElementException {
+ public NotFoundProductException() {
+ }
+}
diff --git a/src/main/java/kitchenpos/global/exception/dto/ErrorCode.java b/src/main/java/kitchenpos/global/exception/dto/ErrorCode.java
new file mode 100644
index 000000000..5106554e8
--- /dev/null
+++ b/src/main/java/kitchenpos/global/exception/dto/ErrorCode.java
@@ -0,0 +1,22 @@
+package kitchenpos.global.exception.dto;
+
+public enum ErrorCode {
+
+ NO_SUCH_ELEMENT("E001", "데이터를 찾지 못했습니다.");
+
+ private final String code;
+ private final String message;
+
+ ErrorCode(String code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+}
diff --git a/src/main/java/kitchenpos/global/exception/dto/ExceptionResponse.java b/src/main/java/kitchenpos/global/exception/dto/ExceptionResponse.java
new file mode 100644
index 000000000..f046e1a7c
--- /dev/null
+++ b/src/main/java/kitchenpos/global/exception/dto/ExceptionResponse.java
@@ -0,0 +1,20 @@
+package kitchenpos.global.exception.dto;
+
+public class ExceptionResponse {
+
+ private final String code;
+ private final String message;
+
+ public ExceptionResponse(String code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+}
diff --git a/src/main/java/kitchenpos/menus/application/MenuEventListener.java b/src/main/java/kitchenpos/menus/application/MenuEventListener.java
new file mode 100644
index 000000000..0cd6df794
--- /dev/null
+++ b/src/main/java/kitchenpos/menus/application/MenuEventListener.java
@@ -0,0 +1,20 @@
+package kitchenpos.menus.application;
+
+import kitchenpos.menus.application.dto.MenuEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MenuEventListener {
+
+ private final MenuService menuService;
+
+ public MenuEventListener(MenuService menuService) {
+ this.menuService = menuService;
+ }
+
+ @EventListener
+ public void changeMenuDisplayStatus(final MenuEvent menuEvent) {
+ menuService.changeMenuDisplayStatus(menuEvent.getProductId());
+ }
+}
diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java
index abf913c11..8ba9df8b4 100644
--- a/src/main/java/kitchenpos/menus/application/MenuService.java
+++ b/src/main/java/kitchenpos/menus/application/MenuService.java
@@ -1,8 +1,8 @@
package kitchenpos.menus.application;
import kitchenpos.menus.domain.*;
-import kitchenpos.products.domain.Product;
-import kitchenpos.products.domain.ProductRepository;
+import kitchenpos.products.tobe.domain.Product;
+import kitchenpos.products.tobe.domain.ProductRepository;
import kitchenpos.products.infra.PurgomalumClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -12,6 +12,7 @@
import java.util.stream.Collectors;
@Service
+@Transactional
public class MenuService {
private final MenuRepository menuRepository;
private final MenuGroupRepository menuGroupRepository;
@@ -30,7 +31,6 @@ public MenuService(
this.purgomalumClient = purgomalumClient;
}
- @Transactional
public Menu create(final Menu request) {
final BigDecimal price = request.getPrice();
if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) {
@@ -61,6 +61,7 @@ public Menu create(final Menu request) {
.orElseThrow(NoSuchElementException::new);
sum = sum.add(
product.getPrice()
+ .getProductPrice()
.multiply(BigDecimal.valueOf(quantity))
);
final MenuProduct menuProduct = new MenuProduct();
@@ -85,7 +86,6 @@ public Menu create(final Menu request) {
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) {
@@ -98,6 +98,7 @@ public Menu changePrice(final UUID menuId, final Menu request) {
sum = sum.add(
menuProduct.getProduct()
.getPrice()
+ .getProductPrice()
.multiply(BigDecimal.valueOf(menuProduct.getQuantity()))
);
}
@@ -108,7 +109,6 @@ public Menu changePrice(final UUID menuId, final Menu request) {
return menu;
}
- @Transactional
public Menu display(final UUID menuId) {
final Menu menu = menuRepository.findById(menuId)
.orElseThrow(NoSuchElementException::new);
@@ -117,6 +117,7 @@ public Menu display(final UUID menuId) {
sum = sum.add(
menuProduct.getProduct()
.getPrice()
+ .getProductPrice()
.multiply(BigDecimal.valueOf(menuProduct.getQuantity()))
);
}
@@ -127,7 +128,6 @@ public Menu display(final UUID menuId) {
return menu;
}
- @Transactional
public Menu hide(final UUID menuId) {
final Menu menu = menuRepository.findById(menuId)
.orElseThrow(NoSuchElementException::new);
@@ -135,6 +135,19 @@ public Menu hide(final UUID menuId) {
return menu;
}
+ public void changeMenuDisplayStatus(final UUID productId) {
+ menuRepository.findAllByProductId(productId)
+ .forEach(menu -> {
+ BigDecimal sum = menu.getMenuProducts().stream()
+ .map(menuProduct -> menuProduct.getProduct().getPrice().getProductPrice().multiply(BigDecimal.valueOf(menuProduct.getQuantity())))
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+ if (menu.getPrice().compareTo(sum) > 0) {
+ menu.setDisplayed(false);
+ }
+ });
+ }
+
@Transactional(readOnly = true)
public List