From 91e844375843ced6c00505d6408b0aab43fb6c66 Mon Sep 17 00:00:00 2001 From: daadaadaah Date: Sun, 25 Jun 2023 01:11:20 +0900 Subject: [PATCH] =?UTF-8?q?`placeOrder`=EC=9D=98=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=EC=A4=91=20`validateHasDealPr?= =?UTF-8?q?oductUuid`=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/dao/RedisHashRepository.java | 4 ++ .../heecommerce/deal/DealQueryRepository.java | 10 ++++ .../TimeDealProductNotFoundException.java | 12 ++++ .../heecommerce/order/OrderService.java | 43 ++++++++++++- .../heecommerce/order/OrderServiceTest.java | 60 ++++++++++++++++--- 5 files changed, 119 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/hcommerce/heecommerce/deal/TimeDealProductNotFoundException.java diff --git a/src/main/java/com/hcommerce/heecommerce/common/dao/RedisHashRepository.java b/src/main/java/com/hcommerce/heecommerce/common/dao/RedisHashRepository.java index ae5036d9..d6a92381 100644 --- a/src/main/java/com/hcommerce/heecommerce/common/dao/RedisHashRepository.java +++ b/src/main/java/com/hcommerce/heecommerce/common/dao/RedisHashRepository.java @@ -28,6 +28,10 @@ public T getOneByKeyAndHashKey(String key, String hashKey, TypeReference obje return convertObjectFromString(item, objectTypeReference); } + public boolean hasKey(String key, String hashKey) { + return hashOperations.hasKey(key, hashKey); + } + public List getAllByKey(String key, TypeReference objectTypeReference) { List list = new ArrayList<>(); diff --git a/src/main/java/com/hcommerce/heecommerce/deal/DealQueryRepository.java b/src/main/java/com/hcommerce/heecommerce/deal/DealQueryRepository.java index 9a7a08d1..962fcd87 100644 --- a/src/main/java/com/hcommerce/heecommerce/deal/DealQueryRepository.java +++ b/src/main/java/com/hcommerce/heecommerce/deal/DealQueryRepository.java @@ -64,6 +64,16 @@ public TimeDealProductDetail getTimeDealProductDetailByDealProductUuid(UUID deal return timeDealProductDetail; } + public boolean hasDealProductUuid(UUID dealProductUuid) { + String dealOpenDate = getDateForCurrentDealProducts(); + + String key = "timeDealProducts:"+dealOpenDate; + + String hashKey = dealProductUuid.toString(); + + return redisHashRepository.hasKey(key, hashKey); + } + private List convertTimeDealProductToTimeDealProductSummary(List timeDealProducts) { List timeDealProductSummaries = new ArrayList<>(); diff --git a/src/main/java/com/hcommerce/heecommerce/deal/TimeDealProductNotFoundException.java b/src/main/java/com/hcommerce/heecommerce/deal/TimeDealProductNotFoundException.java new file mode 100644 index 00000000..9c949ac0 --- /dev/null +++ b/src/main/java/com/hcommerce/heecommerce/deal/TimeDealProductNotFoundException.java @@ -0,0 +1,12 @@ +package com.hcommerce.heecommerce.deal; + +import java.util.UUID; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_FOUND) +public class TimeDealProductNotFoundException extends RuntimeException { + public TimeDealProductNotFoundException(UUID orderUuid) { + super(orderUuid + " : 해당 타임 딜 상품을 찾을 수 없습니다."); + } +} diff --git a/src/main/java/com/hcommerce/heecommerce/order/OrderService.java b/src/main/java/com/hcommerce/heecommerce/order/OrderService.java index 26ce5716..f04a1a5c 100644 --- a/src/main/java/com/hcommerce/heecommerce/order/OrderService.java +++ b/src/main/java/com/hcommerce/heecommerce/order/OrderService.java @@ -1,18 +1,25 @@ package com.hcommerce.heecommerce.order; +import com.hcommerce.heecommerce.deal.DealQueryRepository; +import com.hcommerce.heecommerce.deal.TimeDealProductNotFoundException; +import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.UUID; - @Service public class OrderService { private OrderCommandRepository orderRepository; + private DealQueryRepository dealQueryRepository; + @Autowired - public OrderService(OrderCommandRepository orderRepository) { + public OrderService( + OrderCommandRepository orderRepository, + DealQueryRepository dealQueryRepository + ) { this.orderRepository = orderRepository; + this.dealQueryRepository = dealQueryRepository; } public void completeOrderReceipt(UUID orderUuid) { @@ -22,4 +29,34 @@ public void completeOrderReceipt(UUID orderUuid) { throw new OrderNotFoundException(orderUuid); } } + + public void placeOrder(OrderForm orderForm) { + validateOrderForm(orderForm); + } + + private void validateOrderForm(OrderForm orderForm) { + validateHasDealProductUuid(orderForm.getDealProductUuid()); + + // TODO : Mybatis 연동이 필요하므로, 다른 PR에서 작업할 예정 + validateHasUserId(orderForm.getUserId()); + + // TODO : RedisRepository에 추가적인 함수 필요하므로, 다른 PR에서 작업할 예정 + validateOrderQuantityInMaxOrderQuantityPerOrder(orderForm.getOrderQuantity()); + } + + private void validateHasDealProductUuid(UUID dealProductUuid) { + boolean hasDealProductUuid = dealQueryRepository.hasDealProductUuid(dealProductUuid); + + if(!hasDealProductUuid) { + throw new TimeDealProductNotFoundException(dealProductUuid); + } + } + + private void validateHasUserId(int userId) { + + } + + private void validateOrderQuantityInMaxOrderQuantityPerOrder(int orderQuantity) { + + } } diff --git a/src/test/java/com/hcommerce/heecommerce/order/OrderServiceTest.java b/src/test/java/com/hcommerce/heecommerce/order/OrderServiceTest.java index 482ecbc6..671bab4a 100644 --- a/src/test/java/com/hcommerce/heecommerce/order/OrderServiceTest.java +++ b/src/test/java/com/hcommerce/heecommerce/order/OrderServiceTest.java @@ -1,5 +1,14 @@ package com.hcommerce.heecommerce.order; +import static com.hcommerce.heecommerce.order.OutOfStockHandlingOption.ALL_CANCEL; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.verify; +import static org.mockito.Mockito.times; + +import com.hcommerce.heecommerce.deal.DealQueryRepository; +import com.hcommerce.heecommerce.deal.TimeDealProductNotFoundException; +import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -8,13 +17,6 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.BDDMockito.given; -import static org.mockito.BDDMockito.verify; -import static org.mockito.Mockito.times; - @DisplayName("OrderService") @ExtendWith(MockitoExtension.class) class OrderServiceTest { @@ -22,11 +24,17 @@ class OrderServiceTest { @Mock private OrderCommandRepository orderCommandRepository; + @Mock + private DealQueryRepository dealQueryRepository; + @InjectMocks private OrderService orderService; private static final UUID TEMP_NOT_EXIST_UUID = UUID.fromString("8b455042-e709-11ed-93e5-0242ac110002"); + + private static final UUID NOT_EXIST_DEAL_PRODUCTUUID = UUID.fromString("8b455042-e709-11ed-93e5-0242ac110001"); + @Nested @DisplayName("completeOrderReceipt") class Describe_CompleteOrderReceipt { @@ -65,4 +73,42 @@ void it_throws_OrderNotFoundException() { } } } + + @Nested + @DisplayName("placeOrder") + class Describe_PlaceOrder { + + @Nested + @DisplayName("with invalid OrderForm's DealProductUuid") + class Context_With_Invalid_DealProductUuid { + @Test + @DisplayName("throws TimeDealProductNotFoundException") + void It_throws_TimeDealProductNotFoundException() { + // given + given(dealQueryRepository.hasDealProductUuid(NOT_EXIST_DEAL_PRODUCTUUID)).willReturn(false); + + OrderForm orderForm = OrderForm.builder() + .userId(1) + .recipientInfoForm( + RecipientInfoForm.builder() + .recipientName("leecommerce") + .recipientPhoneNumber("01087654321") + .recipientAddress("서울시 ") + .recipientDetailAddress("101호") + .shippingRequest("빠른 배송 부탁드려요!") + .build() + ) + .outOfStockHandlingOption(ALL_CANCEL) + .dealProductUuid(NOT_EXIST_DEAL_PRODUCTUUID) + .orderQuantity(1) + .paymentType(PaymentType.CREDIT_CARD) + .build(); + + // then + assertThrows(TimeDealProductNotFoundException.class, () -> { + orderService.placeOrder(orderForm); + }); + } + } + } }