From 1c2751c7bc6bcfe7bfaa77f3f68a83d2bfe9f241 Mon Sep 17 00:00:00 2001 From: bum12ark Date: Wed, 23 Mar 2022 16:05:26 +0900 Subject: [PATCH] =?UTF-8?q?feat(order,=20notification,=20kafka):=20?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=20=EC=83=81=ED=83=9C=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EC=8B=9C=20kafka=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../messagequeue/NotificationConsumer.java | 11 ++++++++++ .../service/NotificationService.java | 1 + .../service/NotificationServiceImpl.java | 15 +++++++++++++- .../domain/order/entity/OrderListener.java | 11 ++++++---- .../repository/OrderRepositoryCustom.java | 2 +- .../domain/order/service/OrderSender.java | 20 +++++++++++++++---- .../global/client/store/StoreClient.java | 3 +++ .../global/client/user/UserClient.java | 1 + .../domain/order/web/OrderControllerTest.java | 4 ++++ 9 files changed, 58 insertions(+), 10 deletions(-) diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java index 2026a18..cbc2c69 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/messagequeue/NotificationConsumer.java @@ -34,6 +34,17 @@ public class NotificationConsumer { notificationService.insertOrderPlaced(kafkaSendOrderDto.getUserId(), kafkaSendOrderDto.getStoreId()); } + @Transactional + @KafkaListener(topics = "orderAccepted") + public void orderAccepted(String kafkaMessage) throws JsonProcessingException { + log.debug("## NotificationConsumer.orderAccepted"); + log.debug("#### kafka Message = {}", kafkaMessage); + + KafkaSendOrderDto orderDto = objectMapper.readValue(kafkaMessage, KafkaSendOrderDto.class); + + notificationService.insertOrderAccepted(orderDto.userId, orderDto.storeId); + } + @Data @NoArgsConstructor static class KafkaSendOrderDto { private Long id; diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java index bd86fec..fb4a3b1 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationService.java @@ -11,4 +11,5 @@ public interface NotificationService { void updateNotification(UpdateNotificationDto dto); Long findNotificationCounts(Long userId, Yn readYn); void insertOrderPlaced(Long userId, Long storeId); + void insertOrderAccepted(Long userId, Long storeId); } diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java index ae0391b..4ea4e79 100644 --- a/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java +++ b/notification-service/src/main/java/com/justpickup/notificationservice/domain/notification/service/NotificationServiceImpl.java @@ -59,9 +59,22 @@ public class NotificationServiceImpl implements NotificationService { GetStoreResponse storeResponse = storeClient.getStore(String.valueOf(storeId)).getData(); String title = "주문이 신청되었어요."; - String storeName = "[" + storeResponse.getName() + "]"; + String storeName = "[" + storeResponse.getName() + "] "; String message = storeName + "매장의 주문이 신청되었습니다."; Notification notification = Notification.of(userId, message, title); notificationRepository.save(notification); } + + @Transactional + @Override + public void insertOrderAccepted(Long userId, Long storeId) { + GetStoreResponse storeInfo = storeClient.getStore(String.valueOf(storeId)).getData(); + + String title = "주문이 수락되었어요."; + String storeName = "[" + storeInfo.getName() + "] "; + String message = storeName + "매장의 주문이 수락되었습니다."; + Notification notification = Notification.of(userId, message, title); + notificationRepository.save(notification); + } + } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/OrderListener.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/OrderListener.java index f20318e..ea4077b 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/OrderListener.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/OrderListener.java @@ -15,21 +15,24 @@ public class OrderListener { @Lazy private OrderSender orderSender; - // TODO: 2022/03/15 exception 발생시 order fail 처리 @PostUpdate public void postUpdate(Order order){ OrderStatus orderStatus = order.getOrderStatus(); + log.info("[OrderListener] {}", OrderStatus.PLACED.name()); if (orderStatus == OrderStatus.PLACED) { - log.info("[OrderListener] {}", OrderStatus.PLACED.name()); try{ - orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order)); + orderSender.orderPlaced(order); }catch (Exception ex){ throw new OrderException(ex.getMessage()); } } else if (orderStatus == OrderStatus.ACCEPTED) { - log.info("[OrderListener] {}", OrderStatus.ACCEPTED.name()); + try { + orderSender.orderAccepted(order); + } catch (Exception ex) { + throw new OrderException(ex.getMessage()); + } } } } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java index 86aaf15..71c2f2b 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java @@ -47,7 +47,7 @@ public class OrderRepositoryCustom { List orders = queryFactory .selectFrom(order) - .leftJoin(order.transaction) + .leftJoin(order.transaction).fetchJoin() .where( orderIdLt(condition.getLastOrderId()), order.orderTime.between(start, end), diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderSender.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderSender.java index 2d55071..f1c2fa0 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderSender.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderSender.java @@ -19,19 +19,31 @@ import java.util.List; public class OrderSender { private final KafkaTemplate kafkaTemplate; + private final ObjectMapper objectMapper; - public void orderPlaced( KafkaSendOrderDto kafkaSendOrderDto) throws Exception{ - ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()); - String jsonInString = mapper.writeValueAsString(kafkaSendOrderDto); + public void orderPlaced(Order order) throws Exception{ + objectMapper.registerModule(new JavaTimeModule()); + + KafkaSendOrderDto kafkaSendOrderDto = KafkaSendOrderDto.createPrimitiveField(order); + String jsonInString = objectMapper.writeValueAsString(kafkaSendOrderDto); kafkaTemplate.send("orderPlaced", jsonInString); log.info("kafka Producer sent data from the Order microservice: "+ kafkaSendOrderDto); } + public void orderAccepted(Order order) throws Exception { + objectMapper.registerModule(new JavaTimeModule()); + + KafkaSendOrderDto kafkaSendOrderDto = KafkaSendOrderDto.createPrimitiveField(order); + String json = objectMapper.writeValueAsString(kafkaSendOrderDto); + kafkaTemplate.send("orderAccepted", json); + log.info("[OrderSender] orderAccepted = {}", json); + } + @NoArgsConstructor @Data @AllArgsConstructor @Builder - public static class KafkaSendOrderDto{ + public static class KafkaSendOrderDto { private Long id; private Long userId; diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java index 8842fcb..7c581c0 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java @@ -35,6 +35,7 @@ public interface StoreClient { Result> getItemAndItemOptions(@PathVariable(value = "itemId") Iterable itemIds); default Map getStoreNameMap(Set storeIds) { + if (!storeIds.iterator().hasNext()) return null; List storeResponses = this.getStoreAllById(storeIds).getData(); return storeResponses.stream() .collect( @@ -43,6 +44,7 @@ public interface StoreClient { } default Map getItemNameMap(Iterable itemIds) { + if (!itemIds.iterator().hasNext()) return null; List itemResponses = this.getItems(itemIds).getData(); return itemResponses.stream() .collect( @@ -51,6 +53,7 @@ public interface StoreClient { } default Map getItemAndItemOptionMap(Iterable itemIds) { + if (!itemIds.iterator().hasNext()) return null; List responses = this.getItemAndItemOptions(itemIds).getData(); return responses.stream() .collect( diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/user/UserClient.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/user/UserClient.java index f565cef..916b126 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/global/client/user/UserClient.java +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/user/UserClient.java @@ -20,6 +20,7 @@ public interface UserClient { Result> getCustomers(@PathVariable("userIds") Iterable userIds); default Map getUserNameMap(Iterable userIds) { + if (!userIds.iterator().hasNext()) return null; List userResponses = this.getCustomers(userIds).getData(); return userResponses.stream() .collect( diff --git a/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java b/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java index 89ad9ee..eb4b396 100644 --- a/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java +++ b/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java @@ -101,6 +101,8 @@ class OrderControllerTest { fieldWithPath("code").description("결과코드 SUCCESS/ERROR"), fieldWithPath("message").description("메세지"), fieldWithPath("data.id").description("주문 고유번호"), + fieldWithPath("data.storeName").description("주문 매장이름"), + fieldWithPath("data.orderStatus").description("주문 상태"), fieldWithPath("data.orderTime").description("주문 시간 [yyy-MM-dd]"), fieldWithPath("data.orderPrice").description("주문 금액"), fieldWithPath("data.user.id").description("주문한 회원 고유번호"), @@ -168,7 +170,9 @@ class OrderControllerTest { return OrderDetailDto.builder() .id(orderId) + .orderStatus(OrderStatus.PLACED) .orderTime(LocalDateTime.now()) + .storeName("매장이름") .orderPrice(76600L) .user(orderDetailUser) .orderItems(List.of(카페라떼, 아메리카노))