refactor(order-service): order-service listener
- save order시 jpa의 listener을 이용하여 kafka 전송
This commit is contained in:
@@ -3,15 +3,10 @@ package com.justpickup.orderservice.domain.order.entity;
|
|||||||
import com.justpickup.orderservice.domain.order.exception.OrderException;
|
import com.justpickup.orderservice.domain.order.exception.OrderException;
|
||||||
import com.justpickup.orderservice.domain.order.service.OrderSender;
|
import com.justpickup.orderservice.domain.order.service.OrderSender;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.transaction.annotation.Propagation;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.PostUpdate;
|
import javax.persistence.PostUpdate;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -23,23 +18,18 @@ public class OrderListener {
|
|||||||
private OrderSender orderSender;
|
private OrderSender orderSender;
|
||||||
|
|
||||||
@PostUpdate
|
@PostUpdate
|
||||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
|
||||||
void postUpdate(Order order) {
|
void postUpdate(Order order) {
|
||||||
OrderStatus orderStatus = order.getOrderStatus();
|
OrderStatus orderStatus = order.getOrderStatus();
|
||||||
if (orderStatus == OrderStatus.ORDER) {
|
if (orderStatus == OrderStatus.ORDER) {
|
||||||
// TODO: 2022/03/10 Kafka 알림 전송
|
// TODO: 2022/03/10 Kafka 알림 전송
|
||||||
log.info("[OrderListener] {}", OrderStatus.ORDER.name());
|
log.info("[OrderListener] {}", OrderStatus.ORDER.name());
|
||||||
|
|
||||||
try{
|
try{
|
||||||
orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order));
|
orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order));
|
||||||
}catch (Exception ex){
|
}catch (Exception ex){
|
||||||
|
|
||||||
order.fail();
|
order.fail();
|
||||||
|
|
||||||
throw new OrderException(ex.getMessage());
|
throw new OrderException(ex.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} else if (orderStatus == OrderStatus.PLACED) {
|
} else if (orderStatus == OrderStatus.PLACED) {
|
||||||
log.info("[OrderListener] {}", OrderStatus.PLACED.name());
|
log.info("[OrderListener] {}", OrderStatus.PLACED.name());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class OrderSender {
|
|||||||
@Data
|
@Data
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
static class KafkaSendOrderDto{
|
public static class KafkaSendOrderDto{
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
package com.justpickup.orderservice.domain.order.service;
|
package com.justpickup.orderservice.domain.order.service;
|
||||||
|
|
||||||
import com.justpickup.orderservice.domain.order.dto.FetchOrderDto;
|
import com.justpickup.orderservice.domain.order.dto.*;
|
||||||
import com.justpickup.orderservice.domain.order.dto.OrderDto;
|
|
||||||
import com.justpickup.orderservice.domain.order.dto.OrderMainDto;
|
|
||||||
import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition;
|
|
||||||
import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch;
|
|
||||||
import com.justpickup.orderservice.domain.order.entity.OrderStatus;
|
import com.justpickup.orderservice.domain.order.entity.OrderStatus;
|
||||||
import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto;
|
import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ import com.justpickup.orderservice.domain.order.repository.OrderRepositoryCustom
|
|||||||
import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto;
|
import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto;
|
||||||
import com.justpickup.orderservice.domain.orderItem.entity.OrderItem;
|
import com.justpickup.orderservice.domain.orderItem.entity.OrderItem;
|
||||||
import com.justpickup.orderservice.domain.orderItemOption.entity.OrderItemOption;
|
import com.justpickup.orderservice.domain.orderItemOption.entity.OrderItemOption;
|
||||||
|
import com.justpickup.orderservice.global.client.store.GetItemResponse;
|
||||||
|
import com.justpickup.orderservice.global.client.store.GetStoreReseponse;
|
||||||
|
import com.justpickup.orderservice.global.client.store.StoreClient;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
@@ -19,7 +22,10 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static java.util.stream.Collectors.toList;
|
import static java.util.stream.Collectors.toList;
|
||||||
|
|
||||||
@@ -31,7 +37,8 @@ public class OrderServiceImpl implements OrderService {
|
|||||||
|
|
||||||
private final OrderRepository orderRepository;
|
private final OrderRepository orderRepository;
|
||||||
private final OrderRepositoryCustom orderRepositoryCustom;
|
private final OrderRepositoryCustom orderRepositoryCustom;
|
||||||
private final OrderSender orderSender;
|
|
||||||
|
private final StoreClient storeClient;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public OrderMainDto findOrderMain(OrderSearchCondition condition, Long storeId) {
|
public OrderMainDto findOrderMain(OrderSearchCondition condition, Long storeId) {
|
||||||
@@ -75,7 +82,7 @@ public class OrderServiceImpl implements OrderService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void addItemToBasket(OrderItemDto orderItemDto,Long storeId, Long userId) {
|
public void addItemToBasket(OrderItemDto orderItemDto, Long storeId, Long userId) {
|
||||||
|
|
||||||
//orderItemOption Entity를 생성한다.
|
//orderItemOption Entity를 생성한다.
|
||||||
List<OrderItemOption> orderItemOptions = orderItemDto.getOrderItemOptionDtoList()
|
List<OrderItemOption> orderItemOptions = orderItemDto.getOrderItemOptionDtoList()
|
||||||
@@ -105,21 +112,48 @@ public class OrderServiceImpl implements OrderService {
|
|||||||
public FetchOrderDto fetchOrder(Long userId) {
|
public FetchOrderDto fetchOrder(Long userId) {
|
||||||
Order order = orderRepositoryCustom.fetchOrder(userId)
|
Order order = orderRepositoryCustom.fetchOrder(userId)
|
||||||
.orElseThrow(() -> new OrderException("장바구니 정보를 찾을 수 없습니다."));
|
.orElseThrow(() -> new OrderException("장바구니 정보를 찾을 수 없습니다."));
|
||||||
|
GetStoreReseponse store = storeClient.getStore(String.valueOf(order.getStoreId())).getData();
|
||||||
|
|
||||||
return new FetchOrderDto(order);
|
Map<Long, GetItemResponse> itemMap = storeClient.getItemAndItemOptions(order.getOrderItems().stream()
|
||||||
|
.map(OrderItem::getItemId)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toUnmodifiableList())
|
||||||
|
).getData()
|
||||||
|
.stream().collect(
|
||||||
|
Collectors.toMap(
|
||||||
|
GetItemResponse::getId
|
||||||
|
,getItemResponse->getItemResponse
|
||||||
|
,(t, t2) -> t
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
List<FetchOrderDto.OrderItemDto> orderItemDtoList = order.getOrderItems()
|
||||||
|
.stream().map(orderItem ->
|
||||||
|
new FetchOrderDto.OrderItemDto(
|
||||||
|
itemMap.get(orderItem.getItemId())
|
||||||
|
,orderItem))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
|
||||||
|
FetchOrderDto fetchOrderDto = FetchOrderDto.builder()
|
||||||
|
.userId(order.getUserId())
|
||||||
|
.orderPrice(order.getOrderPrice())
|
||||||
|
.storeName(store.getName())
|
||||||
|
.orderItemDtoList(orderItemDtoList)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
return fetchOrderDto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void saveOrder(Long userId) {
|
public void saveOrder(Long userId) {
|
||||||
Order order = orderRepository.findByUserIdAndOrderStatus(userId, OrderStatus.PENDING)
|
|
||||||
|
orderRepository.findByUserIdAndOrderStatus(userId, OrderStatus.PENDING)
|
||||||
.orElseThrow(() -> new OrderException("장바구니 정보를 찾을 수 없습니다."))
|
.orElseThrow(() -> new OrderException("장바구니 정보를 찾을 수 없습니다."))
|
||||||
.setOrderStatus(OrderStatus.PLACED);
|
.order();
|
||||||
try{
|
|
||||||
orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order));
|
|
||||||
}catch (Exception ex){
|
|
||||||
throw new OrderException(ex.getMessage());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package com.justpickup.orderservice.global.client.store;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class GetStoreReseponse {
|
||||||
|
private Long id;
|
||||||
|
private String name;
|
||||||
|
private String phoneNumber;
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.justpickup.orderservice.global.client.store;
|
||||||
|
|
||||||
|
public enum OptionType {
|
||||||
|
REQUIRED, OTHER
|
||||||
|
}
|
||||||
@@ -5,9 +5,15 @@ import org.springframework.cloud.openfeign.FeignClient;
|
|||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
|
||||||
@FeignClient(name = "STORE-SERVICE", url = "127.0.0.1:8001/store-service")
|
import java.util.List;
|
||||||
|
|
||||||
|
@FeignClient("store-service")
|
||||||
public interface StoreClient {
|
public interface StoreClient {
|
||||||
|
|
||||||
@GetMapping("/item/{itemId}")
|
@GetMapping("/store/{storeId}")
|
||||||
Result<GetItemResponse> getItem(@PathVariable("itemId") Long itemId);
|
Result<GetStoreReseponse> getStore(@PathVariable(value = "storeId") String storeId);
|
||||||
|
|
||||||
|
@GetMapping("/api/customer/items/{itemId}")
|
||||||
|
Result<List<GetItemResponse>> getItemAndItemOptions(@PathVariable(value = "itemId") List<Long> itemIds);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ server:
|
|||||||
|
|
||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
name: order-servcie
|
name: order-service
|
||||||
config:
|
config:
|
||||||
import: optional:configserver:http://127.0.0.1:8888
|
import: optional:configserver:http://127.0.0.1:8888
|
||||||
cloud:
|
cloud:
|
||||||
@@ -46,7 +46,3 @@ decorator.datasource.p6spy:
|
|||||||
kafka:
|
kafka:
|
||||||
host: 127.0.0.1
|
host: 127.0.0.1
|
||||||
port: 9092
|
port: 9092
|
||||||
|
|
||||||
#feign key
|
|
||||||
token:
|
|
||||||
feign: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJmZWlnbiIsImV4cCI6MTE2NDY5NzY4NzAsImlhdCI6MTY0Njk3Njg3MH0.5x4Nx7oMnpF0_kZpbZsiB1u9eEbQ4IKIhJlEsa3D22cjZjvTHKz57GCz0sgXb_olhSNIVv9xF41A29-XYiFeBQ
|
|
||||||
Reference in New Issue
Block a user