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단계 - λ¦¬νŒ©ν„°λ§(맀μž₯ 식사 μ£Όλ¬Έ) #171

Open
wants to merge 51 commits into
base: wenodev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
f600f86
style(Product): κ°œν–‰ 제거
wenodev Oct 10, 2022
d57c1cd
feat(DisplayedName): μƒν’ˆ 이름 null, empty λ°©μ–΄
wenodev Oct 10, 2022
7a0bcf6
refactor(ProductPrice): Bigdecimal 비ꡐ값 μƒμˆ˜λ‘œ λ³€κ²½
wenodev Oct 10, 2022
d4d0c16
feat(MenuPrice): 메뉴 가격은 0보닀 ν¬κ±°λ‚˜ κ°™μ•„μ•Ό ν•œλ‹€.
wenodev Oct 10, 2022
17b537a
feat(MenuPrice): 메뉴 가격은 λΉ„μ–΄μžˆμ„ 수 μ—†λ‹€.
wenodev Oct 10, 2022
e741cd7
feat(DisplayedName): 메뉴 이름 검증
wenodev Oct 10, 2022
fce720a
feat(Product): 메뉴 가격 λ³€κ²½
wenodev Oct 10, 2022
1c0a907
refactor(DisplayedName): μ ‘κ·Όμ œμ–΄μž λ³€κ²½
wenodev Oct 10, 2022
fe09fae
refactor(Profanity): μ ‘κ·Όμ œμ–΄μž λ³€κ²½
wenodev Oct 10, 2022
cb82e2b
feat(MenuProduct): 메뉴에 μ†ν•œ μƒν’ˆμ˜ μˆ˜λŸ‰μ€ 0보닀 ν¬κ±°λ‚˜ κ°™λ‹€.
wenodev Oct 10, 2022
e48c977
refactor(DisplayedName): 메뉴와 μƒν’ˆμ—μ„œ μ‚¬μš©ν•˜λ„λ‘ λ³€κ²½
wenodev Oct 13, 2022
d3142d2
refactor(Price): 메뉴와 μƒν’ˆμ—μ„œ μ‚¬μš©ν•˜λ„λ‘ λ³€κ²½
wenodev Oct 13, 2022
623c7ad
feat(Menu): 메뉴에 μ†ν•œ μƒν’ˆ κΈˆμ•‘μ˜ 합은 λ©”λ‰΄μ˜ 가격보닀 ν¬κ±°λ‚˜ κ°™μ•„μ•Ό ν•œλ‹€.
wenodev Oct 13, 2022
f14b7f4
feat(MenuGroup): λ©”λ‰΄λŠ” νŠΉμ • 메뉴 그룹에 속해야 ν•œλ‹€.
wenodev Oct 13, 2022
fcf969c
feat(Product): μƒν’ˆμ΄ μ—†μœΌλ©΄ 등둝할 수 μ—†λ‹€.
wenodev Oct 13, 2022
eac46ca
feat(Menu): λ©”λ‰΄μ˜ μ „μ‹œμƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.
wenodev Oct 13, 2022
d55cda4
feat(Menu): λ©”λ‰΄μ˜ 가격이 메뉴에 μ†ν•œ μƒν’ˆ κΈˆμ•‘μ˜ 합보닀 높을 경우 메뉴λ₯Ό λ…ΈμΆœν•  수 μ—†λ‹€.
wenodev Oct 13, 2022
40d49e0
feat(ProductRestController): create λ©”μ„œλ“œ 생성
wenodev Oct 17, 2022
728ef07
refactor(MenuProduct): menuProduct의 κ°€κ²©λΉ„κ΅λŠ” MenuProductμ—μ„œ ν•œλ‹€
wenodev Oct 17, 2022
1521912
refactor(Product): JPA Entity에 값객체 μΆ”κ°€
wenodev Oct 17, 2022
65c7a61
refactor(Profanity): PurgomalumClientλ₯Ό Profanities둜 λ³€κ²½
wenodev Oct 17, 2022
36aa0b1
feat(ProductRequest): 클래슀 생성
wenodev Oct 17, 2022
983e8d4
feat(Product): tobe의 Product둜 λŒ€μ²΄ν•˜κ³  create λ©”μ„œλ“œμ— μ‚¬μš©ν•œλ‹€
wenodev Oct 17, 2022
2c68344
feat(Fixtures): Product λ³€κ²½
wenodev Oct 17, 2022
eca26f5
feat(MenuProduct): multiply μΆ”κ°€
wenodev Oct 17, 2022
3bfcfec
refactor(ProductService): changePrice λ³€κ²½
wenodev Oct 17, 2022
ed4067e
refactor(ProductRequest): ProductRequest 적용
wenodev Oct 17, 2022
85a84f5
refactor(Menu): tobe의 Menu Entityλ₯Ό Jpa의 Entity둜 μ‚¬μš©
wenodev Oct 17, 2022
49329fb
refactor(MenuProduct): domain의 MenuProductλ₯Ό Jpa의 Entity둜 μ‚¬μš©
wenodev Oct 17, 2022
e41eed5
refactor(common): Price, DisplayedName, Profanities 곡톡 λͺ¨λ“ˆλ‘œ 이동
wenodev Oct 20, 2022
354c270
refactor(Menu, MenuProduct
wenodev Oct 20, 2022
867c3b6
refactor(Product
wenodev Oct 20, 2022
7d4eafb
docs(OrderTest): μš”κ΅¬μ‚¬ν•­ 정리
wenodev Oct 23, 2022
3a0129a
feat(Order): 메뉴가 μ—†μœΌλ©΄ 등둝할 수 μ—†λ‹€.
wenodev Oct 23, 2022
8cdc1e5
feat(Order): μˆ¨κ²¨μ§„ λ©”λ‰΄λŠ” μ£Όλ¬Έν•  수 μ—†λ‹€.
wenodev Oct 23, 2022
9538940
feat(Order): μ ‘μˆ˜ λŒ€κΈ° 쀑인 주문만 μ ‘μˆ˜ν•  수 μžˆλ‹€.
wenodev Oct 23, 2022
f0a61a6
feat(Order): μ ‘μˆ˜λœ 주문만 μ„œλΉ™ν•  수 μžˆλ‹€.
wenodev Oct 23, 2022
5f55001
feat(Order): 맀μž₯ 주문은 μ£Όλ¬Έ ν•­λͺ©μ˜ μˆ˜λŸ‰μ΄ 0 미만일 수 μžˆλ‹€.
wenodev Oct 23, 2022
1f83984
docs(OrderTest): μš”κ΅¬μ‚¬ν•­ 정리
wenodev Oct 24, 2022
4eacdb9
feat(OrderTable): μ£Όλ¬Έ ν…Œμ΄λΈ”μ˜ λͺ¨λ“  맀μž₯ 주문이 μ™„λ£Œλ˜λ©΄ 빈 ν…Œμ΄λΈ”λ‘œ μ„€μ •ν•œλ‹€.
wenodev Oct 24, 2022
0cf872f
feat(OrderTable): μ™„λ£Œλ˜μ§€ μ•Šμ€ 맀μž₯ 주문이 μžˆλŠ” μ£Όλ¬Έ ν…Œμ΄λΈ”μ€ 빈 ν…Œμ΄λΈ”λ‘œ μ„€μ •ν•˜μ§€ μ•ŠλŠ”λ‹€.
wenodev Oct 24, 2022
a1e886c
feat(OrderTable): 빈 ν…Œμ΄λΈ”μ—λŠ” 맀μž₯ 주문을 등둝할 수 μ—†λ‹€.
wenodev Oct 24, 2022
0e522d9
test(OrderTest): ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ λ¦¬νŒ©ν„°λ§
wenodev Oct 24, 2022
9bc4cd8
test(OrderTest): 포μž₯ 주문의 경우 μ„œλΉ™λœ 주문만 μ™„λ£Œν•  수 μžˆλ‹€.
wenodev Oct 24, 2022
3d295bd
test(OrderTest): 포μž₯ μ£Όλ¬Έ 등둝 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μΆ”κ°€
wenodev Oct 24, 2022
1219471
test(OrderTest): ν…ŒμŠ€νŠΈμ½”λ“œ 클래슀 뢄리
wenodev Oct 24, 2022
e8f4038
feat(Order): 1개 μ΄μƒμ˜ λ“±λ‘λœ λ©”λ‰΄λ‘œ 배달 주문을 등둝할 수 μžˆλ‹€.
wenodev Oct 24, 2022
6defaec
feat(Order): 배달 μ£Όλ¬Έ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μΆ”κ°€
wenodev Oct 24, 2022
625f008
refactor(OrderService): 도메인을 둜직 λ³€κ²½
wenodev Oct 24, 2022
e1ada2e
refactor(Order): tobe의 λ„λ©”μΈμœΌλ‘œ λ³€κ²½
wenodev Oct 24, 2022
43fd9e1
resolve conflict
wenodev Oct 24, 2022
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
108 changes: 21 additions & 87 deletions src/main/java/kitchenpos/eatinorders/application/OrderService.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,21 @@
package kitchenpos.eatinorders.application;

import kitchenpos.deliveryorders.infra.KitchenridersClient;
import kitchenpos.eatinorders.domain.Order;
import kitchenpos.eatinorders.domain.OrderLineItem;
import kitchenpos.eatinorders.domain.OrderRepository;
import kitchenpos.eatinorders.domain.OrderStatus;
import kitchenpos.eatinorders.domain.OrderTable;
import kitchenpos.eatinorders.domain.OrderTableRepository;
import kitchenpos.eatinorders.domain.OrderType;
import kitchenpos.eatinorders.tobe.domain.Order;
import kitchenpos.eatinorders.tobe.domain.OrderLineItem;
import kitchenpos.eatinorders.tobe.domain.OrderTable;
import kitchenpos.menus.domain.MenuRepository;
import kitchenpos.menus.tobe.domain.Menu;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;

Expand All @@ -43,14 +40,8 @@ public OrderService(

@Transactional
public Order create(final Order request) {
final OrderType type = request.getType();
if (Objects.isNull(type)) {
throw new IllegalArgumentException();
}
final List<OrderLineItem> orderLineItemRequests = request.getOrderLineItems();
if (Objects.isNull(orderLineItemRequests) || orderLineItemRequests.isEmpty()) {
throw new IllegalArgumentException();
}

final List<Menu> menus = menuRepository.findAllByIdIn(
orderLineItemRequests.stream()
.map(OrderLineItem::getMenuId)
Expand All @@ -59,14 +50,11 @@ public Order create(final Order request) {
if (menus.size() != orderLineItemRequests.size()) {
throw new IllegalArgumentException();
}

final List<OrderLineItem> orderLineItems = new ArrayList<>();
for (final OrderLineItem orderLineItemRequest : orderLineItemRequests) {
final long quantity = orderLineItemRequest.getQuantity();
if (type != OrderType.EAT_IN) {
if (quantity < 0) {
throw new IllegalArgumentException();
}
}

final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId())
.orElseThrow(NoSuchElementException::new);
if (!menu.isDisplayed()) {
Expand All @@ -75,114 +63,60 @@ public Order create(final Order request) {
if (menu.getPrice().getPrice().compareTo(orderLineItemRequest.getPrice()) != 0) {
throw new IllegalArgumentException();
}
final OrderLineItem orderLineItem = new OrderLineItem();
orderLineItem.setMenu(menu);
orderLineItem.setQuantity(quantity);
final OrderLineItem orderLineItem = new OrderLineItem(menu, quantity);
orderLineItems.add(orderLineItem);
}
Order order = new Order();
order.setId(UUID.randomUUID());
order.setType(type);
order.setStatus(OrderStatus.WAITING);
order.setOrderDateTime(LocalDateTime.now());
order.setOrderLineItems(orderLineItems);
if (type == OrderType.DELIVERY) {
final String deliveryAddress = request.getDeliveryAddress();
if (Objects.isNull(deliveryAddress) || deliveryAddress.isEmpty()) {
throw new IllegalArgumentException();
}
order.setDeliveryAddress(deliveryAddress);
}
if (type == OrderType.EAT_IN) {
final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId())
.orElseThrow(NoSuchElementException::new);
if (!orderTable.isOccupied()) {
throw new IllegalStateException();
}
order.setOrderTable(orderTable);
}
final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()).orElseThrow(NoSuchElementException::new);

final Order order = Order.createDeliveryOrder(request.getOrderType(), request.getOrderLineItems(), request.getOrderStatus(),
orderTable, request.getDeliveryAddress());

return orderRepository.save(order);
}

@Transactional
public Order accept(final UUID orderId) {
final Order order = orderRepository.findById(orderId)
.orElseThrow(NoSuchElementException::new);
if (order.getStatus() != OrderStatus.WAITING) {
throw new IllegalStateException();
}
if (order.getType() == OrderType.DELIVERY) {
BigDecimal sum = BigDecimal.ZERO;
for (final OrderLineItem orderLineItem : order.getOrderLineItems()) {
sum = orderLineItem.getMenu()
.getPrice()
.getPrice()
.multiply(BigDecimal.valueOf(orderLineItem.getQuantity()));
}
kitchenridersClient.requestDelivery(orderId, sum, order.getDeliveryAddress());
}
order.setStatus(OrderStatus.ACCEPTED);
order.accept(kitchenridersClient);

return order;
}

@Transactional
public Order serve(final UUID orderId) {
final Order order = orderRepository.findById(orderId)
.orElseThrow(NoSuchElementException::new);
if (order.getStatus() != OrderStatus.ACCEPTED) {
throw new IllegalStateException();
}
order.setStatus(OrderStatus.SERVED);
order.serve();
return order;
}

@Transactional
public Order startDelivery(final UUID orderId) {
final Order order = orderRepository.findById(orderId)
.orElseThrow(NoSuchElementException::new);
if (order.getType() != OrderType.DELIVERY) {
throw new IllegalStateException();
}
if (order.getStatus() != OrderStatus.SERVED) {
throw new IllegalStateException();
}
order.setStatus(OrderStatus.DELIVERING);
order.startDelivery();
return order;
}

@Transactional
public Order completeDelivery(final UUID orderId) {
final Order order = orderRepository.findById(orderId)
.orElseThrow(NoSuchElementException::new);
if (order.getStatus() != OrderStatus.DELIVERING) {
throw new IllegalStateException();
}
order.setStatus(OrderStatus.DELIVERED);
order.completeDelivery();
return order;
}

@Transactional
public Order complete(final UUID orderId) {
final Order order = orderRepository.findById(orderId)
.orElseThrow(NoSuchElementException::new);
final OrderType type = order.getType();
final OrderStatus status = order.getStatus();
if (type == OrderType.DELIVERY) {
if (status != OrderStatus.DELIVERED) {
throw new IllegalStateException();
}
}
if (type == OrderType.TAKEOUT || type == OrderType.EAT_IN) {
if (status != OrderStatus.SERVED) {
throw new IllegalStateException();
}
}
order.setStatus(OrderStatus.COMPLETED);
if (type == OrderType.EAT_IN) {
order.complete();

if (order.getOrderType() == OrderType.EAT_IN) {
final OrderTable orderTable = order.getOrderTable();
if (!orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) {
orderTable.setNumberOfGuests(0);
orderTable.setOccupied(false);
orderTable.makeEmpty();
}
}
return order;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@

import kitchenpos.eatinorders.domain.OrderRepository;
import kitchenpos.eatinorders.domain.OrderStatus;
import kitchenpos.eatinorders.domain.OrderTable;
import kitchenpos.eatinorders.domain.OrderTableRepository;
import kitchenpos.eatinorders.tobe.domain.OrderTable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

@Service
Expand All @@ -24,30 +23,22 @@ public OrderTableService(final OrderTableRepository orderTableRepository, final

@Transactional
public OrderTable create(final OrderTable request) {
final String name = request.getName();
if (Objects.isNull(name) || name.isEmpty()) {
throw new IllegalArgumentException();
}
final OrderTable orderTable = new OrderTable();
orderTable.setId(UUID.randomUUID());
orderTable.setName(name);
orderTable.setNumberOfGuests(0);
orderTable.setOccupied(false);
OrderTable orderTable = new OrderTable(request.getName(), request.getNumberOfGuests(), false);
return orderTableRepository.save(orderTable);
}

@Transactional
public OrderTable sit(final UUID orderTableId) {
final OrderTable orderTable = orderTableRepository.findById(orderTableId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
orderTable.setOccupied(true);
return orderTable;
}

@Transactional
public OrderTable clear(final UUID orderTableId) {
final OrderTable orderTable = orderTableRepository.findById(orderTableId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
if (orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) {
throw new IllegalStateException();
}
Expand All @@ -63,7 +54,7 @@ public OrderTable changeNumberOfGuests(final UUID orderTableId, final OrderTable
throw new IllegalArgumentException();
}
final OrderTable orderTable = orderTableRepository.findById(orderTableId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
if (!orderTable.isOccupied()) {
throw new IllegalStateException();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package kitchenpos.eatinorders.domain;

import kitchenpos.eatinorders.tobe.domain.Order;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.UUID;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package kitchenpos.eatinorders.domain;

import kitchenpos.eatinorders.tobe.domain.OrderTable;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.UUID;
Expand Down
Loading