Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
235b361
refactor: purgomalum infra package 추가
Flamme1004K Jan 18, 2025
f2c5e06
refactor: purgomalumeClient class 위치를 domain package로 이동
Flamme1004K Jan 18, 2025
92de5a2
refactor: JpaProductRepositroy class 위치를 infra/repository pakcage로 이동
Flamme1004K Jan 18, 2025
a4aa6fb
refactor: ProductPriceChangeEvent 리팩토링
Flamme1004K Jan 25, 2025
6ec6b3d
refactor: MenuPrice 리팩토링
Flamme1004K Jan 25, 2025
113d0aa
refactor: MenuDisplay & MenuHide 리팩토링
Flamme1004K Jan 25, 2025
e501e40
refactor: MenuProducts 일급 컬렉션화하여 리팩토링
Flamme1004K Jan 25, 2025
0eddfea
refactor: Menu create 리팩토링
Flamme1004K Jan 25, 2025
d6873f4
test: Menu 리팩토링 이후 test Case 실패 건 수정
Flamme1004K Jan 25, 2025
bc84687
refactor: PurgomalumClient clients 공통 패키지로 이동
Flamme1004K Jan 25, 2025
cefc29c
refactor: ProductPriceChangeEvent의 가격정보 필드 수정
Flamme1004K Jan 25, 2025
0540594
move: ui 패키지 이동
Flamme1004K Jan 25, 2025
778dcec
move: domain package 중 MenuJpaRepository 을 infra/repository로 이동
Flamme1004K Jan 25, 2025
287979f
move: ProductPriceChangeEvent 클래스를 shared/event로 이동
Flamme1004K Jan 25, 2025
c3f41e4
refactor: menuGroup 리팩토링
Flamme1004K Jan 25, 2025
22260fd
refactor: 비즈니스 내 생성자에 대해서 newOne을 쓰도록 변경
Flamme1004K Jan 25, 2025
292d199
rename: 유비쿼터스 언어에 맞게 totalProductPrice를 amount로 변경
Flamme1004K Jan 25, 2025
2aef482
move: ProductPriceChangeEvent에 대해서 각 도메인에 대해 공유되는 이벤트이므로 shared/event…
Flamme1004K Jan 25, 2025
46e09bf
feature: Menu 가격에 대한 검증 로직 정책 클래스화
Flamme1004K Jan 26, 2025
a1dbca5
feature: MenuName 검증 로직 정책 클래스화
Flamme1004K Jan 26, 2025
b8656dc
refactor: 예외 상세화
Flamme1004K Jan 26, 2025
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
@@ -1,5 +1,6 @@
package kitchenpos.products.infra;
package kitchenpos.clients.purgomalum;

import kitchenpos.products.tobe.domain.PurgomalumClient;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
Expand All @@ -8,7 +9,7 @@
import java.net.URI;

