From d49b533f7e45e4c78e41f15e99fae9d55e87006c Mon Sep 17 00:00:00 2001 From: Ali CANLI Date: Fri, 15 Jul 2022 20:37:22 +0300 Subject: [PATCH] Outbox Message and Scheduler class implemented part - 1. --- infrastructure/outbox/pom.xml | 6 ++ .../order/system/outbox/OutboxScheduler.java | 5 + .../system/outbox/config/SchedulerConfig.java | 12 +++ .../order/system/outbox/order/SagaConst.java | 12 +++ .../order-application-service/pom.xml | 10 ++ .../sysyem/OrderCreateCommandHandler.java | 27 ++++- .../sysyem/helper/OrderCreateHelper.java | 4 +- .../order/sysyem/helper/OrderSagaHelper.java | 12 +++ .../order/sysyem/mapper/OrderDataMapper.java | 17 ++- .../approval/OrderApprovalEventPayload.java | 36 +++++++ .../approval/OrderApprovalOutboxMessage.java | 42 ++++++++ .../model/approval/OrderApprovalProduct.java | 19 ++++ .../payment/OrderPaymentEventPayload.java | 27 +++++ .../payment/OrderPaymentOutboxMessage.java | 39 +++++++ .../approval/ApprovalOutboxHelper.java | 66 ++++++++++++ .../RestaurantApprovalOutboxCleaner.java | 51 +++++++++ .../RestaurantApprovalOutboxMessage.java | 64 +++++++++++ .../payment/PaymentOutboxCleaner.java | 51 +++++++++ .../payment/PaymentOutboxHelper.java | 100 ++++++++++++++++++ .../payment/PaymentOutboxScheduler.java | 63 +++++++++++ ...ncelledPaymentRequestMessagePublisher.java | 8 -- ...CreatedPaymentRequestMessagePublisher.java | 8 -- .../PaymentRequestMessagePublisher.java | 13 +++ ...PaidRestaurantRequestMessagePublisher.java | 8 -- ...aurantApprovalRequestMessagePublisher.java | 13 +++ .../repository/ApprovalOutboxRepository.java | 25 +++++ .../repository/PaymentOutboxRepository.java | 28 +++++ .../order/sysyem/saga/OrderApprovalSaga.java | 8 +- .../order/sysyem/saga/OrderPaymentSaga.java | 1 - .../CancelOrderKafkaMessagePublisher.java | 4 +- .../CreateOrderKafkaMessagePublisher.java | 4 +- .../kafka/PayOrderKafkaMessagePublisher.java | 4 +- 32 files changed, 743 insertions(+), 44 deletions(-) create mode 100644 infrastructure/outbox/src/main/java/com/food/order/system/outbox/OutboxScheduler.java create mode 100644 infrastructure/outbox/src/main/java/com/food/order/system/outbox/config/SchedulerConfig.java create mode 100644 infrastructure/outbox/src/main/java/com/food/order/system/outbox/order/SagaConst.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalEventPayload.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalOutboxMessage.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalProduct.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/payment/OrderPaymentEventPayload.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/payment/OrderPaymentOutboxMessage.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/ApprovalOutboxHelper.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxCleaner.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxMessage.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxCleaner.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxHelper.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxScheduler.java delete mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/OrderCancelledPaymentRequestMessagePublisher.java delete mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/OrderCreatedPaymentRequestMessagePublisher.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/PaymentRequestMessagePublisher.java delete mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/restaurantapproval/OrderPaidRestaurantRequestMessagePublisher.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/restaurantapproval/RestaurantApprovalRequestMessagePublisher.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/ApprovalOutboxRepository.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/PaymentOutboxRepository.java diff --git a/infrastructure/outbox/pom.xml b/infrastructure/outbox/pom.xml index da2aaff..b7c309e 100644 --- a/infrastructure/outbox/pom.xml +++ b/infrastructure/outbox/pom.xml @@ -12,5 +12,11 @@ outbox + + + org.springframework.boot + spring-boot-starter + + \ No newline at end of file diff --git a/infrastructure/outbox/src/main/java/com/food/order/system/outbox/OutboxScheduler.java b/infrastructure/outbox/src/main/java/com/food/order/system/outbox/OutboxScheduler.java new file mode 100644 index 0000000..f37e0f5 --- /dev/null +++ b/infrastructure/outbox/src/main/java/com/food/order/system/outbox/OutboxScheduler.java @@ -0,0 +1,5 @@ +package com.food.order.system.outbox; + +public interface OutboxScheduler { + void processOutboxMessage(); +} diff --git a/infrastructure/outbox/src/main/java/com/food/order/system/outbox/config/SchedulerConfig.java b/infrastructure/outbox/src/main/java/com/food/order/system/outbox/config/SchedulerConfig.java new file mode 100644 index 0000000..43adacd --- /dev/null +++ b/infrastructure/outbox/src/main/java/com/food/order/system/outbox/config/SchedulerConfig.java @@ -0,0 +1,12 @@ +package com.food.order.system.outbox.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; + +@Configuration +@EnableScheduling +public class SchedulerConfig { + + + +} diff --git a/infrastructure/outbox/src/main/java/com/food/order/system/outbox/order/SagaConst.java b/infrastructure/outbox/src/main/java/com/food/order/system/outbox/order/SagaConst.java new file mode 100644 index 0000000..3ec7b83 --- /dev/null +++ b/infrastructure/outbox/src/main/java/com/food/order/system/outbox/order/SagaConst.java @@ -0,0 +1,12 @@ +package com.food.order.system.outbox.order; + +public class SagaConst { + + private SagaConst() { + } + + public static final String ORDER_PROCESSING_SAGA = "OrderProcessingSaga"; + + + +} diff --git a/order-service/order-domain/order-application-service/pom.xml b/order-service/order-domain/order-application-service/pom.xml index 69a718c..8a4fc93 100644 --- a/order-service/order-domain/order-application-service/pom.xml +++ b/order-service/order-domain/order-application-service/pom.xml @@ -31,6 +31,16 @@ spring-boot-starter-validation + + com.food.order + outbox + + + + org.springframework.boot + spring-boot-starter-json + + org.springframework spring-tx diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderCreateCommandHandler.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderCreateCommandHandler.java index 0e0a51c..5bca96a 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderCreateCommandHandler.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderCreateCommandHandler.java @@ -1,13 +1,18 @@ package com.food.order.sysyem; +import com.food.order.system.outbox.OutboxStatus; import com.food.order.sysyem.dto.create.CreateOrderCommand; import com.food.order.sysyem.dto.create.CreateOrderResponse; import com.food.order.sysyem.helper.OrderCreateHelper; +import com.food.order.sysyem.helper.OrderSagaHelper; import com.food.order.sysyem.mapper.OrderDataMapper; -import com.food.order.sysyem.ports.output.message.publisher.payment.OrderCreatedPaymentRequestMessagePublisher; +import com.food.order.sysyem.outbox.scheduler.payment.PaymentOutboxHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; @Component @Slf4j @@ -17,14 +22,28 @@ public class OrderCreateCommandHandler { private final OrderCreateHelper orderCreateHelper; private final OrderDataMapper orderDataMapper; - private final OrderCreatedPaymentRequestMessagePublisher orderCreatedPaymentRequestMessagePublisher; + private final OrderSagaHelper orderSagaHelper; + private final PaymentOutboxHelper paymentOutboxHelper; + + @Transactional public CreateOrderResponse createOrder(CreateOrderCommand createOrderCommand) { var persistOrder = orderCreateHelper.persistOrder(createOrderCommand); log.info("createOrder with id: {}", persistOrder.getOrder().getId().getValue()); - orderCreatedPaymentRequestMessagePublisher.publish(persistOrder); - return orderDataMapper.orderToCreateOrderResponse(persistOrder.getOrder(),"Order created successfully"); + var response = orderDataMapper.orderToCreateOrderResponse(persistOrder.getOrder(),"Order created successfully"); + + paymentOutboxHelper.savePaymentOutboxMessage( + orderDataMapper.orderCreatedEventToOrderPaymentEventPayload(persistOrder), + persistOrder.getOrder().getStatus(), + orderSagaHelper.orderStatusToSagaStatus(persistOrder.getOrder().getStatus()), + OutboxStatus.STARTED, + UUID.randomUUID() + ); + + log.info("Returning CreateOrderResponse with order id : {}", persistOrder.getOrder().getId()); + + return response; } diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderCreateHelper.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderCreateHelper.java index fd1163e..7afb14a 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderCreateHelper.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderCreateHelper.java @@ -28,7 +28,6 @@ public class OrderCreateHelper { private final CustomerRepository customerRepository; private final RestaurantRepository restaurantRepository; private final OrderDataMapper orderDataMapper; - private final DomainEventPublisher publisher; @Transactional public OrderCreatedEvent persistOrder(CreateOrderCommand createOrderCommand) { @@ -36,7 +35,8 @@ public class OrderCreateHelper { checkCustomer(createOrderCommand.customerId()); Restaurant restaurant = checkRestaurant(createOrderCommand); var order = orderDataMapper.createOrderCommandToOrder(createOrderCommand); - var createdEventOrder = orderDomainService.validateAndInitiateOrder(order, restaurant,publisher); + var createdEventOrder = orderDomainService.validateAndInitiateOrder + (order, restaurant); saveOrder(order); log.info("Created Order Event : {}", createdEventOrder); return createdEventOrder; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderSagaHelper.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderSagaHelper.java index 55eb54c..f0bc541 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderSagaHelper.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderSagaHelper.java @@ -2,7 +2,9 @@ package com.food.order.sysyem.helper; import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.exception.OrderNotFoundException; +import com.food.order.system.saga.SagaStatus; import com.food.order.sysyem.ports.output.repository.OrderRepository; +import com.food.order.sysyem.valueobject.OrderStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -23,5 +25,15 @@ public class OrderSagaHelper { orderRepository.save(order); } + public SagaStatus orderStatusToSagaStatus(OrderStatus orderStatus) { + return switch (orderStatus) { + case PAID -> SagaStatus.PROCESSING; + case APPROVED -> SagaStatus.SUCCEEDED; + case CANCELLING -> SagaStatus.COMPENSATING; + case CANCELLED -> SagaStatus.COMPENSATED; + default -> SagaStatus.STARTED; + }; + } + } diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/mapper/OrderDataMapper.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/mapper/OrderDataMapper.java index 10e023c..be99271 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/mapper/OrderDataMapper.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/mapper/OrderDataMapper.java @@ -4,15 +4,14 @@ import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.entity.OrderItem; import com.food.order.system.domain.entity.Product; import com.food.order.system.domain.entity.Restaurant; +import com.food.order.system.domain.event.OrderCreatedEvent; import com.food.order.system.domain.valueobject.StreetAddress; import com.food.order.sysyem.dto.create.CreateOrderCommand; import com.food.order.sysyem.dto.create.CreateOrderResponse; import com.food.order.sysyem.dto.create.OrderAddress; import com.food.order.sysyem.dto.track.TrackOrderResponse; -import com.food.order.sysyem.valueobject.CustomerId; -import com.food.order.sysyem.valueobject.Money; -import com.food.order.sysyem.valueobject.ProductId; -import com.food.order.sysyem.valueobject.RestaurantId; +import com.food.order.sysyem.outbox.model.payment.OrderPaymentEventPayload; +import com.food.order.sysyem.valueobject.*; import org.springframework.stereotype.Component; import java.util.List; @@ -21,6 +20,16 @@ import java.util.UUID; @Component public class OrderDataMapper { + public OrderPaymentEventPayload orderCreatedEventToOrderPaymentEventPayload(OrderCreatedEvent order) { + return OrderPaymentEventPayload.builder() + .orderId(order.getOrder().getId().getValue().toString()) + .customerId(order.getOrder().getCustomerId().getValue().toString()) + .price(order.getOrder().getPrice().getAmount()) + .createdAt(order.getCreatedAt()) + .paymentOrderStatus(PaymentOrderStatus.PENDING.name()) + .build(); + } + public TrackOrderResponse orderToTrackOrderResponse(Order order) { return TrackOrderResponse.builder() diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalEventPayload.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalEventPayload.java new file mode 100644 index 0000000..832ca19 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalEventPayload.java @@ -0,0 +1,36 @@ +package com.food.order.sysyem.outbox.model.approval; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.math.BigDecimal; +import java.time.ZonedDateTime; +import java.util.List; + +@Getter +@Builder +@AllArgsConstructor +public class OrderApprovalEventPayload { + + @JsonProperty + private String orderId; + + @JsonProperty + private String restaurantId; + + @JsonProperty + private BigDecimal price; + + @JsonProperty + private ZonedDateTime createdAt; + + @JsonProperty + private String restaurantOrderStatus; + + @JsonProperty + private List products; + + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalOutboxMessage.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalOutboxMessage.java new file mode 100644 index 0000000..7d58527 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalOutboxMessage.java @@ -0,0 +1,42 @@ +package com.food.order.sysyem.outbox.model.approval; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.saga.SagaStatus; +import com.food.order.sysyem.valueobject.OrderStatus; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.time.ZonedDateTime; +import java.util.UUID; + +@Getter +@Builder +@AllArgsConstructor +public class OrderApprovalOutboxMessage { + + private UUID id; + + private UUID sagaId; + + private ZonedDateTime createdAt; + + @Setter + private ZonedDateTime processedAt; + + private String type; + + private String payload; + + @Setter + private SagaStatus sagaStatus; + + @Setter + private OrderStatus orderStatus; + + @Setter + private OutboxStatus outboxStatus; + + private int version; +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalProduct.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalProduct.java new file mode 100644 index 0000000..9c1524e --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalProduct.java @@ -0,0 +1,19 @@ +package com.food.order.sysyem.outbox.model.approval; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class OrderApprovalProduct { + + @JsonProperty + private String id; + @JsonProperty + private Integer quantity; + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/payment/OrderPaymentEventPayload.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/payment/OrderPaymentEventPayload.java new file mode 100644 index 0000000..d175728 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/payment/OrderPaymentEventPayload.java @@ -0,0 +1,27 @@ +package com.food.order.sysyem.outbox.model.payment; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.math.BigDecimal; +import java.time.ZonedDateTime; + +@Getter +@Builder +@AllArgsConstructor +public class OrderPaymentEventPayload { + + @JsonProperty + private String orderId; + @JsonProperty + private String customerId; + @JsonProperty + private BigDecimal price; + @JsonProperty + private ZonedDateTime createdAt; + @JsonProperty + private String paymentOrderStatus; + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/payment/OrderPaymentOutboxMessage.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/payment/OrderPaymentOutboxMessage.java new file mode 100644 index 0000000..4e3facd --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/payment/OrderPaymentOutboxMessage.java @@ -0,0 +1,39 @@ +package com.food.order.sysyem.outbox.model.payment; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.saga.SagaStatus; +import com.food.order.sysyem.valueobject.OrderStatus; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.time.ZonedDateTime; +import java.util.UUID; + +@Getter +@Builder +@AllArgsConstructor +public class OrderPaymentOutboxMessage { + private UUID id; + + private UUID sagaId; + + private ZonedDateTime createdAt; + + @Setter + private ZonedDateTime processedAt; + + private String type; + + private String payload; + @Setter + private SagaStatus sagaStatus; + @Setter + private OrderStatus orderStatus; + @Setter + private OutboxStatus outboxStatus; + private int version; + + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/ApprovalOutboxHelper.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/ApprovalOutboxHelper.java new file mode 100644 index 0000000..fbe42e8 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/ApprovalOutboxHelper.java @@ -0,0 +1,66 @@ +package com.food.order.sysyem.outbox.scheduler.approval; + +import com.food.order.system.domain.exception.OrderDomainException; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.saga.SagaStatus; +import com.food.order.sysyem.outbox.model.approval.OrderApprovalOutboxMessage; +import com.food.order.sysyem.ports.output.repository.ApprovalOutboxRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +import static com.food.order.system.outbox.order.SagaConst.ORDER_PROCESSING_SAGA; + +@Slf4j +@RequiredArgsConstructor +@Component +public class ApprovalOutboxHelper { + + private final ApprovalOutboxRepository approvalOutboxRepository; + + @Transactional(readOnly = true) + public Optional> getApprovalOutboxMessageByOutboxStatusAndSagaStatus + (OutboxStatus outboxStatus, SagaStatus... sagaStatus) { + return approvalOutboxRepository.findByTypeAndOutboxStatusAndSagaStatus( + ORDER_PROCESSING_SAGA + ,outboxStatus, + sagaStatus); + } + + + @Transactional(readOnly = true) + public Optional getApprovalOutboxMessageBySagaIdAndSagaStatus( + UUID sagaId, SagaStatus... sagaStatus) { + return approvalOutboxRepository.findByTypeAndSagaIdAndSagaStatus( + ORDER_PROCESSING_SAGA + ,sagaId, + sagaStatus); + } + + @Transactional + public void save(OrderApprovalOutboxMessage approvalOutboxMessage) { + var response = approvalOutboxRepository.save(approvalOutboxMessage); + if (Objects.isNull(response)) { + throw new OrderDomainException("Failed to save outbox message id : " + + approvalOutboxMessage.getId()); + } + log.info("Outbox message id : {} saved successfully", response.getId()); + } + + @Transactional + public void deleteApprovalOutboxMessageByOutboxStatusAndSagaStatus(OutboxStatus outboxStatus, + SagaStatus... sagaStatus) { + + approvalOutboxRepository.deleteByTypeAndOutboxStatusAndSagaStatus( + ORDER_PROCESSING_SAGA, + outboxStatus, + sagaStatus); + + } +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxCleaner.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxCleaner.java new file mode 100644 index 0000000..c6c6273 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxCleaner.java @@ -0,0 +1,51 @@ +package com.food.order.sysyem.outbox.scheduler.approval; + +import com.food.order.system.domain.exception.OrderDomainException; +import com.food.order.system.outbox.OutboxScheduler; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.saga.SagaStatus; +import com.food.order.sysyem.outbox.model.approval.OrderApprovalOutboxMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Objects; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RestaurantApprovalOutboxCleaner implements OutboxScheduler { + + private final ApprovalOutboxHelper approvalOutboxHelper; + + @Override + @Scheduled(cron = "@midnight") + public void processOutboxMessage() { + + var outboxMessageResponse = + approvalOutboxHelper.getApprovalOutboxMessageByOutboxStatusAndSagaStatus( + OutboxStatus.COMPLETED, + SagaStatus.SUCCEEDED, + SagaStatus.FAILED, + SagaStatus.COMPENSATING). + orElseThrow(() -> new OrderDomainException("No outbox message found for processing")); + + if (Objects.nonNull(outboxMessageResponse)) { + + log.info("Received {} OrderPaymentOutboxMessage for clean-up. The Payloads :{}", + outboxMessageResponse.size(), + outboxMessageResponse.stream().map(OrderApprovalOutboxMessage::getPayload) + .collect(Collectors.joining(","))); + approvalOutboxHelper.deleteApprovalOutboxMessageByOutboxStatusAndSagaStatus( + OutboxStatus.COMPLETED, + SagaStatus.SUCCEEDED, + SagaStatus.FAILED, + SagaStatus.COMPENSATING); + log.info("Clean-up completed ! DELETED LOG SIZE : {}", outboxMessageResponse.size()); + + } + + } +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxMessage.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxMessage.java new file mode 100644 index 0000000..8d9d9f9 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxMessage.java @@ -0,0 +1,64 @@ +package com.food.order.sysyem.outbox.scheduler.approval; + +import com.food.order.system.domain.exception.OrderDomainException; +import com.food.order.system.outbox.OutboxScheduler; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.saga.SagaStatus; +import com.food.order.sysyem.outbox.model.approval.OrderApprovalOutboxMessage; +import com.food.order.sysyem.ports.output.message.publisher.restaurantapproval.RestaurantApprovalRequestMessagePublisher; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RestaurantApprovalOutboxMessage implements OutboxScheduler { + + private final ApprovalOutboxHelper approvalOutboxHelper; + private final RestaurantApprovalRequestMessagePublisher restaurantApprovalRequestMessagePublisher; + + @Override + @Transactional + @Scheduled(fixedDelayString = "${order-service.outbox-scheduler-fixed-rate}", + initialDelayString = "${order-service.outbox-scheduler-initial-delay}") + public void processOutboxMessage() { + + log.info("Processing outbox message STARTED !"); + + var outboxMessageResponse = + approvalOutboxHelper.getApprovalOutboxMessageByOutboxStatusAndSagaStatus( + OutboxStatus.STARTED, + SagaStatus.STARTED, + SagaStatus.COMPENSATING) + .orElseThrow( + () -> new OrderDomainException("No outbox message found for processing")); + + if (Objects.nonNull(outboxMessageResponse) && outboxMessageResponse.size() > 0) { + + log.info("Received {} OrderPaymentOutboxMessage with ids : {} , sending message bus !" , + outboxMessageResponse.size(), + outboxMessageResponse.stream().map(orderPaymentOutboxMessage -> orderPaymentOutboxMessage.getId().toString()) + .collect(Collectors.joining(","))); + outboxMessageResponse.forEach(orderPaymentOutboxMessage -> { + restaurantApprovalRequestMessagePublisher.publish + (orderPaymentOutboxMessage,this::updateOutboxStatus); + }); + log.info("Processing outbox message completed ! "); + } + + } + + + private void updateOutboxStatus(OrderApprovalOutboxMessage orderPaymentOutboxMessage, + OutboxStatus outboxStatus) { + orderPaymentOutboxMessage.setOutboxStatus(outboxStatus); + approvalOutboxHelper.save(orderPaymentOutboxMessage); + log.info("Outbox message id : {} updated successfully", orderPaymentOutboxMessage.getId()); + } +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxCleaner.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxCleaner.java new file mode 100644 index 0000000..2d7ce1e --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxCleaner.java @@ -0,0 +1,51 @@ +package com.food.order.sysyem.outbox.scheduler.payment; + +import com.food.order.system.domain.exception.OrderDomainException; +import com.food.order.system.outbox.OutboxScheduler; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.saga.SagaStatus; +import com.food.order.sysyem.outbox.model.payment.OrderPaymentOutboxMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Objects; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class PaymentOutboxCleaner implements OutboxScheduler { + + private final PaymentOutboxHelper paymentOutboxHelper; + + @Override + @Scheduled(cron = "@midnight") + public void processOutboxMessage() { + + var outboxMessageResponse = + paymentOutboxHelper.getPaymentOutboxMessageByOutboxMessageStatusAndSagaStatus( + OutboxStatus.COMPLETED, + SagaStatus.SUCCEEDED, + SagaStatus.FAILED, + SagaStatus.COMPENSATING). + orElseThrow(() -> new OrderDomainException("No outbox message found for processing")); + + if (Objects.nonNull(outboxMessageResponse)) { + + log.info("Received {} OrderPaymentOutboxMessage for clean-up. The Payloads :{}", + outboxMessageResponse.size(), + outboxMessageResponse.stream().map(OrderPaymentOutboxMessage::getPayload) + .collect(Collectors.joining(","))); + paymentOutboxHelper.deletePaymentOutboxMessageByOutboxStatusAndSagaStatus( + OutboxStatus.COMPLETED, + SagaStatus.SUCCEEDED, + SagaStatus.FAILED, + SagaStatus.COMPENSATING); + log.info("Clean-up completed ! DELETED LOG SIZE : {}", outboxMessageResponse.size()); + + } + + } +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxHelper.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxHelper.java new file mode 100644 index 0000000..1ef0ca2 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxHelper.java @@ -0,0 +1,100 @@ +package com.food.order.sysyem.outbox.scheduler.payment; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.food.order.system.domain.exception.OrderDomainException; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.saga.SagaStatus; +import com.food.order.sysyem.outbox.model.payment.OrderPaymentEventPayload; +import com.food.order.sysyem.outbox.model.payment.OrderPaymentOutboxMessage; +import com.food.order.sysyem.ports.output.repository.PaymentOutboxRepository; +import com.food.order.sysyem.valueobject.OrderStatus; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +import static com.food.order.system.outbox.order.SagaConst.ORDER_PROCESSING_SAGA; + +@Slf4j +@Component +@RequiredArgsConstructor +public class PaymentOutboxHelper { + + private final PaymentOutboxRepository paymentOutboxRepository; + private final ObjectMapper objectMapper; + + @Transactional(readOnly = true) + public Optional> getPaymentOutboxMessageByOutboxMessageStatusAndSagaStatus( + OutboxStatus outboxStatus, SagaStatus... sagaStatus) { + return paymentOutboxRepository.findByTypeAndOutboxStatusAndSagaStatus( + ORDER_PROCESSING_SAGA, + outboxStatus, + sagaStatus); + + } + + @Transactional(readOnly = true) + public Optional getPaymentOutboxMessageBySagaIdAndSagaStatus( + UUID sagaId, SagaStatus... sagaStatus) { + return paymentOutboxRepository.findByTypeAndSagaIdAndSagaStatus( + ORDER_PROCESSING_SAGA + ,sagaId, + sagaStatus); + } + + @Transactional + public void save(OrderPaymentOutboxMessage orderPaymentOutboxMessage) { + var response = paymentOutboxRepository.save(orderPaymentOutboxMessage); + if (Objects.isNull(response)) { + throw new OrderDomainException("Failed to save outbox message id : " + + orderPaymentOutboxMessage.getId()); + } + log.info("Outbox message id : {} saved successfully", response.getId()); + } + + @Transactional + public void savePaymentOutboxMessage(OrderPaymentEventPayload payload, + OrderStatus orderStatus, + SagaStatus sagaStatus, + OutboxStatus outboxStatus, + UUID sagaId) { + + save(OrderPaymentOutboxMessage.builder() + .id(UUID.randomUUID()) + .sagaId(sagaId) + .createdAt(payload.getCreatedAt()) + .type(ORDER_PROCESSING_SAGA) + .payload(createPayload(payload)) + .outboxStatus(outboxStatus) + .orderStatus(orderStatus) + .sagaStatus(sagaStatus) + .build()); + + } + + private String createPayload(OrderPaymentEventPayload payload) { + try { + return objectMapper.writeValueAsString(payload); + } catch (JsonProcessingException e) { + log.error("Failed to create payload for outbox message", e); + throw new OrderDomainException("Failed to create payload for outbox message"); + } + } + + @Transactional + public void deletePaymentOutboxMessageByOutboxStatusAndSagaStatus(OutboxStatus outboxStatus, + SagaStatus... sagaStatus) { + + paymentOutboxRepository.deleteByTypeAndOutboxStatusAndSagaStatus( + ORDER_PROCESSING_SAGA, + outboxStatus, + sagaStatus); + + } +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxScheduler.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxScheduler.java new file mode 100644 index 0000000..1afbfff --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxScheduler.java @@ -0,0 +1,63 @@ +package com.food.order.sysyem.outbox.scheduler.payment; + +import com.food.order.system.domain.exception.OrderDomainException; +import com.food.order.system.outbox.OutboxScheduler; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.saga.SagaStatus; +import com.food.order.sysyem.outbox.model.payment.OrderPaymentOutboxMessage; +import com.food.order.sysyem.ports.output.message.publisher.payment.PaymentRequestMessagePublisher; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class PaymentOutboxScheduler implements OutboxScheduler { + + private final PaymentOutboxHelper paymentOutboxHelper; + private final PaymentRequestMessagePublisher paymentRequestMessagePublisher; + + @Override + @Transactional + @Scheduled(fixedDelayString = "${order-service.outbox-scheduler-fixed-rate}", + initialDelayString = "${order-service.outbox-scheduler-initial-delay}") + public void processOutboxMessage() { + + log.info("Processing outbox message STARTED !"); + + var outboxMessageResponse = + paymentOutboxHelper.getPaymentOutboxMessageByOutboxMessageStatusAndSagaStatus( + OutboxStatus.STARTED, + SagaStatus.STARTED, + SagaStatus.COMPENSATING) + .orElseThrow( + () -> new OrderDomainException("No outbox message found for processing")); + + if (Objects.nonNull(outboxMessageResponse) && outboxMessageResponse.size() > 0) { + + log.info("Received {} OrderPaymentOutboxMessage with ids : {} , sending message bus !" , + outboxMessageResponse.size(), + outboxMessageResponse.stream().map(orderPaymentOutboxMessage -> orderPaymentOutboxMessage.getId().toString()) + .collect(Collectors.joining(","))); + outboxMessageResponse.forEach(orderPaymentOutboxMessage -> { + paymentRequestMessagePublisher.publish(orderPaymentOutboxMessage,this::updateOutboxStatus); + }); + log.info("Processing outbox message completed ! "); + } + + } + + + private void updateOutboxStatus(OrderPaymentOutboxMessage orderPaymentOutboxMessage, + OutboxStatus outboxStatus) { + orderPaymentOutboxMessage.setOutboxStatus(outboxStatus); + paymentOutboxHelper.save(orderPaymentOutboxMessage); + log.info("Outbox message id : {} updated successfully", orderPaymentOutboxMessage.getId()); + } +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/OrderCancelledPaymentRequestMessagePublisher.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/OrderCancelledPaymentRequestMessagePublisher.java deleted file mode 100644 index 6a84a49..0000000 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/OrderCancelledPaymentRequestMessagePublisher.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.food.order.sysyem.ports.output.message.publisher.payment; - -import com.food.order.sysyem.event.publisher.DomainEventPublisher; -import com.food.order.system.domain.event.OrderCancelledEvent; - -public interface OrderCancelledPaymentRequestMessagePublisher extends DomainEventPublisher { - -} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/OrderCreatedPaymentRequestMessagePublisher.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/OrderCreatedPaymentRequestMessagePublisher.java deleted file mode 100644 index fb83ed0..0000000 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/OrderCreatedPaymentRequestMessagePublisher.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.food.order.sysyem.ports.output.message.publisher.payment; - -import com.food.order.sysyem.event.publisher.DomainEventPublisher; -import com.food.order.system.domain.event.OrderCreatedEvent; - -public interface OrderCreatedPaymentRequestMessagePublisher extends DomainEventPublisher { - -} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/PaymentRequestMessagePublisher.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/PaymentRequestMessagePublisher.java new file mode 100644 index 0000000..05750f7 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/PaymentRequestMessagePublisher.java @@ -0,0 +1,13 @@ +package com.food.order.sysyem.ports.output.message.publisher.payment; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.sysyem.outbox.model.payment.OrderPaymentOutboxMessage; + +import java.util.function.BiConsumer; + +public interface PaymentRequestMessagePublisher { + + void publish(OrderPaymentOutboxMessage message, + BiConsumer outboxCallback); + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/restaurantapproval/OrderPaidRestaurantRequestMessagePublisher.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/restaurantapproval/OrderPaidRestaurantRequestMessagePublisher.java deleted file mode 100644 index 1d03f3f..0000000 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/restaurantapproval/OrderPaidRestaurantRequestMessagePublisher.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.food.order.sysyem.ports.output.message.publisher.restaurantapproval; - -import com.food.order.sysyem.event.publisher.DomainEventPublisher; -import com.food.order.system.domain.event.OrderPaidEvent; - -public interface OrderPaidRestaurantRequestMessagePublisher extends DomainEventPublisher { - -} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/restaurantapproval/RestaurantApprovalRequestMessagePublisher.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/restaurantapproval/RestaurantApprovalRequestMessagePublisher.java new file mode 100644 index 0000000..8f14f8d --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/restaurantapproval/RestaurantApprovalRequestMessagePublisher.java @@ -0,0 +1,13 @@ +package com.food.order.sysyem.ports.output.message.publisher.restaurantapproval; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.sysyem.outbox.model.approval.OrderApprovalOutboxMessage; + +import java.util.function.BiConsumer; + +public interface RestaurantApprovalRequestMessagePublisher { + + void publish(OrderApprovalOutboxMessage message, + BiConsumer outboxCallback); + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/ApprovalOutboxRepository.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/ApprovalOutboxRepository.java new file mode 100644 index 0000000..4cc7355 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/ApprovalOutboxRepository.java @@ -0,0 +1,25 @@ +package com.food.order.sysyem.ports.output.repository; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.saga.SagaStatus; +import com.food.order.sysyem.outbox.model.approval.OrderApprovalOutboxMessage; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface ApprovalOutboxRepository { + OrderApprovalOutboxMessage save(OrderApprovalOutboxMessage message); + + Optional> findByTypeAndOutboxStatusAndSagaStatus(String type, + OutboxStatus outboxStatus, + SagaStatus... sagaStatus); + + Optional findByTypeAndSagaIdAndSagaStatus(String type, + UUID sagaId, + SagaStatus... sagaStatus); + + void deleteByTypeAndOutboxStatusAndSagaStatus(String type, + OutboxStatus outboxStatus, + SagaStatus... sagaStatus); +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/PaymentOutboxRepository.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/PaymentOutboxRepository.java new file mode 100644 index 0000000..a3016a7 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/PaymentOutboxRepository.java @@ -0,0 +1,28 @@ +package com.food.order.sysyem.ports.output.repository; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.saga.SagaStatus; +import com.food.order.sysyem.outbox.model.payment.OrderPaymentOutboxMessage; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface PaymentOutboxRepository { + + OrderPaymentOutboxMessage save(OrderPaymentOutboxMessage message); + + Optional> findByTypeAndOutboxStatusAndSagaStatus( String type, + OutboxStatus outboxStatus, + SagaStatus... sagaStatus); + + Optional findByTypeAndSagaIdAndSagaStatus(String type, + UUID sagaId, + SagaStatus... sagaStatus); + + void deleteByTypeAndOutboxStatusAndSagaStatus(String type, + OutboxStatus outboxStatus, + SagaStatus... sagaStatus); + + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderApprovalSaga.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderApprovalSaga.java index d309c10..314aa46 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderApprovalSaga.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderApprovalSaga.java @@ -6,7 +6,6 @@ import com.food.order.system.saga.SagaStep; import com.food.order.sysyem.dto.message.RestaurantApprovalResponse; import com.food.order.sysyem.event.EmptyEvent; import com.food.order.sysyem.helper.OrderSagaHelper; -import com.food.order.sysyem.ports.output.message.publisher.payment.OrderCancelledPaymentRequestMessagePublisher; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -18,9 +17,10 @@ import org.springframework.transaction.annotation.Transactional; public class OrderApprovalSaga implements SagaStep { private final OrderDomainService orderDomainService; - private final OrderCancelledPaymentRequestMessagePublisher messagePublisher; private final OrderSagaHelper orderSagaHelper; + + @Override @Transactional public EmptyEvent process(RestaurantApprovalResponse data) { @@ -38,7 +38,9 @@ public class OrderApprovalSaga implements SagaStep { private final OrderMessagingDataMapper orderMessagingDataMapper; private final OrderServiceConfigData configData; diff --git a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/CreateOrderKafkaMessagePublisher.java b/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/CreateOrderKafkaMessagePublisher.java index 5ee687c..cce3831 100644 --- a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/CreateOrderKafkaMessagePublisher.java +++ b/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/CreateOrderKafkaMessagePublisher.java @@ -7,7 +7,7 @@ import com.food.order.system.kafka.producer.KafkaMessageHelper; import com.food.order.system.kafka.producer.service.KafkaProducer; import com.food.order.system.order.messaging.mapper.OrderMessagingDataMapper; import com.food.order.sysyem.config.OrderServiceConfigData; -import com.food.order.sysyem.ports.output.message.publisher.payment.OrderCreatedPaymentRequestMessagePublisher; +import com.food.order.sysyem.event.publisher.DomainEventPublisher; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -15,7 +15,7 @@ import org.springframework.stereotype.Component; @Component @Slf4j @RequiredArgsConstructor -public class CreateOrderKafkaMessagePublisher implements OrderCreatedPaymentRequestMessagePublisher { +public class CreateOrderKafkaMessagePublisher implements DomainEventPublisher { private final OrderMessagingDataMapper orderMessagingDataMapper; private final OrderServiceConfigData configData; diff --git a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/PayOrderKafkaMessagePublisher.java b/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/PayOrderKafkaMessagePublisher.java index bf5c71b..24551fb 100644 --- a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/PayOrderKafkaMessagePublisher.java +++ b/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/PayOrderKafkaMessagePublisher.java @@ -6,7 +6,7 @@ import com.food.order.system.kafka.producer.KafkaMessageHelper; import com.food.order.system.kafka.producer.service.KafkaProducer; import com.food.order.system.order.messaging.mapper.OrderMessagingDataMapper; import com.food.order.sysyem.config.OrderServiceConfigData; -import com.food.order.sysyem.ports.output.message.publisher.restaurantapproval.OrderPaidRestaurantRequestMessagePublisher; +import com.food.order.sysyem.event.publisher.DomainEventPublisher; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -14,7 +14,7 @@ import org.springframework.stereotype.Component; @Component @Slf4j @RequiredArgsConstructor -public class PayOrderKafkaMessagePublisher implements OrderPaidRestaurantRequestMessagePublisher { +public class PayOrderKafkaMessagePublisher implements DomainEventPublisher { private final OrderMessagingDataMapper orderMessagingDataMapper; private final OrderServiceConfigData configData;