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

🚀 3단계 - 리팩터링(매장 식사 주문) #322

Open
wants to merge 42 commits into
base: hoa0217
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
ecf8396
refactor(MenuProduct): MenuProduct는 가격을 갖는다.
hoa0217 Jun 18, 2024
1667721
refactor(Menu): 메뉴는 스스로 메뉴가격을 검증할 수 있다
hoa0217 Jun 19, 2024
ff0d84b
fix(MenuProduct): 필드 final 제거
hoa0217 Jun 19, 2024
c3f2e8b
fix(MenuProducts): MenuPrice 의존성 제거
hoa0217 Jun 19, 2024
db93f01
fix(Menu): MenuPrice 검증은 Menu가 한다.
hoa0217 Jun 19, 2024
dc1d39b
fix(Menu): MenuPrice 변경 시 변경된 가격을 검증한다.
hoa0217 Jun 19, 2024
3220bc1
fix(Menu): MenuProduct의 ProductPrice를 변경한다. 이때 메뉴가격이 Product총합보다 크면 메…
hoa0217 Jun 19, 2024
324233f
refactor(OrderTableName): 주문테이블의 이름은 없거나 비어있을 수 없다.
hoa0217 Jun 20, 2024
ebe2ef2
refactor(NumberOfGuests): 주문테이블의 손님은 0보다 작을 수 없다.
hoa0217 Jun 20, 2024
59771a5
refactor(OrderTable): 주문테이블 클래스를 새로 생성한다.
hoa0217 Jun 20, 2024
4a51c8d
chore(OrderTable): 패키지명 변경 eatin -> store
hoa0217 Jun 20, 2024
60d3e0f
refactor(Order): 공통으로 사용되는 Order클래스 생성
hoa0217 Jun 20, 2024
dc494e0
fix(ProductQuantity): MenuQuantity -> ProductQuantity로 변경
hoa0217 Jun 21, 2024
e6b31cf
fix(OrderLineItem): 노출되어있지 않은 메뉴로 주문라인아이템을 생성할 수 없다.
hoa0217 Jun 21, 2024
92c866d
test(MenuQuantity): 매장주문이 아닌 주문의 메뉴수량은 음수가 될 수 없다.
hoa0217 Jun 21, 2024
72878da
feat(StoreOrder): 매장주문용 클래스 생성
hoa0217 Jun 21, 2024
1c9cbc7
feat(StoreOrder): 매장주문용 레파지토리 생성
hoa0217 Jun 21, 2024
4825a7f
feat(OrderTable): 주문테이블 서비스 리팩토링
hoa0217 Jun 21, 2024
6d5dce0
feat(StoreOrder): 매장주문 전용 서비스 클래스 생성
hoa0217 Jun 21, 2024
80a6f64
fix(OrderTable): 테이블이 점유되어있지 않은 상태에서 손님수를 변경하면 예외를 던진다
hoa0217 Jun 21, 2024
a9e0438
refactor(OrderTable): 패키지 경로 tobe로 변경 및 포맷맞추기
hoa0217 Jun 21, 2024
30223f0
test(OrderTable): 점유되지않은 테이블의 손님수를 변경하면 예외를 던진다
hoa0217 Jun 21, 2024
3127efa
test(StoreOrder): 매장주문을 생성할 수 있다
hoa0217 Jun 21, 2024
378409e
feat(StoreOrder): 매장주문을 접수, 전달, 완료를 할 수 있다.
hoa0217 Jun 21, 2024
3cd532c
fix(StoreOrder): 테스트케이스 용어 변경
hoa0217 Jun 21, 2024
8a4d5b2
fix(Menu): 사용하지 않는 생성자 제거
hoa0217 Jun 22, 2024
108f673
fix(Menu): dto 패키지 ui -> application으로 이동
hoa0217 Jun 22, 2024
ddcc764
fix(Product): dto 패키지 ui -> application으로 이동
hoa0217 Jun 22, 2024
b0633a8
fix(StoreOrder): 매장주문 생성시 메뉴가 겹치면 예외를 던진다.
hoa0217 Jun 22, 2024
40dcdc0
fix(MenuProduct): 메뉴상품 생성시 상품이 겹치면 예외를 던진다.
hoa0217 Jun 22, 2024
7845997
fix(MenuProduct): 메뉴상품 서비스 제거
hoa0217 Jun 22, 2024
74024f7
refactor(MenuProduct): 안쓰는 메서드 정리
hoa0217 Jun 22, 2024
b93eb1a
feat(StoreOrder): Controller 생성
hoa0217 Jun 22, 2024
9873af7
feat(MenuProductValidator): 메뉴상품을 검증하는 도메인 서비스 생성
hoa0217 Jul 2, 2024
338db62
refactor(MenuProductMapper): 요청을 받아 메뉴 상품을 생성하는 어플리케이션 서비스 생성
hoa0217 Jul 2, 2024
9074bc6
refactor(MenuProducts): stream메서드 제거
hoa0217 Jul 2, 2024
ebd1a62
refactor(MenuProductsValidator): MenuProductValidator -> MenuProducts…
hoa0217 Jul 2, 2024
04a0359
refactor(MenuCreateRequest): Validation 어노테이션 추가
hoa0217 Jul 2, 2024
e2ab9c1
feat(OrderLineItemsValidator): 주문 아이템을 검증하는 도메인 서비스 생성
hoa0217 Jul 2, 2024
047fd52
refactor(OrderLineItemMapper): 요청을 받아 주문 아이템을 생성하는 어플리케이션 서비스 생성
hoa0217 Jul 2, 2024
d0c8174
refactor(StoreOrderRestController): Validation 어노테이션 추가
hoa0217 Jul 2, 2024
247cbc0
test(OrderLineItemsValidator): 주문 아이템을 검증하는 도메인 서비스 생성
hoa0217 Jul 2, 2024
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
62 changes: 62 additions & 0 deletions src/main/java/kitchenpos/menus/application/MenuProductMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package kitchenpos.menus.application;

