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단계 - 기능 우선 패키지 구성하기 #509

Open
wants to merge 13 commits into
base: devfancy
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 11 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
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.infra;
package kitchenpos.deliveryorders.infra;

import org.springframework.stereotype.Component;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.infra;
package kitchenpos.deliveryorders.infra;

import java.math.BigDecimal;
import java.util.UUID;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package kitchenpos.application;
package kitchenpos.eatinorders.application;

import kitchenpos.domain.Menu;
import kitchenpos.domain.MenuRepository;
import kitchenpos.domain.Order;
import kitchenpos.domain.OrderLineItem;
import kitchenpos.domain.OrderRepository;
import kitchenpos.domain.OrderStatus;
import kitchenpos.domain.OrderTable;
import kitchenpos.domain.OrderTableRepository;
import kitchenpos.domain.OrderType;
import kitchenpos.infra.KitchenridersClient;
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.menus.domain.Menu;
import kitchenpos.menus.domain.MenuRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -29,10 +29,10 @@ public class OrderService {
private final KitchenridersClient kitchenridersClient;

public OrderService(
final OrderRepository orderRepository,
final MenuRepository menuRepository,
final OrderTableRepository orderTableRepository,
final KitchenridersClient kitchenridersClient
final OrderRepository orderRepository,
final MenuRepository menuRepository,
final OrderTableRepository orderTableRepository,
final KitchenridersClient kitchenridersClient
) {
this.orderRepository = orderRepository;
this.menuRepository = menuRepository;
Expand All @@ -44,16 +44,16 @@ public OrderService(
public Order create(final Order request) {
final OrderType type = request.getType();
if (Objects.isNull(type)) {
throw new IllegalArgumentException();
throw new IllegalArgumentException("주문 유형이 존재해야 합니다");
}
final List<OrderLineItem> orderLineItemRequests = request.getOrderLineItems();
if (Objects.isNull(orderLineItemRequests) || orderLineItemRequests.isEmpty()) {
throw new IllegalArgumentException();
throw new IllegalArgumentException("주문 항목이 존재해야 합니다.");
}
final List<Menu> menus = menuRepository.findAllByIdIn(
orderLineItemRequests.stream()
.map(OrderLineItem::getMenuId)
.toList()
orderLineItemRequests.stream()
.map(OrderLineItem::getMenuId)
.toList()
);
if (menus.size() != orderLineItemRequests.size()) {
throw new IllegalArgumentException();
Expand All @@ -63,16 +63,16 @@ public Order create(final Order request) {
final long quantity = orderLineItemRequest.getQuantity();
if (type != OrderType.EAT_IN) {
if (quantity < 0) {
throw new IllegalArgumentException();
throw new IllegalArgumentException("주문 유형이 `배달` 혹은 `테이크아웃`시 주문 수량이 0보다 커야 합니다");
}
}
final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId())
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
if (!menu.isDisplayed()) {
throw new IllegalStateException();
throw new IllegalStateException("메뉴가 표시되어야 주문이 가능합니다.");
}
if (menu.getPrice().compareTo(orderLineItemRequest.getPrice()) != 0) {
throw new IllegalArgumentException();
throw new IllegalArgumentException("주문항목에 있는 가격이 메뉴에 있는 가격과 동일해야 합니다.");
}
final OrderLineItem orderLineItem = new OrderLineItem();
orderLineItem.setMenu(menu);
Expand All @@ -88,15 +88,15 @@ public Order create(final Order request) {
if (type == OrderType.DELIVERY) {
final String deliveryAddress = request.getDeliveryAddress();
if (Objects.isNull(deliveryAddress) || deliveryAddress.isEmpty()) {
throw new IllegalArgumentException();
throw new IllegalArgumentException("주문 유형이 `배달`이면 배달에 필요한 주소가 존재해야 한다.");
}
order.setDeliveryAddress(deliveryAddress);
}
if (type == OrderType.EAT_IN) {
final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId())
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
if (!orderTable.isOccupied()) {
throw new IllegalStateException();
throw new IllegalStateException("주문 유형이 `매장 내 식사`이면 가게 안에 자리가 꽉 차지 않아야 한다.");
}
order.setOrderTable(orderTable);
}
Expand All @@ -106,16 +106,16 @@ public Order create(final Order request) {
@Transactional
public Order accept(final UUID orderId) {
final Order order = orderRepository.findById(orderId)
.orElseThrow(NoSuchElementException::new);
.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()
.multiply(BigDecimal.valueOf(orderLineItem.getQuantity()));
.getPrice()
.multiply(BigDecimal.valueOf(orderLineItem.getQuantity()));
}
kitchenridersClient.requestDelivery(orderId, sum, order.getDeliveryAddress());
}
Expand All @@ -126,7 +126,7 @@ public Order accept(final UUID orderId) {
@Transactional
public Order serve(final UUID orderId) {
final Order order = orderRepository.findById(orderId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
if (order.getStatus() != OrderStatus.ACCEPTED) {
throw new IllegalStateException();
}
Expand All @@ -137,7 +137,7 @@ public Order serve(final UUID orderId) {
@Transactional
public Order startDelivery(final UUID orderId) {
final Order order = orderRepository.findById(orderId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
if (order.getType() != OrderType.DELIVERY) {
throw new IllegalStateException();
}
Expand All @@ -151,7 +151,7 @@ public Order startDelivery(final UUID orderId) {
@Transactional
public Order completeDelivery(final UUID orderId) {
final Order order = orderRepository.findById(orderId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
if (order.getStatus() != OrderStatus.DELIVERING) {
throw new IllegalStateException();
}
Expand All @@ -162,7 +162,7 @@ public Order completeDelivery(final UUID orderId) {
@Transactional
public Order complete(final UUID orderId) {
final Order order = orderRepository.findById(orderId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
final OrderType type = order.getType();
final OrderStatus status = order.getStatus();
if (type == OrderType.DELIVERY) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package kitchenpos.application;
package kitchenpos.eatinorders.application;

import kitchenpos.domain.OrderRepository;
import kitchenpos.domain.OrderStatus;
import kitchenpos.domain.OrderTable;
import kitchenpos.domain.OrderTableRepository;
import io.micrometer.common.util.StringUtils;
import kitchenpos.eatinorders.domain.OrderRepository;
import kitchenpos.eatinorders.domain.OrderStatus;
import kitchenpos.eatinorders.domain.OrderTable;
import kitchenpos.eatinorders.domain.OrderTableRepository;
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 @@ -25,8 +25,8 @@ 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();
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("주문 테이블 이름이 존재해야 합니다.");
}
final OrderTable orderTable = new OrderTable();
orderTable.setId(UUID.randomUUID());
Expand All @@ -39,15 +39,15 @@ public OrderTable create(final OrderTable request) {
@Transactional
public OrderTable sit(final UUID orderTableId) {
final OrderTable orderTable = orderTableRepository.findById(orderTableId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(() -> new NoSuchElementException("주문 테이블이 존재해야 한다."));
orderTable.setOccupied(true);
return orderTable;
}

@Transactional
public OrderTable clear(final UUID orderTableId) {
final OrderTable orderTable = orderTableRepository.findById(orderTableId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(() -> new NoSuchElementException("주문 테이블이 존재해야 한다."));
if (orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) {
throw new IllegalStateException();
}
Expand All @@ -60,12 +60,12 @@ public OrderTable clear(final UUID orderTableId) {
public OrderTable changeNumberOfGuests(final UUID orderTableId, final OrderTable request) {
final int numberOfGuests = request.getNumberOfGuests();
if (numberOfGuests < 0) {
throw new IllegalArgumentException();
throw new IllegalArgumentException("손님 수가 0명 이상이어야 합니다.");
}
final OrderTable orderTable = orderTableRepository.findById(orderTableId)
.orElseThrow(NoSuchElementException::new);
.orElseThrow(NoSuchElementException::new);
if (!orderTable.isOccupied()) {
throw new IllegalStateException();
throw new IllegalStateException("주문 테이블이 사용중이어야 합니다.");
}
orderTable.setNumberOfGuests(numberOfGuests);
return orderTable;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.domain;
package kitchenpos.eatinorders.domain;

import org.springframework.data.jpa.repository.JpaRepository;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.domain;
package kitchenpos.eatinorders.domain;

import org.springframework.data.jpa.repository.JpaRepository;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.domain;
package kitchenpos.eatinorders.domain;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
Expand Down Expand Up @@ -37,10 +37,10 @@ public class Order {

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(
name = "order_id",
nullable = false,
columnDefinition = "binary(16)",
foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders")
name = "order_id",
nullable = false,
columnDefinition = "binary(16)",
foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders")
)
private List<OrderLineItem> orderLineItems;

Expand All @@ -49,9 +49,9 @@ public class Order {

@ManyToOne
@JoinColumn(
name = "order_table_id",
columnDefinition = "binary(16)",
foreignKey = @ForeignKey(name = "fk_orders_to_order_table")
name = "order_table_id",
columnDefinition = "binary(16)",
foreignKey = @ForeignKey(name = "fk_orders_to_order_table")
)
private OrderTable orderTable;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.domain;
package kitchenpos.eatinorders.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
Expand All @@ -10,6 +10,7 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import kitchenpos.menus.domain.Menu;

import java.math.BigDecimal;
import java.util.UUID;
Expand All @@ -24,9 +25,9 @@ public class OrderLineItem {

@ManyToOne(optional = false)
@JoinColumn(
name = "menu_id",
columnDefinition = "binary(16)",
foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu")
name = "menu_id",
columnDefinition = "binary(16)",
foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu")
)
private Menu menu;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.domain;
package kitchenpos.eatinorders.domain;

import java.util.List;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.domain;
package kitchenpos.eatinorders.domain;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 👍


public enum OrderStatus {
WAITING, ACCEPTED, SERVED, DELIVERING, DELIVERED, COMPLETED
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.domain;
package kitchenpos.eatinorders.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.domain;
package kitchenpos.eatinorders.domain;

import java.util.List;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kitchenpos.domain;
package kitchenpos.eatinorders.domain;

public enum OrderType {
DELIVERY, TAKEOUT, EAT_IN
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package kitchenpos.ui;
package kitchenpos.eatinorders.ui;

import kitchenpos.application.OrderService;
import kitchenpos.domain.Order;
import kitchenpos.eatinorders.application.OrderService;
import kitchenpos.eatinorders.domain.Order;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand All @@ -28,7 +28,7 @@ public OrderRestController(final OrderService orderService) {
public ResponseEntity<Order> create(@RequestBody final Order request) {
final Order response = orderService.create(request);
return ResponseEntity.created(URI.create("/api/orders/" + response.getId()))
.body(response);
.body(response);
}

@PutMapping("/{orderId}/accept")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package kitchenpos.ui;
package kitchenpos.eatinorders.ui;

import kitchenpos.application.OrderTableService;
import kitchenpos.domain.OrderTable;
import kitchenpos.eatinorders.application.OrderTableService;
import kitchenpos.eatinorders.domain.OrderTable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand All @@ -28,7 +28,7 @@ public OrderTableRestController(final OrderTableService orderTableService) {
public ResponseEntity<OrderTable> create(@RequestBody final OrderTable request) {
final OrderTable response = orderTableService.create(request);
return ResponseEntity.created(URI.create("/api/order-tables/" + response.getId()))
.body(response);
.body(response);
}

@PutMapping("/{orderTableId}/sit")
Expand All @@ -43,8 +43,8 @@ public ResponseEntity<OrderTable> clear(@PathVariable final UUID orderTableId) {

@PutMapping("/{orderTableId}/number-of-guests")
public ResponseEntity<OrderTable> changeNumberOfGuests(
@PathVariable final UUID orderTableId,
@RequestBody final OrderTable request
@PathVariable final UUID orderTableId,
@RequestBody final OrderTable request
) {
return ResponseEntity.ok(orderTableService.changeNumberOfGuests(orderTableId, request));
}
Expand Down
Loading