Skip to content
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
23 changes: 12 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,22 +98,23 @@ docker compose -p kitchenpos up -d

### 상품

| 한글명 | 영문명 | 설명 |
| --- | --- | --- |
| 상품 | product | 메뉴를 관리하는 기준이 되는 데이터 |
| 한글명 | 영문명 | 설명 |
| --- |----------------| --- |
| 상품 | product | 메뉴를 관리하는 기준이 되는 데이터 |
| 이름 | displayed name | 음식을 상상하게 만드는 중요한 요소 |

### 메뉴

| 한글명 | 영문명 | 설명 |
|--------| --- | --- |
| 원래 가격 | original price | 메뉴에 포함된 상품가격 * 수량의 총합. 즉, 메뉴에 포함된 상품들을 메뉴가 아니라 단품으로 모두 시켰을때의 가격의 총합 |
| 금액 | amount | 가격 * 수량 |
| 메뉴 | menu | 메뉴 그룹에 속하는 실제 주문 가능 단위 |
| 메뉴 그룹 | menu group | 각각의 메뉴를 성격에 따라 분류하여 묶어둔 그룹 |
| 메뉴 상품 | menu product | 메뉴에 속하는 수량이 있는 상품 |
| 한글명 | 영문명 | 설명 |
|-------|--------------------| --- |
| 원래 가격 | original price | 메뉴에 포함된 상품가격 * 수량의 총합. 즉, 메뉴에 포함된 상품들을 메뉴가 아니라 단품으로 모두 시켰을때의 가격의 총합 |
| 금액 | amount | 가격 * 수량 |
| 메뉴 | menu | 메뉴 그룹에 속하는 실제 주문 가능 단위 |
| 메뉴 그룹 | menu group | 각각의 메뉴를 성격에 따라 분류하여 묶어둔 그룹 |
| 메뉴 상품 | menuProduct | 메뉴에 속하는 수량이 있는 상품 |
| 포함 상품 | includedProduct | 메뉴 상품에 속하는 가격이 있는 상품 |
| 숨겨진 메뉴 | not displayed menu | 주문할 수 없는 숨겨진 메뉴 |
| 이름 | displayed name | 음식을 상상하게 만드는 중요한 요소 |
| 이름 | displayed name | 음식을 상상하게 만드는 중요한 요소 |

### 매장 주문

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.products.tobe.domain.infra;
package kitchenpos.common.domain.infra;