import java.util.List;
import java.util.NoSuchElementException;
import java.util.UUID;
import kitchenpos.menus.application.dto.MenuProductCreateRequest;
import kitchenpos.menus.application.dto.MenuProductsCreateRequest;
import kitchenpos.menus.domain.tobe.MenuProduct;
import kitchenpos.menus.domain.tobe.MenuProductsValidator;
import kitchenpos.menus.domain.tobe.MenuProducts;
import kitchenpos.menus.domain.tobe.ProductQuantity;
import kitchenpos.products.domain.ProductRepository;
import kitchenpos.products.domain.tobe.Product;
import org.springframework.stereotype.Component;

@Component
public class MenuProductMapper {

private final ProductRepository productRepository;
private final MenuProductsValidator menuProductsValidator;

public MenuProductMapper(ProductRepository productRepository,
MenuProductsValidator menuProductValidator) {
this.productRepository = productRepository;
this.menuProductsValidator = menuProductValidator;
}

public MenuProducts map(MenuProductsCreateRequest request) {
List<UUID> productIds = request.menuProducts()
.stream().map(MenuProductCreateRequest::productId)
.toList();

List<Product> products = productRepository.findAllByIdIn(productIds);
List<MenuProduct> menuProducts = createMenuProducts(request, products);
menuProductsValidator.validate(menuProducts, products);
return new MenuProducts(menuProducts);
}

private List<MenuProduct> createMenuProducts(MenuProductsCreateRequest menuProducts,
List<Product> products) {
return menuProducts.menuProducts()
.stream()
.map(menuProduct -> createMenuProduct(products,
menuProduct.productId(),
menuProduct.quantity())
)
.toList();
}

private MenuProduct createMenuProduct(List<Product> products,
UUID productId,
ProductQuantity quantity) {
Product product = findProduct(products, productId);
return new MenuProduct(product, quantity);
}

private Product findProduct(List<Product> products, UUID productId) {
return products.stream()
.filter(product -> product.getId().equals(productId))
.findFirst().orElseThrow((NoSuchElementException::new));
}
}

This file was deleted.