@Component
public class DefaultPurgomalumClient implements PurgomalumClient {
public class DefaultPurgomalumClient implements PurgomalumClient, kitchenpos.menus.tobe.domain.PurgomalumClient {
private final RestTemplate restTemplate;

public DefaultPurgomalumClient(final RestTemplateBuilder restTemplateBuilder) {
Expand All @@ -18,9 +19,9 @@ public DefaultPurgomalumClient(final RestTemplateBuilder restTemplateBuilder) {
@Override
public boolean containsProfanity(final String text) {
final URI url = UriComponentsBuilder.fromUriString("https://www.purgomalum.com/service/containsprofanity")
.queryParam("text", text)
.build()
.toUri();
.queryParam("text", text)
.build()
.toUri();
return Boolean.parseBoolean(restTemplate.getForObject(url, String.class));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import kitchenpos.deliveryorders.infra.KitchenridersClient;
import kitchenpos.eatinorders.domain.*;
import kitchenpos.menus.domain.Menu;
import kitchenpos.menus.domain.MenuRepository;
import kitchenpos.menus.tobe.domain.Menu;
import kitchenpos.menus.tobe.domain.MenuRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package kitchenpos.menus.application;

import kitchenpos.menus.application.dto.MenuCreateProductRequest;
import kitchenpos.menus.tobe.domain.MenuProduct;
import kitchenpos.menus.tobe.domain.MenuProducts;
import kitchenpos.products.tobe.domain.Product;
import kitchenpos.products.tobe.domain.ProductRepository;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

@Service
public class MenuAntiCorruptionService {

private final ProductRepository productRepository;

public MenuAntiCorruptionService(ProductRepository productRepository) {
this.productRepository = productRepository;
}

public MenuProducts createMenuProducts(List<MenuCreateProductRequest> menuCreateProductRequests) {
Assert.isTrue(!Objects.isNull(menuCreateProductRequests) && !menuCreateProductRequests.isEmpty(), "메뉴 상품 정보가 누락되었습니다.");

final List<Product> products = productRepository.findAllByIdIn(
menuCreateProductRequests.stream()
.map(MenuCreateProductRequest::getProductId)
.collect(Collectors.toList())
);
Assert.isTrue(products.size() == menuCreateProductRequests.size(), "메뉴 상품 정보가 등록 된 상품 정보와 일치하지 않습니다.");

var productMap = products.stream()
.map(it -> new kitchenpos.menus.tobe.domain.Product(it.getId(), it.getPrice()))
.collect(Collectors.toMap(kitchenpos.menus.tobe.domain.Product::getProductId, Function.identity()));

var menuProducts = menuCreateProductRequests.stream().map(it -> {
var product = productMap.get(it.getProductId());
return MenuProduct.newOne(product, it.getQuantity());
}).collect(Collectors.toList());

return MenuProducts.newOne(menuProducts);
}
}
17 changes: 5 additions & 12 deletions src/main/java/kitchenpos/menus/application/MenuGroupService.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package kitchenpos.menus.application;

import kitchenpos.menus.domain.MenuGroup;
import kitchenpos.menus.domain.MenuGroupRepository;
import kitchenpos.menus.application.dto.MenuGroupCreateRequest;
import kitchenpos.menus.tobe.domain.MenuGroup;
import kitchenpos.menus.tobe.domain.MenuGroupRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;
import java.util.UUID;

@Service
public class MenuGroupService {
Expand All @@ -18,14 +17,8 @@ public MenuGroupService(final MenuGroupRepository menuGroupRepository) {
}

@Transactional
public MenuGroup create(final MenuGroup request) {
final String name = request.getName();
if (Objects.isNull(name) || name.isEmpty()) {
throw new IllegalArgumentException();
}
final MenuGroup menuGroup = new MenuGroup();
menuGroup.setId(UUID.randomUUID());
menuGroup.setName(name);
public MenuGroup create(final MenuGroupCreateRequest request) {
var menuGroup = MenuGroup.newOne(request.getName());
return menuGroupRepository.save(menuGroup);
}

Expand Down
123 changes: 26 additions & 97 deletions src/main/java/kitchenpos/menus/application/MenuService.java
Original file line number Diff line number Diff line change
@@ -1,142 +1,71 @@
package kitchenpos.menus.application;

import kitchenpos.menus.domain.*;
import kitchenpos.products.tobe.domain.Product;
import kitchenpos.products.tobe.domain.ProductRepository;
import kitchenpos.products.infra.PurgomalumClient;
import kitchenpos.menus.application.dto.MenuCreateRequest;
import kitchenpos.menus.application.dto.MenuPriceChangeRequest;
import kitchenpos.menus.tobe.domain.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class MenuService {
private final MenuRepository menuRepository;
private final MenuGroupRepository menuGroupRepository;
private final ProductRepository productRepository;
private final MenuAntiCorruptionService antiCorruptionService;
private final PurgomalumClient purgomalumClient;

public MenuService(
final MenuRepository menuRepository,
final MenuGroupRepository menuGroupRepository,
final ProductRepository productRepository,
final PurgomalumClient purgomalumClient
) {
public MenuService(MenuRepository menuRepository, MenuGroupRepository menuGroupRepository, MenuAntiCorruptionService antiCorruptionService, PurgomalumClient purgomalumClient) {
this.menuRepository = menuRepository;
this.menuGroupRepository = menuGroupRepository;
this.productRepository = productRepository;
this.antiCorruptionService = antiCorruptionService;
this.purgomalumClient = purgomalumClient;
}

@Transactional
public Menu create(final Menu request) {
final BigDecimal price = request.getPrice();
if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) {
throw new IllegalArgumentException();
}
final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId())
.orElseThrow(NoSuchElementException::new);
final List<MenuProduct> menuProductRequests = request.getMenuProducts();
if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) {
throw new IllegalArgumentException();
}
final List<Product> products = productRepository.findAllByIdIn(
menuProductRequests.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)) {
throw new IllegalArgumentException();
}
final Menu menu = new Menu();
menu.setId(UUID.randomUUID());
menu.setName(name);
menu.setPrice(price);
menu.setMenuGroup(menuGroup);
menu.setDisplayed(request.isDisplayed());
menu.setMenuProducts(menuProducts);
public Menu create(final MenuCreateRequest request) {
final var menuGroup = menuGroupRepository.findById(request.getMenuGroupId())
.orElseThrow(NotFoundMenuException::new);
final var menuProducts = antiCorruptionService.createMenuProducts(request.getMenuProducts());
final var menu = Menu.newOne(request.getName(), request.getPrice(), request.isDisplayed(), menuGroup, menuProducts, purgomalumClient);
return menuRepository.save(menu);
}

@Transactional
public Menu changePrice(final UUID menuId, final Menu request) {
final BigDecimal price = request.getPrice();
if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) {
throw new IllegalArgumentException();
}
public Menu changePrice(final UUID menuId, final MenuPriceChangeRequest request) {
final Menu menu = menuRepository.findById(menuId)
.orElseThrow(NoSuchElementException::new);
BigDecimal sum = BigDecimal.ZERO;
for (final MenuProduct menuProduct : menu.getMenuProducts()) {
sum = sum.add(
menuProduct.getProduct()
.getPrice()
.multiply(BigDecimal.valueOf(menuProduct.getQuantity()))
);
}
if (price.compareTo(sum) > 0) {
throw new IllegalArgumentException();
}
menu.setPrice(price);
.orElseThrow(NotFoundMenuException::new);
menu.updateMenuPrice(request.getPrice());
return menu;
}

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

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

@Transactional(readOnly = true)
public List<Menu> findAll() {
return menuRepository.findAll();
}

@Transactional
public void changeProductPrice(final UUID productId, final BigDecimal productPrice) {
final List<Menu> menus = menuRepository.findAllByProductId(productId);
for (final Menu menu : menus) {
menu.updateMenuProductPrice(productId, productPrice);
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package kitchenpos.menus.application.dto;

import javax.validation.constraints.NotNull;
import java.util.UUID;

public class MenuCreateProductRequest {
@NotNull
private final UUID productId;
@NotNull
private final Long quantity;

public MenuCreateProductRequest(UUID productId, Long quantity) {
this.productId = productId;
this.quantity = quantity;
}

public UUID getProductId() {
return productId;
}

public Long getQuantity() {
return quantity;
}
}
Loading