From 22f85a86d816c075e2b84b1487519a4ba200f13b Mon Sep 17 00:00:00 2001 From: Ali CANLI Date: Thu, 14 Jul 2022 15:45:32 +0300 Subject: [PATCH 1/2] Implement SAGA Pattern commit and rollback. --- .../food/order/sysyem/event/EmptyEvent.java | 14 ++++ infrastructure/pom.xml | 4 + infrastructure/saga/pom.xml | 21 +++++ .../com/food/order/system/saga/SagaStep.java | 8 ++ .../order/adapter/OrderRepositoryImpl.java | 7 ++ .../order-application-service/pom.xml | 5 ++ .../sysyem/OrderCreateCommandHandler.java | 1 + .../PaymentResponseMessageListenerImpl.java | 10 ++- ...ntApprovalResponseMessageListenerImpl.java | 10 ++- .../{ => helper}/OrderCreateHelper.java | 2 +- .../order/sysyem/helper/OrderSagaHelper.java | 27 ++++++ .../output/repository/OrderRepository.java | 2 + .../order/sysyem/saga/OrderApprovalSaga.java | 47 +++++++++++ .../order/sysyem/saga/OrderPaymentSaga.java | 45 ++++++++++ .../mapper/OrderMessagingDataMapper.java | 2 +- .../adapter/CreditHistoryRepositoryImpl.java | 10 ++- .../domain/PaymentDomainServiceImpl.java | 4 +- pom.xml | 7 ++ ...BeanConfig.java => BeanConfiguration.java} | 4 +- .../src/main/resources/init-schema.sql | 3 +- .../adapter/OrderApprovalRepositoryImpl.java | 2 +- .../adapter/RestaurantRepositoryImpl.java | 2 +- .../mapper/RestaurantDataAccessMapper.java | 3 +- .../RestaurantApprovalRequestHelper.java | 83 +++++++++++++++++++ ...antApprovalRequestMessageListenerImpl.java | 7 +- .../config/RestaurantServiceConfigData.java} | 6 +- .../dto/RestaurantApprovalRequest.java | 2 +- ...RestaurantApplicationServiceException.java | 2 +- .../service/mapper/RestaurantDataMapper.java | 5 +- ...taurantApprovalRequestMessageListener.java | 7 ++ .../OrderApprovedMessagePublisher.java | 4 +- .../OrderRejectedMessagePublisher.java | 4 +- .../repository/OrderApprovalRepository.java | 2 +- .../repository/RestaurantRepository.java | 2 +- .../RestaurantApprovalRequestHelper.java | 63 -------------- ...taurantApprovalRequestMessageListener.java | 7 -- ...estaurantApprovalRequestKafkaListener.java | 13 +-- .../mapper/RestaurantMessagingDataMapper.java | 2 +- .../OrderApprovedKafkaMessagePublisher.java | 6 +- .../OrderRejectedKafkaMessagePublisher.java | 6 +- 40 files changed, 343 insertions(+), 118 deletions(-) create mode 100644 common/common-domain/src/main/java/com/food/order/sysyem/event/EmptyEvent.java create mode 100644 infrastructure/saga/pom.xml create mode 100644 infrastructure/saga/src/main/java/com/food/order/system/saga/SagaStep.java rename order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/{ => helper}/OrderCreateHelper.java (98%) create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderSagaHelper.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderApprovalSaga.java create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderPaymentSaga.java rename restaurant-service/restaurant-container/src/main/java/com/food/order/system/restaurant/container/{RestaurantBeanConfig.java => BeanConfiguration.java} (80%) create mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/RestaurantApprovalRequestHelper.java rename restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/{ordery => order}/system/restaurant/domain/service/RestaurantApprovalRequestMessageListenerImpl.java (66%) rename restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/{ordery/system/restaurant/domain/service/config/RestaurantServiceConfig.java => order/system/restaurant/domain/service/config/RestaurantServiceConfigData.java} (76%) rename restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/{ordery => order}/system/restaurant/domain/service/dto/RestaurantApprovalRequest.java (90%) rename restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/{ordery => order}/system/restaurant/domain/service/exception/RestaurantApplicationServiceException.java (84%) rename restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/{ordery => order}/system/restaurant/domain/service/mapper/RestaurantDataMapper.java (90%) create mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/input/message/listener/RestaurantApprovalRequestMessageListener.java rename restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/{ordery => order}/system/restaurant/domain/service/ports/output/message/publisher/OrderApprovedMessagePublisher.java (73%) rename restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/{ordery => order}/system/restaurant/domain/service/ports/output/message/publisher/OrderRejectedMessagePublisher.java (73%) rename restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/{ordery => order}/system/restaurant/domain/service/ports/output/repository/OrderApprovalRepository.java (67%) rename restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/{ordery => order}/system/restaurant/domain/service/ports/output/repository/RestaurantRepository.java (72%) delete mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/RestaurantApprovalRequestHelper.java delete mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/input/message/listener/RestaurantApprovalRequestMessageListener.java diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/event/EmptyEvent.java b/common/common-domain/src/main/java/com/food/order/sysyem/event/EmptyEvent.java new file mode 100644 index 0000000..4301ef8 --- /dev/null +++ b/common/common-domain/src/main/java/com/food/order/sysyem/event/EmptyEvent.java @@ -0,0 +1,14 @@ +package com.food.order.sysyem.event; + +public final class EmptyEvent implements DomainEvent { + + public static final EmptyEvent INSTANCE = new EmptyEvent(); + + private EmptyEvent() { + } + + @Override + public void fire() { + + } +} diff --git a/infrastructure/pom.xml b/infrastructure/pom.xml index 5b56af1..dc4487f 100644 --- a/infrastructure/pom.xml +++ b/infrastructure/pom.xml @@ -10,6 +10,10 @@ 4.0.0 infrastructure + pom + + saga + \ No newline at end of file diff --git a/infrastructure/saga/pom.xml b/infrastructure/saga/pom.xml new file mode 100644 index 0000000..f1cccc7 --- /dev/null +++ b/infrastructure/saga/pom.xml @@ -0,0 +1,21 @@ + + + + infrastructure + com.food.order + 1.0-SNAPSHOT + + 4.0.0 + + saga + + + + com.food.order + common-domain + + + + \ No newline at end of file diff --git a/infrastructure/saga/src/main/java/com/food/order/system/saga/SagaStep.java b/infrastructure/saga/src/main/java/com/food/order/system/saga/SagaStep.java new file mode 100644 index 0000000..7f5aa50 --- /dev/null +++ b/infrastructure/saga/src/main/java/com/food/order/system/saga/SagaStep.java @@ -0,0 +1,8 @@ +package com.food.order.system.saga; + +import com.food.order.sysyem.event.DomainEvent; + +public interface SagaStep { + S process(T data); + U rollback(T data); +} diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/adapter/OrderRepositoryImpl.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/adapter/OrderRepositoryImpl.java index 2c80496..41ff899 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/adapter/OrderRepositoryImpl.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/adapter/OrderRepositoryImpl.java @@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Optional; +import java.util.UUID; @Service @RequiredArgsConstructor @@ -26,6 +27,12 @@ public class OrderRepositoryImpl implements OrderRepository { .save(orderDataAccessMapper.orderToOrderEntity(order))); } + @Override + public Optional findById(String orderId) { + return orderJpaRepository.findById(UUID.fromString(orderId)) + .map(orderDataAccessMapper::orderEntityToOrder); + } + @Override public Optional findByTrackingId(TrackingId trackingId) { return orderJpaRepository.findByTrackingId(trackingId.getValue()) diff --git a/order-service/order-domain/order-application-service/pom.xml b/order-service/order-domain/order-application-service/pom.xml index 1c8dbeb..69a718c 100644 --- a/order-service/order-domain/order-application-service/pom.xml +++ b/order-service/order-domain/order-application-service/pom.xml @@ -36,6 +36,11 @@ spring-tx + + com.food.order + saga + + org.mockito mockito-core 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 21a0e85..0e0a51c 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 @@ -2,6 +2,7 @@ package com.food.order.sysyem; 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.mapper.OrderDataMapper; import com.food.order.sysyem.ports.output.message.publisher.payment.OrderCreatedPaymentRequestMessagePublisher; import lombok.RequiredArgsConstructor; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/PaymentResponseMessageListenerImpl.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/PaymentResponseMessageListenerImpl.java index 043a32c..9546932 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/PaymentResponseMessageListenerImpl.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/PaymentResponseMessageListenerImpl.java @@ -2,6 +2,7 @@ package com.food.order.sysyem; import com.food.order.sysyem.dto.message.PaymentResponse; import com.food.order.sysyem.ports.input.message.listener.payment.PaymentResponseMessageListener; +import com.food.order.sysyem.saga.OrderPaymentSaga; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -13,13 +14,18 @@ import org.springframework.validation.annotation.Validated; @RequiredArgsConstructor public class PaymentResponseMessageListenerImpl implements PaymentResponseMessageListener { + private final OrderPaymentSaga orderPaymentSaga; + @Override public void paymentCompleted(PaymentResponse paymentResponse) { - + var paidEvent = orderPaymentSaga.process(paymentResponse); + log.info("Payment completed for order with id: {}", paidEvent.getOrder().getId()); + paidEvent.fire(); } @Override public void paymentCancelled(PaymentResponse paymentResponse) { - + orderPaymentSaga.rollback(paymentResponse); + log.info("Payment cancelled for order with id: {}", paymentResponse.getOrderId()); } } diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/RestaurantApprovalResponseMessageListenerImpl.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/RestaurantApprovalResponseMessageListenerImpl.java index a1a11d1..5c4ff5f 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/RestaurantApprovalResponseMessageListenerImpl.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/RestaurantApprovalResponseMessageListenerImpl.java @@ -2,6 +2,7 @@ package com.food.order.sysyem; import com.food.order.sysyem.dto.message.RestaurantApprovalResponse; import com.food.order.sysyem.ports.input.message.listener.restaurantapproval.RestaurantApprovalResponseMessageListener; +import com.food.order.sysyem.saga.OrderApprovalSaga; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -11,13 +12,18 @@ import org.springframework.stereotype.Service; @Service public class RestaurantApprovalResponseMessageListenerImpl implements RestaurantApprovalResponseMessageListener { + private final OrderApprovalSaga orderApprovalSaga; + @Override public void orderApproved(RestaurantApprovalResponse restaurantApprovalResponse) { - + orderApprovalSaga.process(restaurantApprovalResponse); + log.info("Order Approved: {}", restaurantApprovalResponse); } @Override public void orderRejected(RestaurantApprovalResponse restaurantApprovalResponse) { - + var event = orderApprovalSaga.rollback(restaurantApprovalResponse); + log.info("Order Rejected: {}", restaurantApprovalResponse); + event.fire(); } } diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderCreateHelper.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderCreateHelper.java similarity index 98% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderCreateHelper.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderCreateHelper.java index 53a3840..fd1163e 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderCreateHelper.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderCreateHelper.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem; +package com.food.order.sysyem.helper; import com.food.order.sysyem.dto.create.CreateOrderCommand; import com.food.order.sysyem.event.publisher.DomainEventPublisher; 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 new file mode 100644 index 0000000..55eb54c --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderSagaHelper.java @@ -0,0 +1,27 @@ +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.sysyem.ports.output.repository.OrderRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderSagaHelper { + + private final OrderRepository orderRepository; + + public Order findOrder(String orderId) { + return orderRepository.findById(orderId) + .orElseThrow(() -> new OrderNotFoundException("Order not found -> Order id :" + orderId)); + } + + public void saveOrder(Order order) { + orderRepository.save(order); + } + + +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/OrderRepository.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/OrderRepository.java index 27c3fa4..95c0b17 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/OrderRepository.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/OrderRepository.java @@ -9,6 +9,8 @@ public interface OrderRepository { Order save(Order order); + Optional findById(String trackingId); + Optional findByTrackingId(TrackingId trackingId); 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 new file mode 100644 index 0000000..d309c10 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderApprovalSaga.java @@ -0,0 +1,47 @@ +package com.food.order.sysyem.saga; + +import com.food.order.system.domain.event.OrderCancelledEvent; +import com.food.order.system.domain.service.OrderDomainService; +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; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderApprovalSaga implements SagaStep { + + private final OrderDomainService orderDomainService; + private final OrderCancelledPaymentRequestMessagePublisher messagePublisher; + private final OrderSagaHelper orderSagaHelper; + + @Override + @Transactional + public EmptyEvent process(RestaurantApprovalResponse data) { + log.info("Approving order with id: {}", data.getOrderId()); + var order = orderSagaHelper.findOrder(data.getOrderId()); + orderDomainService.approve(order); + orderSagaHelper.saveOrder(order); + log.info("Order approved: {}", order); + return EmptyEvent.INSTANCE; + } + + + @Override + @Transactional + public OrderCancelledEvent rollback(RestaurantApprovalResponse data) { + log.info("Approving order with id: {}", data.getOrderId()); + var order = orderSagaHelper.findOrder(data.getOrderId()); + var cancelEvent = orderDomainService.cancelOrderPayment(order,data.getFailureMessages(), + messagePublisher); + orderSagaHelper.saveOrder(order); + log.info("Order cancelled: {}", order); + return cancelEvent; + } +} diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderPaymentSaga.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderPaymentSaga.java new file mode 100644 index 0000000..d84beae --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderPaymentSaga.java @@ -0,0 +1,45 @@ +package com.food.order.sysyem.saga; + +import com.food.order.system.domain.event.OrderPaidEvent; +import com.food.order.system.domain.service.OrderDomainService; +import com.food.order.system.saga.SagaStep; +import com.food.order.sysyem.dto.message.PaymentResponse; +import com.food.order.sysyem.event.EmptyEvent; +import com.food.order.sysyem.helper.OrderSagaHelper; +import com.food.order.sysyem.ports.output.message.publisher.restaurantapproval.OrderPaidRestaurantRequestMessagePublisher; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderPaymentSaga implements SagaStep { + + private final OrderDomainService orderDomainService; + private final OrderSagaHelper orderSagaHelper; + private final OrderPaidRestaurantRequestMessagePublisher orderPaidRestaurantRequestMessagePublisher; + + @Override + @Transactional + public OrderPaidEvent process(PaymentResponse data) { + log.info("Completing payment for order with id: {}", data.getOrderId()); + var order = orderSagaHelper.findOrder(data.getOrderId()); + var paidEvent = orderDomainService.payOrder(order,orderPaidRestaurantRequestMessagePublisher); + orderSagaHelper.saveOrder(order); + log.info("Payment completed for order with id: {}", order.getId()); + return paidEvent; + } + + @Override + @Transactional + public EmptyEvent rollback(PaymentResponse data) { + log.info("Rolling back payment for order with id: {}", data.getOrderId()); + var order = orderSagaHelper.findOrder(data.getOrderId()); + orderDomainService.cancelOrder(order,data.getFailureMessages()); + orderSagaHelper.saveOrder(order); + log.info("Payment rolled back for order with id: {}", order.getId()); + return EmptyEvent.INSTANCE; + } +} diff --git a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/mapper/OrderMessagingDataMapper.java b/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/mapper/OrderMessagingDataMapper.java index f4cfb3b..1ddd3a8 100644 --- a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/mapper/OrderMessagingDataMapper.java +++ b/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/mapper/OrderMessagingDataMapper.java @@ -49,7 +49,7 @@ public class OrderMessagingDataMapper { .setRestaurantId(order.getRestaurantId().getValue().toString()) .setProducts(order.getItems().stream() .map(item -> Product.newBuilder() - .setId(item.getId().getValue().toString()) + .setId(item.getProduct().getId().getValue().toString()) .setQuantity(item.getQuantity()) .build()) .toList()) diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/adapter/CreditHistoryRepositoryImpl.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/adapter/CreditHistoryRepositoryImpl.java index 283b7af..acc8788 100644 --- a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/adapter/CreditHistoryRepositoryImpl.java +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/adapter/CreditHistoryRepositoryImpl.java @@ -2,6 +2,7 @@ package com.food.order.system.payment.data.access.credithistory.adapter; import com.food.order.system.payment.application.service.ports.output.repository.CreditHistoryRepository; +import com.food.order.system.payment.data.access.credithistory.entity.CreditHistoryEntity; import com.food.order.system.payment.data.access.credithistory.mapper.CreditHistoryDataAccessMapper; import com.food.order.system.payment.data.access.credithistory.repository.CreditHistoryJpaRepository; import com.food.order.system.payment.service.domain.entity.CreditHistory; @@ -10,6 +11,7 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Component public class CreditHistoryRepositoryImpl implements CreditHistoryRepository { @@ -29,13 +31,15 @@ public class CreditHistoryRepositoryImpl implements CreditHistoryRepository { .save(creditHistoryDataAccessMapper.creditHistoryToCreditHistoryEntity(creditHistory))); } + @Override public Optional> findByCustomerId(CustomerId customerId) { - return creditHistoryJpaRepository.findByCustomerId(customerId.getValue()) + Optional> creditHistory = + creditHistoryJpaRepository.findByCustomerId(customerId.getValue()); + return creditHistory .map(creditHistoryList -> creditHistoryList.stream() .map(creditHistoryDataAccessMapper::creditHistoryEntityToCreditHistory) - .toList()); - + .collect(Collectors.toList())); } } diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainServiceImpl.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainServiceImpl.java index 570dd55..f3bb89e 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainServiceImpl.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainServiceImpl.java @@ -100,7 +100,9 @@ public class PaymentDomainServiceImpl implements PaymentDomainService { .reduce(Money.ZERO, Money::add); } - private void updateCreditHistory(Payment payment, List creditHistory, TransactionType transactionType) { + private void updateCreditHistory(Payment payment, + List creditHistory, + TransactionType transactionType) { creditHistory.add( CreditHistory.builder() .id(new CreditHistoryId(UUID.randomUUID())) diff --git a/pom.xml b/pom.xml index 8ea78e5..1b6ef04 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,13 @@ ${project.version} + + com.food.order + saga + ${project.version} + + + com.food.order payment-domain-core diff --git a/restaurant-service/restaurant-container/src/main/java/com/food/order/system/restaurant/container/RestaurantBeanConfig.java b/restaurant-service/restaurant-container/src/main/java/com/food/order/system/restaurant/container/BeanConfiguration.java similarity index 80% rename from restaurant-service/restaurant-container/src/main/java/com/food/order/system/restaurant/container/RestaurantBeanConfig.java rename to restaurant-service/restaurant-container/src/main/java/com/food/order/system/restaurant/container/BeanConfiguration.java index ef28de8..37c1fb4 100644 --- a/restaurant-service/restaurant-container/src/main/java/com/food/order/system/restaurant/container/RestaurantBeanConfig.java +++ b/restaurant-service/restaurant-container/src/main/java/com/food/order/system/restaurant/container/BeanConfiguration.java @@ -6,10 +6,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration -public class RestaurantBeanConfig { +public class BeanConfiguration { @Bean - public RestaurantDomainService restaurantService() { + public RestaurantDomainService restaurantDomainService() { return new RestaurantDomainServiceImpl(); } } diff --git a/restaurant-service/restaurant-container/src/main/resources/init-schema.sql b/restaurant-service/restaurant-container/src/main/resources/init-schema.sql index d14ba7a..542e1ca 100644 --- a/restaurant-service/restaurant-container/src/main/resources/init-schema.sql +++ b/restaurant-service/restaurant-container/src/main/resources/init-schema.sql @@ -75,7 +75,8 @@ AS p.id AS product_id, p.name AS product_name, p.price AS product_price, - p.available AS product_available + p.available AS product_available, + r.active AS product_active FROM restaurant.restaurants r, restaurant.products p, restaurant.restaurant_products rp diff --git a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/adapter/OrderApprovalRepositoryImpl.java b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/adapter/OrderApprovalRepositoryImpl.java index f2293ff..5e4a311 100644 --- a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/adapter/OrderApprovalRepositoryImpl.java +++ b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/adapter/OrderApprovalRepositoryImpl.java @@ -3,7 +3,7 @@ package com.food.order.system.data.access.restaurant.adapter; import com.food.order.system.data.access.restaurant.mapper.RestaurantDataAccessMapper; import com.food.order.system.data.access.restaurant.repository.OrderApprovalJpaRepository; import com.food.order.system.restaurant.domain.core.entity.OrderApproval; -import com.food.ordery.system.restaurant.domain.service.ports.output.repository.OrderApprovalRepository; +import com.food.order.system.restaurant.domain.service.ports.output.repository.OrderApprovalRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/adapter/RestaurantRepositoryImpl.java b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/adapter/RestaurantRepositoryImpl.java index 515ee9a..4abe55e 100644 --- a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/adapter/RestaurantRepositoryImpl.java +++ b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/adapter/RestaurantRepositoryImpl.java @@ -4,7 +4,7 @@ import com.food.order.system.common.data.access.entity.RestaurantEntity; import com.food.order.system.common.data.access.repository.RestaurantJpaRepository; import com.food.order.system.data.access.restaurant.mapper.RestaurantDataAccessMapper; import com.food.order.system.restaurant.domain.core.entity.Restaurant; -import com.food.ordery.system.restaurant.domain.service.ports.output.repository.RestaurantRepository; +import com.food.order.system.restaurant.domain.service.ports.output.repository.RestaurantRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/mapper/RestaurantDataAccessMapper.java b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/mapper/RestaurantDataAccessMapper.java index 732f5a4..740cb64 100644 --- a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/mapper/RestaurantDataAccessMapper.java +++ b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/mapper/RestaurantDataAccessMapper.java @@ -16,7 +16,6 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; @Component public class RestaurantDataAccessMapper { @@ -39,7 +38,7 @@ public class RestaurantDataAccessMapper { .price(new Money(entity.getProductPrice())) .available(entity.getProductActive()) .build()) - .collect(Collectors.toList()); + .toList(); return Restaurant.builder() .restaurantId(new RestaurantId(restaurantEntity.getRestaurantId())) diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/RestaurantApprovalRequestHelper.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/RestaurantApprovalRequestHelper.java new file mode 100644 index 0000000..af7d3cf --- /dev/null +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/RestaurantApprovalRequestHelper.java @@ -0,0 +1,83 @@ +package com.food.order.system.restaurant.domain.service; + +import com.food.order.system.restaurant.domain.core.RestaurantDomainService; +import com.food.order.system.restaurant.domain.core.entity.Restaurant; +import com.food.order.system.restaurant.domain.core.event.OrderApprovalEvent; +import com.food.order.system.restaurant.domain.core.exception.RestaurantNotFoundException; +import com.food.order.system.restaurant.domain.service.dto.RestaurantApprovalRequest; +import com.food.order.system.restaurant.domain.service.mapper.RestaurantDataMapper; +import com.food.order.system.restaurant.domain.service.ports.output.message.publisher.OrderApprovedMessagePublisher; +import com.food.order.system.restaurant.domain.service.ports.output.message.publisher.OrderRejectedMessagePublisher; +import com.food.order.system.restaurant.domain.service.ports.output.repository.OrderApprovalRepository; +import com.food.order.system.restaurant.domain.service.ports.output.repository.RestaurantRepository; +import com.food.order.sysyem.valueobject.OrderId; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Slf4j +@Component +public class RestaurantApprovalRequestHelper { + + private final RestaurantDomainService restaurantDomainService; + private final RestaurantDataMapper restaurantDataMapper; + private final RestaurantRepository restaurantRepository; + private final OrderApprovalRepository orderApprovalRepository; + private final OrderApprovedMessagePublisher orderApprovedMessagePublisher; + private final OrderRejectedMessagePublisher orderRejectedMessagePublisher; + + public RestaurantApprovalRequestHelper(RestaurantDomainService restaurantDomainService, + RestaurantDataMapper restaurantDataMapper, + RestaurantRepository restaurantRepository, + OrderApprovalRepository orderApprovalRepository, + OrderApprovedMessagePublisher orderApprovedMessagePublisher, + OrderRejectedMessagePublisher orderRejectedMessagePublisher) { + this.restaurantDomainService = restaurantDomainService; + this.restaurantDataMapper = restaurantDataMapper; + this.restaurantRepository = restaurantRepository; + this.orderApprovalRepository = orderApprovalRepository; + this.orderApprovedMessagePublisher = orderApprovedMessagePublisher; + this.orderRejectedMessagePublisher = orderRejectedMessagePublisher; + } + + @Transactional + public OrderApprovalEvent persistOrderApproval(RestaurantApprovalRequest request) { + log.info("Persisting order approval request: {}", request); + List failureMessages = new ArrayList<>(); + var restaurant = findRestaurant(request); + var event = restaurantDomainService.validateOrder + (restaurant, failureMessages, orderApprovedMessagePublisher, orderRejectedMessagePublisher); + + orderApprovalRepository.save(restaurant.getOrderApproval()); + return event; + + } + + private Restaurant findRestaurant(RestaurantApprovalRequest restaurantApprovalRequest) { + Restaurant restaurant = restaurantDataMapper + .restaurantApprovalRequestToRestaurant(restaurantApprovalRequest); + Optional restaurantResult = restaurantRepository.findRestaurantInformation(restaurant); + if (restaurantResult.isEmpty()) { + log.error("Restaurant with id " + restaurant.getId().getValue() + " not found!"); + throw new RestaurantNotFoundException("Restaurant with id " + restaurant.getId().getValue() + + " not found!"); + } + + Restaurant restaurantEntity = restaurantResult.get(); + restaurant.setActive(restaurantEntity.isActive()); + restaurant.getOrderDetail().getProducts().forEach(product -> + restaurantEntity.getOrderDetail().getProducts().forEach(p -> { + if (p.getId().equals(product.getId())) { + product.updateWithConfirmedNamePriceAndAvailablity(p.getName(), p.getPrice(), p.isAvailable()); + } + })); + restaurant.getOrderDetail().setId(new OrderId(UUID.fromString(restaurantApprovalRequest.getOrderId()))); + + return restaurant; + } +} diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/RestaurantApprovalRequestMessageListenerImpl.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/RestaurantApprovalRequestMessageListenerImpl.java similarity index 66% rename from restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/RestaurantApprovalRequestMessageListenerImpl.java rename to restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/RestaurantApprovalRequestMessageListenerImpl.java index 4b58fa5..eb2c020 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/RestaurantApprovalRequestMessageListenerImpl.java +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/RestaurantApprovalRequestMessageListenerImpl.java @@ -1,7 +1,7 @@ -package com.food.ordery.system.restaurant.domain.service; +package com.food.order.system.restaurant.domain.service; -import com.food.ordery.system.restaurant.domain.service.dto.RestaurantApprovalRequest; -import com.food.ordery.system.restaurant.domain.service.ports.input.message.listener.RestaurantApprovalRequestMessageListener; +import com.food.order.system.restaurant.domain.service.dto.RestaurantApprovalRequest; +import com.food.order.system.restaurant.domain.service.ports.input.message.listener.RestaurantApprovalRequestMessageListener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -10,7 +10,6 @@ import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class RestaurantApprovalRequestMessageListenerImpl implements RestaurantApprovalRequestMessageListener { - private final RestaurantApprovalRequestHelper restaurantApprovalRequestHelper; @Override diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/config/RestaurantServiceConfig.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/config/RestaurantServiceConfigData.java similarity index 76% rename from restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/config/RestaurantServiceConfig.java rename to restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/config/RestaurantServiceConfigData.java index 320fff1..6b09832 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/config/RestaurantServiceConfig.java +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/config/RestaurantServiceConfigData.java @@ -1,4 +1,4 @@ -package com.food.ordery.system.restaurant.domain.service.config; +package com.food.order.system.restaurant.domain.service.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -7,9 +7,7 @@ import org.springframework.context.annotation.Configuration; @Data @Configuration @ConfigurationProperties(prefix = "restaurant-service") -public class RestaurantServiceConfig { - +public class RestaurantServiceConfigData { private String restaurantApprovalRequestTopicName; private String restaurantApprovalResponseTopicName; - } diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/dto/RestaurantApprovalRequest.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/dto/RestaurantApprovalRequest.java similarity index 90% rename from restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/dto/RestaurantApprovalRequest.java rename to restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/dto/RestaurantApprovalRequest.java index b0afe0e..4cdbb50 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/dto/RestaurantApprovalRequest.java +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/dto/RestaurantApprovalRequest.java @@ -1,4 +1,4 @@ -package com.food.ordery.system.restaurant.domain.service.dto; +package com.food.order.system.restaurant.domain.service.dto; import com.food.order.system.restaurant.domain.core.entity.Product; import com.food.order.sysyem.valueobject.RestaurantOrderStatus; diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/exception/RestaurantApplicationServiceException.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/exception/RestaurantApplicationServiceException.java similarity index 84% rename from restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/exception/RestaurantApplicationServiceException.java rename to restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/exception/RestaurantApplicationServiceException.java index 6816abc..72a116b 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/exception/RestaurantApplicationServiceException.java +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/exception/RestaurantApplicationServiceException.java @@ -1,4 +1,4 @@ -package com.food.ordery.system.restaurant.domain.service.exception; +package com.food.order.system.restaurant.domain.service.exception; import com.food.order.sysyem.exception.DomainException; diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/mapper/RestaurantDataMapper.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/mapper/RestaurantDataMapper.java similarity index 90% rename from restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/mapper/RestaurantDataMapper.java rename to restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/mapper/RestaurantDataMapper.java index 727e0de..ff918a7 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/mapper/RestaurantDataMapper.java +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/mapper/RestaurantDataMapper.java @@ -1,4 +1,4 @@ -package com.food.ordery.system.restaurant.domain.service.mapper; +package com.food.order.system.restaurant.domain.service.mapper; import com.food.order.system.restaurant.domain.core.entity.OrderDetail; import com.food.order.system.restaurant.domain.core.entity.Product; @@ -7,7 +7,7 @@ import com.food.order.sysyem.valueobject.Money; import com.food.order.sysyem.valueobject.OrderId; import com.food.order.sysyem.valueobject.OrderStatus; import com.food.order.sysyem.valueobject.RestaurantId; -import com.food.ordery.system.restaurant.domain.service.dto.RestaurantApprovalRequest; +import com.food.order.system.restaurant.domain.service.dto.RestaurantApprovalRequest; import org.springframework.stereotype.Component; import java.util.UUID; @@ -24,7 +24,6 @@ public class RestaurantDataMapper { product -> Product.builder() .productId(product.getId()) .quantity(product.getQuantity()) - .build() ).toList()) .totalAmount(new Money(request.getPrice())) diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/input/message/listener/RestaurantApprovalRequestMessageListener.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/input/message/listener/RestaurantApprovalRequestMessageListener.java new file mode 100644 index 0000000..391dfa2 --- /dev/null +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/input/message/listener/RestaurantApprovalRequestMessageListener.java @@ -0,0 +1,7 @@ +package com.food.order.system.restaurant.domain.service.ports.input.message.listener; + +import com.food.order.system.restaurant.domain.service.dto.RestaurantApprovalRequest; + +public interface RestaurantApprovalRequestMessageListener { + void approveOrder(RestaurantApprovalRequest restaurantApprovalRequest); +} diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/message/publisher/OrderApprovedMessagePublisher.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/OrderApprovedMessagePublisher.java similarity index 73% rename from restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/message/publisher/OrderApprovedMessagePublisher.java rename to restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/OrderApprovedMessagePublisher.java index 80c5962..f113fdc 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/message/publisher/OrderApprovedMessagePublisher.java +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/OrderApprovedMessagePublisher.java @@ -1,8 +1,8 @@ -package com.food.ordery.system.restaurant.domain.service.ports.output.message.publisher; +package com.food.order.system.restaurant.domain.service.ports.output.message.publisher; import com.food.order.system.restaurant.domain.core.event.OrderApprovedEvent; import com.food.order.sysyem.event.publisher.DomainEventPublisher; public interface OrderApprovedMessagePublisher extends DomainEventPublisher { - } + diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/message/publisher/OrderRejectedMessagePublisher.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/OrderRejectedMessagePublisher.java similarity index 73% rename from restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/message/publisher/OrderRejectedMessagePublisher.java rename to restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/OrderRejectedMessagePublisher.java index 2878ce6..b5b47cf 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/message/publisher/OrderRejectedMessagePublisher.java +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/OrderRejectedMessagePublisher.java @@ -1,8 +1,8 @@ -package com.food.ordery.system.restaurant.domain.service.ports.output.message.publisher; +package com.food.order.system.restaurant.domain.service.ports.output.message.publisher; import com.food.order.system.restaurant.domain.core.event.OrderRejectedEvent; import com.food.order.sysyem.event.publisher.DomainEventPublisher; public interface OrderRejectedMessagePublisher extends DomainEventPublisher { - } + diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/repository/OrderApprovalRepository.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/OrderApprovalRepository.java similarity index 67% rename from restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/repository/OrderApprovalRepository.java rename to restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/OrderApprovalRepository.java index e897f1d..3fa260c 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/repository/OrderApprovalRepository.java +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/OrderApprovalRepository.java @@ -1,4 +1,4 @@ -package com.food.ordery.system.restaurant.domain.service.ports.output.repository; +package com.food.order.system.restaurant.domain.service.ports.output.repository; import com.food.order.system.restaurant.domain.core.entity.OrderApproval; diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/repository/RestaurantRepository.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/RestaurantRepository.java similarity index 72% rename from restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/repository/RestaurantRepository.java rename to restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/RestaurantRepository.java index 8ca9da5..d996d9e 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/output/repository/RestaurantRepository.java +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/RestaurantRepository.java @@ -1,4 +1,4 @@ -package com.food.ordery.system.restaurant.domain.service.ports.output.repository; +package com.food.order.system.restaurant.domain.service.ports.output.repository; import com.food.order.system.restaurant.domain.core.entity.Restaurant; diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/RestaurantApprovalRequestHelper.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/RestaurantApprovalRequestHelper.java deleted file mode 100644 index 11f8786..0000000 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/RestaurantApprovalRequestHelper.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.food.ordery.system.restaurant.domain.service; - -import com.food.order.system.restaurant.domain.core.RestaurantDomainService; -import com.food.order.system.restaurant.domain.core.entity.Restaurant; -import com.food.order.system.restaurant.domain.core.event.OrderApprovalEvent; -import com.food.order.system.restaurant.domain.core.exception.RestaurantNotFoundException; -import com.food.order.sysyem.valueobject.OrderId; -import com.food.ordery.system.restaurant.domain.service.dto.RestaurantApprovalRequest; -import com.food.ordery.system.restaurant.domain.service.mapper.RestaurantDataMapper; -import com.food.ordery.system.restaurant.domain.service.ports.output.message.publisher.OrderApprovedMessagePublisher; -import com.food.ordery.system.restaurant.domain.service.ports.output.message.publisher.OrderRejectedMessagePublisher; -import com.food.ordery.system.restaurant.domain.service.ports.output.repository.OrderApprovalRepository; -import com.food.ordery.system.restaurant.domain.service.ports.output.repository.RestaurantRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -@Slf4j -@Component -@RequiredArgsConstructor -public class RestaurantApprovalRequestHelper { - - private final RestaurantDomainService restaurantDomainService; - private final RestaurantDataMapper restaurantDataMapper; - private final RestaurantRepository restaurantRepository; - private final OrderApprovalRepository orderApprovalRepository; - private final OrderApprovedMessagePublisher orderApprovedMessagePublisher; - private final OrderRejectedMessagePublisher orderRejectedMessagePublisher; - - @Transactional - public OrderApprovalEvent persistOrderApproval(RestaurantApprovalRequest request) { - log.info("Persisting order approval request: {}", request); - List failureMessages = new ArrayList<>(); - var restaurant = findRestaurant(request); - var event = restaurantDomainService.validateOrder - (restaurant, failureMessages, orderApprovedMessagePublisher, orderRejectedMessagePublisher); - - orderApprovalRepository.save(restaurant.getOrderApproval()); - return event; - - } - - private Restaurant findRestaurant(RestaurantApprovalRequest request) { - var restaurant = restaurantDataMapper.restaurantApprovalRequestToRestaurant(request); - var resultRestaurant = restaurantRepository.findRestaurantInformation(restaurant).orElseThrow( - () -> new RestaurantNotFoundException("Restaurant not found") - ); - restaurant.setActive(resultRestaurant.isActive()); - restaurant.getOrderDetail().getProducts().forEach(product -> { - resultRestaurant.getOrderDetail().getProducts().forEach(p -> { - if (p.getId().equals(product.getId())) { - p.updateWithConfirmedNamePriceAndAvailablity(p.getName(),p.getPrice(), p.isAvailable()); - }}); - }); - restaurant.getOrderDetail().setId(new OrderId(UUID.fromString(request.getOrderId()))); - return restaurant; - } -} diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/input/message/listener/RestaurantApprovalRequestMessageListener.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/input/message/listener/RestaurantApprovalRequestMessageListener.java deleted file mode 100644 index 4b72ecd..0000000 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/ordery/system/restaurant/domain/service/ports/input/message/listener/RestaurantApprovalRequestMessageListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.food.ordery.system.restaurant.domain.service.ports.input.message.listener; - -import com.food.ordery.system.restaurant.domain.service.dto.RestaurantApprovalRequest; - -public interface RestaurantApprovalRequestMessageListener { - void approveOrder(RestaurantApprovalRequest request); -} diff --git a/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/listener/kafka/RestaurantApprovalRequestKafkaListener.java b/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/listener/kafka/RestaurantApprovalRequestKafkaListener.java index 63ee9fc..573f36b 100644 --- a/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/listener/kafka/RestaurantApprovalRequestKafkaListener.java +++ b/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/listener/kafka/RestaurantApprovalRequestKafkaListener.java @@ -4,25 +4,28 @@ package com.food.order.system.restaurant.messaging.listener.kafka; import com.food.order.system.kafka.consumer.KafkaConsumer; import com.food.order.system.kafka.order.avro.model.RestaurantApprovalRequestAvroModel; import com.food.order.system.restaurant.messaging.mapper.RestaurantMessagingDataMapper; -import com.food.ordery.system.restaurant.domain.service.ports.input.message.listener.RestaurantApprovalRequestMessageListener; -import lombok.RequiredArgsConstructor; +import com.food.order.system.restaurant.domain.service.ports.input.message.listener.RestaurantApprovalRequestMessageListener; import lombok.extern.slf4j.Slf4j; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.kafka.support.KafkaHeaders; import org.springframework.messaging.handler.annotation.Header; import org.springframework.messaging.handler.annotation.Payload; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import java.util.List; @Slf4j -@Component -@RequiredArgsConstructor +@Service public class RestaurantApprovalRequestKafkaListener implements KafkaConsumer { private final RestaurantApprovalRequestMessageListener restaurantApprovalRequestMessageListener; private final RestaurantMessagingDataMapper restaurantMessagingDataMapper; + public RestaurantApprovalRequestKafkaListener(RestaurantApprovalRequestMessageListener restaurantApprovalRequestMessageListener, + RestaurantMessagingDataMapper restaurantMessagingDataMapper) { + this.restaurantApprovalRequestMessageListener = restaurantApprovalRequestMessageListener; + this.restaurantMessagingDataMapper = restaurantMessagingDataMapper; + } @Override @KafkaListener(id = "${kafka-consumer-config.restaurant-approval-consumer-group-id}", diff --git a/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/mapper/RestaurantMessagingDataMapper.java b/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/mapper/RestaurantMessagingDataMapper.java index 0ca0da6..226cb5c 100644 --- a/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/mapper/RestaurantMessagingDataMapper.java +++ b/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/mapper/RestaurantMessagingDataMapper.java @@ -9,7 +9,7 @@ import com.food.order.system.restaurant.domain.core.event.OrderApprovedEvent; import com.food.order.system.restaurant.domain.core.event.OrderRejectedEvent; import com.food.order.sysyem.valueobject.ProductId; import com.food.order.sysyem.valueobject.RestaurantOrderStatus; -import com.food.ordery.system.restaurant.domain.service.dto.RestaurantApprovalRequest; +import com.food.order.system.restaurant.domain.service.dto.RestaurantApprovalRequest; import org.springframework.stereotype.Component; import java.util.UUID; diff --git a/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderApprovedKafkaMessagePublisher.java b/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderApprovedKafkaMessagePublisher.java index 58451ec..001b530 100644 --- a/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderApprovedKafkaMessagePublisher.java +++ b/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderApprovedKafkaMessagePublisher.java @@ -6,8 +6,8 @@ import com.food.order.system.kafka.producer.KafkaMessageHelper; import com.food.order.system.kafka.producer.service.KafkaProducer; import com.food.order.system.restaurant.domain.core.event.OrderApprovedEvent; import com.food.order.system.restaurant.messaging.mapper.RestaurantMessagingDataMapper; -import com.food.ordery.system.restaurant.domain.service.config.RestaurantServiceConfig; -import com.food.ordery.system.restaurant.domain.service.ports.output.message.publisher.OrderApprovedMessagePublisher; +import com.food.order.system.restaurant.domain.service.config.RestaurantServiceConfigData; +import com.food.order.system.restaurant.domain.service.ports.output.message.publisher.OrderApprovedMessagePublisher; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -19,7 +19,7 @@ public class OrderApprovedKafkaMessagePublisher implements OrderApprovedMessageP private final RestaurantMessagingDataMapper restaurantMessagingDataMapper; private final KafkaProducer kafkaProducer; - private final RestaurantServiceConfig restaurantServiceConfigData; + private final RestaurantServiceConfigData restaurantServiceConfigData; private final KafkaMessageHelper kafkaMessageHelper; diff --git a/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderRejectedKafkaMessagePublisher.java b/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderRejectedKafkaMessagePublisher.java index adbb1e2..254a23b 100644 --- a/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderRejectedKafkaMessagePublisher.java +++ b/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderRejectedKafkaMessagePublisher.java @@ -6,8 +6,8 @@ import com.food.order.system.kafka.producer.KafkaMessageHelper; import com.food.order.system.kafka.producer.service.KafkaProducer; import com.food.order.system.restaurant.domain.core.event.OrderRejectedEvent; import com.food.order.system.restaurant.messaging.mapper.RestaurantMessagingDataMapper; -import com.food.ordery.system.restaurant.domain.service.config.RestaurantServiceConfig; -import com.food.ordery.system.restaurant.domain.service.ports.output.message.publisher.OrderRejectedMessagePublisher; +import com.food.order.system.restaurant.domain.service.config.RestaurantServiceConfigData; +import com.food.order.system.restaurant.domain.service.ports.output.message.publisher.OrderRejectedMessagePublisher; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -19,7 +19,7 @@ public class OrderRejectedKafkaMessagePublisher implements OrderRejectedMessageP private final RestaurantMessagingDataMapper restaurantMessagingDataMapper; private final KafkaProducer kafkaProducer; - private final RestaurantServiceConfig restaurantServiceConfigData; + private final RestaurantServiceConfigData restaurantServiceConfigData; private final KafkaMessageHelper kafkaMessageHelper; From efbeeacb39f8bf414bbd33e997f227bc8f4619d4 Mon Sep 17 00:00:00 2001 From: Ali CANLI Date: Thu, 14 Jul 2022 23:49:23 +0300 Subject: [PATCH 2/2] Bug fixed and preparing for OutBox Pattern For Transaction Management. --- .../access/order/mapper/OrderDataAccessMapper.java | 10 ++++++---- .../com/food/order/system/domain/entity/Order.java | 2 +- .../domain/service/impl/OrderDomainServiceImpl.java | 3 ++- .../src/main/resources/init-schema.sql | 3 +-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/mapper/OrderDataAccessMapper.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/mapper/OrderDataAccessMapper.java index 8e6a7b6..d043016 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/mapper/OrderDataAccessMapper.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/mapper/OrderDataAccessMapper.java @@ -13,7 +13,9 @@ import com.food.order.sysyem.valueobject.*; import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Objects; import static com.food.order.system.domain.entity.Order.FAILURE_MESSAGE_DELIMITER; @@ -30,7 +32,7 @@ public class OrderDataAccessMapper { orderEntity.setAddress(deliveryAddressToAddressEntity(order.getDeliveryAddress())); orderEntity.setPrice(order.getPrice().getAmount()); orderEntity.setItems(orderItemsToOrderItemsEntity(order.getItems())); - orderEntity.setFailureMessages(order.getFailureMessages() != null ? + orderEntity.setFailureMessages(Objects.nonNull(order.getFailureMessages()) ? String.join(FAILURE_MESSAGE_DELIMITER, order.getFailureMessages()) : ""); orderEntity.getAddress().setOrder(orderEntity); orderEntity.getItems().forEach(item -> item.setOrderEntity(orderEntity)); @@ -47,9 +49,9 @@ public class OrderDataAccessMapper { .items(orderItemsEntityToOrderItems(orderEntity.getItems())) .trackingId(new TrackingId(orderEntity.getTrackingId())) .status(orderEntity.getOrderStatus()) - .failureMessages(orderEntity.getFailureMessages() != null ? - List.of(orderEntity.getFailureMessages().split(FAILURE_MESSAGE_DELIMITER)) : - new ArrayList<>()) + .failureMessages(Objects.isNull(orderEntity.getFailureMessages()) ? new ArrayList<>() : + new ArrayList<>(Arrays.asList(orderEntity.getFailureMessages() + .split(FAILURE_MESSAGE_DELIMITER)))) .build(); } diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Order.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Order.java index 08cf7a2..c9fc1ce 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Order.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Order.java @@ -53,7 +53,7 @@ public class Order extends AggregateRoot { } public void cancel(List failureMessages){ - if(Objects.equals(status, OrderStatus.CANCELLING) || Objects.equals(status, OrderStatus.PENDING)) + if(!(Objects.equals(status, OrderStatus.CANCELLING) || Objects.equals(status, OrderStatus.PENDING))) throw new OrderDomainException("Order status is not correct for cancel operation !"); status = OrderStatus.CANCELLED; updateFailureMessages(failureMessages); diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/service/impl/OrderDomainServiceImpl.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/service/impl/OrderDomainServiceImpl.java index 418d245..1fb74f2 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/service/impl/OrderDomainServiceImpl.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/service/impl/OrderDomainServiceImpl.java @@ -35,7 +35,8 @@ public class OrderDomainServiceImpl implements OrderDomainService { .forEach(orderItem -> restaurant.getProducts().forEach(restaurantProduct -> { var currentProduct = orderItem.getProduct(); if(currentProduct.equals(restaurantProduct)){ - currentProduct.updateWithConfirmedNameAndPrice(restaurantProduct.getName(),restaurantProduct.getPrice()); + currentProduct.updateWithConfirmedNameAndPrice(restaurantProduct.getName(), + restaurantProduct.getPrice()); } })); } diff --git a/restaurant-service/restaurant-container/src/main/resources/init-schema.sql b/restaurant-service/restaurant-container/src/main/resources/init-schema.sql index 542e1ca..8f47d26 100644 --- a/restaurant-service/restaurant-container/src/main/resources/init-schema.sql +++ b/restaurant-service/restaurant-container/src/main/resources/init-schema.sql @@ -75,8 +75,7 @@ AS p.id AS product_id, p.name AS product_name, p.price AS product_price, - p.available AS product_available, - r.active AS product_active + p.available AS product_active FROM restaurant.restaurants r, restaurant.products p, restaurant.restaurant_products rp