public interface PurgomalumValidator {
boolean containsProfanity(String text);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package kitchenpos.products.tobe.domain.vo;
package kitchenpos.common.domain.vo;

import kitchenpos.products.tobe.domain.infra.PurgomalumValidator;
import kitchenpos.common.domain.infra.PurgomalumValidator;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.util.Objects;

@Embeddable
public class ProductName {
@Column(name = "name", nullable = false)
public class Name {
@Column()
private String name;

public ProductName(String name, PurgomalumValidator purgomalumValidator) {
public Name(String name, PurgomalumValidator purgomalumValidator) {
if (Objects.isNull(name) || purgomalumValidator.containsProfanity(name)) {
throw new IllegalArgumentException();
}
Expand All @@ -23,13 +23,13 @@ public String getName() {
return name;
}

protected ProductName() {}
protected Name() {}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ProductName that = (ProductName) o;
Name that = (Name) o;
return Objects.equals(name, that.name);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package kitchenpos.products.tobe.domain.vo;
package kitchenpos.common.domain.vo;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.math.BigDecimal;
import java.util.Objects;

@Embeddable
public class ProductPrice {
public class Price {
static final BigDecimal MIN_PRICE = BigDecimal.ZERO;

@Column(name = "price", nullable = false)
@Column()
private BigDecimal price;

public ProductPrice(BigDecimal price) {
public Price(BigDecimal price) {
if (Objects.isNull(price) || MIN_PRICE.compareTo(price) > 0) {
throw new IllegalArgumentException();
}
Expand All @@ -24,13 +24,13 @@ public BigDecimal getPrice() {
return price;
}

protected ProductPrice() {}
protected Price() {}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ProductPrice that = (ProductPrice) o;
Price that = (Price) o;
return Objects.equals(price, that.price);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kitchenpos.products.infra;
package kitchenpos.common.infra;

import kitchenpos.products.tobe.domain.infra.PurgomalumValidator;
import kitchenpos.common.domain.infra.PurgomalumValidator;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import kitchenpos.deliveryorders.infra.KitchenridersClient;
import kitchenpos.eatinorders.domain.*;
import kitchenpos.menus.domain.Menu;
import kitchenpos.menus.domain.MenuRepository;
import kitchenpos.menus.domain.LegacyMenuRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -15,18 +15,18 @@
@Service
public class OrderService {
private final OrderRepository orderRepository;
private final MenuRepository menuRepository;
private final LegacyMenuRepository legacyMenuRepository;
private final OrderTableRepository orderTableRepository;
private final KitchenridersClient kitchenridersClient;

public OrderService(
final OrderRepository orderRepository,
final MenuRepository menuRepository,
final LegacyMenuRepository legacyMenuRepository,
final OrderTableRepository orderTableRepository,
final KitchenridersClient kitchenridersClient
) {
this.orderRepository = orderRepository;
this.menuRepository = menuRepository;
this.legacyMenuRepository = legacyMenuRepository;
this.orderTableRepository = orderTableRepository;
this.kitchenridersClient = kitchenridersClient;
}
Expand All @@ -41,7 +41,7 @@ public Order create(final Order request) {
if (Objects.isNull(orderLineItemRequests) || orderLineItemRequests.isEmpty()) {
throw new IllegalArgumentException();
}
final List<Menu> menus = menuRepository.findAllByIdIn(
final List<Menu> menus = legacyMenuRepository.findAllByIdIn(
orderLineItemRequests.stream()
.map(OrderLineItem::getMenuId)
.collect(Collectors.toList())
Expand All @@ -57,7 +57,7 @@ public Order create(final Order request) {
throw new IllegalArgumentException();
}
}
final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId())
final Menu menu = legacyMenuRepository.findById(orderLineItemRequest.getMenuId())
.orElseThrow(NoSuchElementException::new);
if (!menu.isDisplayed()) {
throw new IllegalStateException();
Expand Down
31 changes: 31 additions & 0 deletions src/main/java/kitchenpos/menus/application/ChangePriceService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package kitchenpos.menus.application;

import kitchenpos.common.domain.vo.Price;
import kitchenpos.menus.tobe.domain.entity.Menu;
import kitchenpos.menus.tobe.domain.repository.MenuRepository;
import kitchenpos.menus.ui.dto.ChangePriceRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.NoSuchElementException;
import java.util.UUID;

@Service
public class ChangePriceService {
private final MenuRepository menuRepository;

public ChangePriceService(MenuRepository menuRepository) {
this.menuRepository = menuRepository;
}

@Transactional
public Menu change(final UUID menuId, final ChangePriceRequest request) {
final Menu menu = menuRepository.findById(menuId)
.orElseThrow(NoSuchElementException::new);

Price price = new Price(request.price);
menu.changePrice(price);

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

import kitchenpos.menus.tobe.domain.entity.MenuGroup;
import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository;
import kitchenpos.menus.tobe.domain.vo.MenuGroupName;
import kitchenpos.menus.ui.dto.CreateMenuGroupRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class CreateMenuGroupService {
private final MenuGroupRepository menuGroupRepository;

public CreateMenuGroupService(MenuGroupRepository menuGroupRepository) {
this.menuGroupRepository = menuGroupRepository;
}

@Transactional
public MenuGroup create(final CreateMenuGroupRequest request) {
MenuGroupName menuGroupName = new MenuGroupName(request.name);
final MenuGroup menuGroup = new MenuGroup(menuGroupName);
return menuGroupRepository.save(menuGroup);
}
}
58 changes: 58 additions & 0 deletions src/main/java/kitchenpos/menus/application/CreateMenuService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package kitchenpos.menus.application;

import kitchenpos.common.domain.infra.PurgomalumValidator;
import kitchenpos.common.domain.vo.Name;
import kitchenpos.common.domain.vo.Price;
import kitchenpos.menus.tobe.domain.entity.Menu;
import kitchenpos.menus.tobe.domain.entity.MenuGroup;
import kitchenpos.menus.tobe.domain.entity.MenuProduct;
import kitchenpos.menus.tobe.domain.entity.IncludedProduct;
import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository;
import kitchenpos.menus.tobe.domain.repository.MenuRepository;
import kitchenpos.menus.tobe.domain.repository.IncludedProductRepository;
import kitchenpos.menus.tobe.domain.vo.MenuProductQuantity;
import kitchenpos.menus.ui.dto.CreateMenuRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class CreateMenuService {
private final MenuGroupRepository menuGroupRepository;
private final PurgomalumValidator purgomalumValidator;
private final IncludedProductRepository includedProductRepository;
private final MenuRepository menuRepository;

public CreateMenuService(
MenuGroupRepository menuGroupRepository,
PurgomalumValidator purgomalumValidator,
IncludedProductRepository includedProductRepository,
MenuRepository menuRepository
) {
this.menuGroupRepository = menuGroupRepository;
this.purgomalumValidator = purgomalumValidator;
this.includedProductRepository = includedProductRepository;
this.menuRepository = menuRepository;
}

@Transactional
public Menu create(final CreateMenuRequest request) {
final MenuGroup menuGroup = menuGroupRepository.findById(request.menuGroupId)
.orElseThrow(IllegalArgumentException::new);

Name name = new Name(request.name, purgomalumValidator);
final Price price = new Price(request.price);
final Menu menu = new Menu(price, name, request.isDisplayed, menuGroup);

for (final CreateMenuRequest.CreateMenuProductRequest menuProductRequest : request.createMenuProductRequests) {
final IncludedProduct includedProduct = includedProductRepository.findById(menuProductRequest.productId)
.orElseThrow(IllegalArgumentException::new);
final MenuProductQuantity quantity = new MenuProductQuantity(menuProductRequest.quantity);
final MenuProduct menuProduct = new MenuProduct(
quantity, includedProduct
);
menu.registerMenuProduct(menuProduct);
}

return menuRepository.save(menu);
}
}
28 changes: 28 additions & 0 deletions src/main/java/kitchenpos/menus/application/DisplayMenuService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package kitchenpos.menus.application;

import kitchenpos.menus.tobe.domain.entity.Menu;
import kitchenpos.menus.tobe.domain.repository.MenuRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.NoSuchElementException;
import java.util.UUID;

@Service
public class DisplayMenuService {
private final MenuRepository menuRepository;

public DisplayMenuService(MenuRepository menuRepository) {
this.menuRepository = menuRepository;
}

@Transactional
public Menu display(final UUID menuId) {
final Menu menu = menuRepository.findById(menuId)
.orElseThrow(NoSuchElementException::new);

menu.display();

return menu;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package kitchenpos.menus.application;

import kitchenpos.menus.tobe.domain.entity.MenuGroup;
import kitchenpos.menus.tobe.domain.repository.MenuGroupRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class FindAllMenuGroupService {
private final MenuGroupRepository menuGroupRepository;

public FindAllMenuGroupService(MenuGroupRepository menuGroupRepository) {
this.menuGroupRepository = menuGroupRepository;
}


@Transactional(readOnly = true)
public List<MenuGroup> findAll() {
return menuGroupRepository.findAll();
}
}
22 changes: 22 additions & 0 deletions src/main/java/kitchenpos/menus/application/FindAllMenuService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package kitchenpos.menus.application;

import kitchenpos.menus.tobe.domain.entity.Menu;
import kitchenpos.menus.tobe.domain.repository.MenuRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class FindAllMenuService {
private final MenuRepository menuRepository;

public FindAllMenuService(MenuRepository menuRepository) {
this.menuRepository = menuRepository;
}

@Transactional(readOnly = true)
public List<Menu> findAll() {
return menuRepository.findAll();
}
}
26 changes: 26 additions & 0 deletions src/main/java/kitchenpos/menus/application/HideMenuService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package kitchenpos.menus.application;

import kitchenpos.menus.tobe.domain.entity.Menu;
import kitchenpos.menus.tobe.domain.repository.MenuRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.NoSuchElementException;
import java.util.UUID;

@Service
public class HideMenuService {
private final MenuRepository menuRepository;

public HideMenuService(MenuRepository menuRepository) {
this.menuRepository = menuRepository;
}

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