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.service.OrderSender;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
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;
|
||||
|
||||
@Slf4j
|
||||
@@ -23,23 +18,18 @@ public class OrderListener {
|
||||
private OrderSender orderSender;
|
||||
|
||||
@PostUpdate
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
void postUpdate(Order order) {
|
||||
OrderStatus orderStatus = order.getOrderStatus();
|
||||
if (orderStatus == OrderStatus.ORDER) {
|
||||
// TODO: 2022/03/10 Kafka 알림 전송
|
||||
log.info("[OrderListener] {}", OrderStatus.ORDER.name());
|
||||
|
||||
try{
|
||||
orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order));
|
||||
}catch (Exception ex){
|
||||
|
||||
order.fail();
|
||||
|
||||
throw new OrderException(ex.getMessage());
|
||||
}
|
||||
|
||||
|
||||
} else if (orderStatus == OrderStatus.PLACED) {
|
||||
log.info("[OrderListener] {}", OrderStatus.PLACED.name());
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class OrderSender {
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
static class KafkaSendOrderDto{
|
||||
public static class KafkaSendOrderDto{
|
||||
private Long id;
|
||||
|
||||
private Long userId;
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
package com.justpickup.orderservice.domain.order.service;
|
||||
|
||||
import com.justpickup.orderservice.domain.order.dto.FetchOrderDto;
|
||||
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.dto.*;
|
||||
import com.justpickup.orderservice.domain.order.entity.OrderStatus;
|
||||
import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto;
|
||||
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.entity.OrderItem;
|
||||
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.extern.slf4j.Slf4j;
|
||||
import org.springframework.data.domain.Page;
|
||||
@@ -19,7 +22,10 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
@@ -31,7 +37,8 @@ public class OrderServiceImpl implements OrderService {
|
||||
|
||||
private final OrderRepository orderRepository;
|
||||
private final OrderRepositoryCustom orderRepositoryCustom;
|
||||
private final OrderSender orderSender;
|
||||
|
||||
private final StoreClient storeClient;
|
||||
|
||||
@Override
|
||||
public OrderMainDto findOrderMain(OrderSearchCondition condition, Long storeId) {
|
||||
@@ -75,7 +82,7 @@ public class OrderServiceImpl implements OrderService {
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void addItemToBasket(OrderItemDto orderItemDto,Long storeId, Long userId) {
|
||||
public void addItemToBasket(OrderItemDto orderItemDto, Long storeId, Long userId) {
|
||||
|
||||
//orderItemOption Entity를 생성한다.
|
||||
List<OrderItemOption> orderItemOptions = orderItemDto.getOrderItemOptionDtoList()
|
||||
@@ -105,21 +112,48 @@ public class OrderServiceImpl implements OrderService {
|
||||
public FetchOrderDto fetchOrder(Long userId) {
|
||||
Order order = orderRepositoryCustom.fetchOrder(userId)
|
||||
.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
|
||||
@Transactional
|
||||
public void saveOrder(Long userId) {
|
||||
Order order = orderRepository.findByUserIdAndOrderStatus(userId, OrderStatus.PENDING)
|
||||
|
||||
orderRepository.findByUserIdAndOrderStatus(userId, OrderStatus.PENDING)
|
||||
.orElseThrow(() -> new OrderException("장바구니 정보를 찾을 수 없습니다."))
|
||||
.setOrderStatus(OrderStatus.PLACED);
|
||||
try{
|
||||
orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order));
|
||||
}catch (Exception ex){
|
||||
throw new OrderException(ex.getMessage());
|
||||
}
|
||||
.order();
|
||||
|
||||
|
||||
}
|
||||
|
||||
@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.PathVariable;
|
||||
|
||||
@FeignClient(name = "STORE-SERVICE", url = "127.0.0.1:8001/store-service")
|
||||
import java.util.List;
|
||||
|
||||
@FeignClient("store-service")
|
||||
public interface StoreClient {
|
||||
|
||||
@GetMapping("/item/{itemId}")
|
||||
Result<GetItemResponse> getItem(@PathVariable("itemId") Long itemId);
|
||||
@GetMapping("/store/{storeId}")
|
||||
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:
|
||||
application:
|
||||
name: order-servcie
|
||||
name: order-service
|
||||
config:
|
||||
import: optional:configserver:http://127.0.0.1:8888
|
||||
cloud:
|
||||
@@ -46,7 +46,3 @@ decorator.datasource.p6spy:
|
||||
kafka:
|
||||
host: 127.0.0.1
|
||||
port: 9092
|
||||
|
||||
#feign key
|
||||
token:
|
||||
feign: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJmZWlnbiIsImV4cCI6MTE2NDY5NzY4NzAsImlhdCI6MTY0Njk3Njg3MH0.5x4Nx7oMnpF0_kZpbZsiB1u9eEbQ4IKIhJlEsa3D22cjZjvTHKz57GCz0sgXb_olhSNIVv9xF41A29-XYiFeBQ
|
||||
Reference in New Issue
Block a user