40 changes: 21 additions & 19 deletions src/main/java/kitchenpos/menus/application/MenuService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
import java.util.NoSuchElementException;
import java.util.UUID;
import kitchenpos.menugroups.domain.MenuGroupRepository;
import kitchenpos.menugroups.domain.tobe.MenuGroup;
import kitchenpos.menus.application.dto.MenuCreateRequest;
import kitchenpos.menus.domain.MenuRepository;
import kitchenpos.menus.domain.tobe.Menu;
import kitchenpos.menus.domain.tobe.MenuPrice;
import kitchenpos.menus.domain.tobe.MenuProducts;
import kitchenpos.menugroups.domain.tobe.MenuGroup;
import kitchenpos.menus.ui.dto.MenuCreateRequest;
import kitchenpos.products.domain.ProfanityValidator;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -20,41 +20,43 @@ public class MenuService {
private final MenuRepository menuRepository;
private final MenuGroupRepository menuGroupRepository;
private final ProfanityValidator profanityValidator;
private final MenuProductsService menuProductsService;
private final MenuProductMapper menuProductMapper;

public MenuService(
final MenuRepository menuRepository,
final MenuGroupRepository menuGroupRepository,
final ProfanityValidator profanityValidator,
final MenuProductsService menuProductsService
) {
public MenuService(MenuRepository menuRepository, MenuGroupRepository menuGroupRepository,
ProfanityValidator profanityValidator, MenuProductMapper menuProductMapper) {
this.menuRepository = menuRepository;
this.menuGroupRepository = menuGroupRepository;
this.profanityValidator = profanityValidator;
this.menuProductsService = menuProductsService;
this.menuProductMapper = menuProductMapper;
}

@Transactional
public Menu create(final MenuCreateRequest request) {
request.validateName(profanityValidator);
final MenuGroup menuGroup = findMenuGroup(request.getMenuGroupId());
final MenuProducts menuProducts = menuProductsService.create(request.getMenuProducts(),
request.getPrice());
return menuRepository.save(request.to(menuGroup, menuProducts));
profanityValidator.validate(request.name().getName());
final MenuGroup menuGroup = findMenuGroup(request.menuGroupId());
final MenuProducts menuProducts = menuProductMapper.map(
request.menuProductsCreateRequest());

final Menu menu = new Menu(
request.name(),
request.price(),
menuGroup,
request.displayed(),
menuProducts);
return menuRepository.save(menu);
}


@Transactional
public Menu changePrice(final UUID menuId, final MenuPrice request) {
final Menu menu = findMenu(menuId);
menuProductsService.validateMenuPrice(menu.getMenuProducts(), request);
menu.changePrice(request);
return menu;
}

@Transactional
public Menu display(final UUID menuId) {
final Menu menu = findMenu(menuId);
menuProductsService.validateMenuPrice(menu.getMenuProducts(), menu.getMenuPrice());
menu.display();
return menu;
}
Expand All @@ -73,11 +75,11 @@ public List<Menu> findAll() {

private MenuGroup findMenuGroup(UUID menuGroupId) {
return menuGroupRepository.findById(menuGroupId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
}

private Menu findMenu(UUID menuId) {
return menuRepository.findById(menuId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package kitchenpos.menus.application.dto;

import jakarta.validation.constraints.NotNull;
import java.util.UUID;
import kitchenpos.menus.domain.tobe.DisplayedMenu;
import kitchenpos.menus.domain.tobe.MenuName;
import kitchenpos.menus.domain.tobe.MenuPrice;

public record MenuCreateRequest(@NotNull MenuName name,
@NotNull MenuPrice price,
@NotNull UUID menuGroupId,
@NotNull DisplayedMenu displayed,
@NotNull MenuProductsCreateRequest menuProductsCreateRequest) {

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

import jakarta.validation.constraints.NotNull;
import java.util.UUID;
import kitchenpos.menus.domain.tobe.ProductQuantity;

public record MenuProductCreateRequest(@NotNull UUID productId,
@NotNull ProductQuantity quantity) {

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

import jakarta.validation.constraints.NotEmpty;
import java.util.List;

public record MenuProductsCreateRequest(@NotEmpty List<MenuProductCreateRequest> menuProducts) {

}
54 changes: 35 additions & 19 deletions src/main/java/kitchenpos/menus/domain/tobe/Menu.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,12 @@
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;
import kitchenpos.menugroups.domain.tobe.MenuGroup;
import kitchenpos.products.domain.tobe.ProductPrice;

@Table(name = "menu")
@Entity
Expand Down Expand Up @@ -40,32 +36,56 @@ protected Menu() {
}

public Menu(MenuName name, MenuPrice price, MenuGroup menuGroup, DisplayedMenu displayed,
MenuProducts menuProducts) {
this(UUID.randomUUID(), name, price, menuGroup.getId(), displayed, menuProducts);
}

public Menu(UUID id, MenuName name, MenuPrice price, UUID menuGroupId,
DisplayedMenu displayed, MenuProducts menuProducts) {
this.id = id;
MenuProducts menuProducts) {
validateMenuPrice(price, menuProducts);
this.id = UUID.randomUUID();
this.name = name;
this.price = price;
this.menuGroupId = menuGroupId;
this.menuGroupId = menuGroup.getId();
this.displayed = displayed;
this.menuProducts = menuProducts;
}

private static void validateMenuPrice(MenuPrice price, MenuProducts menuProducts) {
if (price.isOver(menuProducts.calculateSumPrice())) {
throw new IllegalArgumentException();
}
}

public void changePrice(MenuPrice price) {
if (price.isOver(menuProducts.calculateSumPrice())) {
throw new IllegalArgumentException();
}
this.price = price;
}

public void display() {
if (isOverThanProductSumPrice()) {
throw new IllegalArgumentException();
}
this.displayed = new DisplayedMenu(true);
}

public boolean isOverThanProductSumPrice() {
return price.isOver(menuProducts.calculateSumPrice());
}

public void hide() {
this.displayed = new DisplayedMenu(false);
}

public void changeMenuProductPrice(UUID productId, ProductPrice price) {
for (MenuProduct menuProduct : menuProducts) {
if (menuProduct.getProductId().equals(productId)) {
menuProduct.changePrice(price);
}
}

if (isOverThanProductSumPrice()) {
hide();
}
}

public boolean isDisplayed() {
return this.displayed.isDisplayed();
}
Expand All @@ -74,15 +94,11 @@ public UUID getId() {
return id;
}

public MenuPrice getMenuPrice() {
return price;
}

public BigDecimal getPrice() {
return price.getPrice();
}

public List<MenuProduct> getMenuProducts() {
return menuProducts.getMenuProducts();
public MenuProducts getMenuProducts() {
return menuProducts;
}
}
Loading