diff --git a/src/main/java/kitchenpos/application/MenuGroupService.java b/src/main/java/kitchenpos/application/MenuGroupService.java deleted file mode 100644 index abcede75d7..0000000000 --- a/src/main/java/kitchenpos/application/MenuGroupService.java +++ /dev/null @@ -1,26 +0,0 @@ -package kitchenpos.application; - -import kitchenpos.dao.MenuGroupDao; -import kitchenpos.domain.MenuGroup; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Service -public class MenuGroupService { - private final MenuGroupDao menuGroupDao; - - public MenuGroupService(final MenuGroupDao menuGroupDao) { - this.menuGroupDao = menuGroupDao; - } - - @Transactional - public MenuGroup create(final MenuGroup menuGroup) { - return menuGroupDao.save(menuGroup); - } - - public List list() { - return menuGroupDao.findAll(); - } -} diff --git a/src/main/java/kitchenpos/application/MenuService.java b/src/main/java/kitchenpos/application/MenuService.java deleted file mode 100644 index 83367332aa..0000000000 --- a/src/main/java/kitchenpos/application/MenuService.java +++ /dev/null @@ -1,84 +0,0 @@ -package kitchenpos.application; - -import kitchenpos.dao.MenuDao; -import kitchenpos.dao.MenuGroupDao; -import kitchenpos.dao.MenuProductDao; -import kitchenpos.dao.ProductDao; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuProduct; -import kitchenpos.domain.Product; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -@Service -public class MenuService { - private final MenuDao menuDao; - private final MenuGroupDao menuGroupDao; - private final MenuProductDao menuProductDao; - private final ProductDao productDao; - - public MenuService( - final MenuDao menuDao, - final MenuGroupDao menuGroupDao, - final MenuProductDao menuProductDao, - final ProductDao productDao - ) { - this.menuDao = menuDao; - this.menuGroupDao = menuGroupDao; - this.menuProductDao = menuProductDao; - this.productDao = productDao; - } - - @Transactional - public Menu create(final Menu menu) { - final BigDecimal price = menu.getPrice(); - - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } - - if (!menuGroupDao.existsById(menu.getMenuGroupId())) { - throw new IllegalArgumentException(); - } - - final List menuProducts = menu.getMenuProducts(); - - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menuProducts) { - final Product product = productDao.findById(menuProduct.getProductId()) - .orElseThrow(IllegalArgumentException::new); - sum = sum.add(product.getPrice().multiply(BigDecimal.valueOf(menuProduct.getQuantity()))); - } - - if (price.compareTo(sum) > 0) { - throw new IllegalArgumentException(); - } - - final Menu savedMenu = menuDao.save(menu); - - final Long menuId = savedMenu.getId(); - final List savedMenuProducts = new ArrayList<>(); - for (final MenuProduct menuProduct : menuProducts) { - menuProduct.setMenuId(menuId); - savedMenuProducts.add(menuProductDao.save(menuProduct)); - } - savedMenu.setMenuProducts(savedMenuProducts); - - return savedMenu; - } - - public List list() { - final List menus = menuDao.findAll(); - - for (final Menu menu : menus) { - menu.setMenuProducts(menuProductDao.findAllByMenuId(menu.getId())); - } - - return menus; - } -} diff --git a/src/main/java/kitchenpos/application/OrderService.java b/src/main/java/kitchenpos/application/OrderService.java deleted file mode 100644 index f8eb93cfdb..0000000000 --- a/src/main/java/kitchenpos/application/OrderService.java +++ /dev/null @@ -1,110 +0,0 @@ -package kitchenpos.application; - -import kitchenpos.dao.MenuDao; -import kitchenpos.dao.OrderDao; -import kitchenpos.dao.OrderLineItemDao; -import kitchenpos.dao.OrderTableDao; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderLineItem; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -@Service -public class OrderService { - private final MenuDao menuDao; - private final OrderDao orderDao; - private final OrderLineItemDao orderLineItemDao; - private final OrderTableDao orderTableDao; - - public OrderService( - final MenuDao menuDao, - final OrderDao orderDao, - final OrderLineItemDao orderLineItemDao, - final OrderTableDao orderTableDao - ) { - this.menuDao = menuDao; - this.orderDao = orderDao; - this.orderLineItemDao = orderLineItemDao; - this.orderTableDao = orderTableDao; - } - - @Transactional - public Order create(final Order order) { - final List orderLineItems = order.getOrderLineItems(); - - if (CollectionUtils.isEmpty(orderLineItems)) { - throw new IllegalArgumentException(); - } - - final List menuIds = orderLineItems.stream() - .map(OrderLineItem::getMenuId) - .collect(Collectors.toList()); - - if (orderLineItems.size() != menuDao.countByIdIn(menuIds)) { - throw new IllegalArgumentException(); - } - - order.setId(null); - - final OrderTable orderTable = orderTableDao.findById(order.getOrderTableId()) - .orElseThrow(IllegalArgumentException::new); - - if (orderTable.isEmpty()) { - throw new IllegalArgumentException(); - } - - order.setOrderTableId(orderTable.getId()); - order.setOrderStatus(OrderStatus.COOKING.name()); - order.setOrderedTime(LocalDateTime.now()); - - final Order savedOrder = orderDao.save(order); - - final Long orderId = savedOrder.getId(); - final List savedOrderLineItems = new ArrayList<>(); - for (final OrderLineItem orderLineItem : orderLineItems) { - orderLineItem.setOrderId(orderId); - savedOrderLineItems.add(orderLineItemDao.save(orderLineItem)); - } - savedOrder.setOrderLineItems(savedOrderLineItems); - - return savedOrder; - } - - public List list() { - final List orders = orderDao.findAll(); - - for (final Order order : orders) { - order.setOrderLineItems(orderLineItemDao.findAllByOrderId(order.getId())); - } - - return orders; - } - - @Transactional - public Order changeOrderStatus(final Long orderId, final Order order) { - final Order savedOrder = orderDao.findById(orderId) - .orElseThrow(IllegalArgumentException::new); - - if (Objects.equals(OrderStatus.COMPLETION.name(), savedOrder.getOrderStatus())) { - throw new IllegalArgumentException(); - } - - final OrderStatus orderStatus = OrderStatus.valueOf(order.getOrderStatus()); - savedOrder.setOrderStatus(orderStatus.name()); - - orderDao.save(savedOrder); - - savedOrder.setOrderLineItems(orderLineItemDao.findAllByOrderId(orderId)); - - return savedOrder; - } -} diff --git a/src/main/java/kitchenpos/application/ProductService.java b/src/main/java/kitchenpos/application/ProductService.java deleted file mode 100644 index 048d709ee3..0000000000 --- a/src/main/java/kitchenpos/application/ProductService.java +++ /dev/null @@ -1,34 +0,0 @@ -package kitchenpos.application; - -import kitchenpos.dao.ProductDao; -import kitchenpos.domain.Product; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.util.List; -import java.util.Objects; - -@Service -public class ProductService { - private final ProductDao productDao; - - public ProductService(final ProductDao productDao) { - this.productDao = productDao; - } - - @Transactional - public Product create(final Product product) { - final BigDecimal price = product.getPrice(); - - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } - - return productDao.save(product); - } - - public List list() { - return productDao.findAll(); - } -} diff --git a/src/main/java/kitchenpos/application/TableGroupService.java b/src/main/java/kitchenpos/application/TableGroupService.java deleted file mode 100644 index e9bdae86c8..0000000000 --- a/src/main/java/kitchenpos/application/TableGroupService.java +++ /dev/null @@ -1,88 +0,0 @@ -package kitchenpos.application; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import kitchenpos.dao.OrderDao; -import kitchenpos.dao.OrderTableDao; -import kitchenpos.dao.TableGroupDao; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.TableGroup; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; - -@Service -public class TableGroupService { - private final OrderDao orderDao; - private final OrderTableDao orderTableDao; - private final TableGroupDao tableGroupDao; - - public TableGroupService(final OrderDao orderDao, final OrderTableDao orderTableDao, - final TableGroupDao tableGroupDao) { - this.orderDao = orderDao; - this.orderTableDao = orderTableDao; - this.tableGroupDao = tableGroupDao; - } - - @Transactional - public TableGroup create(final TableGroup tableGroup) { - final List orderTables = tableGroup.getOrderTables(); - - if (CollectionUtils.isEmpty(orderTables) || orderTables.size() < 2) { - throw new IllegalArgumentException(); - } - - final List orderTableIds = orderTables.stream() - .map(OrderTable::getId) - .collect(Collectors.toList()); - - final List savedOrderTables = orderTableDao.findAllByIdIn(orderTableIds); - - if (orderTables.size() != savedOrderTables.size()) { - throw new IllegalArgumentException(); - } - - for (final OrderTable savedOrderTable : savedOrderTables) { - if (!savedOrderTable.isEmpty() || Objects.nonNull(savedOrderTable.getTableGroupId())) { - throw new IllegalArgumentException(); - } - } - - tableGroup.setCreatedDate(LocalDateTime.now()); - - final TableGroup savedTableGroup = tableGroupDao.save(tableGroup); - - final Long tableGroupId = savedTableGroup.getId(); - for (final OrderTable savedOrderTable : savedOrderTables) { - savedOrderTable.setTableGroupId(tableGroupId); - savedOrderTable.setEmpty(false); - orderTableDao.save(savedOrderTable); - } - savedTableGroup.setOrderTables(savedOrderTables); - - return savedTableGroup; - } - - @Transactional - public void ungroup(final Long tableGroupId) { - final List orderTables = orderTableDao.findAllByTableGroupId(tableGroupId); - - final List orderTableIds = orderTables.stream() - .map(OrderTable::getId) - .collect(Collectors.toList()); - - if (orderDao.existsByOrderTableIdInAndOrderStatusIn( - orderTableIds, List.of(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))) { - throw new IllegalArgumentException(); - } - - for (final OrderTable orderTable : orderTables) { - orderTable.setTableGroupId(null); - orderTable.setEmpty(false); - orderTableDao.save(orderTable); - } - } -} diff --git a/src/main/java/kitchenpos/application/TableService.java b/src/main/java/kitchenpos/application/TableService.java deleted file mode 100644 index b994d07cea..0000000000 --- a/src/main/java/kitchenpos/application/TableService.java +++ /dev/null @@ -1,72 +0,0 @@ -package kitchenpos.application; - -import java.util.List; -import java.util.Objects; -import kitchenpos.dao.OrderDao; -import kitchenpos.dao.OrderTableDao; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -public class TableService { - private final OrderDao orderDao; - private final OrderTableDao orderTableDao; - - public TableService(final OrderDao orderDao, final OrderTableDao orderTableDao) { - this.orderDao = orderDao; - this.orderTableDao = orderTableDao; - } - - @Transactional - public OrderTable create(final OrderTable orderTable) { - orderTable.setId(null); - orderTable.setTableGroupId(null); - - return orderTableDao.save(orderTable); - } - - public List list() { - return orderTableDao.findAll(); - } - - @Transactional - public OrderTable changeEmpty(final Long orderTableId, final OrderTable orderTable) { - final OrderTable savedOrderTable = orderTableDao.findById(orderTableId) - .orElseThrow(IllegalArgumentException::new); - - if (Objects.nonNull(savedOrderTable.getTableGroupId())) { - throw new IllegalArgumentException(); - } - - if (orderDao.existsByOrderTableIdAndOrderStatusIn( - orderTableId, List.of(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))) { - throw new IllegalArgumentException(); - } - - savedOrderTable.setEmpty(orderTable.isEmpty()); - - return orderTableDao.save(savedOrderTable); - } - - @Transactional - public OrderTable changeNumberOfGuests(final Long orderTableId, final OrderTable orderTable) { - final int numberOfGuests = orderTable.getNumberOfGuests(); - - if (numberOfGuests < 0) { - throw new IllegalArgumentException(); - } - - final OrderTable savedOrderTable = orderTableDao.findById(orderTableId) - .orElseThrow(IllegalArgumentException::new); - - if (savedOrderTable.isEmpty()) { - throw new IllegalArgumentException(); - } - - savedOrderTable.setNumberOfGuests(numberOfGuests); - - return orderTableDao.save(savedOrderTable); - } -} diff --git a/src/main/java/kitchenpos/application/menu/MenuGroupService.java b/src/main/java/kitchenpos/application/menu/MenuGroupService.java new file mode 100644 index 0000000000..9deb91c30b --- /dev/null +++ b/src/main/java/kitchenpos/application/menu/MenuGroupService.java @@ -0,0 +1,36 @@ +package kitchenpos.application.menu; + +import java.util.List; +import kitchenpos.domain.menu.MenuGroup; +import kitchenpos.domain.menu.MenuGroupRepository; +import kitchenpos.dto.menu.mapper.MenuGroupDtoMapper; +import kitchenpos.dto.menu.mapper.MenuGroupMapper; +import kitchenpos.dto.menu.request.MenuGroupCreateRequest; +import kitchenpos.dto.menu.response.MenuGroupResponse; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class MenuGroupService { + + private final MenuGroupMapper menuGroupMapper; + private final MenuGroupDtoMapper menuGroupDtoMapper; + private final MenuGroupRepository menuGroupRepository; + + public MenuGroupService(final MenuGroupMapper menuGroupMapper, final MenuGroupDtoMapper menuGroupDtoMapper, + final MenuGroupRepository menuGroupRepository) { + this.menuGroupMapper = menuGroupMapper; + this.menuGroupDtoMapper = menuGroupDtoMapper; + this.menuGroupRepository = menuGroupRepository; + } + + @Transactional + public MenuGroupResponse create(final MenuGroupCreateRequest menuGroupCreateRequest) { + MenuGroup menuGroup = menuGroupRepository.save(menuGroupMapper.toMenuGroup(menuGroupCreateRequest)); + return menuGroupDtoMapper.toMenuGroupResponse(menuGroup); + } + + public List list() { + return menuGroupDtoMapper.toMenuGroupResponses(menuGroupRepository.findAll()); + } +} diff --git a/src/main/java/kitchenpos/application/menu/MenuService.java b/src/main/java/kitchenpos/application/menu/MenuService.java new file mode 100644 index 0000000000..e074fbbc21 --- /dev/null +++ b/src/main/java/kitchenpos/application/menu/MenuService.java @@ -0,0 +1,70 @@ +package kitchenpos.application.menu; + +import java.util.List; +import java.util.stream.Collectors; +import kitchenpos.domain.menu.Menu; +import kitchenpos.domain.menu.MenuProduct; +import kitchenpos.domain.product.Product; +import kitchenpos.domain.menu.MenuGroupRepository; +import kitchenpos.domain.menu.MenuRepository; +import kitchenpos.domain.product.ProductRepository; +import kitchenpos.dto.menu.mapper.MenuDtoMapper; +import kitchenpos.dto.menu.mapper.MenuMapper; +import kitchenpos.dto.menu.request.MenuCreateRequest; +import kitchenpos.dto.menu.request.MenuProductCreateRequest; +import kitchenpos.dto.menu.response.MenuResponse; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class MenuService { + + private final MenuMapper menuMapper; + private final MenuDtoMapper menuDtoMapper; + private final MenuRepository menuRepository; + private final MenuGroupRepository menuGroupRepository; + private final ProductRepository productRepository; + + public MenuService(final MenuMapper menuMapper, final MenuDtoMapper menuDtoMapper, + final MenuRepository menuRepository, + final MenuGroupRepository menuGroupRepository, final ProductRepository productRepository) { + this.menuMapper = menuMapper; + this.menuDtoMapper = menuDtoMapper; + this.menuRepository = menuRepository; + this.menuGroupRepository = menuGroupRepository; + this.productRepository = productRepository; + } + + @Transactional + public MenuResponse create(final MenuCreateRequest menuCreateRequest) { + validateMenuGroupExists(menuCreateRequest); + List menuProducts = createMenuProducts(menuCreateRequest); + Menu menu = menuMapper.toMenu(menuCreateRequest, menuProducts); + return menuDtoMapper.toMenuResponse(menuRepository.save(menu)); + } + + private void validateMenuGroupExists(final MenuCreateRequest menuCreateRequest) { + if (!menuGroupRepository.existsById(menuCreateRequest.getMenuGroupId())) { + throw new IllegalArgumentException(); + } + } + + private List createMenuProducts(final MenuCreateRequest menuCreateRequest) { + return menuCreateRequest.getMenuProducts() + .stream() + .map(this::createMenuProduct) + .collect(Collectors.toList()); + } + + private MenuProduct createMenuProduct(final MenuProductCreateRequest menuProductCreateRequest) { + Product product = productRepository.findById(menuProductCreateRequest.getProductId()) + .orElseThrow(IllegalArgumentException::new); + return new MenuProduct(null, null, product.getId(), menuProductCreateRequest.getQuantity(), product.getPrice()); + } + + public List list() { + final List menus = menuRepository.findAll(); + + return menuDtoMapper.toMenuResponses(menus); + } +} diff --git a/src/main/java/kitchenpos/application/order/OrderService.java b/src/main/java/kitchenpos/application/order/OrderService.java new file mode 100644 index 0000000000..221cadcfe7 --- /dev/null +++ b/src/main/java/kitchenpos/application/order/OrderService.java @@ -0,0 +1,91 @@ +package kitchenpos.application.order; + +import java.util.List; +import java.util.stream.Collectors; +import kitchenpos.domain.order.Order; +import kitchenpos.domain.order.OrderLineItem; +import kitchenpos.domain.table.OrderTable; +import kitchenpos.domain.menu.MenuRepository; +import kitchenpos.domain.order.OrderRepository; +import kitchenpos.domain.table.OrderTableRepository; +import kitchenpos.dto.order.mapper.OrderDtoMapper; +import kitchenpos.dto.order.mapper.OrderLineItemMapper; +import kitchenpos.dto.order.mapper.OrderMapper; +import kitchenpos.dto.order.request.OrderCreateRequest; +import kitchenpos.dto.order.request.OrderStatusChangeRequest; +import kitchenpos.dto.order.response.OrderResponse; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class OrderService { + + private final OrderMapper orderMapper; + private final OrderLineItemMapper orderLineItemMapper; + private final OrderDtoMapper orderDtoMapper; + private final MenuRepository menuRepository; + private final OrderRepository orderRepository; + private final OrderTableRepository orderTableRepository; + + public OrderService(final OrderMapper orderMapper, final OrderLineItemMapper orderLineItemMapper, + final OrderDtoMapper orderDtoMapper, + final MenuRepository menuRepository, final OrderRepository orderRepository, + final OrderTableRepository orderTableRepository) { + this.orderMapper = orderMapper; + this.orderLineItemMapper = orderLineItemMapper; + this.orderDtoMapper = orderDtoMapper; + this.menuRepository = menuRepository; + this.orderRepository = orderRepository; + this.orderTableRepository = orderTableRepository; + } + + @Transactional + public OrderResponse create(final OrderCreateRequest orderCreateRequest) { + List orderLineItems = orderLineItemMapper.toOrderLineItems( + orderCreateRequest.getOrderLineItems()); + Order order = orderMapper.toOrder(orderCreateRequest, orderLineItems); + validateOrder(order); + return orderDtoMapper.toOrderResponse(orderRepository.save(order)); + } + + private void validateOrder(final Order order) { + List orderLineItems = order.getOrderLineItems(); + List menuIds = toMenuIds(orderLineItems); + validateOrderLineItemCount(orderLineItems, menuIds); + validateOrderTableIsEmpty(order); + } + + private List toMenuIds(final List orderLineItems) { + return orderLineItems.stream() + .map(OrderLineItem::getMenuId) + .collect(Collectors.toList()); + } + + private void validateOrderLineItemCount(final List orderLineItems, final List menuIds) { + if (orderLineItems.size() != menuRepository.countByIdIn(menuIds)) { + throw new IllegalArgumentException(); + } + } + + private void validateOrderTableIsEmpty(final Order order) { + OrderTable orderTable = orderTableRepository.findById(order.getOrderTableId()) + .orElseThrow(IllegalArgumentException::new); + if (orderTable.isEmpty()) { + throw new IllegalArgumentException(); + } + } + + public List list() { + final List orders = orderRepository.findAll(); + return orderDtoMapper.toOrderResponses(orders); + } + + @Transactional + public OrderResponse changeOrderStatus(final Long orderId, + final OrderStatusChangeRequest orderStatusChangeRequest) { + Order savedOrder = orderRepository.findById(orderId) + .orElseThrow(IllegalArgumentException::new); + savedOrder.changeOrderStatus(orderStatusChangeRequest.getOrderStatus()); + return orderDtoMapper.toOrderResponse(savedOrder); + } +} diff --git a/src/main/java/kitchenpos/application/product/ProductService.java b/src/main/java/kitchenpos/application/product/ProductService.java new file mode 100644 index 0000000000..3725e6eb3b --- /dev/null +++ b/src/main/java/kitchenpos/application/product/ProductService.java @@ -0,0 +1,37 @@ +package kitchenpos.application.product; + +import java.util.List; +import kitchenpos.domain.product.Product; +import kitchenpos.domain.product.ProductRepository; +import kitchenpos.dto.product.mapper.ProductDtoMapper; +import kitchenpos.dto.product.mapper.ProductMapper; +import kitchenpos.dto.product.request.ProductCreateRequest; +import kitchenpos.dto.product.response.ProductResponse; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class ProductService { + + private final ProductMapper productMapper; + private final ProductDtoMapper productDtoMapper; + private final ProductRepository productRepository; + + public ProductService(final ProductMapper productMapper, final ProductDtoMapper productDtoMapper, + final ProductRepository productRepository) { + this.productMapper = productMapper; + this.productDtoMapper = productDtoMapper; + this.productRepository = productRepository; + } + + @Transactional + public ProductResponse create(final ProductCreateRequest productCreateRequest) { + Product product = productMapper.toProduct(productCreateRequest); + return productDtoMapper.toProductResponse(productRepository.save(product)); + } + + public List list() { + List products = productRepository.findAll(); + return productDtoMapper.toProductResponses(products); + } +} diff --git a/src/main/java/kitchenpos/application/table/TableGroupService.java b/src/main/java/kitchenpos/application/table/TableGroupService.java new file mode 100644 index 0000000000..9a0417e42e --- /dev/null +++ b/src/main/java/kitchenpos/application/table/TableGroupService.java @@ -0,0 +1,84 @@ +package kitchenpos.application.table; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; +import kitchenpos.domain.common.OrderStatus; +import kitchenpos.domain.table.OrderTable; +import kitchenpos.domain.table.TableGroup; +import kitchenpos.domain.order.OrderRepository; +import kitchenpos.domain.table.OrderTableRepository; +import kitchenpos.domain.table.TableGroupRepository; +import kitchenpos.dto.table.mapper.TableGroupDtoMapper; +import kitchenpos.dto.table.request.OrderTableIdRequest; +import kitchenpos.dto.table.request.TableGroupCreateRequest; +import kitchenpos.dto.table.response.TableGroupResponse; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class TableGroupService { + + private final TableGroupDtoMapper tableGroupDtoMapper; + private final OrderRepository orderRepository; + private final OrderTableRepository orderTableRepository; + private final TableGroupRepository tableGroupRepository; + + public TableGroupService(final TableGroupDtoMapper tableGroupDtoMapper, final OrderRepository orderRepository, + final OrderTableRepository orderTableRepository, + final TableGroupRepository tableGroupRepository) { + this.tableGroupDtoMapper = tableGroupDtoMapper; + this.orderRepository = orderRepository; + this.orderTableRepository = orderTableRepository; + this.tableGroupRepository = tableGroupRepository; + } + + @Transactional + public TableGroupResponse create(final TableGroupCreateRequest tableGroupCreateRequest) { + List savedOrderTables = findSavedOrderTables(tableGroupCreateRequest); + TableGroup savedTableGroup = + tableGroupRepository.save(new TableGroup(null, LocalDateTime.now(), savedOrderTables)); + return tableGroupDtoMapper.toTableGroupResponse(savedTableGroup); + } + + private List findSavedOrderTables(final TableGroupCreateRequest tableGroupCreateRequest) { + List orderTableIds = toOrderTableIds(tableGroupCreateRequest.getOrderTables()); + List savedOrderTables = orderTableRepository.findAllByIdIn(orderTableIds); + validateOrderTablesExists(orderTableIds, savedOrderTables); + return savedOrderTables; + } + + private void validateOrderTablesExists(final List orderTableIds, final List savedOrderTables) { + if (orderTableIds.size() != savedOrderTables.size()) { + throw new IllegalArgumentException(); + } + } + + private List toOrderTableIds(final List orderTableIdRequests) { + return orderTableIdRequests.stream() + .map(OrderTableIdRequest::getId) + .collect(Collectors.toList()); + } + + @Transactional + public void ungroup(final Long tableGroupId) { + TableGroup tableGroup = tableGroupRepository.findById(tableGroupId) + .orElseThrow(IllegalArgumentException::new); + List orderTableIds = getOrderTableIds(tableGroup.getOrderTables()); + validateOrderTableNotCompleted(orderTableIds); + tableGroup.ungroup(); + } + + private List getOrderTableIds(final List orderTables) { + return orderTables.stream() + .map(OrderTable::getId) + .collect(Collectors.toList()); + } + + private void validateOrderTableNotCompleted(final List orderTableIds) { + if (orderRepository.existsByOrderTableIdInAndOrderStatusIn( + orderTableIds, List.of(OrderStatus.COOKING, OrderStatus.MEAL))) { + throw new IllegalArgumentException(); + } + } +} diff --git a/src/main/java/kitchenpos/application/table/TableService.java b/src/main/java/kitchenpos/application/table/TableService.java new file mode 100644 index 0000000000..1d4c96d7d0 --- /dev/null +++ b/src/main/java/kitchenpos/application/table/TableService.java @@ -0,0 +1,65 @@ +package kitchenpos.application.table; + +import java.util.List; +import kitchenpos.domain.common.OrderStatus; +import kitchenpos.domain.table.OrderTable; +import kitchenpos.domain.order.OrderRepository; +import kitchenpos.domain.table.OrderTableRepository; +import kitchenpos.dto.table.mapper.OrderTableDtoMapper; +import kitchenpos.dto.table.mapper.OrderTableMapper; +import kitchenpos.dto.table.request.OrderTableCreateRequest; +import kitchenpos.dto.table.response.OrderTableResponse; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class TableService { + + private final OrderTableMapper orderTableMapper; + private final OrderTableDtoMapper orderTableDtoMapper; + private final OrderRepository orderRepository; + private final OrderTableRepository orderTableRepository; + + public TableService(final OrderTableMapper orderTableMapper, final OrderTableDtoMapper orderTableDtoMapper, + final OrderRepository orderRepository, final OrderTableRepository orderTableRepository) { + this.orderTableMapper = orderTableMapper; + this.orderTableDtoMapper = orderTableDtoMapper; + this.orderRepository = orderRepository; + this.orderTableRepository = orderTableRepository; + } + + @Transactional + public OrderTableResponse create(final OrderTableCreateRequest orderTableCreateRequest) { + OrderTable orderTable = orderTableRepository.save(orderTableMapper.toOrderTable(orderTableCreateRequest)); + return orderTableDtoMapper.toOrderTableResponse(orderTable); + } + + public List list() { + List orderTables = orderTableRepository.findAll(); + return orderTableDtoMapper.toOrderTableResponses(orderTables); + } + + @Transactional + public OrderTableResponse changeEmpty(final Long orderTableId, final boolean empty) { + OrderTable savedOrderTable = orderTableRepository.findById(orderTableId) + .orElseThrow(IllegalArgumentException::new); + validateTableDoesNotHaveCookingOrMealOrder(orderTableId); + savedOrderTable.changeEmpty(empty); + return orderTableDtoMapper.toOrderTableResponse(savedOrderTable); + } + + private void validateTableDoesNotHaveCookingOrMealOrder(final Long orderTableId) { + if (orderRepository.existsByOrderTableIdAndOrderStatusIn( + orderTableId, List.of(OrderStatus.COOKING, OrderStatus.MEAL))) { + throw new IllegalArgumentException(); + } + } + + @Transactional + public OrderTableResponse changeNumberOfGuests(final Long orderTableId, final int numberOfGuests) { + OrderTable savedOrderTable = orderTableRepository.findById(orderTableId) + .orElseThrow(IllegalArgumentException::new); + savedOrderTable.changeNumberOfGuests(numberOfGuests); + return orderTableDtoMapper.toOrderTableResponse(savedOrderTable); + } +} diff --git a/src/main/java/kitchenpos/dao/JdbcTemplateMenuDao.java b/src/main/java/kitchenpos/dao/JdbcTemplateMenuDao.java deleted file mode 100644 index 35a38f7017..0000000000 --- a/src/main/java/kitchenpos/dao/JdbcTemplateMenuDao.java +++ /dev/null @@ -1,79 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.Menu; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; -import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.jdbc.core.namedparam.SqlParameterSource; -import org.springframework.jdbc.core.simple.SimpleJdbcInsert; -import org.springframework.stereotype.Repository; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; -import java.util.Optional; - -@Repository -public class JdbcTemplateMenuDao implements MenuDao { - private static final String TABLE_NAME = "menu"; - private static final String KEY_COLUMN_NAME = "id"; - - private final NamedParameterJdbcTemplate jdbcTemplate; - private final SimpleJdbcInsert jdbcInsert; - - public JdbcTemplateMenuDao(final DataSource dataSource) { - jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - jdbcInsert = new SimpleJdbcInsert(dataSource) - .withTableName(TABLE_NAME) - .usingGeneratedKeyColumns(KEY_COLUMN_NAME) - ; - } - - @Override - public Menu save(final Menu entity) { - final SqlParameterSource parameters = new BeanPropertySqlParameterSource(entity); - final Number key = jdbcInsert.executeAndReturnKey(parameters); - return select(key.longValue()); - } - - @Override - public Optional findById(final Long id) { - try { - return Optional.of(select(id)); - } catch (final EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - @Override - public List findAll() { - final String sql = "SELECT id, name, price, menu_group_id FROM menu "; - return jdbcTemplate.query(sql, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - @Override - public long countByIdIn(final List ids) { - final String sql = "SELECT COUNT(*) FROM menu WHERE id IN (:ids)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("ids", ids); - return jdbcTemplate.queryForObject(sql, parameters, Long.class); - } - - private Menu select(final Long id) { - final String sql = "SELECT id, name, price, menu_group_id FROM menu WHERE id = (:id)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("id", id); - return jdbcTemplate.queryForObject(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private Menu toEntity(final ResultSet resultSet) throws SQLException { - final Menu entity = new Menu(); - entity.setId(resultSet.getLong("id")); - entity.setName(resultSet.getString("name")); - entity.setPrice(resultSet.getBigDecimal("price")); - entity.setMenuGroupId(resultSet.getLong("menu_group_id")); - return entity; - } -} diff --git a/src/main/java/kitchenpos/dao/JdbcTemplateMenuGroupDao.java b/src/main/java/kitchenpos/dao/JdbcTemplateMenuGroupDao.java deleted file mode 100644 index 99035897cd..0000000000 --- a/src/main/java/kitchenpos/dao/JdbcTemplateMenuGroupDao.java +++ /dev/null @@ -1,77 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.MenuGroup; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; -import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.jdbc.core.namedparam.SqlParameterSource; -import org.springframework.jdbc.core.simple.SimpleJdbcInsert; -import org.springframework.stereotype.Repository; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; -import java.util.Optional; - -@Repository -public class JdbcTemplateMenuGroupDao implements MenuGroupDao { - private static final String TABLE_NAME = "menu_group"; - private static final String KEY_COLUMN_NAME = "id"; - - private final NamedParameterJdbcTemplate jdbcTemplate; - private final SimpleJdbcInsert jdbcInsert; - - public JdbcTemplateMenuGroupDao(final DataSource dataSource) { - jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - jdbcInsert = new SimpleJdbcInsert(dataSource) - .withTableName(TABLE_NAME) - .usingGeneratedKeyColumns(KEY_COLUMN_NAME) - ; - } - - @Override - public MenuGroup save(final MenuGroup entity) { - final SqlParameterSource parameters = new BeanPropertySqlParameterSource(entity); - final Number key = jdbcInsert.executeAndReturnKey(parameters); - return select(key.longValue()); - } - - @Override - public Optional findById(final Long id) { - try { - return Optional.of(select(id)); - } catch (final EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - @Override - public List findAll() { - final String sql = "SELECT id, name FROM menu_group"; - return jdbcTemplate.query(sql, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - @Override - public boolean existsById(final Long id) { - final String sql = "SELECT CASE WHEN COUNT(*) > 0 THEN TRUE ELSE FALSE END FROM menu_group WHERE id = (:id)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("id", id); - return jdbcTemplate.queryForObject(sql, parameters, Boolean.class); - } - - private MenuGroup select(final Long id) { - final String sql = "SELECT id, name FROM menu_group WHERE id = (:id)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("id", id); - return jdbcTemplate.queryForObject(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private MenuGroup toEntity(final ResultSet resultSet) throws SQLException { - final MenuGroup entity = new MenuGroup(); - entity.setId(resultSet.getLong("id")); - entity.setName(resultSet.getString("name")); - return entity; - } -} diff --git a/src/main/java/kitchenpos/dao/JdbcTemplateMenuProductDao.java b/src/main/java/kitchenpos/dao/JdbcTemplateMenuProductDao.java deleted file mode 100644 index a99ab000d5..0000000000 --- a/src/main/java/kitchenpos/dao/JdbcTemplateMenuProductDao.java +++ /dev/null @@ -1,79 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.MenuProduct; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; -import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.jdbc.core.namedparam.SqlParameterSource; -import org.springframework.jdbc.core.simple.SimpleJdbcInsert; -import org.springframework.stereotype.Repository; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; -import java.util.Optional; - -@Repository -public class JdbcTemplateMenuProductDao implements MenuProductDao { - private static final String TABLE_NAME = "menu_product"; - private static final String KEY_COLUMN_NAME = "seq"; - - private final NamedParameterJdbcTemplate jdbcTemplate; - private final SimpleJdbcInsert jdbcInsert; - - public JdbcTemplateMenuProductDao(final DataSource dataSource) { - jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - jdbcInsert = new SimpleJdbcInsert(dataSource) - .withTableName(TABLE_NAME) - .usingGeneratedKeyColumns(KEY_COLUMN_NAME) - ; - } - - @Override - public MenuProduct save(final MenuProduct entity) { - final SqlParameterSource parameters = new BeanPropertySqlParameterSource(entity); - final Number key = jdbcInsert.executeAndReturnKey(parameters); - return select(key.longValue()); - } - - @Override - public Optional findById(final Long id) { - try { - return Optional.of(select(id)); - } catch (final EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - @Override - public List findAll() { - final String sql = "SELECT seq, menu_id, product_id, quantity FROM menu_product"; - return jdbcTemplate.query(sql, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - @Override - public List findAllByMenuId(final Long menuId) { - final String sql = "SELECT seq, menu_id, product_id, quantity FROM menu_product WHERE menu_id = (:menuId)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("menuId", menuId); - return jdbcTemplate.query(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private MenuProduct select(final Long id) { - final String sql = "SELECT seq, menu_id, product_id, quantity FROM menu_product WHERE seq = (:seq)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("seq", id); - return jdbcTemplate.queryForObject(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private MenuProduct toEntity(final ResultSet resultSet) throws SQLException { - final MenuProduct entity = new MenuProduct(); - entity.setSeq(resultSet.getLong(KEY_COLUMN_NAME)); - entity.setMenuId(resultSet.getLong("menu_id")); - entity.setProductId(resultSet.getLong("product_id")); - entity.setQuantity(resultSet.getLong("quantity")); - return entity; - } -} diff --git a/src/main/java/kitchenpos/dao/JdbcTemplateOrderDao.java b/src/main/java/kitchenpos/dao/JdbcTemplateOrderDao.java deleted file mode 100644 index 44fe41aed5..0000000000 --- a/src/main/java/kitchenpos/dao/JdbcTemplateOrderDao.java +++ /dev/null @@ -1,105 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.Order; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; -import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.jdbc.core.namedparam.SqlParameterSource; -import org.springframework.jdbc.core.simple.SimpleJdbcInsert; -import org.springframework.stereotype.Repository; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -@Repository -public class JdbcTemplateOrderDao implements OrderDao { - private static final String TABLE_NAME = "orders"; - private static final String KEY_COLUMN_NAME = "id"; - - private final NamedParameterJdbcTemplate jdbcTemplate; - private final SimpleJdbcInsert jdbcInsert; - - public JdbcTemplateOrderDao(final DataSource dataSource) { - jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - jdbcInsert = new SimpleJdbcInsert(dataSource) - .withTableName(TABLE_NAME) - .usingGeneratedKeyColumns(KEY_COLUMN_NAME) - ; - } - - @Override - public Order save(final Order entity) { - if (Objects.isNull(entity.getId())) { - final SqlParameterSource parameters = new BeanPropertySqlParameterSource(entity); - final Number key = jdbcInsert.executeAndReturnKey(parameters); - return select(key.longValue()); - } - update(entity); - return entity; - } - - @Override - public Optional findById(final Long id) { - try { - return Optional.of(select(id)); - } catch (final EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - @Override - public List findAll() { - final String sql = "SELECT id, order_table_id, order_status, ordered_time FROM orders"; - return jdbcTemplate.query(sql, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - @Override - public boolean existsByOrderTableIdAndOrderStatusIn(final Long orderTableId, final List orderStatuses) { - final String sql = "SELECT CASE WHEN COUNT(*) > 0 THEN TRUE ELSE FALSE END" + - " FROM orders WHERE order_table_id = (:orderTableId) AND order_status IN (:orderStatuses)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("orderTableId", orderTableId) - .addValue("orderStatuses", orderStatuses); - return jdbcTemplate.queryForObject(sql, parameters, Boolean.class); - } - - @Override - public boolean existsByOrderTableIdInAndOrderStatusIn(final List orderTableIds, final List orderStatuses) { - final String sql = "SELECT CASE WHEN COUNT(*) > 0 THEN TRUE ELSE FALSE END" + - " FROM orders WHERE order_table_id IN (:orderTableIds) AND order_status IN (:orderStatuses)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("orderTableIds", orderTableIds) - .addValue("orderStatuses", orderStatuses); - return jdbcTemplate.queryForObject(sql, parameters, Boolean.class); - } - - private Order select(final Long id) { - final String sql = "SELECT id, order_table_id, order_status, ordered_time FROM orders WHERE id = (:id)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("id", id); - return jdbcTemplate.queryForObject(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private void update(final Order entity) { - final String sql = "UPDATE orders SET order_status = (:orderStatus) WHERE id = (:id)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("orderStatus", entity.getOrderStatus()) - .addValue("id", entity.getId()); - jdbcTemplate.update(sql, parameters); - } - - private Order toEntity(final ResultSet resultSet) throws SQLException { - final Order entity = new Order(); - entity.setId(resultSet.getLong(KEY_COLUMN_NAME)); - entity.setOrderTableId(resultSet.getLong("order_table_id")); - entity.setOrderStatus(resultSet.getString("order_status")); - entity.setOrderedTime(resultSet.getObject("ordered_time", LocalDateTime.class)); - return entity; - } -} diff --git a/src/main/java/kitchenpos/dao/JdbcTemplateOrderLineItemDao.java b/src/main/java/kitchenpos/dao/JdbcTemplateOrderLineItemDao.java deleted file mode 100644 index 567c5c3ce6..0000000000 --- a/src/main/java/kitchenpos/dao/JdbcTemplateOrderLineItemDao.java +++ /dev/null @@ -1,79 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.OrderLineItem; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; -import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.jdbc.core.namedparam.SqlParameterSource; -import org.springframework.jdbc.core.simple.SimpleJdbcInsert; -import org.springframework.stereotype.Repository; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; -import java.util.Optional; - -@Repository -public class JdbcTemplateOrderLineItemDao implements OrderLineItemDao { - private static final String TABLE_NAME = "order_line_item"; - private static final String KEY_COLUMN_NAME = "seq"; - - private final NamedParameterJdbcTemplate jdbcTemplate; - private final SimpleJdbcInsert jdbcInsert; - - public JdbcTemplateOrderLineItemDao(final DataSource dataSource) { - jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - jdbcInsert = new SimpleJdbcInsert(dataSource) - .withTableName(TABLE_NAME) - .usingGeneratedKeyColumns(KEY_COLUMN_NAME) - ; - } - - @Override - public OrderLineItem save(final OrderLineItem entity) { - final SqlParameterSource parameters = new BeanPropertySqlParameterSource(entity); - final Number key = jdbcInsert.executeAndReturnKey(parameters); - return select(key.longValue()); - } - - @Override - public Optional findById(final Long id) { - try { - return Optional.of(select(id)); - } catch (final EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - @Override - public List findAll() { - final String sql = "SELECT seq, order_id, menu_id, quantity FROM order_line_item"; - return jdbcTemplate.query(sql, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - @Override - public List findAllByOrderId(final Long orderId) { - final String sql = "SELECT seq, order_id, menu_id, quantity FROM order_line_item WHERE order_id = (:orderId)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("orderId", orderId); - return jdbcTemplate.query(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private OrderLineItem select(final Long id) { - final String sql = "SELECT seq, order_id, menu_id, quantity FROM order_line_item WHERE seq = (:seq)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("seq", id); - return jdbcTemplate.queryForObject(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private OrderLineItem toEntity(final ResultSet resultSet) throws SQLException { - final OrderLineItem entity = new OrderLineItem(); - entity.setSeq(resultSet.getLong(KEY_COLUMN_NAME)); - entity.setOrderId(resultSet.getLong("order_id")); - entity.setMenuId(resultSet.getLong("menu_id")); - entity.setQuantity(resultSet.getLong("quantity")); - return entity; - } -} diff --git a/src/main/java/kitchenpos/dao/JdbcTemplateOrderTableDao.java b/src/main/java/kitchenpos/dao/JdbcTemplateOrderTableDao.java deleted file mode 100644 index c364e63798..0000000000 --- a/src/main/java/kitchenpos/dao/JdbcTemplateOrderTableDao.java +++ /dev/null @@ -1,104 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.OrderTable; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; -import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.jdbc.core.namedparam.SqlParameterSource; -import org.springframework.jdbc.core.simple.SimpleJdbcInsert; -import org.springframework.stereotype.Repository; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -@Repository -public class JdbcTemplateOrderTableDao implements OrderTableDao { - private static final String TABLE_NAME = "order_table"; - private static final String KEY_COLUMN_NAME = "id"; - - private final NamedParameterJdbcTemplate jdbcTemplate; - private final SimpleJdbcInsert jdbcInsert; - - public JdbcTemplateOrderTableDao(final DataSource dataSource) { - jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - jdbcInsert = new SimpleJdbcInsert(dataSource) - .withTableName(TABLE_NAME) - .usingGeneratedKeyColumns(KEY_COLUMN_NAME) - ; - } - - @Override - public OrderTable save(final OrderTable entity) { - if (Objects.isNull(entity.getId())) { - final SqlParameterSource parameters = new BeanPropertySqlParameterSource(entity); - final Number key = jdbcInsert.executeAndReturnKey(parameters); - return select(key.longValue()); - } - update(entity); - return entity; - } - - @Override - public Optional findById(final Long id) { - try { - return Optional.of(select(id)); - } catch (final EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - @Override - public List findAll() { - final String sql = "SELECT id, table_group_id, number_of_guests, empty FROM order_table"; - return jdbcTemplate.query(sql, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - @Override - public List findAllByIdIn(final List ids) { - final String sql = "SELECT id, table_group_id, number_of_guests, empty FROM order_table WHERE id IN (:ids)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("ids", ids); - return jdbcTemplate.query(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - @Override - public List findAllByTableGroupId(final Long tableGroupId) { - final String sql = "SELECT id, table_group_id, number_of_guests, empty" + - " FROM order_table WHERE table_group_id = (:tableGroupId)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("tableGroupId", tableGroupId); - return jdbcTemplate.query(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private OrderTable select(final Long id) { - final String sql = "SELECT id, table_group_id, number_of_guests, empty FROM order_table WHERE id = (:id)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("id", id); - return jdbcTemplate.queryForObject(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private void update(final OrderTable entity) { - final String sql = "UPDATE order_table SET table_group_id = (:tableGroupId)," + - " number_of_guests = (:numberOfGuests), empty = (:empty) WHERE id = (:id)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("tableGroupId", entity.getTableGroupId()) - .addValue("numberOfGuests", entity.getNumberOfGuests()) - .addValue("empty", entity.isEmpty()) - .addValue("id", entity.getId()); - jdbcTemplate.update(sql, parameters); - } - - private OrderTable toEntity(final ResultSet resultSet) throws SQLException { - final OrderTable entity = new OrderTable(); - entity.setId(resultSet.getLong(KEY_COLUMN_NAME)); - entity.setTableGroupId(resultSet.getObject("table_group_id", Long.class)); - entity.setNumberOfGuests(resultSet.getInt("number_of_guests")); - entity.setEmpty(resultSet.getBoolean("empty")); - return entity; - } -} diff --git a/src/main/java/kitchenpos/dao/JdbcTemplateProductDao.java b/src/main/java/kitchenpos/dao/JdbcTemplateProductDao.java deleted file mode 100644 index 4be56056a3..0000000000 --- a/src/main/java/kitchenpos/dao/JdbcTemplateProductDao.java +++ /dev/null @@ -1,70 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.Product; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; -import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.jdbc.core.namedparam.SqlParameterSource; -import org.springframework.jdbc.core.simple.SimpleJdbcInsert; -import org.springframework.stereotype.Repository; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; -import java.util.Optional; - -@Repository -public class JdbcTemplateProductDao implements ProductDao { - private static final String TABLE_NAME = "product"; - private static final String KEY_COLUMN_NAME = "id"; - - private final NamedParameterJdbcTemplate jdbcTemplate; - private final SimpleJdbcInsert jdbcInsert; - - public JdbcTemplateProductDao(final DataSource dataSource) { - jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - jdbcInsert = new SimpleJdbcInsert(dataSource) - .withTableName(TABLE_NAME) - .usingGeneratedKeyColumns(KEY_COLUMN_NAME) - ; - } - - @Override - public Product save(final Product entity) { - final SqlParameterSource parameters = new BeanPropertySqlParameterSource(entity); - final Number key = jdbcInsert.executeAndReturnKey(parameters); - return select(key.longValue()); - } - - @Override - public Optional findById(final Long id) { - try { - return Optional.of(select(id)); - } catch (final EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - @Override - public List findAll() { - final String sql = "SELECT id, name, price FROM product"; - return jdbcTemplate.query(sql, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private Product select(final Long id) { - final String sql = "SELECT id, name, price FROM product WHERE id = (:id)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("id", id); - return jdbcTemplate.queryForObject(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private Product toEntity(final ResultSet resultSet) throws SQLException { - final Product entity = new Product(); - entity.setId(resultSet.getLong(KEY_COLUMN_NAME)); - entity.setName(resultSet.getString("name")); - entity.setPrice(resultSet.getBigDecimal("price")); - return entity; - } -} diff --git a/src/main/java/kitchenpos/dao/JdbcTemplateTableGroupDao.java b/src/main/java/kitchenpos/dao/JdbcTemplateTableGroupDao.java deleted file mode 100644 index b158a2d87b..0000000000 --- a/src/main/java/kitchenpos/dao/JdbcTemplateTableGroupDao.java +++ /dev/null @@ -1,70 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.TableGroup; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; -import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.jdbc.core.namedparam.SqlParameterSource; -import org.springframework.jdbc.core.simple.SimpleJdbcInsert; -import org.springframework.stereotype.Repository; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; - -@Repository -public class JdbcTemplateTableGroupDao implements TableGroupDao { - private static final String TABLE_NAME = "table_group"; - private static final String KEY_COLUMN_NAME = "id"; - - private final NamedParameterJdbcTemplate jdbcTemplate; - private final SimpleJdbcInsert jdbcInsert; - - public JdbcTemplateTableGroupDao(final DataSource dataSource) { - jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - jdbcInsert = new SimpleJdbcInsert(dataSource) - .withTableName(TABLE_NAME) - .usingGeneratedKeyColumns(KEY_COLUMN_NAME) - ; - } - - @Override - public TableGroup save(final TableGroup entity) { - final SqlParameterSource parameters = new BeanPropertySqlParameterSource(entity); - final Number key = jdbcInsert.executeAndReturnKey(parameters); - return select(key.longValue()); - } - - @Override - public Optional findById(final Long id) { - try { - return Optional.of(select(id)); - } catch (final EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - @Override - public List findAll() { - final String sql = "SELECT id, created_date FROM table_group"; - return jdbcTemplate.query(sql, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private TableGroup select(final Long id) { - final String sql = "SELECT id, created_date FROM table_group WHERE id = (:id)"; - final SqlParameterSource parameters = new MapSqlParameterSource() - .addValue("id", id); - return jdbcTemplate.queryForObject(sql, parameters, (resultSet, rowNumber) -> toEntity(resultSet)); - } - - private TableGroup toEntity(final ResultSet resultSet) throws SQLException { - final TableGroup entity = new TableGroup(); - entity.setId(resultSet.getLong(KEY_COLUMN_NAME)); - entity.setCreatedDate(resultSet.getObject("created_date", LocalDateTime.class)); - return entity; - } -} diff --git a/src/main/java/kitchenpos/dao/MenuDao.java b/src/main/java/kitchenpos/dao/MenuDao.java deleted file mode 100644 index ffd29ca4ac..0000000000 --- a/src/main/java/kitchenpos/dao/MenuDao.java +++ /dev/null @@ -1,16 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.Menu; - -import java.util.List; -import java.util.Optional; - -public interface MenuDao { - Menu save(Menu entity); - - Optional findById(Long id); - - List findAll(); - - long countByIdIn(List ids); -} diff --git a/src/main/java/kitchenpos/dao/MenuGroupDao.java b/src/main/java/kitchenpos/dao/MenuGroupDao.java deleted file mode 100644 index dc257224fd..0000000000 --- a/src/main/java/kitchenpos/dao/MenuGroupDao.java +++ /dev/null @@ -1,16 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.MenuGroup; - -import java.util.List; -import java.util.Optional; - -public interface MenuGroupDao { - MenuGroup save(MenuGroup entity); - - Optional findById(Long id); - - List findAll(); - - boolean existsById(Long id); -} diff --git a/src/main/java/kitchenpos/dao/MenuProductDao.java b/src/main/java/kitchenpos/dao/MenuProductDao.java deleted file mode 100644 index e0afea58c3..0000000000 --- a/src/main/java/kitchenpos/dao/MenuProductDao.java +++ /dev/null @@ -1,16 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.MenuProduct; - -import java.util.List; -import java.util.Optional; - -public interface MenuProductDao { - MenuProduct save(MenuProduct entity); - - Optional findById(Long id); - - List findAll(); - - List findAllByMenuId(Long menuId); -} diff --git a/src/main/java/kitchenpos/dao/OrderDao.java b/src/main/java/kitchenpos/dao/OrderDao.java deleted file mode 100644 index df460b0151..0000000000 --- a/src/main/java/kitchenpos/dao/OrderDao.java +++ /dev/null @@ -1,18 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.Order; - -import java.util.List; -import java.util.Optional; - -public interface OrderDao { - Order save(Order entity); - - Optional findById(Long id); - - List findAll(); - - boolean existsByOrderTableIdAndOrderStatusIn(Long orderTableId, List orderStatuses); - - boolean existsByOrderTableIdInAndOrderStatusIn(List orderTableIds, List orderStatuses); -} diff --git a/src/main/java/kitchenpos/dao/OrderLineItemDao.java b/src/main/java/kitchenpos/dao/OrderLineItemDao.java deleted file mode 100644 index a820589be0..0000000000 --- a/src/main/java/kitchenpos/dao/OrderLineItemDao.java +++ /dev/null @@ -1,16 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.OrderLineItem; - -import java.util.List; -import java.util.Optional; - -public interface OrderLineItemDao { - OrderLineItem save(OrderLineItem entity); - - Optional findById(Long id); - - List findAll(); - - List findAllByOrderId(Long orderId); -} diff --git a/src/main/java/kitchenpos/dao/OrderTableDao.java b/src/main/java/kitchenpos/dao/OrderTableDao.java deleted file mode 100644 index 6817d54163..0000000000 --- a/src/main/java/kitchenpos/dao/OrderTableDao.java +++ /dev/null @@ -1,18 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.OrderTable; - -import java.util.List; -import java.util.Optional; - -public interface OrderTableDao { - OrderTable save(OrderTable entity); - - Optional findById(Long id); - - List findAll(); - - List findAllByIdIn(List ids); - - List findAllByTableGroupId(Long tableGroupId); -} diff --git a/src/main/java/kitchenpos/dao/ProductDao.java b/src/main/java/kitchenpos/dao/ProductDao.java deleted file mode 100644 index 2e0243c4aa..0000000000 --- a/src/main/java/kitchenpos/dao/ProductDao.java +++ /dev/null @@ -1,14 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.Product; - -import java.util.List; -import java.util.Optional; - -public interface ProductDao { - Product save(Product entity); - - Optional findById(Long id); - - List findAll(); -} diff --git a/src/main/java/kitchenpos/dao/TableGroupDao.java b/src/main/java/kitchenpos/dao/TableGroupDao.java deleted file mode 100644 index 7a514e58d9..0000000000 --- a/src/main/java/kitchenpos/dao/TableGroupDao.java +++ /dev/null @@ -1,14 +0,0 @@ -package kitchenpos.dao; - -import kitchenpos.domain.TableGroup; - -import java.util.List; -import java.util.Optional; - -public interface TableGroupDao { - TableGroup save(TableGroup entity); - - Optional findById(Long id); - - List findAll(); -} diff --git a/src/main/java/kitchenpos/domain/MenuProduct.java b/src/main/java/kitchenpos/domain/MenuProduct.java deleted file mode 100644 index 82497d3281..0000000000 --- a/src/main/java/kitchenpos/domain/MenuProduct.java +++ /dev/null @@ -1,40 +0,0 @@ -package kitchenpos.domain; - -public class MenuProduct { - private Long seq; - private Long menuId; - private Long productId; - private long quantity; - - public Long getSeq() { - return seq; - } - - public void setSeq(final Long seq) { - this.seq = seq; - } - - public Long getMenuId() { - return menuId; - } - - public void setMenuId(final Long menuId) { - this.menuId = menuId; - } - - public Long getProductId() { - return productId; - } - - public void setProductId(final Long productId) { - this.productId = productId; - } - - public long getQuantity() { - return quantity; - } - - public void setQuantity(final long quantity) { - this.quantity = quantity; - } -} diff --git a/src/main/java/kitchenpos/domain/OrderLineItem.java b/src/main/java/kitchenpos/domain/OrderLineItem.java deleted file mode 100644 index 42b0c5766f..0000000000 --- a/src/main/java/kitchenpos/domain/OrderLineItem.java +++ /dev/null @@ -1,40 +0,0 @@ -package kitchenpos.domain; - -public class OrderLineItem { - private Long seq; - private Long orderId; - private Long menuId; - private long quantity; - - public Long getSeq() { - return seq; - } - - public void setSeq(final Long seq) { - this.seq = seq; - } - - public Long getOrderId() { - return orderId; - } - - public void setOrderId(final Long orderId) { - this.orderId = orderId; - } - - public Long getMenuId() { - return menuId; - } - - public void setMenuId(final Long menuId) { - this.menuId = menuId; - } - - public long getQuantity() { - return quantity; - } - - public void setQuantity(final long quantity) { - this.quantity = quantity; - } -} diff --git a/src/main/java/kitchenpos/domain/common/NumberOfGuests.java b/src/main/java/kitchenpos/domain/common/NumberOfGuests.java new file mode 100644 index 0000000000..1776fa50b3 --- /dev/null +++ b/src/main/java/kitchenpos/domain/common/NumberOfGuests.java @@ -0,0 +1,47 @@ +package kitchenpos.domain.common; + +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embeddable; + +@Embeddable +public class NumberOfGuests { + + @Column(name = "number_of_guests", nullable = false) + private int value; + + protected NumberOfGuests() { + } + + public NumberOfGuests(final int value) { + validateNotNegative(value); + this.value = value; + } + + private static void validateNotNegative(final int value) { + if (value < 0) { + throw new IllegalArgumentException(); + } + } + + public int getValue() { + return value; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NumberOfGuests that = (NumberOfGuests) o; + return value == that.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/kitchenpos/domain/OrderStatus.java b/src/main/java/kitchenpos/domain/common/OrderStatus.java similarity index 63% rename from src/main/java/kitchenpos/domain/OrderStatus.java rename to src/main/java/kitchenpos/domain/common/OrderStatus.java index 41fe1a9317..cd1666c369 100644 --- a/src/main/java/kitchenpos/domain/OrderStatus.java +++ b/src/main/java/kitchenpos/domain/common/OrderStatus.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.domain.common; public enum OrderStatus { COOKING, MEAL, COMPLETION diff --git a/src/main/java/kitchenpos/domain/common/Price.java b/src/main/java/kitchenpos/domain/common/Price.java new file mode 100644 index 0000000000..ccedb64925 --- /dev/null +++ b/src/main/java/kitchenpos/domain/common/Price.java @@ -0,0 +1,60 @@ +package kitchenpos.domain.common; + +import java.math.BigDecimal; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embeddable; + +@Embeddable +public class Price { + + @Column(name = "price", nullable = false) + private BigDecimal value; + + protected Price() { + } + + public Price(final BigDecimal value) { + validateValue(value); + this.value = value; + } + + private static void validateValue(final BigDecimal value) { + if (value.compareTo(BigDecimal.ZERO) < 0) { + throw new IllegalArgumentException(); + } + } + + public Price add(final Price price) { + return new Price(value.add(price.getValue())); + } + + public Price multiply(final long times) { + return new Price(value.multiply(BigDecimal.valueOf(times))); + } + + public boolean isExpensiveThan(final Price price) { + return this.value.compareTo(price.value) > 0; + } + + public BigDecimal getValue() { + return value; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Price)) { + return false; + } + Price price = (Price) o; + return value.compareTo(price.value) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/kitchenpos/domain/menu/Menu.java b/src/main/java/kitchenpos/domain/menu/Menu.java new file mode 100644 index 0000000000..5236ceac8a --- /dev/null +++ b/src/main/java/kitchenpos/domain/menu/Menu.java @@ -0,0 +1,98 @@ +package kitchenpos.domain.menu; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import kitchenpos.domain.common.Price; + +@Entity +@Table(name = "menu") +public class Menu { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(name = "name", nullable = false) + private String name; + @Embedded + private Price price; + @Column(name = "menu_group_id", nullable = false) + private Long menuGroupId; + @OneToMany(mappedBy = "menu", cascade = CascadeType.PERSIST) + private List menuProducts; + + protected Menu() { + } + + public Menu(final Long id, final String name, final Price price, final Long menuGroupId, + final List menuProducts) { + validatePrice(menuProducts, price); + mapMenuProduct(menuProducts); + this.id = id; + this.name = name; + this.price = price; + this.menuGroupId = menuGroupId; + } + + private void mapMenuProduct(final List menuProducts) { + this.menuProducts = menuProducts; + for (MenuProduct menuProduct : menuProducts) { + menuProduct.designateMenu(this); + } + } + + private void validatePrice(final List menuProducts, final Price price) { + Price sum = menuProducts.stream() + .map(MenuProduct::getAmount) + .reduce(new Price(BigDecimal.ZERO), Price::add); + if (price.isExpensiveThan(sum)) { + throw new IllegalArgumentException(); + } + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public Price getPrice() { + return price; + } + + public Long getMenuGroupId() { + return menuGroupId; + } + + public List getMenuProducts() { + return menuProducts; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Menu)) { + return false; + } + Menu menu = (Menu) o; + return Objects.equals(id, menu.getId()); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/kitchenpos/domain/menu/MenuGroup.java b/src/main/java/kitchenpos/domain/menu/MenuGroup.java new file mode 100644 index 0000000000..59d3918f27 --- /dev/null +++ b/src/main/java/kitchenpos/domain/menu/MenuGroup.java @@ -0,0 +1,53 @@ +package kitchenpos.domain.menu; + +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "menu_group") +public class MenuGroup { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(name = "name", nullable = false) + private String name; + + protected MenuGroup() { + } + + public MenuGroup(final Long id, final String name) { + this.id = id; + this.name = name; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof MenuGroup)) { + return false; + } + MenuGroup menuGroup = (MenuGroup) o; + return Objects.equals(id, menuGroup.getId()); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/kitchenpos/domain/menu/MenuGroupRepository.java b/src/main/java/kitchenpos/domain/menu/MenuGroupRepository.java new file mode 100644 index 0000000000..f9c9607f0c --- /dev/null +++ b/src/main/java/kitchenpos/domain/menu/MenuGroupRepository.java @@ -0,0 +1,7 @@ +package kitchenpos.domain.menu; + +import kitchenpos.domain.menu.MenuGroup; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MenuGroupRepository extends JpaRepository { +} diff --git a/src/main/java/kitchenpos/domain/menu/MenuProduct.java b/src/main/java/kitchenpos/domain/menu/MenuProduct.java new file mode 100644 index 0000000000..91b1b8f7ba --- /dev/null +++ b/src/main/java/kitchenpos/domain/menu/MenuProduct.java @@ -0,0 +1,92 @@ +package kitchenpos.domain.menu; + +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import kitchenpos.domain.common.Price; + +@Entity +@Table(name = "menu_product") +public class MenuProduct { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long seq; + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "menu_id", nullable = false) + private Menu menu; + @Column(name = "product_id", nullable = false) + private Long productId; + @Column(name = "quantity", nullable = false) + private long quantity; + @Embedded + private Price price; + + protected MenuProduct() { + } + + public MenuProduct(final Long seq, final Menu menu, final Long productId, final long quantity, final Price price) { + this.seq = seq; + this.productId = productId; + this.quantity = quantity; + this.price = price; + designateMenu(menu); + } + + public void designateMenu(final Menu menu) { + if (this.menu != null) { + this.menu.getMenuProducts() + .remove(this); + } + this.menu = menu; + } + + public Long getSeq() { + return seq; + } + + public Menu getMenu() { + return menu; + } + + public Long getProductId() { + return productId; + } + + public long getQuantity() { + return quantity; + } + + public Price getPrice() { + return price; + } + + public Price getAmount() { + return price.multiply(quantity); + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof MenuProduct)) { + return false; + } + MenuProduct that = (MenuProduct) o; + return Objects.equals(seq, that.getSeq()); + } + + @Override + public int hashCode() { + return Objects.hash(seq); + } +} diff --git a/src/main/java/kitchenpos/domain/menu/MenuRepository.java b/src/main/java/kitchenpos/domain/menu/MenuRepository.java new file mode 100644 index 0000000000..be945421af --- /dev/null +++ b/src/main/java/kitchenpos/domain/menu/MenuRepository.java @@ -0,0 +1,10 @@ +package kitchenpos.domain.menu; + +import java.util.List; +import kitchenpos.domain.menu.Menu; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MenuRepository extends JpaRepository { + + long countByIdIn(List ids); +} diff --git a/src/main/java/kitchenpos/domain/order/Order.java b/src/main/java/kitchenpos/domain/order/Order.java new file mode 100644 index 0000000000..c409f81394 --- /dev/null +++ b/src/main/java/kitchenpos/domain/order/Order.java @@ -0,0 +1,111 @@ +package kitchenpos.domain.order; + +import static kitchenpos.domain.common.OrderStatus.COMPLETION; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import kitchenpos.domain.common.OrderStatus; +import org.springframework.util.CollectionUtils; + +@Entity +@Table(name = "orders") +public class Order { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(name = "order_table_id", nullable = false) + private Long orderTableId; + @Enumerated(value = EnumType.STRING) + @Column(name = "order_status", nullable = false) + private OrderStatus orderStatus; + @Column(name = "ordered_time", nullable = false) + private LocalDateTime orderedTime; + @OneToMany(mappedBy = "order", cascade = CascadeType.PERSIST) + private List orderLineItems; + + protected Order() { + } + + public Order(final Long id, final Long orderTableId, final OrderStatus orderStatus, final LocalDateTime orderedTime, + final List orderLineItems) { + mapOrderLineItems(orderLineItems); + this.id = id; + this.orderTableId = orderTableId; + this.orderStatus = orderStatus; + this.orderedTime = orderedTime; + } + + private void mapOrderLineItems(final List orderLineItems) { + validateItemExists(orderLineItems); + this.orderLineItems = orderLineItems; + for (OrderLineItem orderLineItem : orderLineItems) { + orderLineItem.mapOrder(this); + } + } + + private void validateItemExists(final List orderLineItems) { + if (CollectionUtils.isEmpty(orderLineItems)) { + throw new IllegalArgumentException(); + } + } + + public void changeOrderStatus(final String orderStatusName) { + validateNotCompleted(); + this.orderStatus = OrderStatus.valueOf(orderStatusName); + } + + private void validateNotCompleted() { + if (orderStatus == COMPLETION) { + throw new IllegalArgumentException(); + } + } + + public Long getId() { + return id; + } + + public Long getOrderTableId() { + return orderTableId; + } + + public OrderStatus getOrderStatus() { + return orderStatus; + } + + public LocalDateTime getOrderedTime() { + return orderedTime; + } + + public List getOrderLineItems() { + return orderLineItems; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Order)) { + return false; + } + Order order = (Order) o; + return Objects.equals(id, order.getId()); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/kitchenpos/domain/order/OrderLineItem.java b/src/main/java/kitchenpos/domain/order/OrderLineItem.java new file mode 100644 index 0000000000..817ee85a22 --- /dev/null +++ b/src/main/java/kitchenpos/domain/order/OrderLineItem.java @@ -0,0 +1,95 @@ +package kitchenpos.domain.order; + +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "order_line_item") +public class OrderLineItem { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long seq; + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "order_id", nullable = false) + private Order order; + @Column(name = "menu_id", nullable = false) + private Long menuId; + @Column(name = "quantity", nullable = false) + private long quantity; + + public OrderLineItem() { + } + + public OrderLineItem(final Long seq, final Order order, final Long menuId, final long quantity) { + this.seq = seq; + this.order = order; + this.menuId = menuId; + this.quantity = quantity; + } + + public void mapOrder(final Order order) { + if (this.order != null) { + this.order.getOrderLineItems() + .remove(this); + } + this.order = order; + } + + public Long getSeq() { + return seq; + } + + public void setSeq(final Long seq) { + this.seq = seq; + } + + public Order getOrder() { + return order; + } + + public void setOrder(final Order order) { + this.order = order; + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(final Long menuId) { + this.menuId = menuId; + } + + public long getQuantity() { + return quantity; + } + + public void setQuantity(final long quantity) { + this.quantity = quantity; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof OrderLineItem)) { + return false; + } + OrderLineItem that = (OrderLineItem) o; + return Objects.equals(seq, that.getSeq()); + } + + @Override + public int hashCode() { + return Objects.hash(seq); + } +} diff --git a/src/main/java/kitchenpos/domain/order/OrderRepository.java b/src/main/java/kitchenpos/domain/order/OrderRepository.java new file mode 100644 index 0000000000..8c90fef098 --- /dev/null +++ b/src/main/java/kitchenpos/domain/order/OrderRepository.java @@ -0,0 +1,12 @@ +package kitchenpos.domain.order; + +import java.util.List; +import kitchenpos.domain.common.OrderStatus; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderRepository extends JpaRepository { + + boolean existsByOrderTableIdAndOrderStatusIn(Long orderTableId, List orderStatuses); + + boolean existsByOrderTableIdInAndOrderStatusIn(List orderTableIds, List orderStatuses); +} diff --git a/src/main/java/kitchenpos/domain/product/Product.java b/src/main/java/kitchenpos/domain/product/Product.java new file mode 100644 index 0000000000..89c0f42351 --- /dev/null +++ b/src/main/java/kitchenpos/domain/product/Product.java @@ -0,0 +1,63 @@ +package kitchenpos.domain.product; + +import java.math.BigDecimal; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import kitchenpos.domain.common.Price; + +@Entity +@Table(name = "product") +public class Product { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(name = "name", nullable = false) + private String name; + @Embedded + private Price price; + + protected Product() { + } + + public Product(final Long id, final String name, final BigDecimal price) { + this.id = id; + this.name = name; + this.price = new Price(price); + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public Price getPrice() { + return price; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Product)) { + return false; + } + Product product = (Product) o; + return Objects.equals(id, product.getId()); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/kitchenpos/domain/product/ProductRepository.java b/src/main/java/kitchenpos/domain/product/ProductRepository.java new file mode 100644 index 0000000000..4e3f462348 --- /dev/null +++ b/src/main/java/kitchenpos/domain/product/ProductRepository.java @@ -0,0 +1,7 @@ +package kitchenpos.domain.product; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProductRepository extends JpaRepository { + +} diff --git a/src/main/java/kitchenpos/domain/table/OrderTable.java b/src/main/java/kitchenpos/domain/table/OrderTable.java new file mode 100644 index 0000000000..eae65c3a55 --- /dev/null +++ b/src/main/java/kitchenpos/domain/table/OrderTable.java @@ -0,0 +1,108 @@ +package kitchenpos.domain.table; + +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import kitchenpos.domain.common.NumberOfGuests; + +@Entity +@Table(name = "order_table") +public class OrderTable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "table_group_id") + private TableGroup tableGroup; + @Embedded + private NumberOfGuests numberOfGuests; + @Column(name = "empty", nullable = false) + private boolean empty; + + protected OrderTable() { + } + + public OrderTable(final Long id, final TableGroup tableGroup, final int numberOfGuests, final boolean empty) { + this.id = id; + this.tableGroup = tableGroup; + this.numberOfGuests = new NumberOfGuests(numberOfGuests); + this.empty = empty; + } + + public void changeEmpty(final boolean empty) { + validateTableGroupNotDesignated(); + this.empty = empty; + } + + private void validateTableGroupNotDesignated() { + if (tableGroup != null) { + throw new IllegalArgumentException(); + } + } + + public void changeNumberOfGuests(final int numberOfGuests) { + validateNotEmpty(); + this.numberOfGuests = new NumberOfGuests(numberOfGuests); + } + + private void validateNotEmpty() { + if (empty) { + throw new IllegalArgumentException(); + } + } + + public boolean isDesignatedTableGroup() { + return this.tableGroup != null; + } + + public void designateTableGroup(final TableGroup tableGroup) { + this.tableGroup = tableGroup; + } + + public void ungroup() { + this.tableGroup = null; + this.empty = false; + } + + public Long getId() { + return id; + } + + public TableGroup getTableGroup() { + return tableGroup; + } + + public int getNumberOfGuests() { + return numberOfGuests.getValue(); + } + + public boolean isEmpty() { + return empty; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof OrderTable)) { + return false; + } + OrderTable that = (OrderTable) o; + return Objects.equals(id, that.getId()); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/kitchenpos/domain/table/OrderTableRepository.java b/src/main/java/kitchenpos/domain/table/OrderTableRepository.java new file mode 100644 index 0000000000..ab19ff1c28 --- /dev/null +++ b/src/main/java/kitchenpos/domain/table/OrderTableRepository.java @@ -0,0 +1,14 @@ +package kitchenpos.domain.table; + +import java.util.List; +import kitchenpos.domain.table.OrderTable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface OrderTableRepository extends JpaRepository { + + List findAllByIdIn(List ids); + + @Query("select ot from OrderTable ot where ot.tableGroup.id = :tableGroupId") + List findAllByTableGroupId(Long tableGroupId); +} diff --git a/src/main/java/kitchenpos/domain/table/TableGroup.java b/src/main/java/kitchenpos/domain/table/TableGroup.java new file mode 100644 index 0000000000..5178cb9460 --- /dev/null +++ b/src/main/java/kitchenpos/domain/table/TableGroup.java @@ -0,0 +1,85 @@ +package kitchenpos.domain.table; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import org.springframework.util.CollectionUtils; + +@Entity +@Table(name = "table_group") +public class TableGroup { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(name = "created_date") + private LocalDateTime createdDate; + @OneToMany(mappedBy = "tableGroup") + private List orderTables = new ArrayList<>(); + + protected TableGroup() { + } + + public TableGroup(final Long id, final LocalDateTime createdDate, final List orderTables) { + this.id = id; + this.createdDate = createdDate; + group(orderTables); + } + + private void group(final List orderTables) { + validateOrderTables(orderTables); + this.orderTables = orderTables; + orderTables.forEach(orderTable -> orderTable.designateTableGroup(this)); + } + + private void validateOrderTables(final List orderTables) { + validateOrderTablesSize(orderTables); + for (final OrderTable orderTable : orderTables) { + validateEmptyTable(orderTable); + validateTableGroupNotDesignated(orderTable); + } + } + + private void validateOrderTablesSize(final List orderTables) { + if (CollectionUtils.isEmpty(orderTables) || orderTables.size() < 2) { + throw new IllegalArgumentException(); + } + } + + private void validateEmptyTable(final OrderTable orderTable) { + if (!orderTable.isEmpty()) { + throw new IllegalArgumentException(); + } + } + + private void validateTableGroupNotDesignated(final OrderTable orderTable) { + if (orderTable.isDesignatedTableGroup()) { + throw new IllegalArgumentException(); + } + } + + public void ungroup() { + for (OrderTable orderTable : orderTables) { + orderTable.ungroup(); + } + } + + public Long getId() { + return id; + } + + public LocalDateTime getCreatedDate() { + return createdDate; + } + + public List getOrderTables() { + return orderTables; + } +} diff --git a/src/main/java/kitchenpos/domain/table/TableGroupRepository.java b/src/main/java/kitchenpos/domain/table/TableGroupRepository.java new file mode 100644 index 0000000000..6f84f92161 --- /dev/null +++ b/src/main/java/kitchenpos/domain/table/TableGroupRepository.java @@ -0,0 +1,7 @@ +package kitchenpos.domain.table; + +import kitchenpos.domain.table.TableGroup; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TableGroupRepository extends JpaRepository { +} diff --git a/src/main/java/kitchenpos/dto/menu/mapper/MenuDtoMapper.java b/src/main/java/kitchenpos/dto/menu/mapper/MenuDtoMapper.java new file mode 100644 index 0000000000..33ef155c4c --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/mapper/MenuDtoMapper.java @@ -0,0 +1,12 @@ +package kitchenpos.dto.menu.mapper; + +import java.util.List; +import kitchenpos.domain.menu.Menu; +import kitchenpos.dto.menu.response.MenuResponse; + +public interface MenuDtoMapper { + + MenuResponse toMenuResponse(Menu menu); + + List toMenuResponses(List menus); +} diff --git a/src/main/java/kitchenpos/dto/menu/mapper/MenuDtoMapperImpl.java b/src/main/java/kitchenpos/dto/menu/mapper/MenuDtoMapperImpl.java new file mode 100644 index 0000000000..33d8087e82 --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/mapper/MenuDtoMapperImpl.java @@ -0,0 +1,55 @@ +package kitchenpos.dto.menu.mapper; + +import java.util.List; +import java.util.stream.Collectors; +import kitchenpos.domain.menu.Menu; +import kitchenpos.domain.menu.MenuProduct; +import kitchenpos.dto.menu.response.MenuProductResponse; +import kitchenpos.dto.menu.response.MenuResponse; +import org.springframework.stereotype.Component; + +@Component +public class MenuDtoMapperImpl implements MenuDtoMapper { + + @Override + public MenuResponse toMenuResponse(final Menu menu) { + return new MenuResponse( + menu.getId(), + menu.getName(), + menu.getPrice().getValue(), + menu.getMenuGroupId(), + menu.getMenuProducts() + .stream() + .map(this::menuProductToResponse) + .collect(Collectors.toList()) + ); + } + + private MenuResponse menuToResponse(final Menu menu) { + return new MenuResponse( + menu.getId(), + menu.getName(), + menu.getPrice().getValue(), + menu.getMenuGroupId(), + menu.getMenuProducts() + .stream() + .map(this::menuProductToResponse) + .collect(Collectors.toList()) + ); + } + + private MenuProductResponse menuProductToResponse(final MenuProduct menuProduct) { + return new MenuProductResponse( + menuProduct.getSeq(), + menuProduct.getProductId(), + menuProduct.getQuantity() + ); + } + + @Override + public List toMenuResponses(final List menus) { + return menus.stream() + .map(this::menuToResponse) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupDtoMapper.java b/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupDtoMapper.java new file mode 100644 index 0000000000..74e8054e73 --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupDtoMapper.java @@ -0,0 +1,12 @@ +package kitchenpos.dto.menu.mapper; + +import java.util.List; +import kitchenpos.domain.menu.MenuGroup; +import kitchenpos.dto.menu.response.MenuGroupResponse; + +public interface MenuGroupDtoMapper { + + MenuGroupResponse toMenuGroupResponse(MenuGroup menuGroup); + + List toMenuGroupResponses(List menuGroups); +} diff --git a/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupDtoMapperImpl.java b/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupDtoMapperImpl.java new file mode 100644 index 0000000000..eac9abba6c --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupDtoMapperImpl.java @@ -0,0 +1,23 @@ +package kitchenpos.dto.menu.mapper; + +import java.util.List; +import java.util.stream.Collectors; +import kitchenpos.domain.menu.MenuGroup; +import kitchenpos.dto.menu.response.MenuGroupResponse; +import org.springframework.stereotype.Component; + +@Component +public class MenuGroupDtoMapperImpl implements MenuGroupDtoMapper { + + @Override + public MenuGroupResponse toMenuGroupResponse(final MenuGroup menuGroup) { + return new MenuGroupResponse(menuGroup.getId(), menuGroup.getName()); + } + + @Override + public List toMenuGroupResponses(final List menuGroups) { + return menuGroups.stream() + .map(this::toMenuGroupResponse) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupMapper.java b/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupMapper.java new file mode 100644 index 0000000000..7863573a92 --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupMapper.java @@ -0,0 +1,9 @@ +package kitchenpos.dto.menu.mapper; + +import kitchenpos.domain.menu.MenuGroup; +import kitchenpos.dto.menu.request.MenuGroupCreateRequest; + +public interface MenuGroupMapper { + + MenuGroup toMenuGroup(MenuGroupCreateRequest menuGroupCreateRequest); +} diff --git a/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupMapperImpl.java b/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupMapperImpl.java new file mode 100644 index 0000000000..788e35cdeb --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/mapper/MenuGroupMapperImpl.java @@ -0,0 +1,14 @@ +package kitchenpos.dto.menu.mapper; + +import kitchenpos.domain.menu.MenuGroup; +import kitchenpos.dto.menu.request.MenuGroupCreateRequest; +import org.springframework.stereotype.Component; + +@Component +public class MenuGroupMapperImpl implements MenuGroupMapper { + + @Override + public MenuGroup toMenuGroup(final MenuGroupCreateRequest menuGroupCreateRequest) { + return new MenuGroup(null, menuGroupCreateRequest.getName()); + } +} diff --git a/src/main/java/kitchenpos/dto/menu/mapper/MenuMapper.java b/src/main/java/kitchenpos/dto/menu/mapper/MenuMapper.java new file mode 100644 index 0000000000..b05967bac9 --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/mapper/MenuMapper.java @@ -0,0 +1,11 @@ +package kitchenpos.dto.menu.mapper; + +import java.util.List; +import kitchenpos.domain.menu.Menu; +import kitchenpos.domain.menu.MenuProduct; +import kitchenpos.dto.menu.request.MenuCreateRequest; + +public interface MenuMapper { + + Menu toMenu(MenuCreateRequest menuCreateRequest, List menuProducts); +} diff --git a/src/main/java/kitchenpos/dto/menu/mapper/MenuMapperImpl.java b/src/main/java/kitchenpos/dto/menu/mapper/MenuMapperImpl.java new file mode 100644 index 0000000000..be5accea7c --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/mapper/MenuMapperImpl.java @@ -0,0 +1,27 @@ +package kitchenpos.dto.menu.mapper; + +import java.util.List; +import kitchenpos.domain.menu.Menu; +import kitchenpos.domain.menu.MenuProduct; +import kitchenpos.domain.common.Price; +import kitchenpos.dto.menu.request.MenuCreateRequest; +import org.springframework.stereotype.Component; + +@Component +public class MenuMapperImpl implements MenuMapper { + + @Override + public Menu toMenu(final MenuCreateRequest menuCreateRequest, final List menuProducts) { + if (menuCreateRequest == null) { + return null; + } + + return new Menu( + null, + menuCreateRequest.getName(), + new Price(menuCreateRequest.getPrice()), + menuCreateRequest.getMenuGroupId(), + menuProducts + ); + } +} diff --git a/src/main/java/kitchenpos/dto/menu/request/MenuCreateRequest.java b/src/main/java/kitchenpos/dto/menu/request/MenuCreateRequest.java new file mode 100644 index 0000000000..8f861f5cc7 --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/request/MenuCreateRequest.java @@ -0,0 +1,39 @@ +package kitchenpos.dto.menu.request; + +import java.math.BigDecimal; +import java.util.List; + +public class MenuCreateRequest { + + private String name; + private BigDecimal price; + private Long menuGroupId; + private List menuProducts; + + private MenuCreateRequest() { + } + + public MenuCreateRequest(final String name, final BigDecimal price, final Long menuGroupId, + final List menuProducts) { + this.name = name; + this.price = price; + this.menuGroupId = menuGroupId; + this.menuProducts = menuProducts; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + + public Long getMenuGroupId() { + return menuGroupId; + } + + public List getMenuProducts() { + return menuProducts; + } +} diff --git a/src/main/java/kitchenpos/dto/menu/request/MenuGroupCreateRequest.java b/src/main/java/kitchenpos/dto/menu/request/MenuGroupCreateRequest.java new file mode 100644 index 0000000000..895db077a5 --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/request/MenuGroupCreateRequest.java @@ -0,0 +1,17 @@ +package kitchenpos.dto.menu.request; + +public class MenuGroupCreateRequest { + + private String name; + + private MenuGroupCreateRequest() { + } + + public MenuGroupCreateRequest(final String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/kitchenpos/dto/menu/request/MenuProductCreateRequest.java b/src/main/java/kitchenpos/dto/menu/request/MenuProductCreateRequest.java new file mode 100644 index 0000000000..413fdeeeab --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/request/MenuProductCreateRequest.java @@ -0,0 +1,23 @@ +package kitchenpos.dto.menu.request; + +public class MenuProductCreateRequest { + + private Long productId; + private long quantity; + + private MenuProductCreateRequest() { + } + + public MenuProductCreateRequest(final Long productId, final long quantity) { + this.productId = productId; + this.quantity = quantity; + } + + public Long getProductId() { + return productId; + } + + public long getQuantity() { + return quantity; + } +} diff --git a/src/main/java/kitchenpos/domain/MenuGroup.java b/src/main/java/kitchenpos/dto/menu/response/MenuGroupResponse.java similarity index 56% rename from src/main/java/kitchenpos/domain/MenuGroup.java rename to src/main/java/kitchenpos/dto/menu/response/MenuGroupResponse.java index c7b09e2e96..a0ab99ac8b 100644 --- a/src/main/java/kitchenpos/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/dto/menu/response/MenuGroupResponse.java @@ -1,22 +1,23 @@ -package kitchenpos.domain; +package kitchenpos.dto.menu.response; + +public class MenuGroupResponse { -public class MenuGroup { private Long id; private String name; - public Long getId() { - return id; + private MenuGroupResponse() { } - public void setId(final Long id) { + public MenuGroupResponse(final Long id, final String name) { this.id = id; + this.name = name; } - public String getName() { - return name; + public Long getId() { + return id; } - public void setName(final String name) { - this.name = name; + public String getName() { + return name; } } diff --git a/src/main/java/kitchenpos/dto/menu/response/MenuProductResponse.java b/src/main/java/kitchenpos/dto/menu/response/MenuProductResponse.java new file mode 100644 index 0000000000..44e3f934ec --- /dev/null +++ b/src/main/java/kitchenpos/dto/menu/response/MenuProductResponse.java @@ -0,0 +1,29 @@ +package kitchenpos.dto.menu.response; + +public class MenuProductResponse { + + private Long seq; + private Long productId; + private long quantity; + + private MenuProductResponse() { + } + + public MenuProductResponse(final Long seq, final Long productId, final long quantity) { + this.seq = seq; + this.productId = productId; + this.quantity = quantity; + } + + public Long getSeq() { + return seq; + } + + public Long getProductId() { + return productId; + } + + public long getQuantity() { + return quantity; + } +} diff --git a/src/main/java/kitchenpos/domain/Menu.java b/src/main/java/kitchenpos/dto/menu/response/MenuResponse.java similarity index 59% rename from src/main/java/kitchenpos/domain/Menu.java rename to src/main/java/kitchenpos/dto/menu/response/MenuResponse.java index 49fb36fc72..aa01957aa7 100644 --- a/src/main/java/kitchenpos/domain/Menu.java +++ b/src/main/java/kitchenpos/dto/menu/response/MenuResponse.java @@ -1,52 +1,45 @@ -package kitchenpos.domain; +package kitchenpos.dto.menu.response; import java.math.BigDecimal; import java.util.List; -public class Menu { +public class MenuResponse { + private Long id; private String name; private BigDecimal price; private Long menuGroupId; - private List menuProducts; + private List menuProducts; - public Long getId() { - return id; + private MenuResponse() { } - public void setId(final Long id) { + public MenuResponse(final Long id, final String name, final BigDecimal price, final Long menuGroupId, + final List menuProducts) { this.id = id; + this.name = name; + this.price = price; + this.menuGroupId = menuGroupId; + this.menuProducts = menuProducts; } - public String getName() { - return name; + public Long getId() { + return id; } - public void setName(final String name) { - this.name = name; + public String getName() { + return name; } public BigDecimal getPrice() { return price; } - public void setPrice(final BigDecimal price) { - this.price = price; - } - public Long getMenuGroupId() { return menuGroupId; } - public void setMenuGroupId(final Long menuGroupId) { - this.menuGroupId = menuGroupId; - } - - public List getMenuProducts() { + public List getMenuProducts() { return menuProducts; } - - public void setMenuProducts(final List menuProducts) { - this.menuProducts = menuProducts; - } } diff --git a/src/main/java/kitchenpos/dto/order/mapper/OrderDtoMapper.java b/src/main/java/kitchenpos/dto/order/mapper/OrderDtoMapper.java new file mode 100644 index 0000000000..3c57bb829e --- /dev/null +++ b/src/main/java/kitchenpos/dto/order/mapper/OrderDtoMapper.java @@ -0,0 +1,12 @@ +package kitchenpos.dto.order.mapper; + +import java.util.List; +import kitchenpos.domain.order.Order; +import kitchenpos.dto.order.response.OrderResponse; + +public interface OrderDtoMapper { + + OrderResponse toOrderResponse(Order order); + + List toOrderResponses(List orders); +} diff --git a/src/main/java/kitchenpos/dto/order/mapper/OrderDtoMapperImpl.java b/src/main/java/kitchenpos/dto/order/mapper/OrderDtoMapperImpl.java new file mode 100644 index 0000000000..50dad646ab --- /dev/null +++ b/src/main/java/kitchenpos/dto/order/mapper/OrderDtoMapperImpl.java @@ -0,0 +1,35 @@ +package kitchenpos.dto.order.mapper; + +import java.util.List; +import java.util.stream.Collectors; +import kitchenpos.domain.order.Order; +import kitchenpos.domain.order.OrderLineItem; +import kitchenpos.dto.order.response.OrderLineItemResponse; +import kitchenpos.dto.order.response.OrderResponse; +import org.springframework.stereotype.Component; + +@Component +public class OrderDtoMapperImpl implements OrderDtoMapper { + + @Override + public OrderResponse toOrderResponse(final Order order) { + List orderLineItemRespons = order.getOrderLineItems() + .stream() + .map(this::toOrderLineItemResponse) + .collect(Collectors.toList()); + return new OrderResponse(order.getId(), order.getOrderTableId(), order.getOrderStatus().name(), + order.getOrderedTime(), orderLineItemRespons); + } + + private OrderLineItemResponse toOrderLineItemResponse(final OrderLineItem orderLineItem) { + return new OrderLineItemResponse(orderLineItem.getSeq(), orderLineItem.getMenuId(), + orderLineItem.getQuantity()); + } + + @Override + public List toOrderResponses(final List orders) { + return orders.stream() + .map(this::toOrderResponse) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/kitchenpos/dto/order/mapper/OrderLineItemMapper.java b/src/main/java/kitchenpos/dto/order/mapper/OrderLineItemMapper.java new file mode 100644 index 0000000000..2590231438 --- /dev/null +++ b/src/main/java/kitchenpos/dto/order/mapper/OrderLineItemMapper.java @@ -0,0 +1,10 @@ +package kitchenpos.dto.order.mapper; + +import java.util.List; +import kitchenpos.domain.order.OrderLineItem; +import kitchenpos.dto.order.request.OrderLineItemCreateRequest; + +public interface OrderLineItemMapper { + + List toOrderLineItems(List orderLineItemCreateRequests); +} diff --git a/src/main/java/kitchenpos/dto/order/mapper/OrderLineItemMapperImpl.java b/src/main/java/kitchenpos/dto/order/mapper/OrderLineItemMapperImpl.java new file mode 100644 index 0000000000..c5ca602abc --- /dev/null +++ b/src/main/java/kitchenpos/dto/order/mapper/OrderLineItemMapperImpl.java @@ -0,0 +1,24 @@ +package kitchenpos.dto.order.mapper; + +import java.util.List; +import java.util.stream.Collectors; +import kitchenpos.domain.order.OrderLineItem; +import kitchenpos.dto.order.request.OrderLineItemCreateRequest; +import org.springframework.stereotype.Component; + +@Component +public class OrderLineItemMapperImpl implements OrderLineItemMapper { + + @Override + public List toOrderLineItems(final List orderLineItemCreateRequests) { + return orderLineItemCreateRequests.stream() + .map(this::createOrderLineItem) + .collect(Collectors.toList()); + } + + private OrderLineItem createOrderLineItem(final OrderLineItemCreateRequest orderLineItemCreateRequest) { + return new OrderLineItem( + null, null, orderLineItemCreateRequest.getMenuId(), orderLineItemCreateRequest.getQuantity() + ); + } +} diff --git a/src/main/java/kitchenpos/dto/order/mapper/OrderMapper.java b/src/main/java/kitchenpos/dto/order/mapper/OrderMapper.java new file mode 100644 index 0000000000..5bf71c6e57 --- /dev/null +++ b/src/main/java/kitchenpos/dto/order/mapper/OrderMapper.java @@ -0,0 +1,11 @@ +package kitchenpos.dto.order.mapper; + +import java.util.List; +import kitchenpos.domain.order.Order; +import kitchenpos.domain.order.OrderLineItem; +import kitchenpos.dto.order.request.OrderCreateRequest; + +public interface OrderMapper { + + Order toOrder(OrderCreateRequest orderCreateRequest, List orderLineItems); +} diff --git a/src/main/java/kitchenpos/dto/order/mapper/OrderMapperImpl.java b/src/main/java/kitchenpos/dto/order/mapper/OrderMapperImpl.java new file mode 100644 index 0000000000..16e838b834 --- /dev/null +++ b/src/main/java/kitchenpos/dto/order/mapper/OrderMapperImpl.java @@ -0,0 +1,28 @@ +package kitchenpos.dto.order.mapper; + +import java.time.LocalDateTime; +import java.util.List; +import kitchenpos.domain.common.OrderStatus; +import kitchenpos.domain.order.Order; +import kitchenpos.domain.order.OrderLineItem; +import kitchenpos.dto.order.request.OrderCreateRequest; +import org.springframework.stereotype.Component; + +@Component +public class OrderMapperImpl implements OrderMapper { + + @Override + public Order toOrder(final OrderCreateRequest orderCreateRequest, final List orderLineItems) { + if (orderCreateRequest == null) { + return null; + } + + return new Order( + null, + orderCreateRequest.getOrderTableId(), + OrderStatus.COOKING, + LocalDateTime.now(), + orderLineItems + ); + } +} diff --git a/src/main/java/kitchenpos/dto/order/request/OrderCreateRequest.java b/src/main/java/kitchenpos/dto/order/request/OrderCreateRequest.java new file mode 100644 index 0000000000..8f2597df74 --- /dev/null +++ b/src/main/java/kitchenpos/dto/order/request/OrderCreateRequest.java @@ -0,0 +1,25 @@ +package kitchenpos.dto.order.request; + +import java.util.List; + +public class OrderCreateRequest { + + private Long orderTableId; + private List orderLineItems; + + private OrderCreateRequest() { + } + + public OrderCreateRequest(final Long orderTableId, final List orderLineItems) { + this.orderTableId = orderTableId; + this.orderLineItems = orderLineItems; + } + + public Long getOrderTableId() { + return orderTableId; + } + + public List getOrderLineItems() { + return orderLineItems; + } +} diff --git a/src/main/java/kitchenpos/dto/order/request/OrderLineItemCreateRequest.java b/src/main/java/kitchenpos/dto/order/request/OrderLineItemCreateRequest.java new file mode 100644 index 0000000000..5e32fb2ffe --- /dev/null +++ b/src/main/java/kitchenpos/dto/order/request/OrderLineItemCreateRequest.java @@ -0,0 +1,23 @@ +package kitchenpos.dto.order.request; + +public class OrderLineItemCreateRequest { + + private Long menuId; + private long quantity; + + private OrderLineItemCreateRequest() { + } + + public OrderLineItemCreateRequest(final Long menuId, final long quantity) { + this.menuId = menuId; + this.quantity = quantity; + } + + public Long getMenuId() { + return menuId; + } + + public long getQuantity() { + return quantity; + } +} diff --git a/src/main/java/kitchenpos/dto/order/request/OrderStatusChangeRequest.java b/src/main/java/kitchenpos/dto/order/request/OrderStatusChangeRequest.java new file mode 100644 index 0000000000..dae9007d62 --- /dev/null +++ b/src/main/java/kitchenpos/dto/order/request/OrderStatusChangeRequest.java @@ -0,0 +1,17 @@ +package kitchenpos.dto.order.request; + +public class OrderStatusChangeRequest { + + private String orderStatus; + + private OrderStatusChangeRequest() { + } + + public OrderStatusChangeRequest(final String orderStatus) { + this.orderStatus = orderStatus; + } + + public String getOrderStatus() { + return orderStatus; + } +} diff --git a/src/main/java/kitchenpos/dto/order/response/OrderLineItemResponse.java b/src/main/java/kitchenpos/dto/order/response/OrderLineItemResponse.java new file mode 100644 index 0000000000..a83ceb898e --- /dev/null +++ b/src/main/java/kitchenpos/dto/order/response/OrderLineItemResponse.java @@ -0,0 +1,29 @@ +package kitchenpos.dto.order.response; + +public class OrderLineItemResponse { + + private Long seq; + private Long menuId; + private long quantity; + + private OrderLineItemResponse() { + } + + public OrderLineItemResponse(final Long seq, final Long menuId, final long quantity) { + this.seq = seq; + this.menuId = menuId; + this.quantity = quantity; + } + + public Long getSeq() { + return seq; + } + + public Long getMenuId() { + return menuId; + } + + public long getQuantity() { + return quantity; + } +} diff --git a/src/main/java/kitchenpos/domain/Order.java b/src/main/java/kitchenpos/dto/order/response/OrderResponse.java similarity index 59% rename from src/main/java/kitchenpos/domain/Order.java rename to src/main/java/kitchenpos/dto/order/response/OrderResponse.java index 542715958b..47c5d7ec73 100644 --- a/src/main/java/kitchenpos/domain/Order.java +++ b/src/main/java/kitchenpos/dto/order/response/OrderResponse.java @@ -1,52 +1,46 @@ -package kitchenpos.domain; +package kitchenpos.dto.order.response; import java.time.LocalDateTime; import java.util.List; -public class Order { +public class OrderResponse { + private Long id; private Long orderTableId; private String orderStatus; private LocalDateTime orderedTime; - private List orderLineItems; + private List orderLineItems; - public Long getId() { - return id; + private OrderResponse() { } - public void setId(final Long id) { + public OrderResponse(final Long id, final Long orderTableId, final String orderStatus, + final LocalDateTime orderedTime, + final List orderLineItems) { this.id = id; + this.orderTableId = orderTableId; + this.orderStatus = orderStatus; + this.orderedTime = orderedTime; + this.orderLineItems = orderLineItems; } - public Long getOrderTableId() { - return orderTableId; + public Long getId() { + return id; } - public void setOrderTableId(final Long orderTableId) { - this.orderTableId = orderTableId; + public Long getOrderTableId() { + return orderTableId; } public String getOrderStatus() { return orderStatus; } - public void setOrderStatus(final String orderStatus) { - this.orderStatus = orderStatus; - } - public LocalDateTime getOrderedTime() { return orderedTime; } - public void setOrderedTime(final LocalDateTime orderedTime) { - this.orderedTime = orderedTime; - } - - public List getOrderLineItems() { + public List getOrderLineItems() { return orderLineItems; } - - public void setOrderLineItems(final List orderLineItems) { - this.orderLineItems = orderLineItems; - } } diff --git a/src/main/java/kitchenpos/dto/product/mapper/ProductDtoMapper.java b/src/main/java/kitchenpos/dto/product/mapper/ProductDtoMapper.java new file mode 100644 index 0000000000..42ce655ca7 --- /dev/null +++ b/src/main/java/kitchenpos/dto/product/mapper/ProductDtoMapper.java @@ -0,0 +1,12 @@ +package kitchenpos.dto.product.mapper; + +import java.util.List; +import kitchenpos.domain.product.Product; +import kitchenpos.dto.product.response.ProductResponse; + +public interface ProductDtoMapper { + + ProductResponse toProductResponse(Product product); + + List toProductResponses(List product); +} diff --git a/src/main/java/kitchenpos/dto/product/mapper/ProductDtoMapperImpl.java b/src/main/java/kitchenpos/dto/product/mapper/ProductDtoMapperImpl.java new file mode 100644 index 0000000000..d3562e7080 --- /dev/null +++ b/src/main/java/kitchenpos/dto/product/mapper/ProductDtoMapperImpl.java @@ -0,0 +1,23 @@ +package kitchenpos.dto.product.mapper; + +import java.util.List; +import java.util.stream.Collectors; +import kitchenpos.domain.product.Product; +import kitchenpos.dto.product.response.ProductResponse; +import org.springframework.stereotype.Component; + +@Component +public class ProductDtoMapperImpl implements ProductDtoMapper { + + @Override + public ProductResponse toProductResponse(final Product product) { + return new ProductResponse(product.getId(), product.getName(), product.getPrice().getValue()); + } + + @Override + public List toProductResponses(final List products) { + return products.stream() + .map(this::toProductResponse) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/kitchenpos/dto/product/mapper/ProductMapper.java b/src/main/java/kitchenpos/dto/product/mapper/ProductMapper.java new file mode 100644 index 0000000000..27066e5780 --- /dev/null +++ b/src/main/java/kitchenpos/dto/product/mapper/ProductMapper.java @@ -0,0 +1,9 @@ +package kitchenpos.dto.product.mapper; + +import kitchenpos.domain.product.Product; +import kitchenpos.dto.product.request.ProductCreateRequest; + +public interface ProductMapper { + + Product toProduct(ProductCreateRequest productCreateRequest); +} diff --git a/src/main/java/kitchenpos/dto/product/mapper/ProductMapperImpl.java b/src/main/java/kitchenpos/dto/product/mapper/ProductMapperImpl.java new file mode 100644 index 0000000000..fb071c184f --- /dev/null +++ b/src/main/java/kitchenpos/dto/product/mapper/ProductMapperImpl.java @@ -0,0 +1,14 @@ +package kitchenpos.dto.product.mapper; + +import kitchenpos.domain.product.Product; +import kitchenpos.dto.product.request.ProductCreateRequest; +import org.springframework.stereotype.Component; + +@Component +public class ProductMapperImpl implements ProductMapper { + + @Override + public Product toProduct(final ProductCreateRequest productCreateRequest) { + return new Product(null, productCreateRequest.getName(), productCreateRequest.getPrice()); + } +} diff --git a/src/main/java/kitchenpos/dto/product/request/ProductCreateRequest.java b/src/main/java/kitchenpos/dto/product/request/ProductCreateRequest.java new file mode 100644 index 0000000000..b11ce7b282 --- /dev/null +++ b/src/main/java/kitchenpos/dto/product/request/ProductCreateRequest.java @@ -0,0 +1,26 @@ +package kitchenpos.dto.product.request; + +import java.math.BigDecimal; + +public class ProductCreateRequest { + + private String name; + + private BigDecimal price; + + private ProductCreateRequest() { + } + + public ProductCreateRequest(final String name, final BigDecimal price) { + this.name = name; + this.price = price; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/domain/Product.java b/src/main/java/kitchenpos/dto/product/response/ProductResponse.java similarity index 65% rename from src/main/java/kitchenpos/domain/Product.java rename to src/main/java/kitchenpos/dto/product/response/ProductResponse.java index 33e29e7952..d62c142577 100644 --- a/src/main/java/kitchenpos/domain/Product.java +++ b/src/main/java/kitchenpos/dto/product/response/ProductResponse.java @@ -1,33 +1,33 @@ -package kitchenpos.domain; +package kitchenpos.dto.product.response; import java.math.BigDecimal; -public class Product { +public class ProductResponse { + private Long id; + private String name; + private BigDecimal price; - public Long getId() { - return id; + private ProductResponse() { } - public void setId(final Long id) { + public ProductResponse(final Long id, final String name, final BigDecimal price) { this.id = id; + this.name = name; + this.price = price; } - public String getName() { - return name; + public Long getId() { + return id; } - public void setName(final String name) { - this.name = name; + public String getName() { + return name; } public BigDecimal getPrice() { return price; } - - public void setPrice(final BigDecimal price) { - this.price = price; - } } diff --git a/src/main/java/kitchenpos/dto/table/mapper/OrderTableDtoMapper.java b/src/main/java/kitchenpos/dto/table/mapper/OrderTableDtoMapper.java new file mode 100644 index 0000000000..4054fcba5b --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/mapper/OrderTableDtoMapper.java @@ -0,0 +1,12 @@ +package kitchenpos.dto.table.mapper; + +import java.util.List; +import kitchenpos.domain.table.OrderTable; +import kitchenpos.dto.table.response.OrderTableResponse; + +public interface OrderTableDtoMapper { + + OrderTableResponse toOrderTableResponse(OrderTable orderTable); + + List toOrderTableResponses(List orderTables); +} diff --git a/src/main/java/kitchenpos/dto/table/mapper/OrderTableDtoMapperImpl.java b/src/main/java/kitchenpos/dto/table/mapper/OrderTableDtoMapperImpl.java new file mode 100644 index 0000000000..0630e897a7 --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/mapper/OrderTableDtoMapperImpl.java @@ -0,0 +1,28 @@ +package kitchenpos.dto.table.mapper; + +import java.util.List; +import java.util.stream.Collectors; +import kitchenpos.domain.table.OrderTable; +import kitchenpos.dto.table.response.OrderTableResponse; +import org.springframework.stereotype.Component; + +@Component +public class OrderTableDtoMapperImpl implements OrderTableDtoMapper { + + @Override + public OrderTableResponse toOrderTableResponse(final OrderTable orderTable) { + if (orderTable.getTableGroup() == null) { + return new OrderTableResponse(orderTable.getId(), null, orderTable.getNumberOfGuests(), + orderTable.isEmpty()); + } + return new OrderTableResponse(orderTable.getId(), orderTable.getTableGroup().getId(), + orderTable.getNumberOfGuests(), orderTable.isEmpty()); + } + + @Override + public List toOrderTableResponses(final List orderTables) { + return orderTables.stream() + .map(this::toOrderTableResponse) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/kitchenpos/dto/table/mapper/OrderTableMapper.java b/src/main/java/kitchenpos/dto/table/mapper/OrderTableMapper.java new file mode 100644 index 0000000000..ff6a026829 --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/mapper/OrderTableMapper.java @@ -0,0 +1,9 @@ +package kitchenpos.dto.table.mapper; + +import kitchenpos.domain.table.OrderTable; +import kitchenpos.dto.table.request.OrderTableCreateRequest; + +public interface OrderTableMapper { + + OrderTable toOrderTable(OrderTableCreateRequest orderTableCreateRequest); +} diff --git a/src/main/java/kitchenpos/dto/table/mapper/OrderTableMapperImpl.java b/src/main/java/kitchenpos/dto/table/mapper/OrderTableMapperImpl.java new file mode 100644 index 0000000000..90fd558e67 --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/mapper/OrderTableMapperImpl.java @@ -0,0 +1,15 @@ +package kitchenpos.dto.table.mapper; + +import kitchenpos.domain.table.OrderTable; +import kitchenpos.dto.table.request.OrderTableCreateRequest; +import org.springframework.stereotype.Component; + +@Component +public class OrderTableMapperImpl implements OrderTableMapper { + + @Override + public OrderTable toOrderTable(final OrderTableCreateRequest orderTableCreateRequest) { + return new OrderTable(null, null, orderTableCreateRequest.getNumberOfGuests(), + orderTableCreateRequest.isEmpty()); + } +} diff --git a/src/main/java/kitchenpos/dto/table/mapper/TableGroupDtoMapper.java b/src/main/java/kitchenpos/dto/table/mapper/TableGroupDtoMapper.java new file mode 100644 index 0000000000..1c3315bb39 --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/mapper/TableGroupDtoMapper.java @@ -0,0 +1,9 @@ +package kitchenpos.dto.table.mapper; + +import kitchenpos.domain.table.TableGroup; +import kitchenpos.dto.table.response.TableGroupResponse; + +public interface TableGroupDtoMapper { + + TableGroupResponse toTableGroupResponse(TableGroup tableGroup); +} diff --git a/src/main/java/kitchenpos/dto/table/mapper/TableGroupDtoMapperImpl.java b/src/main/java/kitchenpos/dto/table/mapper/TableGroupDtoMapperImpl.java new file mode 100644 index 0000000000..a74cee143f --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/mapper/TableGroupDtoMapperImpl.java @@ -0,0 +1,36 @@ +package kitchenpos.dto.table.mapper; + +import java.util.List; +import java.util.stream.Collectors; +import kitchenpos.domain.table.OrderTable; +import kitchenpos.domain.table.TableGroup; +import kitchenpos.dto.table.response.OrderTableResponse; +import kitchenpos.dto.table.response.TableGroupResponse; +import org.springframework.stereotype.Component; + +@Component +public class TableGroupDtoMapperImpl implements TableGroupDtoMapper { + + @Override + public TableGroupResponse toTableGroupResponse(final TableGroup tableGroup) { + if (tableGroup == null) { + return null; + } + + List orderTableResponses = tableGroup.getOrderTables() + .stream() + .map(this::toOrderTableResponse) + .collect(Collectors.toList()); + + return new TableGroupResponse(tableGroup.getId(), tableGroup.getCreatedDate(), orderTableResponses); + } + + private OrderTableResponse toOrderTableResponse(final OrderTable orderTable) { + return new OrderTableResponse( + orderTable.getId(), + orderTable.getTableGroup().getId(), + orderTable.getNumberOfGuests(), + orderTable.isEmpty() + ); + } +} diff --git a/src/main/java/kitchenpos/dto/table/request/NumberOfGuestsChangeRequest.java b/src/main/java/kitchenpos/dto/table/request/NumberOfGuestsChangeRequest.java new file mode 100644 index 0000000000..9f7c2adf77 --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/request/NumberOfGuestsChangeRequest.java @@ -0,0 +1,17 @@ +package kitchenpos.dto.table.request; + +public class NumberOfGuestsChangeRequest { + + private int numberOfGuests; + + private NumberOfGuestsChangeRequest() { + } + + public NumberOfGuestsChangeRequest(final int numberOfGuests) { + this.numberOfGuests = numberOfGuests; + } + + public int getNumberOfGuests() { + return numberOfGuests; + } +} diff --git a/src/main/java/kitchenpos/dto/table/request/OrderTableCreateRequest.java b/src/main/java/kitchenpos/dto/table/request/OrderTableCreateRequest.java new file mode 100644 index 0000000000..84dce29c7a --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/request/OrderTableCreateRequest.java @@ -0,0 +1,23 @@ +package kitchenpos.dto.table.request; + +public class OrderTableCreateRequest { + + private int numberOfGuests; + private boolean empty; + + private OrderTableCreateRequest() { + } + + public OrderTableCreateRequest(final int numberOfGuests, final boolean empty) { + this.numberOfGuests = numberOfGuests; + this.empty = empty; + } + + public int getNumberOfGuests() { + return numberOfGuests; + } + + public boolean isEmpty() { + return empty; + } +} diff --git a/src/main/java/kitchenpos/dto/table/request/OrderTableIdRequest.java b/src/main/java/kitchenpos/dto/table/request/OrderTableIdRequest.java new file mode 100644 index 0000000000..023fe88527 --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/request/OrderTableIdRequest.java @@ -0,0 +1,17 @@ +package kitchenpos.dto.table.request; + +public class OrderTableIdRequest { + + private Long id; + + private OrderTableIdRequest() { + } + + public OrderTableIdRequest(final Long id) { + this.id = id; + } + + public Long getId() { + return id; + } +} diff --git a/src/main/java/kitchenpos/dto/table/request/TableEmptyChangeRequest.java b/src/main/java/kitchenpos/dto/table/request/TableEmptyChangeRequest.java new file mode 100644 index 0000000000..00ec9ffd0d --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/request/TableEmptyChangeRequest.java @@ -0,0 +1,17 @@ +package kitchenpos.dto.table.request; + +public class TableEmptyChangeRequest { + + private boolean empty; + + private TableEmptyChangeRequest() { + } + + public TableEmptyChangeRequest(final boolean empty) { + this.empty = empty; + } + + public boolean isEmpty() { + return empty; + } +} diff --git a/src/main/java/kitchenpos/dto/table/request/TableGroupCreateRequest.java b/src/main/java/kitchenpos/dto/table/request/TableGroupCreateRequest.java new file mode 100644 index 0000000000..6710659919 --- /dev/null +++ b/src/main/java/kitchenpos/dto/table/request/TableGroupCreateRequest.java @@ -0,0 +1,31 @@ +package kitchenpos.dto.table.request; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class TableGroupCreateRequest { + + private List orderTables; + + private TableGroupCreateRequest() { + } + + public TableGroupCreateRequest(final Long... ids) { + this(toOrderTableIdRequests(ids)); + } + + public TableGroupCreateRequest(final List orderTables) { + this.orderTables = orderTables; + } + + private static List toOrderTableIdRequests(final Long[] ids) { + return Arrays.stream(ids) + .map(OrderTableIdRequest::new) + .collect(Collectors.toList()); + } + + public List getOrderTables() { + return orderTables; + } +} diff --git a/src/main/java/kitchenpos/domain/OrderTable.java b/src/main/java/kitchenpos/dto/table/response/OrderTableResponse.java similarity index 65% rename from src/main/java/kitchenpos/domain/OrderTable.java rename to src/main/java/kitchenpos/dto/table/response/OrderTableResponse.java index 1978d568ce..71da3abd3a 100644 --- a/src/main/java/kitchenpos/domain/OrderTable.java +++ b/src/main/java/kitchenpos/dto/table/response/OrderTableResponse.java @@ -1,40 +1,35 @@ -package kitchenpos.domain; +package kitchenpos.dto.table.response; + +public class OrderTableResponse { -public class OrderTable { private Long id; private Long tableGroupId; private int numberOfGuests; private boolean empty; - public Long getId() { - return id; + private OrderTableResponse() { } - public void setId(final Long id) { + public OrderTableResponse(final Long id, final Long tableGroupId, final int numberOfGuests, final boolean empty) { this.id = id; + this.tableGroupId = tableGroupId; + this.numberOfGuests = numberOfGuests; + this.empty = empty; } - public Long getTableGroupId() { - return tableGroupId; + public Long getId() { + return id; } - public void setTableGroupId(final Long tableGroupId) { - this.tableGroupId = tableGroupId; + public Long getTableGroupId() { + return tableGroupId; } public int getNumberOfGuests() { return numberOfGuests; } - public void setNumberOfGuests(final int numberOfGuests) { - this.numberOfGuests = numberOfGuests; - } - public boolean isEmpty() { return empty; } - - public void setEmpty(final boolean empty) { - this.empty = empty; - } } diff --git a/src/main/java/kitchenpos/domain/TableGroup.java b/src/main/java/kitchenpos/dto/table/response/TableGroupResponse.java similarity index 52% rename from src/main/java/kitchenpos/domain/TableGroup.java rename to src/main/java/kitchenpos/dto/table/response/TableGroupResponse.java index d9787025ef..d6d345057a 100644 --- a/src/main/java/kitchenpos/domain/TableGroup.java +++ b/src/main/java/kitchenpos/dto/table/response/TableGroupResponse.java @@ -1,34 +1,33 @@ -package kitchenpos.domain; +package kitchenpos.dto.table.response; import java.time.LocalDateTime; import java.util.List; -public class TableGroup { +public class TableGroupResponse { + private Long id; private LocalDateTime createdDate; - private List orderTables; + private List orderTables; - public Long getId() { - return id; + private TableGroupResponse() { } - public void setId(final Long id) { + public TableGroupResponse(final Long id, final LocalDateTime createdDate, + final List orderTables) { this.id = id; + this.createdDate = createdDate; + this.orderTables = orderTables; } - public LocalDateTime getCreatedDate() { - return createdDate; + public Long getId() { + return id; } - public void setCreatedDate(final LocalDateTime createdDate) { - this.createdDate = createdDate; + public LocalDateTime getCreatedDate() { + return createdDate; } - public List getOrderTables() { + public List getOrderTables() { return orderTables; } - - public void setOrderTables(final List orderTables) { - this.orderTables = orderTables; - } } diff --git a/src/main/java/kitchenpos/ui/OrderRestController.java b/src/main/java/kitchenpos/ui/OrderRestController.java deleted file mode 100644 index 1498a67f4e..0000000000 --- a/src/main/java/kitchenpos/ui/OrderRestController.java +++ /dev/null @@ -1,42 +0,0 @@ -package kitchenpos.ui; - -import kitchenpos.application.OrderService; -import kitchenpos.domain.Order; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.net.URI; -import java.util.List; - -@RestController -public class OrderRestController { - private final OrderService orderService; - - public OrderRestController(final OrderService orderService) { - this.orderService = orderService; - } - - @PostMapping("/api/orders") - public ResponseEntity create(@RequestBody final Order order) { - final Order created = orderService.create(order); - final URI uri = URI.create("/api/orders/" + created.getId()); - return ResponseEntity.created(uri) - .body(created) - ; - } - - @GetMapping("/api/orders") - public ResponseEntity> list() { - return ResponseEntity.ok() - .body(orderService.list()) - ; - } - - @PutMapping("/api/orders/{orderId}/order-status") - public ResponseEntity changeOrderStatus( - @PathVariable final Long orderId, - @RequestBody final Order order - ) { - return ResponseEntity.ok(orderService.changeOrderStatus(orderId, order)); - } -} diff --git a/src/main/java/kitchenpos/ui/TableGroupRestController.java b/src/main/java/kitchenpos/ui/TableGroupRestController.java deleted file mode 100644 index f09b099e06..0000000000 --- a/src/main/java/kitchenpos/ui/TableGroupRestController.java +++ /dev/null @@ -1,34 +0,0 @@ -package kitchenpos.ui; - -import kitchenpos.application.TableGroupService; -import kitchenpos.domain.TableGroup; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.net.URI; - -@RestController -public class TableGroupRestController { - private final TableGroupService tableGroupService; - - public TableGroupRestController(final TableGroupService tableGroupService) { - this.tableGroupService = tableGroupService; - } - - @PostMapping("/api/table-groups") - public ResponseEntity create(@RequestBody final TableGroup tableGroup) { - final TableGroup created = tableGroupService.create(tableGroup); - final URI uri = URI.create("/api/table-groups/" + created.getId()); - return ResponseEntity.created(uri) - .body(created) - ; - } - - @DeleteMapping("/api/table-groups/{tableGroupId}") - public ResponseEntity ungroup(@PathVariable final Long tableGroupId) { - tableGroupService.ungroup(tableGroupId); - return ResponseEntity.noContent() - .build() - ; - } -} diff --git a/src/main/java/kitchenpos/ui/TableRestController.java b/src/main/java/kitchenpos/ui/TableRestController.java deleted file mode 100644 index f8ee90f175..0000000000 --- a/src/main/java/kitchenpos/ui/TableRestController.java +++ /dev/null @@ -1,54 +0,0 @@ -package kitchenpos.ui; - -import kitchenpos.application.TableService; -import kitchenpos.domain.OrderTable; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.net.URI; -import java.util.List; - -@RestController -public class TableRestController { - private final TableService tableService; - - public TableRestController(final TableService tableService) { - this.tableService = tableService; - } - - @PostMapping("/api/tables") - public ResponseEntity create(@RequestBody final OrderTable orderTable) { - final OrderTable created = tableService.create(orderTable); - final URI uri = URI.create("/api/tables/" + created.getId()); - return ResponseEntity.created(uri) - .body(created) - ; - } - - @GetMapping("/api/tables") - public ResponseEntity> list() { - return ResponseEntity.ok() - .body(tableService.list()) - ; - } - - @PutMapping("/api/tables/{orderTableId}/empty") - public ResponseEntity changeEmpty( - @PathVariable final Long orderTableId, - @RequestBody final OrderTable orderTable - ) { - return ResponseEntity.ok() - .body(tableService.changeEmpty(orderTableId, orderTable)) - ; - } - - @PutMapping("/api/tables/{orderTableId}/number-of-guests") - public ResponseEntity changeNumberOfGuests( - @PathVariable final Long orderTableId, - @RequestBody final OrderTable orderTable - ) { - return ResponseEntity.ok() - .body(tableService.changeNumberOfGuests(orderTableId, orderTable)) - ; - } -} diff --git a/src/main/java/kitchenpos/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/ui/menu/MenuGroupRestController.java similarity index 50% rename from src/main/java/kitchenpos/ui/MenuGroupRestController.java rename to src/main/java/kitchenpos/ui/menu/MenuGroupRestController.java index 7cad5dd875..06fa9edcac 100644 --- a/src/main/java/kitchenpos/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/ui/menu/MenuGroupRestController.java @@ -1,18 +1,19 @@ -package kitchenpos.ui; +package kitchenpos.ui.menu; -import kitchenpos.application.MenuGroupService; -import kitchenpos.domain.MenuGroup; +import java.net.URI; +import java.util.List; +import kitchenpos.application.menu.MenuGroupService; +import kitchenpos.dto.menu.request.MenuGroupCreateRequest; +import kitchenpos.dto.menu.response.MenuGroupResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import java.net.URI; -import java.util.List; - @RestController public class MenuGroupRestController { + private final MenuGroupService menuGroupService; public MenuGroupRestController(final MenuGroupService menuGroupService) { @@ -20,18 +21,15 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { } @PostMapping("/api/menu-groups") - public ResponseEntity create(@RequestBody final MenuGroup menuGroup) { - final MenuGroup created = menuGroupService.create(menuGroup); - final URI uri = URI.create("/api/menu-groups/" + created.getId()); - return ResponseEntity.created(uri) - .body(created) - ; + public ResponseEntity create( + @RequestBody final MenuGroupCreateRequest menuGroupCreateRequest) { + MenuGroupResponse created = menuGroupService.create(menuGroupCreateRequest); + URI uri = URI.create("/api/menu-groups/" + created.getId()); + return ResponseEntity.created(uri).body(created); } @GetMapping("/api/menu-groups") - public ResponseEntity> list() { - return ResponseEntity.ok() - .body(menuGroupService.list()) - ; + public ResponseEntity> list() { + return ResponseEntity.ok().body(menuGroupService.list()); } } diff --git a/src/main/java/kitchenpos/ui/MenuRestController.java b/src/main/java/kitchenpos/ui/menu/MenuRestController.java similarity index 51% rename from src/main/java/kitchenpos/ui/MenuRestController.java rename to src/main/java/kitchenpos/ui/menu/MenuRestController.java index 39d5a32e3c..82d0046e8c 100644 --- a/src/main/java/kitchenpos/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/ui/menu/MenuRestController.java @@ -1,18 +1,19 @@ -package kitchenpos.ui; +package kitchenpos.ui.menu; -import kitchenpos.application.MenuService; -import kitchenpos.domain.Menu; +import java.net.URI; +import java.util.List; +import kitchenpos.application.menu.MenuService; +import kitchenpos.dto.menu.request.MenuCreateRequest; +import kitchenpos.dto.menu.response.MenuResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import java.net.URI; -import java.util.List; - @RestController public class MenuRestController { + private final MenuService menuService; public MenuRestController(final MenuService menuService) { @@ -20,18 +21,14 @@ public MenuRestController(final MenuService menuService) { } @PostMapping("/api/menus") - public ResponseEntity create(@RequestBody final Menu menu) { - final Menu created = menuService.create(menu); - final URI uri = URI.create("/api/menus/" + created.getId()); - return ResponseEntity.created(uri) - .body(created) - ; + public ResponseEntity create(@RequestBody final MenuCreateRequest menuCreateRequest) { + MenuResponse created = menuService.create(menuCreateRequest); + URI uri = URI.create("/api/menus/" + created.getId()); + return ResponseEntity.created(uri).body(created); } @GetMapping("/api/menus") - public ResponseEntity> list() { - return ResponseEntity.ok() - .body(menuService.list()) - ; + public ResponseEntity> list() { + return ResponseEntity.ok().body(menuService.list()); } } diff --git a/src/main/java/kitchenpos/ui/order/OrderRestController.java b/src/main/java/kitchenpos/ui/order/OrderRestController.java new file mode 100644 index 0000000000..dd17e35d07 --- /dev/null +++ b/src/main/java/kitchenpos/ui/order/OrderRestController.java @@ -0,0 +1,44 @@ +package kitchenpos.ui.order; + +import java.net.URI; +import java.util.List; +import kitchenpos.application.order.OrderService; +import kitchenpos.dto.order.request.OrderCreateRequest; +import kitchenpos.dto.order.request.OrderStatusChangeRequest; +import kitchenpos.dto.order.response.OrderResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class OrderRestController { + private final OrderService orderService; + + public OrderRestController(final OrderService orderService) { + this.orderService = orderService; + } + + @PostMapping("/api/orders") + public ResponseEntity create(@RequestBody final OrderCreateRequest orderCreateRequest) { + OrderResponse created = orderService.create(orderCreateRequest); + URI uri = URI.create("/api/orders/" + created.getId()); + return ResponseEntity.created(uri).body(created); + } + + @GetMapping("/api/orders") + public ResponseEntity> list() { + return ResponseEntity.ok().body(orderService.list()); + } + + @PutMapping("/api/orders/{orderId}/order-status") + public ResponseEntity changeOrderStatus( + @PathVariable final Long orderId, + @RequestBody final OrderStatusChangeRequest orderStatusChangeRequest + ) { + return ResponseEntity.ok(orderService.changeOrderStatus(orderId, orderStatusChangeRequest)); + } +} diff --git a/src/main/java/kitchenpos/ui/ProductRestController.java b/src/main/java/kitchenpos/ui/product/ProductRestController.java similarity index 50% rename from src/main/java/kitchenpos/ui/ProductRestController.java rename to src/main/java/kitchenpos/ui/product/ProductRestController.java index 36cc4314b6..cc7c9d9503 100644 --- a/src/main/java/kitchenpos/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/ui/product/ProductRestController.java @@ -1,18 +1,19 @@ -package kitchenpos.ui; +package kitchenpos.ui.product; -import kitchenpos.application.ProductService; -import kitchenpos.domain.Product; +import java.net.URI; +import java.util.List; +import kitchenpos.application.product.ProductService; +import kitchenpos.dto.product.request.ProductCreateRequest; +import kitchenpos.dto.product.response.ProductResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import java.net.URI; -import java.util.List; - @RestController public class ProductRestController { + private final ProductService productService; public ProductRestController(final ProductService productService) { @@ -20,18 +21,14 @@ public ProductRestController(final ProductService productService) { } @PostMapping("/api/products") - public ResponseEntity create(@RequestBody final Product product) { - final Product created = productService.create(product); - final URI uri = URI.create("/api/products/" + created.getId()); - return ResponseEntity.created(uri) - .body(created) - ; + public ResponseEntity create(@RequestBody final ProductCreateRequest request) { + ProductResponse response = productService.create(request); + final URI uri = URI.create("/api/products/" + response.getId()); + return ResponseEntity.created(uri).body(response); } @GetMapping("/api/products") - public ResponseEntity> list() { - return ResponseEntity.ok() - .body(productService.list()) - ; + public ResponseEntity> list() { + return ResponseEntity.ok().body(productService.list()); } } diff --git a/src/main/java/kitchenpos/ui/table/TableGroupRestController.java b/src/main/java/kitchenpos/ui/table/TableGroupRestController.java new file mode 100644 index 0000000000..13f1b7a8ed --- /dev/null +++ b/src/main/java/kitchenpos/ui/table/TableGroupRestController.java @@ -0,0 +1,36 @@ +package kitchenpos.ui.table; + +import java.net.URI; +import kitchenpos.application.table.TableGroupService; +import kitchenpos.dto.table.request.TableGroupCreateRequest; +import kitchenpos.dto.table.response.TableGroupResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class TableGroupRestController { + + private final TableGroupService tableGroupService; + + public TableGroupRestController(final TableGroupService tableGroupService) { + this.tableGroupService = tableGroupService; + } + + @PostMapping("/api/table-groups") + public ResponseEntity create( + @RequestBody final TableGroupCreateRequest tableGroupCreateRequest) { + TableGroupResponse created = tableGroupService.create(tableGroupCreateRequest); + URI uri = URI.create("/api/table-groups/" + created.getId()); + return ResponseEntity.created(uri).body(created); + } + + @DeleteMapping("/api/table-groups/{tableGroupId}") + public ResponseEntity ungroup(@PathVariable final Long tableGroupId) { + tableGroupService.ungroup(tableGroupId); + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/kitchenpos/ui/table/TableRestController.java b/src/main/java/kitchenpos/ui/table/TableRestController.java new file mode 100644 index 0000000000..925dc4510a --- /dev/null +++ b/src/main/java/kitchenpos/ui/table/TableRestController.java @@ -0,0 +1,55 @@ +package kitchenpos.ui.table; + +import java.net.URI; +import java.util.List; +import kitchenpos.application.table.TableService; +import kitchenpos.dto.table.request.NumberOfGuestsChangeRequest; +import kitchenpos.dto.table.request.OrderTableCreateRequest; +import kitchenpos.dto.table.request.TableEmptyChangeRequest; +import kitchenpos.dto.table.response.OrderTableResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class TableRestController { + + private final TableService tableService; + + public TableRestController(final TableService tableService) { + this.tableService = tableService; + } + + @PostMapping("/api/tables") + public ResponseEntity create( + @RequestBody final OrderTableCreateRequest orderTableCreateRequest) { + OrderTableResponse response = tableService.create(orderTableCreateRequest); + final URI uri = URI.create("/api/tables/" + response.getId()); + return ResponseEntity.created(uri).body(response); + } + + @GetMapping("/api/tables") + public ResponseEntity> list() { + List responses = tableService.list(); + return ResponseEntity.ok().body(responses); + } + + @PutMapping("/api/tables/{orderTableId}/empty") + public ResponseEntity changeEmpty(@PathVariable final Long orderTableId, + @RequestBody final TableEmptyChangeRequest tableEmptyChangeRequest) { + OrderTableResponse response = tableService.changeEmpty(orderTableId, tableEmptyChangeRequest.isEmpty()); + return ResponseEntity.ok().body(response); + } + + @PutMapping("/api/tables/{orderTableId}/number-of-guests") + public ResponseEntity changeNumberOfGuests(@PathVariable final Long orderTableId, + @RequestBody final NumberOfGuestsChangeRequest numberOfGuestsChangeRequest) { + OrderTableResponse response = + tableService.changeNumberOfGuests(orderTableId, numberOfGuestsChangeRequest.getNumberOfGuests()); + return ResponseEntity.ok().body(response); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 4a301293a8..0000000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE -spring.h2.console.enabled=true -spring.jpa.properties.hibernate.format_sql=true -spring.jpa.show-sql=true diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000000..0590e1c878 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,18 @@ +spring: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + format_sql: true + h2: + console: + enabled: true +logging: + level: + org: + hibernate: + type: + descriptor: + sql: TRACE diff --git a/src/main/resources/db/migration/V3__Add_MenuProduct_price.sql b/src/main/resources/db/migration/V3__Add_MenuProduct_price.sql new file mode 100644 index 0000000000..8f76fb874b --- /dev/null +++ b/src/main/resources/db/migration/V3__Add_MenuProduct_price.sql @@ -0,0 +1,5 @@ +ALTER TABLE menu_product + ADD price DECIMAL(19, 2) NOT NULL DEFAULT 0; + +UPDATE menu_product mp +SET mp.price = (SELECT price FROM product p where p.id = mp.product_id); diff --git a/src/test/java/kitchenpos/dao/DaoTest.java b/src/test/java/kitchenpos/TransactionalTest.java similarity index 51% rename from src/test/java/kitchenpos/dao/DaoTest.java rename to src/test/java/kitchenpos/TransactionalTest.java index 35b7bde63a..7b9b62f65f 100644 --- a/src/test/java/kitchenpos/dao/DaoTest.java +++ b/src/test/java/kitchenpos/TransactionalTest.java @@ -1,16 +1,20 @@ -package kitchenpos.dao; +package kitchenpos; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.FilterType; import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) -@JdbcTest(includeFilters = @Filter(type = FilterType.ANNOTATION, classes = {Repository.class})) -public @interface DaoTest { +@DataJpaTest(includeFilters = { + @Filter(type = FilterType.ANNOTATION, classes = {Repository.class, Service.class}), + @Filter(type = FilterType.REGEX, pattern = "kitchenpos.dto.*") +}) +public @interface TransactionalTest { } diff --git a/src/test/java/kitchenpos/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/application/MenuGroupServiceTest.java deleted file mode 100644 index fb5f13839e..0000000000 --- a/src/test/java/kitchenpos/application/MenuGroupServiceTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package kitchenpos.application; - -import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -import java.util.List; -import kitchenpos.domain.MenuGroup; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@ServiceTest -class MenuGroupServiceTest { - - @Autowired - private MenuGroupService menuGroupService; - - @Test - void 메뉴_그룹을_생성할_수_있다() { - MenuGroup menuGroup = 메뉴_그룹을_생성한다("메뉴 그룹"); - - MenuGroup savedMenuGroup = menuGroupService.create(menuGroup); - - assertAll( - () -> assertThat(savedMenuGroup.getId()).isNotNull(), - () -> assertThat(savedMenuGroup).usingRecursiveComparison() - .ignoringFields("id") - .isEqualTo(menuGroup) - ); - } - - @Test - void 메뉴_그룹의_목록을_조회할_수_있다() { - MenuGroup menuGroup1 = menuGroupService.create(메뉴_그룹을_생성한다("메뉴 그룹1")); - MenuGroup menuGroup2 = menuGroupService.create(메뉴_그룹을_생성한다("메뉴 그룹2")); - - List actual = menuGroupService.list(); - - assertThat(actual).hasSize(2) - .usingFieldByFieldElementComparator() - .containsExactly(menuGroup1, menuGroup2); - } -} \ No newline at end of file diff --git a/src/test/java/kitchenpos/application/MenuServiceTest.java b/src/test/java/kitchenpos/application/MenuServiceTest.java deleted file mode 100644 index 67ec4d0e3f..0000000000 --- a/src/test/java/kitchenpos/application/MenuServiceTest.java +++ /dev/null @@ -1,107 +0,0 @@ -package kitchenpos.application; - -import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; -import static kitchenpos.support.TestFixtureFactory.메뉴_상품을_생성한다; -import static kitchenpos.support.TestFixtureFactory.메뉴를_생성한다; -import static kitchenpos.support.TestFixtureFactory.상품을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - -import java.math.BigDecimal; -import java.util.List; -import kitchenpos.dao.MenuGroupDao; -import kitchenpos.dao.ProductDao; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuProduct; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@ServiceTest -class MenuServiceTest { - - @Autowired - private ProductDao productDao; - @Autowired - private MenuGroupDao menuGroupDao; - @Autowired - private MenuService menuService; - - @Test - void 메뉴를_생성할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long productId = productDao.save(상품을_생성한다("상품", new BigDecimal(1_000))) - .getId(); - MenuProduct menuProduct = 메뉴_상품을_생성한다(null, productId, 1); - Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(0), menuGroupId, List.of(menuProduct)); - - Menu savedMenu = menuService.create(menu); - - assertAll( - () -> assertThat(savedMenu.getId()).isNotNull(), - () -> assertThat(savedMenu.getPrice().compareTo(menu.getPrice())).isZero(), - () -> assertThat(savedMenu).usingRecursiveComparison() - .ignoringFields("id", "price", "menuProducts") - .isEqualTo(savedMenu), - () -> assertThat(savedMenu.getMenuProducts()).hasSize(1) - .usingElementComparatorIgnoringFields("seq") - .containsOnly(menuProduct) - ); - } - - @Test - void 메뉴_가격이_0원_미만이면_예외를_반환한다() { - Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(-1), null, null); - - assertThatThrownBy(() -> menuService.create(menu)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 메뉴_그룹이_존재하지_않으면_예외를_반환한다() { - Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(0), 0L, null); - - assertThatThrownBy(() -> menuService.create(menu)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 존재하지_않는_상품이_메뉴에_포함되어_있으면_예외를_반환한다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - MenuProduct menuProduct = 메뉴_상품을_생성한다(null, 0L, 1); - Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(2_000), menuGroupId, List.of(menuProduct)); - - assertThatThrownBy(() -> menuService.create(menu)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 메뉴_가격이_메뉴_상품_가격의_합보다_크면_예외를_반환한다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long productId = productDao.save(상품을_생성한다("상품", new BigDecimal(1_000))) - .getId(); - MenuProduct menuProduct = 메뉴_상품을_생성한다(null, productId, 1); - Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(2_000), menuGroupId, List.of(menuProduct)); - - assertThatThrownBy(() -> menuService.create(menu)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 모든_메뉴를_조회할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long productId = productDao.save(상품을_생성한다("상품", new BigDecimal(1_000))) - .getId(); - MenuProduct menuProduct = 메뉴_상품을_생성한다(null, productId, 1); - Menu menu1 = menuService.create( - 메뉴를_생성한다("메뉴1", new BigDecimal(0), menuGroupId, List.of(menuProduct))); - Menu menu2 = menuService.create( - 메뉴를_생성한다("메뉴2", new BigDecimal(0), menuGroupId, List.of(menuProduct))); - - List actual = menuService.list(); - - assertThat(actual).hasSize(2) - .usingElementComparatorIgnoringFields("price", "menuProducts") - .containsExactly(menu1, menu2); - } -} diff --git a/src/test/java/kitchenpos/application/OrderServiceTest.java b/src/test/java/kitchenpos/application/OrderServiceTest.java deleted file mode 100644 index e952a205d8..0000000000 --- a/src/test/java/kitchenpos/application/OrderServiceTest.java +++ /dev/null @@ -1,150 +0,0 @@ -package kitchenpos.application; - -import static kitchenpos.domain.OrderStatus.COMPLETION; -import static kitchenpos.domain.OrderStatus.MEAL; -import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; -import static kitchenpos.support.TestFixtureFactory.메뉴를_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문_항목을_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import kitchenpos.dao.MenuDao; -import kitchenpos.dao.MenuGroupDao; -import kitchenpos.dao.OrderTableDao; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderLineItem; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@ServiceTest -class OrderServiceTest { - - @Autowired - private MenuGroupDao menuGroupDao; - @Autowired - private MenuDao menuDao; - @Autowired - private OrderTableDao orderTableDao; - @Autowired - private OrderService orderService; - - @Test - void 주문을_생성할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(1_000), menuGroupId, null)) - .getId(); - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); - Order order = 주문을_생성한다(orderTableId, null, LocalDateTime.now(), List.of(orderLineItem)); - - Order savedOrder = orderService.create(order); - - assertAll( - () -> assertThat(savedOrder.getId()).isNotNull(), - () -> assertThat(savedOrder.getOrderStatus()).isNotNull(), - () -> assertThat(orderLineItem.getOrderId()).isEqualTo(savedOrder.getId()) - ); - } - - @Test - void 생성하려는_주문에_주문_항목이_없으면_예외를_반환한다() { - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - Order order = 주문을_생성한다(orderTableId, null, LocalDateTime.now(), List.of()); - - assertThatThrownBy(() -> orderService.create(order)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 생성하려는_주문이_속한_주문_테이블이_존재하지_않으면_예외를_반환한다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(1_000), menuGroupId, null)) - .getId(); - OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); - Order order = 주문을_생성한다(0L, null, LocalDateTime.now(), List.of(orderLineItem)); - - assertThatThrownBy(() -> orderService.create(order)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 생성하려는_주문이_속한_주문_테이블이_빈_주문_테이블이면_예외를_반환한다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(1_000), menuGroupId, null)) - .getId(); - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)) - .getId(); - OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); - Order order = 주문을_생성한다(orderTableId, null, LocalDateTime.now(), List.of(orderLineItem)); - - assertThatThrownBy(() -> orderService.create(order)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 모든_주문_목록을_조회할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(1_000), menuGroupId, null)) - .getId(); - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); - Order order1 = orderService.create(주문을_생성한다(orderTableId, null, LocalDateTime.now(), List.of(orderLineItem))); - Order order2 = orderService.create(주문을_생성한다(orderTableId, null, LocalDateTime.now(), List.of(orderLineItem))); - - List actual = orderService.list(); - - assertThat(actual).hasSize(2) - .usingElementComparatorIgnoringFields("orderLineItems") - .containsExactly(order1, order2); - } - - @Test - void 주문_상태를_변경할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(1_000), menuGroupId, null)) - .getId(); - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); - Order order = orderService.create(주문을_생성한다(orderTableId, null, LocalDateTime.now(), List.of(orderLineItem))); - order.setOrderStatus(MEAL.name()); - - Order changedOrder = orderService.changeOrderStatus(order.getId(), order); - - assertThat(changedOrder.getOrderStatus()).isEqualTo(MEAL.name()); - } - - @Test - void 상태를_변경하려는_주문이_존재하지_않으면_예외를_반환한다() { - assertThatThrownBy(() -> orderService.changeOrderStatus(0L, null)) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 상태를_변경하려는_주문이_완료된_주문이면_예외를_반환한다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(1_000), menuGroupId, null)) - .getId(); - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); - Order order = orderService.create(주문을_생성한다(orderTableId, null, LocalDateTime.now(), List.of(orderLineItem))); - order.setOrderStatus(COMPLETION.name()); - orderService.changeOrderStatus(order.getId(), order); - - assertThatThrownBy(() -> orderService.changeOrderStatus(order.getId(), order)) - .isInstanceOf(IllegalArgumentException.class); - } -} diff --git a/src/test/java/kitchenpos/application/ProductServiceTest.java b/src/test/java/kitchenpos/application/ProductServiceTest.java deleted file mode 100644 index 04bc88e182..0000000000 --- a/src/test/java/kitchenpos/application/ProductServiceTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package kitchenpos.application; - -import static kitchenpos.support.TestFixtureFactory.상품을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - -import java.math.BigDecimal; -import java.util.List; -import kitchenpos.domain.Product; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@ServiceTest -class ProductServiceTest { - - @Autowired - private ProductService productService; - - @Test - void 상품을_생성할_수_있다() { - Product product = 상품을_생성한다("상품", new BigDecimal(0)); - - Product savedProduct = productService.create(product); - - assertAll( - () -> assertThat(savedProduct.getId()).isNotNull(), - () -> assertThat(savedProduct.getName()).isEqualTo(product.getName()), - () -> assertThat(savedProduct.getPrice().compareTo(product.getPrice())).isZero() - ); - } - - @Test - void 상품_가격이_0원_미만이면_예외를_반환한다() { - Product product = 상품을_생성한다("상품", new BigDecimal(-1)); - - assertThatThrownBy(() -> productService.create(product)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 상품_목록을_조회할_수_있다() { - Product savedProduct = productService.create(상품을_생성한다("상품", new BigDecimal(0))); - - List products = productService.list(); - - assertThat(products).hasSize(1) - .usingFieldByFieldElementComparator() - .containsOnly(savedProduct); - } -} \ No newline at end of file diff --git a/src/test/java/kitchenpos/application/ServiceTest.java b/src/test/java/kitchenpos/application/ServiceTest.java deleted file mode 100644 index 95009368c6..0000000000 --- a/src/test/java/kitchenpos/application/ServiceTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package kitchenpos.application; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; - -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -@SpringBootTest -@Transactional -public @interface ServiceTest { -} diff --git a/src/test/java/kitchenpos/application/TableGroupServiceTest.java b/src/test/java/kitchenpos/application/TableGroupServiceTest.java deleted file mode 100644 index 23f4377393..0000000000 --- a/src/test/java/kitchenpos/application/TableGroupServiceTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package kitchenpos.application; - -import static kitchenpos.domain.OrderStatus.COOKING; -import static kitchenpos.support.TestFixtureFactory.단체_지정을_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -import java.time.LocalDateTime; -import java.util.List; -import kitchenpos.dao.OrderDao; -import kitchenpos.dao.OrderTableDao; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.TableGroup; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@ServiceTest -class TableGroupServiceTest { - - @Autowired - private OrderTableDao orderTableDao; - @Autowired - private OrderDao orderDao; - @Autowired - private TableGroupService tableGroupService; - - @Test - void 단체_지정을_할_수_있다() { - OrderTable orderTable1 = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)); - OrderTable orderTable2 = orderTableDao.save(주문_테이블을_생성한다(null, 2, true)); - TableGroup tableGroup = 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2)); - - TableGroup savedTableGroup = tableGroupService.create(tableGroup); - - orderTable1.setTableGroupId(savedTableGroup.getId()); - orderTable1.setEmpty(false); - orderTable2.setTableGroupId(savedTableGroup.getId()); - orderTable2.setEmpty(false); - - assertAll( - () -> assertThat(savedTableGroup.getId()).isNotNull(), - () -> assertThat(savedTableGroup).usingRecursiveComparison() - .ignoringFields("id", "orderTables") - .isEqualTo(tableGroup), - () -> assertThat(savedTableGroup.getOrderTables()) - .usingFieldByFieldElementComparator() - .containsExactly(orderTable1, orderTable2) - ); - } - - @Test - void 단체_지정하려는_테이블이_2개_미만이면_예외를_반환한다() { - OrderTable orderTable = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)); - TableGroup tableGroup = 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable)); - - assertThatThrownBy(() -> tableGroupService.create(tableGroup)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 단체_지정하려는_테이블이_존재하지_않으면_예외를_반환한다() { - OrderTable orderTable1 = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)); - OrderTable orderTable2 = 주문_테이블을_생성한다(null, 2, true); - TableGroup tableGroup = 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2)); - - assertThatThrownBy(() -> tableGroupService.create(tableGroup)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 단체_지정하려는_테이블이_빈_테이블이_아니면_예외를_반환한다() { - OrderTable orderTable1 = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)); - OrderTable orderTable2 = orderTableDao.save(주문_테이블을_생성한다(null, 2, false)); - TableGroup tableGroup = 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2)); - - assertThatThrownBy(() -> tableGroupService.create(tableGroup)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 이미_지정된_테이블을_단체_지정할_수_없다() { - OrderTable orderTable1 = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)); - OrderTable orderTable2 = orderTableDao.save(주문_테이블을_생성한다(null, 2, true)); - TableGroup tableGroup = 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2)); - tableGroupService.create(tableGroup); - - assertThatThrownBy(() -> tableGroupService.create(tableGroup)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 테이블의_단체_지정을_해제할_수_있다() { - OrderTable orderTable1 = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)); - OrderTable orderTable2 = orderTableDao.save(주문_테이블을_생성한다(null, 2, true)); - Long tableGroupId = tableGroupService.create( - 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2))).getId(); - - assertDoesNotThrow(() -> tableGroupService.ungroup(tableGroupId)); - } - - @Test - void 단체_지정하려는_테이블의_주문_목록_중_식사_중인_주문이_있을_경우_예외를_반환한다() { - OrderTable orderTable1 = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)); - OrderTable orderTable2 = orderTableDao.save(주문_테이블을_생성한다(null, 2, true)); - Long tableGroupId = tableGroupService.create( - 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2))).getId(); - orderDao.save(주문을_생성한다(orderTable1.getId(), COOKING.name(), LocalDateTime.now(), null)); - - assertThatThrownBy(() -> tableGroupService.ungroup(tableGroupId)).isInstanceOf(IllegalArgumentException.class); - } -} \ No newline at end of file diff --git a/src/test/java/kitchenpos/application/TableServiceTest.java b/src/test/java/kitchenpos/application/TableServiceTest.java deleted file mode 100644 index 4b9867e88c..0000000000 --- a/src/test/java/kitchenpos/application/TableServiceTest.java +++ /dev/null @@ -1,133 +0,0 @@ -package kitchenpos.application; - -import static kitchenpos.domain.OrderStatus.COOKING; -import static kitchenpos.domain.OrderStatus.MEAL; -import static kitchenpos.support.TestFixtureFactory.단체_지정을_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - -import java.time.LocalDateTime; -import java.util.List; -import kitchenpos.dao.OrderDao; -import kitchenpos.dao.OrderTableDao; -import kitchenpos.dao.TableGroupDao; -import kitchenpos.domain.OrderTable; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@ServiceTest -class TableServiceTest { - - @Autowired - private TableGroupDao tableGroupDao; - @Autowired - private OrderTableDao orderTableDao; - @Autowired - private OrderDao orderDao; - @Autowired - private TableService tableService; - - @Test - void 주문_테이블을_생성할_수_있다() { - OrderTable orderTable = 주문_테이블을_생성한다(null, 1, false); - - OrderTable savedOrderTable = tableService.create(orderTable); - - assertAll( - () -> assertThat(savedOrderTable.getId()).isNotNull(), - () -> assertThat(savedOrderTable).usingRecursiveComparison() - .ignoringFields("id") - .isEqualTo(orderTable) - ); - } - - @Test - void 주문_테이블_목록을_조회할_수_있다() { - OrderTable orderTable1 = tableService.create(주문_테이블을_생성한다(null, 1, false)); - OrderTable orderTable2 = tableService.create(주문_테이블을_생성한다(null, 0, true)); - - List actual = tableService.list(); - - assertThat(actual).hasSize(2) - .usingFieldByFieldElementComparator() - .containsExactly(orderTable1, orderTable2); - } - - @Test - void 주문_테이블을_빈_테이블로_변경할_수_있다() { - OrderTable orderTable = tableService.create(주문_테이블을_생성한다(null, 1, false)); - - OrderTable changedOrderTable = tableService.changeEmpty(orderTable.getId(), 주문_테이블을_생성한다(null, 1, true)); - - assertThat(changedOrderTable.isEmpty()).isTrue(); - } - - @Test - void 변경_대상_테이블이_존재하지_않으면_예외를_반환한다() { - assertThatThrownBy(() -> tableService.changeEmpty(0L, null)) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 변경_대상_테이블이_단체_지정되어_있으면_예외를_반환한다() { - OrderTable orderTable1 = tableService.create(주문_테이블을_생성한다(null, 1, true)); - OrderTable orderTable2 = tableService.create(주문_테이블을_생성한다(null, 0, true)); - orderTable1.setTableGroupId( - tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2))).getId()); - orderTableDao.save(orderTable1); - - assertThatThrownBy(() -> tableService.changeEmpty(orderTable1.getId(), orderTable1)) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 변경_대상_테이블의_주문_목록_중_식사_중인_주문이_있을_경우_예외를_반환한다() { - OrderTable orderTable = tableService.create(주문_테이블을_생성한다(null, 1, false)); - orderDao.save(주문을_생성한다(orderTable.getId(), COOKING.name(), LocalDateTime.now(), null)); - - assertThatThrownBy(() -> tableService.changeEmpty(orderTable.getId(), orderTable)) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 변경_대상_테이블의_주문_목록_중_조리_중인_주문이_있을_경우_예외를_반환한다() { - OrderTable orderTable = tableService.create(주문_테이블을_생성한다(null, 1, false)); - orderDao.save(주문을_생성한다(orderTable.getId(), MEAL.name(), LocalDateTime.now(), null)); - - assertThatThrownBy(() -> tableService.changeEmpty(orderTable.getId(), orderTable)) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 테이블의_방문한_손님_수를_변경할_수_있다() { - OrderTable orderTable = tableService.create(주문_테이블을_생성한다(null, 0, false)); - orderTable.setNumberOfGuests(1); - - tableService.changeNumberOfGuests(orderTable.getId(), orderTable); - - assertThat(orderTable.getNumberOfGuests()).isOne(); - } - - @Test - void 변경하려는_인원이_0명_미만이면_예외를_반환한다() { - assertThatThrownBy(() -> tableService.changeNumberOfGuests(1L, 주문_테이블을_생성한다(0L, -1, false))) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 인원_변경_테이블이_존재하지_않으면_예외를_반환한다() { - assertThatThrownBy(() -> tableService.changeNumberOfGuests(0L, 주문_테이블을_생성한다(0L, 1, false))) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void 인원_변경_테이블이_빈_테이블이면_예외를_반환한다() { - OrderTable orderTable = tableService.create(주문_테이블을_생성한다(null, 0, true)); - - assertThatThrownBy(() -> tableService.changeNumberOfGuests(orderTable.getId(), orderTable)) - .isInstanceOf(IllegalArgumentException.class); - } -} diff --git a/src/test/java/kitchenpos/application/menu/MenuGroupServiceTest.java b/src/test/java/kitchenpos/application/menu/MenuGroupServiceTest.java new file mode 100644 index 0000000000..8be63d22f4 --- /dev/null +++ b/src/test/java/kitchenpos/application/menu/MenuGroupServiceTest.java @@ -0,0 +1,45 @@ +package kitchenpos.application.menu; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.util.List; +import kitchenpos.TransactionalTest; +import kitchenpos.application.menu.MenuGroupService; +import kitchenpos.dto.menu.request.MenuGroupCreateRequest; +import kitchenpos.dto.menu.response.MenuGroupResponse; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@TransactionalTest +class MenuGroupServiceTest { + + @Autowired + private MenuGroupService menuGroupService; + + @Test + void 메뉴_그룹을_생성할_수_있다() { + MenuGroupCreateRequest request = new MenuGroupCreateRequest("메뉴 그룹"); + + MenuGroupResponse response = menuGroupService.create(request); + + assertAll( + () -> assertThat(response.getId()).isNotNull(), + () -> assertThat(response.getName()).isEqualTo(request.getName()) + ); + } + + @Test + void 메뉴_그룹의_목록을_조회할_수_있다() { + Long menuGroup1Id = menuGroupService.create(new MenuGroupCreateRequest("메뉴 그룹1")) + .getId(); + Long menuGroup2Id = menuGroupService.create(new MenuGroupCreateRequest("메뉴 그룹2")) + .getId(); + + List actual = menuGroupService.list(); + + assertThat(actual).hasSize(2) + .extracting("id") + .containsExactly(menuGroup1Id, menuGroup2Id); + } +} diff --git a/src/test/java/kitchenpos/application/menu/MenuServiceTest.java b/src/test/java/kitchenpos/application/menu/MenuServiceTest.java new file mode 100644 index 0000000000..a72caf7d05 --- /dev/null +++ b/src/test/java/kitchenpos/application/menu/MenuServiceTest.java @@ -0,0 +1,83 @@ +package kitchenpos.application.menu; + +import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; +import static kitchenpos.support.TestFixtureFactory.상품을_생성한다; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import kitchenpos.TransactionalTest; +import kitchenpos.domain.menu.MenuGroupRepository; +import kitchenpos.domain.product.ProductRepository; +import kitchenpos.dto.menu.request.MenuCreateRequest; +import kitchenpos.dto.menu.request.MenuProductCreateRequest; +import kitchenpos.dto.menu.response.MenuResponse; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@TransactionalTest +class MenuServiceTest { + + @Autowired + private ProductRepository productRepository; + @Autowired + private MenuGroupRepository menuGroupRepository; + @Autowired + private MenuService menuService; + + @Test + void 메뉴를_생성할_수_있다() { + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long productId = productRepository.save(상품을_생성한다("상품", BigDecimal.valueOf(1_000))) + .getId(); + MenuProductCreateRequest menuProductCreateRequest = new MenuProductCreateRequest(productId, 1); + MenuCreateRequest menuCreateRequest = new MenuCreateRequest("메뉴", BigDecimal.ZERO, menuGroupId, + List.of(menuProductCreateRequest)); + + MenuResponse menuResponse = menuService.create(menuCreateRequest); + + assertAll( + () -> assertThat(menuResponse.getId()).isNotNull(), + () -> assertThat(menuResponse.getPrice().compareTo(BigDecimal.ZERO)).isZero(), + () -> assertThat(menuResponse.getMenuProducts()).hasSize(1) + ); + } + + @Test + void 메뉴_그룹이_존재하지_않으면_예외를_반환한다() { + MenuCreateRequest request = new MenuCreateRequest("메뉴", BigDecimal.ZERO, 0L, new ArrayList<>()); + + assertThatThrownBy(() -> menuService.create(request)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 존재하지_않는_상품이_메뉴에_포함되어_있으면_예외를_반환한다() { + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + MenuProductCreateRequest menuProductRequest = new MenuProductCreateRequest(0L, 1); + MenuCreateRequest menuRequest = new MenuCreateRequest("메뉴", BigDecimal.valueOf(2_000), menuGroupId, + List.of(menuProductRequest)); + + assertThatThrownBy(() -> menuService.create(menuRequest)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 모든_메뉴를_조회할_수_있다() { + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId1 = menuService.create(new MenuCreateRequest("메뉴", BigDecimal.ZERO, menuGroupId, new ArrayList<>())) + .getId(); + Long menuId2 = menuService.create(new MenuCreateRequest("메뉴", BigDecimal.ZERO, menuGroupId, new ArrayList<>())) + .getId(); + + List actual = menuService.list(); + + assertThat(actual).hasSize(2) + .extracting("id") + .containsExactly(menuId1, menuId2); + } +} diff --git a/src/test/java/kitchenpos/application/order/OrderServiceTest.java b/src/test/java/kitchenpos/application/order/OrderServiceTest.java new file mode 100644 index 0000000000..7e6a98a8b3 --- /dev/null +++ b/src/test/java/kitchenpos/application/order/OrderServiceTest.java @@ -0,0 +1,127 @@ +package kitchenpos.application.order; + +import static kitchenpos.domain.common.OrderStatus.MEAL; +import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; +import static kitchenpos.support.TestFixtureFactory.메뉴를_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import kitchenpos.TransactionalTest; +import kitchenpos.domain.common.OrderStatus; +import kitchenpos.domain.menu.MenuGroupRepository; +import kitchenpos.domain.menu.MenuRepository; +import kitchenpos.domain.table.OrderTableRepository; +import kitchenpos.dto.order.request.OrderCreateRequest; +import kitchenpos.dto.order.request.OrderLineItemCreateRequest; +import kitchenpos.dto.order.request.OrderStatusChangeRequest; +import kitchenpos.dto.order.response.OrderResponse; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@TransactionalTest +class OrderServiceTest { + + @Autowired + private MenuGroupRepository menuGroupRepository; + @Autowired + private MenuRepository menuRepository; + @Autowired + private OrderTableRepository orderTableRepository; + @Autowired + private OrderService orderService; + + @Test + void 주문을_생성할_수_있다() { + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, new ArrayList<>())) + .getId(); + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)) + .getId(); + OrderLineItemCreateRequest orderLineItemRequest = new OrderLineItemCreateRequest(menuId, 1); + OrderCreateRequest orderRequest = new OrderCreateRequest(orderTableId, List.of(orderLineItemRequest)); + + OrderResponse orderResponse = orderService.create(orderRequest); + + assertAll( + () -> assertThat(orderResponse.getId()).isNotNull(), + () -> assertThat(orderResponse.getOrderStatus()).isEqualTo(OrderStatus.COOKING.name()) + ); + } + + @Test + void 생성하려는_주문이_속한_주문_테이블이_존재하지_않으면_예외를_반환한다() { + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, new ArrayList<>())) + .getId(); + OrderLineItemCreateRequest orderLineItemRequest = new OrderLineItemCreateRequest(menuId, 1); + OrderCreateRequest orderRequest = new OrderCreateRequest(0L, + List.of(orderLineItemRequest)); + + assertThatThrownBy(() -> orderService.create(orderRequest)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 생성하려는_주문이_속한_주문_테이블이_빈_주문_테이블이면_예외를_반환한다() { + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, new ArrayList<>())) + .getId(); + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, true)) + .getId(); + OrderLineItemCreateRequest orderLineItemRequest = new OrderLineItemCreateRequest(menuId, 1); + OrderCreateRequest orderRequest = new OrderCreateRequest(orderTableId, List.of(orderLineItemRequest)); + + assertThatThrownBy(() -> orderService.create(orderRequest)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 모든_주문_목록을_조회할_수_있다() { + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, new ArrayList<>())) + .getId(); + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)) + .getId(); + OrderLineItemCreateRequest orderLineItemRequest = new OrderLineItemCreateRequest(menuId, 1); + OrderCreateRequest orderRequest = new OrderCreateRequest(orderTableId, List.of(orderLineItemRequest)); + Long orderId = orderService.create(orderRequest) + .getId(); + + List actual = orderService.list(); + + assertThat(actual).hasSize(1) + .extracting("id") + .containsExactly(orderId); + } + + @Test + void 주문_상태를_변경할_수_있다() { + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, new ArrayList<>())) + .getId(); + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)) + .getId(); + OrderLineItemCreateRequest orderLineItemRequest = new OrderLineItemCreateRequest(menuId, 1); + OrderCreateRequest orderRequest = new OrderCreateRequest(orderTableId, List.of(orderLineItemRequest)); + Long orderId = orderService.create(orderRequest) + .getId(); + + OrderResponse changed = orderService.changeOrderStatus(orderId, new OrderStatusChangeRequest(MEAL.name())); + + assertThat(changed.getOrderStatus()).isEqualTo(MEAL.name()); + } + + @Test + void 상태를_변경하려는_주문이_존재하지_않으면_예외를_반환한다() { + assertThatThrownBy(() -> orderService.changeOrderStatus(0L, new OrderStatusChangeRequest(MEAL.name()))) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/kitchenpos/application/product/ProductServiceTest.java b/src/test/java/kitchenpos/application/product/ProductServiceTest.java new file mode 100644 index 0000000000..65e3917c99 --- /dev/null +++ b/src/test/java/kitchenpos/application/product/ProductServiceTest.java @@ -0,0 +1,40 @@ +package kitchenpos.application.product; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigDecimal; +import java.util.List; +import kitchenpos.TransactionalTest; +import kitchenpos.application.product.ProductService; +import kitchenpos.dto.product.request.ProductCreateRequest; +import kitchenpos.dto.product.response.ProductResponse; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@TransactionalTest +class ProductServiceTest { + + @Autowired + private ProductService productService; + + @Test + void 상품을_생성할_수_있다() { + ProductCreateRequest request = new ProductCreateRequest("상품", BigDecimal.ZERO); + + ProductResponse response = productService.create(request); + + assertThat(response.getId()).isNotNull(); + } + + @Test + void 상품_목록을_조회할_수_있다() { + Long productId = productService.create(new ProductCreateRequest("상품", BigDecimal.ZERO)) + .getId(); + + List actual = productService.list(); + + assertThat(actual).hasSize(1) + .extracting("id") + .containsOnly(productId); + } +} diff --git a/src/test/java/kitchenpos/application/table/TableGroupServiceTest.java b/src/test/java/kitchenpos/application/table/TableGroupServiceTest.java new file mode 100644 index 0000000000..3449754337 --- /dev/null +++ b/src/test/java/kitchenpos/application/table/TableGroupServiceTest.java @@ -0,0 +1,101 @@ +package kitchenpos.application.table; + +import static kitchenpos.domain.common.OrderStatus.COOKING; +import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; +import static kitchenpos.support.TestFixtureFactory.메뉴를_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문_항목을_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문을_생성한다; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import kitchenpos.TransactionalTest; +import kitchenpos.domain.order.OrderLineItem; +import kitchenpos.domain.table.OrderTable; +import kitchenpos.domain.menu.MenuGroupRepository; +import kitchenpos.domain.menu.MenuRepository; +import kitchenpos.domain.order.OrderRepository; +import kitchenpos.domain.table.OrderTableRepository; +import kitchenpos.dto.table.request.TableGroupCreateRequest; +import kitchenpos.dto.table.response.TableGroupResponse; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@TransactionalTest +class TableGroupServiceTest { + + @Autowired + private OrderTableRepository orderTableRepository; + @Autowired + private OrderRepository orderRepository; + @Autowired + private MenuGroupRepository menuGroupRepository; + @Autowired + private MenuRepository menuRepository; + @Autowired + private TableGroupService tableGroupService; + + @Test + void 단체_지정을_할_수_있다() { + OrderTable orderTable1 = orderTableRepository.save(주문_테이블을_생성한다(null, 1, true)); + OrderTable orderTable2 = orderTableRepository.save(주문_테이블을_생성한다(null, 2, true)); + + TableGroupCreateRequest request = new TableGroupCreateRequest(orderTable1.getId(), orderTable2.getId()); + + TableGroupResponse response = tableGroupService.create(request); + + assertAll( + () -> assertThat(response.getId()).isNotNull(), + () -> assertThat(response.getOrderTables()) + .extracting("id") + .containsExactly(orderTable1.getId(), orderTable2.getId()) + ); + } + + @Test + void 단체_지정하려는_테이블이_존재하지_않으면_예외를_반환한다() { + OrderTable orderTable = orderTableRepository.save(주문_테이블을_생성한다(null, 1, true)); + + TableGroupCreateRequest request = new TableGroupCreateRequest(orderTable.getId()); + + assertThatThrownBy(() -> tableGroupService.create(request)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 테이블의_단체_지정을_해제할_수_있다() { + OrderTable orderTable1 = orderTableRepository.save(주문_테이블을_생성한다(null, 1, true)); + OrderTable orderTable2 = orderTableRepository.save(주문_테이블을_생성한다(null, 2, true)); + + TableGroupCreateRequest request = new TableGroupCreateRequest(orderTable1.getId(), orderTable2.getId()); + + Long tableGroupId = tableGroupService.create(request) + .getId(); + + assertDoesNotThrow(() -> tableGroupService.ungroup(tableGroupId)); + } + + @Test + void 단체_지정을_해제하려는_테이블의_주문_목록_중_식사_중인_주문이_있을_경우_예외를_반환한다() { + OrderTable orderTable1 = orderTableRepository.save(주문_테이블을_생성한다(null, 1, true)); + OrderTable orderTable2 = orderTableRepository.save(주문_테이블을_생성한다(null, 2, true)); + + TableGroupCreateRequest request = new TableGroupCreateRequest(orderTable1.getId(), orderTable2.getId()); + + Long tableGroupId = tableGroupService.create(request) + .getId(); + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, List.of())) + .getId(); + OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); + orderRepository.save( + 주문을_생성한다(orderTable1.getId(), COOKING, LocalDateTime.now(), List.of(orderLineItem))); + + assertThatThrownBy(() -> tableGroupService.ungroup(tableGroupId)).isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/kitchenpos/application/table/TableServiceTest.java b/src/test/java/kitchenpos/application/table/TableServiceTest.java new file mode 100644 index 0000000000..14a6052157 --- /dev/null +++ b/src/test/java/kitchenpos/application/table/TableServiceTest.java @@ -0,0 +1,127 @@ +package kitchenpos.application.table; + +import static kitchenpos.domain.common.OrderStatus.COOKING; +import static kitchenpos.domain.common.OrderStatus.MEAL; +import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; +import static kitchenpos.support.TestFixtureFactory.메뉴를_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문_항목을_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문을_생성한다; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import kitchenpos.TransactionalTest; +import kitchenpos.domain.order.OrderLineItem; +import kitchenpos.domain.menu.MenuGroupRepository; +import kitchenpos.domain.menu.MenuRepository; +import kitchenpos.domain.order.OrderRepository; +import kitchenpos.domain.table.OrderTableRepository; +import kitchenpos.domain.table.TableGroupRepository; +import kitchenpos.dto.table.request.OrderTableCreateRequest; +import kitchenpos.dto.table.response.OrderTableResponse; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@TransactionalTest +class TableServiceTest { + + @Autowired + private TableGroupRepository tableGroupRepository; + @Autowired + private OrderTableRepository orderTableRepository; + @Autowired + private OrderRepository orderRepository; + @Autowired + private MenuGroupRepository menuGroupRepository; + @Autowired + private MenuRepository menuRepository; + @Autowired + private TableService tableService; + + @Test + void 주문_테이블을_생성할_수_있다() { + OrderTableCreateRequest request = new OrderTableCreateRequest(1, false); + + OrderTableResponse response = tableService.create(request); + + assertThat(response.getId()).isNotNull(); + } + + @Test + void 주문_테이블_목록을_조회할_수_있다() { + Long orderTableId1 = tableService.create(new OrderTableCreateRequest(0, true)) + .getId(); + Long orderTableId2 = tableService.create(new OrderTableCreateRequest(0, true)) + .getId(); + + List actual = tableService.list(); + + assertThat(actual).hasSize(2) + .extracting("id") + .containsExactly(orderTableId1, orderTableId2); + } + + @Test + void 주문_테이블을_빈_테이블로_변경할_수_있다() { + Long orderTableId = tableService.create(new OrderTableCreateRequest(1, false)) + .getId(); + + OrderTableResponse response = tableService.changeEmpty(orderTableId, true); + + assertThat(response.isEmpty()).isTrue(); + } + + @Test + void 변경_대상_테이블이_존재하지_않으면_예외를_반환한다() { + assertThatThrownBy(() -> tableService.changeEmpty(0L, true)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 변경_대상_테이블의_주문_목록_중_조리_중인_주문이_있을_경우_예외를_반환한다() { + Long orderTableId = tableService.create(new OrderTableCreateRequest(1, false)) + .getId(); + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, List.of())) + .getId(); + OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); + orderRepository.save(주문을_생성한다(orderTableId, MEAL, LocalDateTime.now(), List.of(orderLineItem))); + + assertThatThrownBy(() -> tableService.changeEmpty(orderTableId, true)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 변경_대상_테이블의_주문_목록_중_식사_중인_주문이_있을_경우_예외를_반환한다() { + Long orderTableId = tableService.create(new OrderTableCreateRequest(1, false)) + .getId(); + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, List.of())) + .getId(); + OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); + orderRepository.save(주문을_생성한다(orderTableId, COOKING, LocalDateTime.now(), List.of(orderLineItem))); + + assertThatThrownBy(() -> tableService.changeEmpty(orderTableId, true)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 테이블의_방문한_손님_수를_변경할_수_있다() { + Long orderTableId = tableService.create(new OrderTableCreateRequest(1, false)) + .getId(); + + OrderTableResponse response = tableService.changeNumberOfGuests(orderTableId, 1); + + assertThat(response.getNumberOfGuests()).isOne(); + } + + @Test + void 인원_변경_테이블이_존재하지_않으면_예외를_반환한다() { + assertThatThrownBy(() -> tableService.changeNumberOfGuests(0L, 1)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/kitchenpos/dao/MenuProductDaoTest.java b/src/test/java/kitchenpos/dao/MenuProductDaoTest.java deleted file mode 100644 index b5075070b7..0000000000 --- a/src/test/java/kitchenpos/dao/MenuProductDaoTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package kitchenpos.dao; - -import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; -import static kitchenpos.support.TestFixtureFactory.메뉴_상품을_생성한다; -import static kitchenpos.support.TestFixtureFactory.메뉴를_생성한다; -import static kitchenpos.support.TestFixtureFactory.상품을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -import java.math.BigDecimal; -import java.util.List; -import java.util.Optional; -import kitchenpos.domain.MenuProduct; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@DaoTest -class MenuProductDaoTest { - - @Autowired - private MenuGroupDao menuGroupDao; - @Autowired - private MenuDao menuDao; - @Autowired - private ProductDao productDao; - @Autowired - private MenuProductDao menuProductDao; - - @Test - void 메뉴_상품을_저장하면_seq가_채워진다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(0), menuGroupId, null)) - .getId(); - Long productId = productDao.save(상품을_생성한다("상품", new BigDecimal(0))) - .getId(); - MenuProduct menuProduct = 메뉴_상품을_생성한다(menuId, productId, 1); - - MenuProduct savedMenuProduct = menuProductDao.save(menuProduct); - - assertAll( - () -> assertThat(savedMenuProduct.getSeq()).isNotNull(), - () -> assertThat(savedMenuProduct).usingRecursiveComparison() - .ignoringFields("seq") - .isEqualTo(menuProduct) - ); - } - - @Test - void id로_메뉴를_조회할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(0), menuGroupId, null)) - .getId(); - Long productId = productDao.save(상품을_생성한다("상품", new BigDecimal(0))) - .getId(); - MenuProduct menuProduct = menuProductDao.save(메뉴_상품을_생성한다(menuId, productId, 1)); - - MenuProduct actual = menuProductDao.findById(menuProduct.getSeq()) - .orElseGet(Assertions::fail); - - assertThat(actual).usingRecursiveComparison() - .isEqualTo(menuProduct); - } - - @Test - void 없는_메뉴_상품_id로_조회하면_Optional_empty를_반환한다() { - Optional actual = menuProductDao.findById(0L); - - assertThat(actual).isEmpty(); - } - - @Test - void 모든_메뉴_상품을_조회할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId1 = menuDao.save(메뉴를_생성한다("메뉴1", new BigDecimal(0), menuGroupId, null)) - .getId(); - Long menuId2 = menuDao.save(메뉴를_생성한다("메뉴2", new BigDecimal(0), menuGroupId, null)) - .getId(); - Long productId1 = productDao.save(상품을_생성한다("상품1", new BigDecimal(0))) - .getId(); - Long productId2 = productDao.save(상품을_생성한다("상품2", new BigDecimal(0))) - .getId(); - MenuProduct menuProduct1 = menuProductDao.save(메뉴_상품을_생성한다(menuId1, productId1, 1)); - MenuProduct menuProduct2 = menuProductDao.save(메뉴_상품을_생성한다(menuId2, productId2, 2)); - - List actual = menuProductDao.findAll(); - - assertThat(actual).hasSize(2) - .usingFieldByFieldElementComparator() - .containsExactly(menuProduct1, menuProduct2); - } - - @Test - void 메뉴_id에_해당하는_모든_메뉴_상품을_조회할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId1 = menuDao.save(메뉴를_생성한다("메뉴1", new BigDecimal(0), menuGroupId, null)) - .getId(); - Long menuId2 = menuDao.save(메뉴를_생성한다("메뉴2", new BigDecimal(0), menuGroupId, null)) - .getId(); - Long productId1 = productDao.save(상품을_생성한다("상품1", new BigDecimal(0))) - .getId(); - Long productId2 = productDao.save(상품을_생성한다("상품2", new BigDecimal(0))) - .getId(); - MenuProduct menuProduct1 = menuProductDao.save(메뉴_상품을_생성한다(menuId1, productId1, 1)); - menuProductDao.save(메뉴_상품을_생성한다(menuId2, productId2, 2)); - - List actual = menuProductDao.findAllByMenuId(menuId1); - - assertThat(actual).hasSize(1) - .usingFieldByFieldElementComparator() - .containsExactly(menuProduct1); - } -} \ No newline at end of file diff --git a/src/test/java/kitchenpos/dao/OrderDaoTest.java b/src/test/java/kitchenpos/dao/OrderDaoTest.java deleted file mode 100644 index 2f562c1efd..0000000000 --- a/src/test/java/kitchenpos/dao/OrderDaoTest.java +++ /dev/null @@ -1,134 +0,0 @@ -package kitchenpos.dao; - -import static kitchenpos.domain.OrderStatus.COOKING; -import static kitchenpos.domain.OrderStatus.MEAL; -import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import kitchenpos.domain.Order; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@DaoTest -class OrderDaoTest { - - @Autowired - private OrderTableDao orderTableDao; - @Autowired - private OrderDao orderDao; - - @Test - void 주문을_저장하면_id가_채워진다() { - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - Order order = 주문을_생성한다(orderTableId, COOKING.name(), LocalDateTime.now(), null); - - Order savedOrder = orderDao.save(order); - - assertAll( - () -> assertThat(savedOrder.getId()).isNotNull(), - () -> assertThat(savedOrder).usingRecursiveComparison() - .ignoringFields("id") - .isEqualTo(order) - ); - } - - @Test - void 저장하는_주문의_id가_null이_아니면_업데이트_한다() { - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - Long orderId = orderDao.save(주문을_생성한다(orderTableId, COOKING.name(), LocalDateTime.now(), null)) - .getId(); - Order updateOrder = 주문을_생성한다(orderTableId, MEAL.name(), LocalDateTime.now(), null); - updateOrder.setId(orderId); - - Order savedOrder = orderDao.save(updateOrder); - - assertThat(savedOrder).usingRecursiveComparison() - .isEqualTo(updateOrder); - } - - @Test - void id로_주문을_조회할_수_있다() { - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - Order order = orderDao.save(주문을_생성한다(orderTableId, COOKING.name(), LocalDateTime.now(), null)); - - Order actual = orderDao.findById(order.getId()) - .orElseGet(Assertions::fail); - - assertThat(actual).usingRecursiveComparison() - .isEqualTo(order); - } - - @Test - void 없는_id로_주문을_조회하면_Optional_empty를_반환한다() { - Optional actual = orderDao.findById(0L); - - assertThat(actual).isEmpty(); - } - - @Test - void 모든_주문을_조회할_수_있다() { - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - Order order1 = orderDao.save(주문을_생성한다(orderTableId, COOKING.name(), LocalDateTime.now(), null)); - Order order2 = orderDao.save(주문을_생성한다(orderTableId, MEAL.name(), LocalDateTime.now(), null)); - - List actual = orderDao.findAll(); - - assertThat(actual).hasSize(2) - .usingFieldByFieldElementComparator() - .containsExactly(order1, order2); - } - - @Test - void 주문_테이블에_해당하고_주문_상태_목록에_있는_주문이_있으면_true를_반환한다() { - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - orderDao.save(주문을_생성한다(orderTableId, COOKING.name(), LocalDateTime.now(), null)); - - boolean actual = orderDao.existsByOrderTableIdAndOrderStatusIn(orderTableId, List.of(COOKING.name())); - - assertThat(actual).isTrue(); - } - - @Test - void 주문_테이블에_해당하고_주문_상태_목록에_있는_주문이_없으면_false를_반환한다() { - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - - boolean actual = orderDao.existsByOrderTableIdAndOrderStatusIn(orderTableId, List.of(COOKING.name())); - - assertThat(actual).isFalse(); - } - - @Test - void 주문_테이블_목록에_있으면서_주문_상태_목록에_있는_주문이_있으면_true를_반환한다() { - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - orderDao.save(주문을_생성한다(orderTableId, COOKING.name(), LocalDateTime.now(), null)); - - boolean actual = orderDao.existsByOrderTableIdInAndOrderStatusIn(List.of(orderTableId), - List.of(COOKING.name())); - - assertThat(actual).isTrue(); - } - - @Test - void 주문_테이블_목록에_있으면서_주문_상태_목록에_있는_주문이_없으면_false를_반환한다() { - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, false)) - .getId(); - - boolean actual = orderDao.existsByOrderTableIdInAndOrderStatusIn(List.of(orderTableId), - List.of(COOKING.name())); - - assertThat(actual).isFalse(); - } -} \ No newline at end of file diff --git a/src/test/java/kitchenpos/dao/OrderLineItemDaoTest.java b/src/test/java/kitchenpos/dao/OrderLineItemDaoTest.java deleted file mode 100644 index eba50c2b8f..0000000000 --- a/src/test/java/kitchenpos/dao/OrderLineItemDaoTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package kitchenpos.dao; - -import static kitchenpos.domain.OrderStatus.COOKING; -import static kitchenpos.domain.OrderStatus.MEAL; -import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; -import static kitchenpos.support.TestFixtureFactory.메뉴를_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문_항목을_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import kitchenpos.domain.OrderLineItem; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@DaoTest -class OrderLineItemDaoTest { - - @Autowired - private MenuGroupDao menuGroupDao; - @Autowired - private MenuDao menuDao; - @Autowired - private OrderTableDao orderTableDao; - @Autowired - private OrderDao orderDao; - @Autowired - private OrderLineItemDao orderLineItemDao; - - @Test - void 주문_항목을_저장하면_id가_채워진다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(1_000), menuGroupId, null)) - .getId(); - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)) - .getId(); - Long orderId = orderDao.save(주문을_생성한다(orderTableId, COOKING.name(), LocalDateTime.now(), null)) - .getId(); - OrderLineItem orderLineItem = 주문_항목을_생성한다(orderId, menuId, 1); - - OrderLineItem savedOrderLineItem = orderLineItemDao.save(orderLineItem); - - assertAll( - () -> assertThat(savedOrderLineItem.getSeq()).isNotNull(), - () -> assertThat(savedOrderLineItem).usingRecursiveComparison() - .ignoringFields("seq") - .isEqualTo(orderLineItem) - ); - } - - @Test - void id로_주문_항목을_조회할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(1_000), menuGroupId, null)) - .getId(); - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)) - .getId(); - Long orderId = orderDao.save(주문을_생성한다(orderTableId, COOKING.name(), LocalDateTime.now(), null)) - .getId(); - OrderLineItem orderLineItem = orderLineItemDao.save(주문_항목을_생성한다(orderId, menuId, 1)); - - OrderLineItem actual = orderLineItemDao.findById(orderLineItem.getSeq()) - .orElseGet(Assertions::fail); - - assertThat(actual).usingRecursiveComparison() - .isEqualTo(orderLineItem); - } - - @Test - void 없는_id로_주문_항목을_조회하면_Optional_empty를_반환한다() { - Optional actual = orderLineItemDao.findById(0L); - - assertThat(actual).isEmpty(); - } - - @Test - void 모든_주문_항목을_조회할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(1_000), menuGroupId, null)) - .getId(); - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)) - .getId(); - Long orderId = orderDao.save(주문을_생성한다(orderTableId, COOKING.name(), LocalDateTime.now(), null)) - .getId(); - OrderLineItem orderLineItem1 = orderLineItemDao.save(주문_항목을_생성한다(orderId, menuId, 1)); - OrderLineItem orderLineItem2 = orderLineItemDao.save(주문_항목을_생성한다(orderId, menuId, 2)); - - List actual = orderLineItemDao.findAll(); - - assertThat(actual).hasSize(2) - .usingFieldByFieldElementComparator() - .containsExactly(orderLineItem1, orderLineItem2); - } - - @Test - void 주문에_포함된_주문_항목을_조회할_수_있다() { - Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")) - .getId(); - Long menuId = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(1_000), menuGroupId, null)) - .getId(); - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(null, 1, true)) - .getId(); - Long orderId1 = orderDao.save(주문을_생성한다(orderTableId, COOKING.name(), LocalDateTime.now(), null)) - .getId(); - Long orderId2 = orderDao.save(주문을_생성한다(orderTableId, MEAL.name(), LocalDateTime.now(), null)) - .getId(); - OrderLineItem orderLineItem = orderLineItemDao.save(주문_항목을_생성한다(orderId1, menuId, 1)); - orderLineItemDao.save(주문_항목을_생성한다(orderId2, menuId, 1)); - - List actual = orderLineItemDao.findAllByOrderId(orderId1); - - assertThat(actual).hasSize(1) - .usingFieldByFieldElementComparator() - .containsExactly(orderLineItem); - } -} \ No newline at end of file diff --git a/src/test/java/kitchenpos/dao/OrderTableDaoTest.java b/src/test/java/kitchenpos/dao/OrderTableDaoTest.java deleted file mode 100644 index af84822f68..0000000000 --- a/src/test/java/kitchenpos/dao/OrderTableDaoTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package kitchenpos.dao; - -import static kitchenpos.support.TestFixtureFactory.단체_지정을_생성한다; -import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import kitchenpos.domain.OrderTable; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@DaoTest -class OrderTableDaoTest { - - @Autowired - private TableGroupDao tableGroupDao; - @Autowired - private OrderTableDao orderTableDao; - - @Test - void 주문_테이블을_저장하면_id가_채워진다() { - Long tableGroupId = tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), null)) - .getId(); - OrderTable orderTable = 주문_테이블을_생성한다(tableGroupId, 0, true); - - OrderTable savedOrderTable = orderTableDao.save(orderTable); - - assertAll( - () -> assertThat(savedOrderTable.getId()).isNotNull(), - () -> assertThat(savedOrderTable).usingRecursiveComparison() - .ignoringFields("id") - .isEqualTo(orderTable) - ); - } - - @Test - void 저장하는_주문_테이블의_id가_null이_아니면_업데이트한다() { - Long tableGroupId = tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), null)) - .getId(); - Long orderTableId = orderTableDao.save(주문_테이블을_생성한다(tableGroupId, 0, true)) - .getId(); - OrderTable updateOrderTable = 주문_테이블을_생성한다(tableGroupId, 1, false); - updateOrderTable.setId(orderTableId); - - OrderTable savedOrderTable = orderTableDao.save(updateOrderTable); - - assertThat(savedOrderTable).usingRecursiveComparison() - .isEqualTo(updateOrderTable); - } - - @Test - void 단체_지정_id는_null일_수_있다() { - OrderTable orderTable = 주문_테이블을_생성한다(null, 0, true); - - assertDoesNotThrow(() -> orderTableDao.save(orderTable)); - } - - @Test - void id로_주문_테이블을_조회할_수_있다() { - Long tableGroupId = tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), null)) - .getId(); - OrderTable orderTable = orderTableDao.save(주문_테이블을_생성한다(tableGroupId, 0, true)); - - OrderTable actual = orderTableDao.findById(orderTable.getId()) - .orElseGet(Assertions::fail); - - assertThat(actual).usingRecursiveComparison() - .isEqualTo(orderTable); - } - - @Test - void 없는_id로_주문_테이블을_조회하면_Optional_empty를_반환한다() { - Optional actual = orderTableDao.findById(0L); - - assertThat(actual).isEmpty(); - } - - @Test - void 모든_주문_테이블을_조회할_수_있다() { - Long tableGroupId = tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), null)) - .getId(); - OrderTable orderTable1 = orderTableDao.save(주문_테이블을_생성한다(tableGroupId, 0, true)); - OrderTable orderTable2 = orderTableDao.save(주문_테이블을_생성한다(tableGroupId, 1, false)); - - List actual = orderTableDao.findAll(); - - assertThat(actual).hasSize(2) - .usingFieldByFieldElementComparator() - .containsExactly(orderTable1, orderTable2); - } - - @Test - void id_목록에_있는_주문_테이블을_조회할_수_있다() { - Long tableGroupId = tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), null)) - .getId(); - OrderTable orderTable1 = orderTableDao.save(주문_테이블을_생성한다(tableGroupId, 0, true)); - orderTableDao.save(주문_테이블을_생성한다(tableGroupId, 1, false)); - List ids = List.of(orderTable1.getId()); - - List actual = orderTableDao.findAllByIdIn(ids); - - assertThat(actual).hasSize(1) - .usingFieldByFieldElementComparator() - .containsExactly(orderTable1); - } - - @Test - void 단체_지정_id로_주문_테이블을_조회할_수_있다() { - Long tableGroupId1 = tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), null)) - .getId(); - Long tableGroupId2 = tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), null)) - .getId(); - OrderTable orderTable1 = orderTableDao.save(주문_테이블을_생성한다(tableGroupId1, 0, true)); - orderTableDao.save(주문_테이블을_생성한다(tableGroupId2, 0, true)); - - List actual = orderTableDao.findAllByTableGroupId(tableGroupId1); - - assertThat(actual).hasSize(1) - .usingFieldByFieldElementComparator() - .containsExactly(orderTable1); - } -} \ No newline at end of file diff --git a/src/test/java/kitchenpos/dao/TableGroupDaoTest.java b/src/test/java/kitchenpos/dao/TableGroupDaoTest.java deleted file mode 100644 index 2fdeb61f60..0000000000 --- a/src/test/java/kitchenpos/dao/TableGroupDaoTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package kitchenpos.dao; - -import static kitchenpos.support.TestFixtureFactory.단체_지정을_생성한다; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import kitchenpos.domain.TableGroup; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@DaoTest -class TableGroupDaoTest { - - @Autowired - private TableGroupDao tableGroupDao; - - @Test - void 단체_지정을_저장_하면_id가_채워진다() { - TableGroup tableGroup = 단체_지정을_생성한다(LocalDateTime.now(), null); - - TableGroup savedTableGroup = tableGroupDao.save(tableGroup); - - assertAll( - () -> assertThat(savedTableGroup.getId()).isNotNull(), - () -> assertThat(savedTableGroup).usingRecursiveComparison() - .ignoringFields("id") - .isEqualTo(tableGroup) - ); - } - - @Test - void id로_단체_지정을_조회할_수_있다() { - TableGroup tableGroup = tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), null)); - - TableGroup actual = tableGroupDao.findById(tableGroup.getId()) - .orElseGet(Assertions::fail); - - assertThat(actual).usingRecursiveComparison() - .isEqualTo(tableGroup); - } - - @Test - void 없는_id로_단체_지정을_조회하면_Optional_empty를_반환한다() { - Optional actual = tableGroupDao.findById(0L); - - assertThat(actual).isEmpty(); - } - - @Test - void 모든_단체_지정을_조회할_수_있다() { - TableGroup tableGroup1 = tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), null)); - TableGroup tableGroup2 = tableGroupDao.save(단체_지정을_생성한다(LocalDateTime.now(), null)); - - List actual = tableGroupDao.findAll(); - - assertThat(actual).hasSize(2) - .usingFieldByFieldElementComparator() - .containsExactly(tableGroup1, tableGroup2); - } -} \ No newline at end of file diff --git a/src/test/java/kitchenpos/domain/common/NumberOfGuestsTest.java b/src/test/java/kitchenpos/domain/common/NumberOfGuestsTest.java new file mode 100644 index 0000000000..91f37c6b0f --- /dev/null +++ b/src/test/java/kitchenpos/domain/common/NumberOfGuestsTest.java @@ -0,0 +1,13 @@ +package kitchenpos.domain.common; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +class NumberOfGuestsTest { + + @Test + void 인원_수는_음수일_수_없다() { + assertThatThrownBy(() -> new NumberOfGuests(-1)).isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/kitchenpos/domain/common/OrderTest.java b/src/test/java/kitchenpos/domain/common/OrderTest.java new file mode 100644 index 0000000000..b5f4d7ae83 --- /dev/null +++ b/src/test/java/kitchenpos/domain/common/OrderTest.java @@ -0,0 +1,28 @@ +package kitchenpos.domain.common; + +import static kitchenpos.domain.common.OrderStatus.COMPLETION; +import static kitchenpos.domain.common.OrderStatus.COOKING; +import static kitchenpos.domain.common.OrderStatus.MEAL; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.time.LocalDateTime; +import java.util.List; +import kitchenpos.domain.order.Order; +import kitchenpos.domain.order.OrderLineItem; +import org.junit.jupiter.api.Test; + +class OrderTest { + + @Test + void 주문_항목이_하나_이상_있어야_한다() { + assertThatThrownBy(() -> new Order(null, 1L, COOKING, LocalDateTime.now(), List.of())) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 주문_상태가_완료인_주문의_상태는_변경할_수_없다() { + OrderLineItem orderLineItem = new OrderLineItem(null, null, 1L, 1); + Order order = new Order(null, 1L, COMPLETION, LocalDateTime.now(), List.of(orderLineItem)); + assertThatThrownBy(() -> order.changeOrderStatus(MEAL.name())).isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/kitchenpos/domain/common/PriceTest.java b/src/test/java/kitchenpos/domain/common/PriceTest.java new file mode 100644 index 0000000000..de4ebd8bae --- /dev/null +++ b/src/test/java/kitchenpos/domain/common/PriceTest.java @@ -0,0 +1,58 @@ +package kitchenpos.domain.common; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.math.BigDecimal; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class PriceTest { + + @Test + void 가격은_음수일_수_없다() { + assertThatThrownBy(() -> new Price(BigDecimal.valueOf(-1))).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 가격_동등_비교가_가능하다() { + Price price1 = new Price(BigDecimal.ONE); + Price price2 = new Price(BigDecimal.ZERO); + + boolean actual = price1.equals(price2); + + assertThat(actual).isFalse(); + } + + @Test + void 가격의_합연산을_할_수_있다() { + Price price1 = new Price(BigDecimal.ONE); + Price price2 = new Price(BigDecimal.ONE); + + Price sum = price1.add(price2); + + assertThat(sum).isEqualTo(new Price(BigDecimal.valueOf(2))); + } + + @Test + void 가격의_곱연산을_할_수_있다() { + Price price = new Price(BigDecimal.valueOf(2)); + long times = 5; + + Price multiple = price.multiply(times); + + assertThat(multiple).isEqualTo(new Price(BigDecimal.TEN)); + } + + @ParameterizedTest + @CsvSource(value = {"0,true", "1,false"}) + void 가격이_더_비싼지_판정할_수_있다(final long value, final boolean expected) { + Price price1 = new Price(BigDecimal.ONE); + Price price2 = new Price(BigDecimal.valueOf(value)); + + boolean actual = price1.isExpensiveThan(price2); + + assertThat(actual).isEqualTo(expected); + } +} diff --git a/src/test/java/kitchenpos/dao/MenuGroupDaoTest.java b/src/test/java/kitchenpos/domain/menu/MenuGroupRepositoryTest.java similarity index 52% rename from src/test/java/kitchenpos/dao/MenuGroupDaoTest.java rename to src/test/java/kitchenpos/domain/menu/MenuGroupRepositoryTest.java index bfe1bb39f2..b574c2dd2d 100644 --- a/src/test/java/kitchenpos/dao/MenuGroupDaoTest.java +++ b/src/test/java/kitchenpos/domain/menu/MenuGroupRepositoryTest.java @@ -1,4 +1,4 @@ -package kitchenpos.dao; +package kitchenpos.domain.menu; import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; import static org.assertj.core.api.Assertions.assertThat; @@ -6,74 +6,72 @@ import java.util.List; import java.util.Optional; -import kitchenpos.domain.MenuGroup; +import kitchenpos.TransactionalTest; +import kitchenpos.domain.menu.MenuGroup; +import kitchenpos.domain.menu.MenuGroupRepository; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -@DaoTest -class MenuGroupDaoTest { +@TransactionalTest +class MenuGroupRepositoryTest { @Autowired - private MenuGroupDao menuGroupDao; + private MenuGroupRepository menuGroupRepository; @Test void 메뉴_그룹을_저장하면_id값이_채워진다() { MenuGroup menuGroup = 메뉴_그룹을_생성한다("메뉴 그룹"); - MenuGroup savedMenuGroup = menuGroupDao.save(menuGroup); + MenuGroup savedMenuGroup = menuGroupRepository.save(menuGroup); assertAll( - () -> assertThat(savedMenuGroup).usingRecursiveComparison() - .ignoringFields("id") - .isEqualTo(menuGroup), + () -> assertThat(savedMenuGroup).isEqualTo(menuGroup), () -> assertThat(savedMenuGroup.getId()).isNotNull() ); } @Test void 메뉴_그룹을_id로_조회할_수_있다() { - MenuGroup menuGroup = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")); + MenuGroup menuGroup = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")); - MenuGroup actual = menuGroupDao.findById(menuGroup.getId()) + MenuGroup actual = menuGroupRepository.findById(menuGroup.getId()) .orElseGet(Assertions::fail); - assertThat(actual).usingRecursiveComparison() - .isEqualTo(menuGroup); + assertThat(actual).isEqualTo(menuGroup); } @Test void 없는_메뉴_그룹_id로_조회하면_Optional_empty를_반환한다() { - Optional actual = menuGroupDao.findById(0L); + Optional actual = menuGroupRepository.findById(0L); assertThat(actual).isEmpty(); } @Test void 모든_메뉴그룹을_조회할_수_있다() { - MenuGroup menuGroup1 = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹1")); - MenuGroup menuGroup2 = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹2")); + MenuGroup menuGroup1 = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹1")); + MenuGroup menuGroup2 = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹2")); - List actual = menuGroupDao.findAll(); + List actual = menuGroupRepository.findAll(); assertThat(actual).hasSize(2) - .usingFieldByFieldElementComparator() .containsExactly(menuGroup1, menuGroup2); } @Test void 메뉴_그룹이_존재하면_true를_반환한다() { - MenuGroup menuGroup = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")); + MenuGroup menuGroup = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")); - boolean actual = menuGroupDao.existsById(menuGroup.getId()); + boolean actual = menuGroupRepository.existsById(menuGroup.getId()); assertThat(actual).isTrue(); } @Test void 메뉴_그룹이_존재하지_않으면_false를_반환한다() { - boolean actual = menuGroupDao.existsById(0L); + boolean actual = menuGroupRepository.existsById(0L); assertThat(actual).isFalse(); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/domain/menu/MenuProductTest.java b/src/test/java/kitchenpos/domain/menu/MenuProductTest.java new file mode 100644 index 0000000000..86591e7c7e --- /dev/null +++ b/src/test/java/kitchenpos/domain/menu/MenuProductTest.java @@ -0,0 +1,20 @@ +package kitchenpos.domain.menu; + +import static kitchenpos.support.TestFixtureFactory.메뉴_상품을_생성한다; +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigDecimal; +import kitchenpos.domain.common.Price; +import org.junit.jupiter.api.Test; + +class MenuProductTest { + + @Test + void 금액을_계산할_수_있다() { + MenuProduct menuProduct = 메뉴_상품을_생성한다(1L, 10, new Price(BigDecimal.ONE)); + + Price amount = menuProduct.getAmount(); + + assertThat(amount).isEqualTo(new Price(BigDecimal.TEN)); + } +} diff --git a/src/test/java/kitchenpos/dao/MenuDaoTest.java b/src/test/java/kitchenpos/domain/menu/MenuRepositoryTest.java similarity index 57% rename from src/test/java/kitchenpos/dao/MenuDaoTest.java rename to src/test/java/kitchenpos/domain/menu/MenuRepositoryTest.java index 61b075a55b..7638927a58 100644 --- a/src/test/java/kitchenpos/dao/MenuDaoTest.java +++ b/src/test/java/kitchenpos/domain/menu/MenuRepositoryTest.java @@ -1,4 +1,4 @@ -package kitchenpos.dao; +package kitchenpos.domain.menu; import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; import static kitchenpos.support.TestFixtureFactory.메뉴를_생성한다; @@ -6,31 +6,35 @@ import static org.junit.jupiter.api.Assertions.assertAll; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; import java.util.Optional; -import kitchenpos.domain.Menu; +import kitchenpos.TransactionalTest; +import kitchenpos.domain.menu.Menu; +import kitchenpos.domain.menu.MenuGroupRepository; +import kitchenpos.domain.menu.MenuRepository; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -@DaoTest -class MenuDaoTest { +@TransactionalTest +class MenuRepositoryTest { @Autowired - private MenuGroupDao menuGroupDao; + private MenuGroupRepository menuGroupDao; @Autowired - private MenuDao menuDao; + private MenuRepository menuRepository; @Test void 메뉴를_저장하면_id가_채워진다() { Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")).getId(); - Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(0), menuGroupId, null); + Menu menu = 메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, new ArrayList<>()); - Menu savedMenu = menuDao.save(menu); + Menu savedMenu = menuRepository.save(menu); assertAll( () -> assertThat(savedMenu.getId()).isNotNull(), - () -> assertThat(savedMenu.getPrice().compareTo(menu.getPrice())).isZero(), + () -> assertThat(savedMenu.getPrice()).isEqualTo(menu.getPrice()), () -> assertThat(savedMenu).usingRecursiveComparison() .ignoringFields("id", "price") .isEqualTo(menu) @@ -40,13 +44,13 @@ class MenuDaoTest { @Test void id로_메뉴를_조회할_수_있다() { Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")).getId(); - Menu menu = menuDao.save(메뉴를_생성한다("메뉴", new BigDecimal(0), menuGroupId, null)); + Menu menu = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, new ArrayList<>())); - Menu actual = menuDao.findById(menu.getId()) + Menu actual = menuRepository.findById(menu.getId()) .orElseGet(Assertions::fail); assertAll( - () -> assertThat(actual.getPrice().compareTo(menu.getPrice())).isZero(), + () -> assertThat(actual.getPrice()).isEqualTo(menu.getPrice()), () -> assertThat(actual).usingRecursiveComparison() .ignoringFields("price") .isEqualTo(menu) @@ -55,7 +59,7 @@ class MenuDaoTest { @Test void 없는_메뉴_id로_조회하면_Optional_empty를_반환한다() { - Optional actual = menuDao.findById(0L); + Optional actual = menuRepository.findById(0L); assertThat(actual).isEmpty(); } @@ -63,10 +67,10 @@ class MenuDaoTest { @Test void 모든_메뉴를_조회할_수_있다() { Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")).getId(); - Menu menu1 = menuDao.save(메뉴를_생성한다("메뉴1", new BigDecimal(0), menuGroupId, null)); - Menu menu2 = menuDao.save(메뉴를_생성한다("메뉴2", new BigDecimal(0), menuGroupId, null)); + Menu menu1 = menuRepository.save(메뉴를_생성한다("메뉴1", BigDecimal.ZERO, menuGroupId, new ArrayList<>())); + Menu menu2 = menuRepository.save(메뉴를_생성한다("메뉴2", BigDecimal.ZERO, menuGroupId, new ArrayList<>())); - List actual = menuDao.findAll(); + List actual = menuRepository.findAll(); assertThat(actual).hasSize(2) .usingElementComparatorIgnoringFields("price") @@ -76,12 +80,12 @@ class MenuDaoTest { @Test void id_목록에_있는_메뉴의_개수를_셀_수_있다() { Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹")).getId(); - Menu menu1 = menuDao.save(메뉴를_생성한다("메뉴1", new BigDecimal(0), menuGroupId, null)); - Menu menu2 = menuDao.save(메뉴를_생성한다("메뉴2", new BigDecimal(0), menuGroupId, null)); + Menu menu1 = menuRepository.save(메뉴를_생성한다("메뉴1", BigDecimal.ZERO, menuGroupId, new ArrayList<>())); + Menu menu2 = menuRepository.save(메뉴를_생성한다("메뉴2", BigDecimal.ZERO, menuGroupId, new ArrayList<>())); List ids = List.of(menu1.getId(), menu2.getId()); - long count = menuDao.countByIdIn(ids); + long count = menuRepository.countByIdIn(ids); assertThat(count).isEqualTo(ids.size()); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/domain/menu/MenuTest.java b/src/test/java/kitchenpos/domain/menu/MenuTest.java new file mode 100644 index 0000000000..472192cb61 --- /dev/null +++ b/src/test/java/kitchenpos/domain/menu/MenuTest.java @@ -0,0 +1,28 @@ +package kitchenpos.domain.menu; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.math.BigDecimal; +import java.util.List; +import kitchenpos.domain.common.Price; +import org.junit.jupiter.api.Test; + +class MenuTest { + + @Test + void 메뉴를_생성하면_메뉴_상품에_메뉴를_매핑한다() { + MenuProduct menuProduct = new MenuProduct(null, null, 1L, 1, new Price(BigDecimal.ZERO)); + + Menu menu = new Menu(null, "메뉴", new Price(BigDecimal.ZERO), 1L, List.of(menuProduct)); + + assertThat(menuProduct.getMenu()).isEqualTo(menu); + } + + @Test + void 가격이_메뉴_상품_가격의_총합보다_비싸면_예외를_반환한다() { + MenuProduct menuProduct = new MenuProduct(null, null, 1L, 1, new Price(BigDecimal.ZERO)); + assertThatThrownBy(() -> new Menu(null, "메뉴", new Price(BigDecimal.ONE), 1L, List.of(menuProduct))) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/kitchenpos/domain/order/OrderRepositoryTest.java b/src/test/java/kitchenpos/domain/order/OrderRepositoryTest.java new file mode 100644 index 0000000000..fe6c9171eb --- /dev/null +++ b/src/test/java/kitchenpos/domain/order/OrderRepositoryTest.java @@ -0,0 +1,159 @@ +package kitchenpos.domain.order; + +import static kitchenpos.domain.common.OrderStatus.COOKING; +import static kitchenpos.domain.common.OrderStatus.MEAL; +import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다; +import static kitchenpos.support.TestFixtureFactory.메뉴를_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문_항목을_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문을_생성한다; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import kitchenpos.TransactionalTest; +import kitchenpos.domain.menu.MenuGroupRepository; +import kitchenpos.domain.menu.MenuRepository; +import kitchenpos.domain.table.OrderTableRepository; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@TransactionalTest +class OrderRepositoryTest { + + @Autowired + private OrderTableRepository orderTableRepository; + @Autowired + private OrderRepository orderRepository; + @Autowired + private MenuGroupRepository menuGroupRepository; + @Autowired + private MenuRepository menuRepository; + + @Test + void 주문을_저장하면_id가_채워진다() { + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)) + .getId(); + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, List.of())) + .getId(); + OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); + Order order = 주문을_생성한다(orderTableId, COOKING, LocalDateTime.now(), List.of(orderLineItem)); + + Order savedOrder = orderRepository.save(order); + + assertAll( + () -> assertThat(savedOrder.getId()).isNotNull(), + () -> assertThat(savedOrder).usingRecursiveComparison() + .ignoringFields("id") + .isEqualTo(order) + ); + } + + @Test + void id로_주문을_조회할_수_있다() { + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)) + .getId(); + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, List.of())) + .getId(); + OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); + Order order = orderRepository + .save(주문을_생성한다(orderTableId, COOKING, LocalDateTime.now(), List.of(orderLineItem))); + + Order actual = orderRepository.findById(order.getId()) + .orElseGet(Assertions::fail); + + assertThat(actual).usingRecursiveComparison() + .isEqualTo(order); + } + + @Test + void 없는_id로_주문을_조회하면_Optional_empty를_반환한다() { + Optional actual = orderRepository.findById(0L); + + assertThat(actual).isEmpty(); + } + + @Test + void 모든_주문을_조회할_수_있다() { + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)) + .getId(); + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, List.of())) + .getId(); + OrderLineItem orderLineItem1 = 주문_항목을_생성한다(null, menuId, 1); + OrderLineItem orderLineItem2 = 주문_항목을_생성한다(null, menuId, 1); + Order order1 = orderRepository.save( + 주문을_생성한다(orderTableId, COOKING, LocalDateTime.now(), List.of(orderLineItem1))); + Order order2 = orderRepository.save( + 주문을_생성한다(orderTableId, MEAL, LocalDateTime.now(), List.of(orderLineItem2))); + + List actual = orderRepository.findAll(); + + assertThat(actual).hasSize(2) + .usingFieldByFieldElementComparator() + .containsExactly(order1, order2); + } + + @Test + void 주문_테이블에_해당하고_주문_상태_목록에_있는_주문이_있으면_true를_반환한다() { + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)) + .getId(); + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, List.of())) + .getId(); + OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); + orderRepository.save(주문을_생성한다(orderTableId, COOKING, LocalDateTime.now(), List.of(orderLineItem))); + + boolean actual = orderRepository.existsByOrderTableIdAndOrderStatusIn(orderTableId, List.of(COOKING)); + + assertThat(actual).isTrue(); + } + + @Test + void 주문_테이블에_해당하고_주문_상태_목록에_있는_주문이_없으면_false를_반환한다() { + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)) + .getId(); + + boolean actual = orderRepository.existsByOrderTableIdAndOrderStatusIn(orderTableId, List.of(COOKING)); + + assertThat(actual).isFalse(); + } + + @Test + void 주문_테이블_목록에_있으면서_주문_상태_목록에_있는_주문이_있으면_true를_반환한다() { + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)) + .getId(); + Long menuGroupId = menuGroupRepository.save(메뉴_그룹을_생성한다("메뉴 그룹")) + .getId(); + Long menuId = menuRepository.save(메뉴를_생성한다("메뉴", BigDecimal.ZERO, menuGroupId, List.of())) + .getId(); + OrderLineItem orderLineItem = 주문_항목을_생성한다(null, menuId, 1); + orderRepository.save(주문을_생성한다(orderTableId, COOKING, LocalDateTime.now(), List.of(orderLineItem))); + + boolean actual = orderRepository.existsByOrderTableIdInAndOrderStatusIn(List.of(orderTableId), + List.of(COOKING)); + + assertThat(actual).isTrue(); + } + + @Test + void 주문_테이블_목록에_있으면서_주문_상태_목록에_있는_주문이_없으면_false를_반환한다() { + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)) + .getId(); + + boolean actual = orderRepository.existsByOrderTableIdInAndOrderStatusIn(List.of(orderTableId), + List.of(COOKING)); + + assertThat(actual).isFalse(); + } +} diff --git a/src/test/java/kitchenpos/dao/ProductDaoTest.java b/src/test/java/kitchenpos/domain/product/ProductRepositoryTest.java similarity index 76% rename from src/test/java/kitchenpos/dao/ProductDaoTest.java rename to src/test/java/kitchenpos/domain/product/ProductRepositoryTest.java index ddaa578edf..b6e0572626 100644 --- a/src/test/java/kitchenpos/dao/ProductDaoTest.java +++ b/src/test/java/kitchenpos/domain/product/ProductRepositoryTest.java @@ -1,4 +1,4 @@ -package kitchenpos.dao; +package kitchenpos.domain.product; import static kitchenpos.support.TestFixtureFactory.상품을_생성한다; import static org.assertj.core.api.Assertions.assertThat; @@ -7,33 +7,35 @@ import java.math.BigDecimal; import java.util.List; import java.util.Optional; -import kitchenpos.domain.Product; +import kitchenpos.TransactionalTest; +import kitchenpos.domain.product.Product; +import kitchenpos.domain.product.ProductRepository; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -@DaoTest -class ProductDaoTest { +@TransactionalTest +class ProductRepositoryTest { @Autowired - private ProductDao productDao; + private ProductRepository productDao; @Test void 상품을_저장하면_id값이_채워진다() { - Product product = 상품을_생성한다("상품", new BigDecimal(0)); + Product product = 상품을_생성한다("상품", BigDecimal.ZERO); Product savedProduct = productDao.save(product); assertAll( () -> assertThat(savedProduct.getId()).isNotNull(), () -> assertThat(savedProduct.getName()).isEqualTo(product.getName()), - () -> assertThat(savedProduct.getPrice().compareTo(product.getPrice())).isZero() + () -> assertThat(savedProduct.getPrice()).isEqualTo(product.getPrice()) ); } @Test void 상품을_id로_조회할_수_있다() { - Product product = productDao.save(상품을_생성한다("상품", new BigDecimal(0))); + Product product = productDao.save(상품을_생성한다("상품", BigDecimal.ZERO)); Product actual = productDao.findById(product.getId()) .orElseGet(Assertions::fail); @@ -51,8 +53,8 @@ class ProductDaoTest { @Test void 모든_상품을_조회할_수_있다() { - Product product1 = productDao.save(상품을_생성한다("상품1", new BigDecimal(1_000))); - Product product2 = productDao.save(상품을_생성한다("상품2", new BigDecimal(2_000))); + Product product1 = productDao.save(상품을_생성한다("상품1", BigDecimal.valueOf(1_000))); + Product product2 = productDao.save(상품을_생성한다("상품2", BigDecimal.valueOf(2_000))); List actual = productDao.findAll(); diff --git a/src/test/java/kitchenpos/domain/table/OrderTableRepositoryTest.java b/src/test/java/kitchenpos/domain/table/OrderTableRepositoryTest.java new file mode 100644 index 0000000000..48805d7832 --- /dev/null +++ b/src/test/java/kitchenpos/domain/table/OrderTableRepositoryTest.java @@ -0,0 +1,119 @@ +package kitchenpos.domain.table; + +import static kitchenpos.support.TestFixtureFactory.id를_가진_주문_테이블을_생성한다; +import static kitchenpos.support.TestFixtureFactory.단체_지정을_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import kitchenpos.TransactionalTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@TransactionalTest +class OrderTableRepositoryTest { + + @Autowired + private TableGroupRepository tableGroupRepository; + @Autowired + private OrderTableRepository orderTableRepository; + + @Test + void 주문_테이블을_저장하면_id가_채워진다() { + OrderTable orderTable = 주문_테이블을_생성한다(null, 0, true); + + OrderTable savedOrderTable = orderTableRepository.save(orderTable); + + assertAll( + () -> assertThat(savedOrderTable.getId()).isNotNull(), + () -> assertThat(savedOrderTable).usingRecursiveComparison() + .ignoringFields("id") + .isEqualTo(orderTable) + ); + } + + @Test + void 저장하는_주문_테이블의_id가_null이_아니면_업데이트한다() { + Long orderTableId = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)) + .getId(); + OrderTable updateOrderTable = id를_가진_주문_테이블을_생성한다(orderTableId, null, 1, false); + + OrderTable savedOrderTable = orderTableRepository.save(updateOrderTable); + + assertAll( + () -> assertThat(savedOrderTable.getId()).isEqualTo(orderTableId), + () -> assertThat(savedOrderTable).usingRecursiveComparison() + .ignoringFields("id") + .isEqualTo(updateOrderTable) + ); + } + + @Test + void 단체_지정_id는_null일_수_있다() { + OrderTable orderTable = 주문_테이블을_생성한다(null, 0, true); + + assertDoesNotThrow(() -> orderTableRepository.save(orderTable)); + } + + @Test + void id로_주문_테이블을_조회할_수_있다() { + OrderTable orderTable = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + + OrderTable actual = orderTableRepository.findById(orderTable.getId()) + .orElseGet(Assertions::fail); + + assertThat(actual).usingRecursiveComparison() + .isEqualTo(orderTable); + } + + @Test + void 없는_id로_주문_테이블을_조회하면_Optional_empty를_반환한다() { + Optional actual = orderTableRepository.findById(0L); + + assertThat(actual).isEmpty(); + } + + @Test + void 모든_주문_테이블을_조회할_수_있다() { + OrderTable orderTable1 = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + OrderTable orderTable2 = orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)); + + List actual = orderTableRepository.findAll(); + + assertThat(actual).hasSize(2) + .usingFieldByFieldElementComparator() + .containsExactly(orderTable1, orderTable2); + } + + @Test + void id_목록에_있는_주문_테이블을_조회할_수_있다() { + OrderTable orderTable1 = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + orderTableRepository.save(주문_테이블을_생성한다(null, 1, false)); + List ids = List.of(orderTable1.getId()); + + List actual = orderTableRepository.findAllByIdIn(ids); + + assertThat(actual).hasSize(1) + .usingFieldByFieldElementComparator() + .containsExactly(orderTable1); + } + + @Test + void 단체_지정_id로_주문_테이블을_조회할_수_있다() { + OrderTable orderTable1 = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + OrderTable orderTable2 = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + TableGroup tableGroup = tableGroupRepository + .save(단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2))); + + List actual = orderTableRepository.findAllByTableGroupId(tableGroup.getId()); + + assertThat(actual).hasSize(2) + .usingFieldByFieldElementComparator() + .containsExactly(orderTable1, orderTable2); + } +} diff --git a/src/test/java/kitchenpos/domain/table/OrderTableTest.java b/src/test/java/kitchenpos/domain/table/OrderTableTest.java new file mode 100644 index 0000000000..37a603ca98 --- /dev/null +++ b/src/test/java/kitchenpos/domain/table/OrderTableTest.java @@ -0,0 +1,45 @@ +package kitchenpos.domain.table; + +import static kitchenpos.support.TestFixtureFactory.단체_지정을_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.time.LocalDateTime; +import java.util.List; +import kitchenpos.domain.table.OrderTable; +import org.junit.jupiter.api.Test; + +class OrderTableTest { + + @Test + void 단체_지정이_되어_있으면_빈_테이블_여부를_변경할_수_없다() { + OrderTable orderTable1 = 주문_테이블을_생성한다(null, 1, true); + OrderTable orderTable2 = 주문_테이블을_생성한다(null, 1, true); + 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2)); + + assertThatThrownBy(() -> orderTable1.changeEmpty(true)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 빈_테이블의_인원_수를_변경할_수_없다() { + OrderTable orderTable = 주문_테이블을_생성한다(null, 0, true); + + assertThatThrownBy(() -> orderTable.changeNumberOfGuests(1)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 그룹_지정을_해제한다() { + OrderTable orderTable1 = 주문_테이블을_생성한다(null, 1, true); + OrderTable orderTable2 = 주문_테이블을_생성한다(null, 1, true); + 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2)); + + orderTable1.ungroup(); + + assertAll( + () -> assertThat(orderTable1.getTableGroup()).isNull(), + () -> assertThat(orderTable1.isEmpty()).isFalse() + ); + } +} diff --git a/src/test/java/kitchenpos/domain/table/TableGroupRepositoryTest.java b/src/test/java/kitchenpos/domain/table/TableGroupRepositoryTest.java new file mode 100644 index 0000000000..430eea1c6c --- /dev/null +++ b/src/test/java/kitchenpos/domain/table/TableGroupRepositoryTest.java @@ -0,0 +1,72 @@ +package kitchenpos.domain.table; + +import static kitchenpos.support.TestFixtureFactory.단체_지정을_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import kitchenpos.TransactionalTest; +import kitchenpos.domain.table.OrderTable; +import kitchenpos.domain.table.OrderTableRepository; +import kitchenpos.domain.table.TableGroup; +import kitchenpos.domain.table.TableGroupRepository; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@TransactionalTest +class TableGroupRepositoryTest { + + @Autowired + private TableGroupRepository tableGroupRepository; + @Autowired + private OrderTableRepository orderTableRepository; + + @Test + void 단체_지정을_저장_하면_id가_채워진다() { + OrderTable orderTable1 = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + OrderTable orderTable2 = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + + TableGroup savedTableGroup = tableGroupRepository.save( + new TableGroup(null, LocalDateTime.now(), List.of(orderTable1, orderTable2))); + + assertThat(savedTableGroup.getId()).isNotNull(); + } + + @Test + void id로_단체_지정을_조회할_수_있다() { + OrderTable orderTable1 = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + OrderTable orderTable2 = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + TableGroup tableGroup = tableGroupRepository.save( + 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2))); + + TableGroup actual = tableGroupRepository.findById(tableGroup.getId()) + .orElseGet(Assertions::fail); + + assertThat(actual).usingRecursiveComparison() + .isEqualTo(tableGroup); + } + + @Test + void 없는_id로_단체_지정을_조회하면_Optional_empty를_반환한다() { + Optional actual = tableGroupRepository.findById(0L); + + assertThat(actual).isEmpty(); + } + + @Test + void 모든_단체_지정을_조회할_수_있다() { + OrderTable orderTable1 = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + OrderTable orderTable2 = orderTableRepository.save(주문_테이블을_생성한다(null, 0, true)); + TableGroup tableGroup = tableGroupRepository.save( + 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2))); + + List actual = tableGroupRepository.findAll(); + + assertThat(actual).hasSize(1) + .usingFieldByFieldElementComparator() + .containsExactly(tableGroup); + } +} diff --git a/src/test/java/kitchenpos/domain/table/TableGroupTest.java b/src/test/java/kitchenpos/domain/table/TableGroupTest.java new file mode 100644 index 0000000000..521ca63357 --- /dev/null +++ b/src/test/java/kitchenpos/domain/table/TableGroupTest.java @@ -0,0 +1,57 @@ +package kitchenpos.domain.table; + +import static kitchenpos.support.TestFixtureFactory.단체_지정을_생성한다; +import static kitchenpos.support.TestFixtureFactory.주문_테이블을_생성한다; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.time.LocalDateTime; +import java.util.List; +import kitchenpos.domain.table.OrderTable; +import kitchenpos.domain.table.TableGroup; +import org.junit.jupiter.api.Test; + +class TableGroupTest { + + @Test + void 단체_지정된_테이블의_크기가_2_미만일_수_없다() { + OrderTable orderTable = 주문_테이블을_생성한다(null, 0, true); + + assertThatThrownBy(() -> new TableGroup(null, LocalDateTime.now(), List.of(orderTable))) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 빈_테이블이_아닌_테이블을_단체_지정할_수_없다() { + OrderTable orderTable1 = 주문_테이블을_생성한다(null, 0, true); + OrderTable orderTable2 = 주문_테이블을_생성한다(null, 0, false); + + assertThatThrownBy(() -> new TableGroup(null, LocalDateTime.now(), List.of(orderTable1, orderTable2))) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 이미_단체_지정된_테이블을_단체_지정할_수_없다() { + OrderTable orderTable1 = 주문_테이블을_생성한다(null, 0, true); + OrderTable orderTable2 = 주문_테이블을_생성한다(null, 0, true); + 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2)); + + assertThatThrownBy(() -> new TableGroup(null, LocalDateTime.now(), List.of(orderTable1, orderTable2))) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 단체_지정된_테이블들의_단체_지정을_해제할_수_있다() { + OrderTable orderTable1 = 주문_테이블을_생성한다(null, 0, true); + OrderTable orderTable2 = 주문_테이블을_생성한다(null, 0, true); + TableGroup tableGroup = 단체_지정을_생성한다(LocalDateTime.now(), List.of(orderTable1, orderTable2)); + + tableGroup.ungroup(); + + assertAll( + () -> assertThat(orderTable1.getTableGroup()).isNull(), + () -> assertThat(orderTable2.getTableGroup()).isNull() + ); + } +} diff --git a/src/test/java/kitchenpos/support/TestFixtureFactory.java b/src/test/java/kitchenpos/support/TestFixtureFactory.java index 606148437a..8a63316e42 100644 --- a/src/test/java/kitchenpos/support/TestFixtureFactory.java +++ b/src/test/java/kitchenpos/support/TestFixtureFactory.java @@ -3,14 +3,16 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuProduct; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderLineItem; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.Product; -import kitchenpos.domain.TableGroup; +import kitchenpos.domain.menu.Menu; +import kitchenpos.domain.menu.MenuGroup; +import kitchenpos.domain.menu.MenuProduct; +import kitchenpos.domain.order.Order; +import kitchenpos.domain.order.OrderLineItem; +import kitchenpos.domain.common.OrderStatus; +import kitchenpos.domain.table.OrderTable; +import kitchenpos.domain.common.Price; +import kitchenpos.domain.product.Product; +import kitchenpos.domain.table.TableGroup; public class TestFixtureFactory { @@ -18,66 +20,42 @@ private TestFixtureFactory() { } public static Product 상품을_생성한다(final String name, final BigDecimal price) { - Product product = new Product(); - product.setName(name); - product.setPrice(price); - return product; + return new Product(null, name, price); } public static MenuGroup 메뉴_그룹을_생성한다(final String name) { - MenuGroup menuGroup = new MenuGroup(); - menuGroup.setName(name); - return menuGroup; + return new MenuGroup(null, name); } public static Menu 메뉴를_생성한다(final String name, final BigDecimal price, final Long menuGroupId, final List menuProducts) { - Menu menu = new Menu(); - menu.setName(name); - menu.setPrice(price); - menu.setMenuGroupId(menuGroupId); - menu.setMenuProducts(menuProducts); - return menu; + return new Menu(null, name, new Price(price), menuGroupId, menuProducts); } - public static MenuProduct 메뉴_상품을_생성한다(final Long menuId, final Long productId, final long quantity) { - MenuProduct menuProduct = new MenuProduct(); - menuProduct.setMenuId(menuId); - menuProduct.setProductId(productId); - menuProduct.setQuantity(quantity); - return menuProduct; + public static MenuProduct 메뉴_상품을_생성한다(final Long productId, final long quantity, final Price price) { + return new MenuProduct(null, null, productId, quantity, price); } - public static Order 주문을_생성한다(final Long orderTableId, final String orderStatus, final LocalDateTime orderedTime, + public static Order 주문을_생성한다(final Long orderTableId, final OrderStatus orderStatus, + final LocalDateTime orderedTime, List orderLineItems) { - Order order = new Order(); - order.setOrderTableId(orderTableId); - order.setOrderStatus(orderStatus); - order.setOrderedTime(orderedTime); - order.setOrderLineItems(orderLineItems); - return order; + return new Order(null, orderTableId, orderStatus, orderedTime, orderLineItems); } - public static OrderLineItem 주문_항목을_생성한다(final Long orderId, final Long menuId, final long quantity) { - OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setOrderId(orderId); - orderLineItem.setMenuId(menuId); - orderLineItem.setQuantity(quantity); - return orderLineItem; + public static OrderLineItem 주문_항목을_생성한다(final Order order, final Long menuId, final long quantity) { + return new OrderLineItem(null, order, menuId, quantity); } - public static OrderTable 주문_테이블을_생성한다(final Long tableGroupId, final int numberOfGuests, final boolean empty) { - OrderTable orderTable = new OrderTable(); - orderTable.setTableGroupId(tableGroupId); - orderTable.setNumberOfGuests(numberOfGuests); - orderTable.setEmpty(empty); - return orderTable; + public static OrderTable 주문_테이블을_생성한다(final TableGroup tableGroup, final int numberOfGuests, final boolean empty) { + return new OrderTable(null, tableGroup, numberOfGuests, empty); + } + + public static OrderTable id를_가진_주문_테이블을_생성한다(final Long id, final TableGroup tableGroup, final int numberOfGuests, + final boolean empty) { + return new OrderTable(id, tableGroup, numberOfGuests, empty); } public static TableGroup 단체_지정을_생성한다(final LocalDateTime createdDate, final List orderTables) { - TableGroup tableGroup = new TableGroup(); - tableGroup.setCreatedDate(createdDate); - tableGroup.setOrderTables(orderTables); - return tableGroup; + return new TableGroup(null, createdDate, orderTables); } } diff --git a/src/test/java/kitchenpos/ui/menu/MenuGroupRestControllerTest.java b/src/test/java/kitchenpos/ui/menu/MenuGroupRestControllerTest.java new file mode 100644 index 0000000000..ebba6ffb6e --- /dev/null +++ b/src/test/java/kitchenpos/ui/menu/MenuGroupRestControllerTest.java @@ -0,0 +1,55 @@ +package kitchenpos.ui.menu; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.refEq; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.core.type.TypeReference; +import java.util.List; +import kitchenpos.dto.menu.request.MenuGroupCreateRequest; +import kitchenpos.dto.menu.response.MenuGroupResponse; +import kitchenpos.ui.product.RestControllerTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +class MenuGroupRestControllerTest extends RestControllerTest { + + @Test + void 메뉴_그룹_생성에_성공한다() throws Exception { + MenuGroupCreateRequest request = new MenuGroupCreateRequest("메뉴 그룹"); + when(menuGroupService.create(refEq(request))) + .thenReturn(new MenuGroupResponse(1L, "메뉴 그룹")); + + mockMvc.perform(post("/api/menu-groups") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsBytes(request))) + .andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andDo(print()); + } + + @Test + void 메뉴_그룹_목록_조회에_성공한다() throws Exception { + MenuGroupResponse expected = new MenuGroupResponse(1L, "메뉴 그룹"); + when(menuGroupService.list()).thenReturn(List.of(expected)); + + MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/api/menu-groups")) + .andExpect(status().isOk()) + .andDo(print()) + .andReturn(); + + List menuGroupResponses = objectMapper.readValue( + mvcResult.getResponse().getContentAsByteArray(), new TypeReference>() { + }); + + assertThat(menuGroupResponses).hasSize(1) + .usingFieldByFieldElementComparator() + .containsExactly(new MenuGroupResponse(expected.getId(), expected.getName())); + } +} diff --git a/src/test/java/kitchenpos/ui/menu/MenuRestControllerTest.java b/src/test/java/kitchenpos/ui/menu/MenuRestControllerTest.java new file mode 100644 index 0000000000..9969a602a8 --- /dev/null +++ b/src/test/java/kitchenpos/ui/menu/MenuRestControllerTest.java @@ -0,0 +1,67 @@ +package kitchenpos.ui.menu; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.core.type.TypeReference; +import java.math.BigDecimal; +import java.util.List; +import kitchenpos.dto.menu.request.MenuCreateRequest; +import kitchenpos.dto.menu.request.MenuProductCreateRequest; +import kitchenpos.dto.menu.response.MenuProductResponse; +import kitchenpos.dto.menu.response.MenuResponse; +import kitchenpos.ui.product.RestControllerTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +class MenuRestControllerTest extends RestControllerTest { + + @Test + void 메뉴_생성에_성공한다() throws Exception { + MenuProductCreateRequest menuProductRequest = new MenuProductCreateRequest(1L, 1); + MenuCreateRequest menuRequest = new MenuCreateRequest("메뉴", BigDecimal.valueOf(1_000), 1L, + List.of(menuProductRequest)); + MenuProductResponse expectedMenuProduct = + new MenuProductResponse(1L, 1L, 1); + MenuResponse expected = + new MenuResponse(1L, "메뉴", BigDecimal.valueOf(1_000), 1L, List.of(expectedMenuProduct)); + + when(menuService.create(any(MenuCreateRequest.class))).thenReturn(expected); + + mockMvc.perform(post("/api/menus") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(menuRequest))) + .andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andDo(print()); + } + + @Test + void 메뉴_목록_조회에_성공한다() throws Exception { + MenuProductResponse expectedMenuProduct = new MenuProductResponse(1L, 1L, 1); + MenuResponse expected = + new MenuResponse(1L, "메뉴", BigDecimal.valueOf(1_000), 1L, List.of(expectedMenuProduct)); + + when(menuService.list()).thenReturn(List.of(expected)); + + MvcResult mvcResult = mockMvc.perform(get("/api/menus")) + .andExpect(status().isOk()) + .andDo(print()) + .andReturn(); + + List content = objectMapper.readValue(mvcResult.getResponse().getContentAsByteArray(), + new TypeReference>() { + }); + + assertThat(content).hasSize(1) + .extracting("id") + .containsExactly(1L); + } +} diff --git a/src/test/java/kitchenpos/ui/order/OrderRestControllerTest.java b/src/test/java/kitchenpos/ui/order/OrderRestControllerTest.java new file mode 100644 index 0000000000..4d47554dff --- /dev/null +++ b/src/test/java/kitchenpos/ui/order/OrderRestControllerTest.java @@ -0,0 +1,40 @@ +package kitchenpos.ui.order; + +import static kitchenpos.domain.common.OrderStatus.COOKING; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.time.LocalDateTime; +import java.util.List; +import kitchenpos.dto.order.request.OrderCreateRequest; +import kitchenpos.dto.order.request.OrderLineItemCreateRequest; +import kitchenpos.dto.order.response.OrderLineItemResponse; +import kitchenpos.dto.order.response.OrderResponse; +import kitchenpos.ui.product.RestControllerTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; + +class OrderRestControllerTest extends RestControllerTest { + + @Test + void 주문_생성에_성공한다() throws Exception { + OrderLineItemCreateRequest orderLineItemRequest = new OrderLineItemCreateRequest(1L, 1); + OrderCreateRequest orderRequest = new OrderCreateRequest(1L, List.of(orderLineItemRequest)); + OrderLineItemResponse expectedItem = new OrderLineItemResponse(1L, 1L, 1); + OrderResponse expected = new OrderResponse(1L, 1L, COOKING.name(), LocalDateTime.now(), + List.of(expectedItem)); + + when(orderService.create(any(OrderCreateRequest.class))).thenReturn(expected); + + mockMvc.perform(post("/api/orders") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(orderRequest))) + .andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andDo(print()); + } +} diff --git a/src/test/java/kitchenpos/ui/product/ProductRestControllerTest.java b/src/test/java/kitchenpos/ui/product/ProductRestControllerTest.java new file mode 100644 index 0000000000..b1ac00bf42 --- /dev/null +++ b/src/test/java/kitchenpos/ui/product/ProductRestControllerTest.java @@ -0,0 +1,57 @@ +package kitchenpos.ui.product; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.core.type.TypeReference; +import java.math.BigDecimal; +import java.util.List; +import kitchenpos.dto.product.request.ProductCreateRequest; +import kitchenpos.dto.product.response.ProductResponse; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +class ProductRestControllerTest extends RestControllerTest { + + @Test + void 상품_생성에_성공한다() throws Exception { + ProductCreateRequest request = new ProductCreateRequest("상품", BigDecimal.valueOf(1_000)); + ProductResponse expected = new ProductResponse(1L, "상품", BigDecimal.valueOf(1_000)); + + when(productService.create(any(ProductCreateRequest.class))).thenReturn(expected); + + mockMvc.perform(post("/api/products") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andDo(print()); + } + + @Test + void 상품_목록_조회에_성공한다() throws Exception { + ProductResponse expected = new ProductResponse(1L, "상품", BigDecimal.valueOf(1_000)); + + when(productService.list()).thenReturn(List.of(expected)); + + MvcResult mvcResult = mockMvc.perform(get("/api/products")) + .andExpect(status().isOk()) + .andDo(print()) + .andReturn(); + + List content = objectMapper.readValue(mvcResult.getResponse().getContentAsByteArray(), + new TypeReference>() { + }); + + assertThat(content).hasSize(1) + .extracting("id") + .containsExactly(1L); + } +} diff --git a/src/test/java/kitchenpos/ui/product/RestControllerTest.java b/src/test/java/kitchenpos/ui/product/RestControllerTest.java new file mode 100644 index 0000000000..8081c13d81 --- /dev/null +++ b/src/test/java/kitchenpos/ui/product/RestControllerTest.java @@ -0,0 +1,41 @@ +package kitchenpos.ui.product; + +import com.fasterxml.jackson.databind.ObjectMapper; +import kitchenpos.application.menu.MenuGroupService; +import kitchenpos.application.menu.MenuService; +import kitchenpos.application.order.OrderService; +import kitchenpos.application.product.ProductService; +import kitchenpos.application.table.TableGroupService; +import kitchenpos.application.table.TableService; +import kitchenpos.ui.menu.MenuGroupRestController; +import kitchenpos.ui.menu.MenuRestController; +import kitchenpos.ui.order.OrderRestController; +import kitchenpos.ui.product.ProductRestController; +import kitchenpos.ui.table.TableGroupRestController; +import kitchenpos.ui.table.TableRestController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; + +@WebMvcTest(controllers = {MenuGroupRestController.class, MenuRestController.class, ProductRestController.class, + TableRestController.class, TableGroupRestController.class, OrderRestController.class}) +public class RestControllerTest { + + @Autowired + protected ObjectMapper objectMapper; + @Autowired + protected MockMvc mockMvc; + @MockBean + protected MenuGroupService menuGroupService; + @MockBean + protected MenuService menuService; + @MockBean + protected ProductService productService; + @MockBean + protected TableService tableService; + @MockBean + protected TableGroupService tableGroupService; + @MockBean + protected OrderService orderService; +} diff --git a/src/test/java/kitchenpos/ui/table/TableGroupRestControllerTest.java b/src/test/java/kitchenpos/ui/table/TableGroupRestControllerTest.java new file mode 100644 index 0000000000..a36b521d87 --- /dev/null +++ b/src/test/java/kitchenpos/ui/table/TableGroupRestControllerTest.java @@ -0,0 +1,46 @@ +package kitchenpos.ui.table; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.time.LocalDateTime; +import java.util.List; +import kitchenpos.dto.table.request.TableGroupCreateRequest; +import kitchenpos.dto.table.response.OrderTableResponse; +import kitchenpos.dto.table.response.TableGroupResponse; +import kitchenpos.ui.product.RestControllerTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; + +class TableGroupRestControllerTest extends RestControllerTest { + + @Test + void 단체_지정에_성공한다() throws Exception { + TableGroupCreateRequest request = new TableGroupCreateRequest(1L, 2L); + OrderTableResponse orderTable1 = new OrderTableResponse(1L, null, 1, false); + OrderTableResponse orderTable2 = new OrderTableResponse(1L, null, 1, false); + TableGroupResponse expected = + new TableGroupResponse(1L, LocalDateTime.now(), List.of(orderTable1, orderTable2)); + + when(tableGroupService.create(any(TableGroupCreateRequest.class))).thenReturn(expected); + + mockMvc.perform(post("/api/table-groups") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andDo(print()); + } + + @Test + void 단체_지정_해제에_성공한다() throws Exception { + mockMvc.perform(delete("/api/table-groups/1")) + .andExpect(status().isNoContent()) + .andDo(print()); + } +} diff --git a/src/test/java/kitchenpos/ui/table/TableRestControllerTest.java b/src/test/java/kitchenpos/ui/table/TableRestControllerTest.java new file mode 100644 index 0000000000..d38dab1079 --- /dev/null +++ b/src/test/java/kitchenpos/ui/table/TableRestControllerTest.java @@ -0,0 +1,96 @@ +package kitchenpos.ui.table; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.refEq; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.core.type.TypeReference; +import java.util.List; +import kitchenpos.dto.table.request.NumberOfGuestsChangeRequest; +import kitchenpos.dto.table.request.OrderTableCreateRequest; +import kitchenpos.dto.table.request.TableEmptyChangeRequest; +import kitchenpos.dto.table.response.OrderTableResponse; +import kitchenpos.ui.product.RestControllerTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +class TableRestControllerTest extends RestControllerTest { + + @Test + void 주문_테이블_생성에_성공한다() throws Exception { + OrderTableCreateRequest request = new OrderTableCreateRequest(0, true); + OrderTableResponse expected = new OrderTableResponse(1L, null, 0, true); + when(tableService.create(refEq(request))) + .thenReturn(expected); + + mockMvc.perform(post("/api/tables") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isCreated()) + .andExpect(header().exists("Location")) + .andDo(print()); + } + + @Test + void 주문_테이블_목록_조회에_성공한다() throws Exception { + OrderTableResponse expected = new OrderTableResponse(1L, null, 0, true); + when(tableService.list()).thenReturn(List.of(expected)); + + MvcResult mvcResult = mockMvc.perform(get("/api/tables")) + .andExpect(status().isOk()) + .andDo(print()) + .andReturn(); + + List content = objectMapper.readValue( + mvcResult.getResponse().getContentAsByteArray(), new TypeReference>() { + }); + assertThat(content).hasSize(1) + .extracting("id") + .containsExactly(1L); + } + + @Test + void 주문_테이블을_빈_테이블로_변경에_성공한다() throws Exception { + TableEmptyChangeRequest request = new TableEmptyChangeRequest(true); + OrderTableResponse expected = new OrderTableResponse(1L, null, 0, true); + when(tableService.changeEmpty(1L, true)).thenReturn(expected); + + MvcResult mvcResult = mockMvc.perform(put("/api/tables/1/empty") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isOk()) + .andDo(print()) + .andReturn(); + + OrderTableResponse content = objectMapper.readValue( + mvcResult.getResponse().getContentAsByteArray(), OrderTableResponse.class + ); + assertThat(content.isEmpty()).isTrue(); + } + + @Test + void 주문_테이블의_인원_수_변경에_성공한다() throws Exception { + NumberOfGuestsChangeRequest request = new NumberOfGuestsChangeRequest(1); + OrderTableResponse expected = new OrderTableResponse(1L, null, 1, true); + when(tableService.changeNumberOfGuests(1L, 1)).thenReturn(expected); + + MvcResult mvcResult = mockMvc.perform(put("/api/tables/1/number-of-guests") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isOk()) + .andDo(print()) + .andReturn(); + + OrderTableResponse content = objectMapper.readValue( + mvcResult.getResponse().getContentAsByteArray(), OrderTableResponse.class + ); + assertThat(content.getNumberOfGuests()).isOne(); + } +} diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 319de9f3a6..c658e30424 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -1,3 +1,17 @@ spring: flyway: - enabled: false \ No newline at end of file + enabled: false + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + format_sql: true +logging: + level: + org: + hibernate: + type: + descriptor: + sql: TRACE diff --git a/src/test/resources/schema.sql b/src/test/resources/schema.sql index 62033be6c8..62a14b6fae 100644 --- a/src/test/resources/schema.sql +++ b/src/test/resources/schema.sql @@ -38,6 +38,7 @@ CREATE TABLE menu_product menu_id BIGINT(20) NOT NULL, product_id BIGINT(20) NOT NULL, quantity BIGINT(20) NOT NULL, + price DECIMAL(19, 2) NOT NULL, PRIMARY KEY (seq) );