From 9ff94746f6c44355617ad68c3575a5505b58daee Mon Sep 17 00:00:00 2001 From: Ali CANLI Date: Sat, 16 Jul 2022 14:01:49 +0300 Subject: [PATCH 1/4] Outbox Message and Scheduler class implemented part - 3. --- .../{sysyem => system}/DomainConstants.java | 2 +- .../entity/AggregateRoot.java | 2 +- .../{sysyem => system}/entity/BaseEntity.java | 2 +- .../{sysyem => system}/event/DomainEvent.java | 2 +- .../event/publisher/DomainEventPublisher.java | 4 +- .../exception/DomainException.java | 2 +- .../valueobject/BaseId.java | 2 +- .../valueobject/CustomerId.java | 2 +- .../{sysyem => system}/valueobject/Money.java | 2 +- .../valueobject/OrderApprovalStatus.java | 2 +- .../valueobject/OrderId.java | 2 +- .../valueobject/OrderStatus.java | 2 +- .../valueobject/PaymentOrderStatus.java | 2 +- .../valueobject/PaymentStatus.java | 2 +- .../valueobject/ProductId.java | 2 +- .../valueobject/RestaurantId.java | 2 +- .../valueobject/RestaurantOrderStatus.java | 2 +- .../food/order/sysyem/event/EmptyEvent.java | 14 -- infrastructure/kafka/kafka-producer/pom.xml | 4 + .../kafka/producer/KafkaMessageHelper.java | 47 +++- .../service/app/api/OrderController.java | 10 +- .../system/{order/domain => }/BeanConfig.java | 2 +- .../domain => }/OrderServiceApplication.java | 2 +- .../adapter/CustomerRepositoryImpl.java | 2 +- .../mapper/CustomerDataAccessMapper.java | 2 +- .../order/adapter/OrderRepositoryImpl.java | 2 +- .../data/access/order/entity/OrderEntity.java | 2 +- .../order/mapper/OrderDataAccessMapper.java | 2 +- .../adapter/PaymentOutboxRepositoryImpl.java | 4 +- .../payment/entity/PaymentOutboxEntity.java | 2 +- .../mapper/PaymentOutboxDataAccessMapper.java | 2 +- .../adapter/ApprovalOutboxRepositoryImpl.java | 4 +- .../entity/ApprovalOutboxEntity.java | 2 +- .../ApprovalOutboxDataAccessMapper.java | 2 +- .../adapter/RestaurantRepositoryImpl.java | 2 +- .../mapper/RestaurantDataAccessMapper.java | 6 +- .../OrderApplicationServiceImpl.java | 12 +- .../OrderCreateCommandHandler.java | 14 +- .../OrderTrackCommandHandler.java | 10 +- .../PaymentResponseMessageListenerImpl.java | 8 +- ...ntApprovalResponseMessageListenerImpl.java | 8 +- .../config/OrderServiceConfigData.java | 2 +- .../dto/create/CreateOrderCommand.java | 2 +- .../dto/create/CreateOrderResponse.java | 4 +- .../dto/create/OrderAddress.java | 2 +- .../dto/create/OrderItem.java | 2 +- .../dto/message/PaymentResponse.java | 4 +- .../message/RestaurantApprovalResponse.java | 4 +- .../dto/track/TrackOrderQuery.java | 2 +- .../dto/track/TrackOrderResponse.java | 4 +- .../helper/OrderCreateHelper.java | 13 +- .../helper/OrderSagaHelper.java | 6 +- .../mapper/OrderDataMapper.java | 32 ++- .../approval/OrderApprovalEventPayload.java | 2 +- .../approval/OrderApprovalOutboxMessage.java | 4 +- .../model/approval/OrderApprovalProduct.java | 2 +- .../payment/OrderPaymentEventPayload.java | 2 +- .../payment/OrderPaymentOutboxMessage.java | 4 +- .../approval/ApprovalOutboxHelper.java | 16 +- ...taurantApprovalOutboxCleanerSchedule.java} | 6 +- .../RestaurantApprovalOutboxScheduler.java} | 8 +- .../payment/PaymentOutboxCleaner.java | 4 +- .../payment/PaymentOutboxHelper.java | 10 +- .../payment/PaymentOutboxScheduler.java | 16 +- .../PaymentResponseMessageListener.java | 4 +- ...aurantApprovalResponseMessageListener.java | 4 +- .../service/OrderApplicationService.java | 15 ++ .../PaymentRequestMessagePublisher.java | 4 +- ...aurantApprovalRequestMessagePublisher.java | 4 +- .../repository/ApprovalOutboxRepository.java | 4 +- .../output/repository/CustomerRepository.java | 2 +- .../output/repository/OrderRepository.java | 2 +- .../repository/PaymentOutboxRepository.java | 4 +- .../repository/RestaurantRepository.java | 2 +- .../order/system/saga/OrderApprovalSaga.java | 141 +++++++++++ .../saga/OrderPaymentSaga.java | 24 +- .../service/OrderApplicationService.java | 15 -- .../order/sysyem/saga/OrderApprovalSaga.java | 44 ---- .../system/OrderApplicationServiceTest.java | 237 ++++++++++++++++++ .../order/system/OrderTestConfiguration.java | 55 ++++ .../src/test/resources/application.yml | 3 + .../order/system/domain/entity/Customer.java | 4 +- .../order/system/domain/entity/Order.java | 4 +- .../order/system/domain/entity/OrderItem.java | 6 +- .../order/system/domain/entity/Product.java | 6 +- .../system/domain/entity/Restaurant.java | 4 +- .../domain/event/OrderCancelledEvent.java | 1 - .../order/system/domain/event/OrderEvent.java | 2 +- .../system/domain/event/OrderPaidEvent.java | 1 - .../exception/OrderDomainException.java | 2 +- .../exception/OrderNotFoundException.java | 2 +- .../domain/valueobject/OrderItemId.java | 2 +- .../system/domain/valueobject/TrackingId.java | 2 +- .../kafka/PaymentResponseKafkaListener.java | 6 +- ...staurantApprovalResponseKafkaListener.java | 6 +- .../mapper/OrderMessagingDataMapper.java | 46 +++- .../OrderApprovalEventKafkaPublisher.java | 69 +++++ .../OrderPaymentEventKafkaPublisher.java | 66 +++++ .../CancelOrderKafkaMessagePublisher.java | 54 ---- .../CreateOrderKafkaMessagePublisher.java | 52 ---- .../kafka/PayOrderKafkaMessagePublisher.java | 47 ---- .../adapter/CreditEntryRepositoryImpl.java | 2 +- .../mapper/CreditEntryDataAccessMapper.java | 4 +- .../adapter/CreditHistoryRepositoryImpl.java | 2 +- .../mapper/CreditHistoryDataAccessMapper.java | 4 +- .../access/payment/entity/PaymentEntity.java | 2 +- .../mapper/PaymentDataAccessMapper.java | 6 +- .../service/PaymentRequestHelper.java | 4 +- .../service/dto/PaymentRequest.java | 2 +- .../PaymentApplicationServiceException.java | 2 +- .../service/mapper/PaymentDataMapper.java | 6 +- .../PaymentCancelledMessagePublisher.java | 2 +- .../PaymentCompletedMessagePublisher.java | 2 +- .../PaymentFailedMessagePublisher.java | 2 +- .../repository/CreditEntryRepository.java | 2 +- .../repository/CreditHistoryRepository.java | 2 +- .../service/domain/PaymentDomainService.java | 2 +- .../domain/PaymentDomainServiceImpl.java | 8 +- .../service/domain/entity/CreditEntry.java | 6 +- .../service/domain/entity/CreditHistory.java | 6 +- .../service/domain/entity/Payment.java | 10 +- .../domain/event/PaymentCancelledEvent.java | 2 +- .../domain/event/PaymentCompletedEvent.java | 2 +- .../service/domain/event/PaymentEvent.java | 2 +- .../domain/event/PaymentFailedEvent.java | 2 +- .../exception/PayemntDomainException.java | 2 +- .../exception/PaymentNotFoundException.java | 2 +- .../domain/valueobject/CreditEntryId.java | 2 +- .../domain/valueobject/CreditHistoryId.java | 2 +- .../service/domain/valueobject/PaymentId.java | 2 +- .../kafka/PaymentRequestKafkaListener.java | 2 +- .../mapper/PaymentMessagingDataMapper.java | 2 +- .../entity/OrderApprovalEntity.java | 2 +- .../mapper/RestaurantDataAccessMapper.java | 8 +- .../RestaurantApprovalRequestHelper.java | 2 +- .../dto/RestaurantApprovalRequest.java | 2 +- ...RestaurantApplicationServiceException.java | 2 +- .../service/mapper/RestaurantDataMapper.java | 8 +- .../OrderApprovedMessagePublisher.java | 2 +- .../OrderRejectedMessagePublisher.java | 2 +- .../domain/core/RestaurantDomainService.java | 2 +- .../core/RestaurantDomainServiceImpl.java | 6 +- .../domain/core/entity/OrderApproval.java | 8 +- .../domain/core/entity/OrderDetail.java | 8 +- .../domain/core/entity/Product.java | 6 +- .../domain/core/entity/Restaurant.java | 10 +- .../domain/core/event/OrderApprovalEvent.java | 4 +- .../domain/core/event/OrderApprovedEvent.java | 4 +- .../domain/core/event/OrderRejectedEvent.java | 4 +- .../exception/RestaurantDomainException.java | 2 +- .../RestaurantNotFoundException.java | 2 +- .../core/valueobject/OrderApprovalId.java | 2 +- .../mapper/RestaurantMessagingDataMapper.java | 4 +- 153 files changed, 961 insertions(+), 525 deletions(-) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/DomainConstants.java (79%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/entity/AggregateRoot.java (65%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/entity/BaseEntity.java (92%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/event/DomainEvent.java (66%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/event/publisher/DomainEventPublisher.java (50%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/exception/DomainException.java (85%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/BaseId.java (91%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/CustomerId.java (76%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/Money.java (97%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/OrderApprovalStatus.java (59%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/OrderId.java (75%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/OrderStatus.java (69%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/PaymentOrderStatus.java (59%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/PaymentStatus.java (58%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/ProductId.java (76%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/RestaurantId.java (77%) rename common/common-domain/src/main/java/com/food/order/{sysyem => system}/valueobject/RestaurantOrderStatus.java (52%) delete mode 100644 common/common-domain/src/main/java/com/food/order/sysyem/event/EmptyEvent.java rename order-service/order-container/src/main/java/com/food/order/system/{order/domain => }/BeanConfig.java (90%) rename order-service/order-container/src/main/java/com/food/order/system/{order/domain => }/OrderServiceApplication.java (94%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/OrderApplicationServiceImpl.java (70%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/OrderCreateCommandHandler.java (79%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/OrderTrackCommandHandler.java (78%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/PaymentResponseMessageListenerImpl.java (81%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/RestaurantApprovalResponseMessageListenerImpl.java (80%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/config/OrderServiceConfigData.java (92%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/dto/create/CreateOrderCommand.java (91%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/dto/create/CreateOrderResponse.java (75%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/dto/create/OrderAddress.java (90%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/dto/create/OrderItem.java (89%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/dto/message/PaymentResponse.java (83%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/dto/message/RestaurantApprovalResponse.java (81%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/dto/track/TrackOrderQuery.java (80%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/dto/track/TrackOrderResponse.java (77%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/helper/OrderCreateHelper.java (85%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/helper/OrderSagaHelper.java (87%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/mapper/OrderDataMapper.java (78%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/outbox/model/approval/OrderApprovalEventPayload.java (92%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/outbox/model/approval/OrderApprovalOutboxMessage.java (86%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/outbox/model/approval/OrderApprovalProduct.java (85%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/outbox/model/payment/OrderPaymentEventPayload.java (91%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/outbox/model/payment/OrderPaymentOutboxMessage.java (86%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/outbox/scheduler/approval/ApprovalOutboxHelper.java (87%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxCleaner.java => system/outbox/scheduler/approval/RestaurantApprovalOutboxCleanerSchedule.java} (89%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxMessage.java => system/outbox/scheduler/approval/RestaurantApprovalOutboxScheduler.java} (91%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/outbox/scheduler/payment/PaymentOutboxCleaner.java (93%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/outbox/scheduler/payment/PaymentOutboxHelper.java (92%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/outbox/scheduler/payment/PaymentOutboxScheduler.java (80%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/ports/input/message/listener/payment/PaymentResponseMessageListener.java (59%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java (65%) create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/input/service/OrderApplicationService.java rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/ports/output/message/publisher/payment/PaymentRequestMessagePublisher.java (70%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/ports/output/message/publisher/restaurantapproval/RestaurantApprovalRequestMessagePublisher.java (71%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/ports/output/repository/ApprovalOutboxRepository.java (90%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/ports/output/repository/CustomerRepository.java (78%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/ports/output/repository/OrderRepository.java (85%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/ports/output/repository/PaymentOutboxRepository.java (90%) rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/ports/output/repository/RestaurantRepository.java (78%) create mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderApprovalSaga.java rename order-service/order-domain/order-application-service/src/main/java/com/food/order/{sysyem => system}/saga/OrderPaymentSaga.java (90%) delete mode 100644 order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/service/OrderApplicationService.java delete 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/test/java/com/food/order/system/OrderApplicationServiceTest.java create mode 100644 order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderTestConfiguration.java create mode 100644 order-service/order-domain/order-application-service/src/test/resources/application.yml rename order-service/order-messaging/src/main/java/com/food/order/system/{order => }/messaging/listener/kafka/PaymentResponseKafkaListener.java (92%) rename order-service/order-messaging/src/main/java/com/food/order/system/{order => }/messaging/listener/kafka/RestaurantApprovalResponseKafkaListener.java (92%) rename order-service/order-messaging/src/main/java/com/food/order/system/{order => }/messaging/mapper/OrderMessagingDataMapper.java (63%) create mode 100644 order-service/order-messaging/src/main/java/com/food/order/system/messaging/publisher/kafka/OrderApprovalEventKafkaPublisher.java create mode 100644 order-service/order-messaging/src/main/java/com/food/order/system/messaging/publisher/kafka/OrderPaymentEventKafkaPublisher.java delete mode 100644 order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/CancelOrderKafkaMessagePublisher.java delete mode 100644 order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/CreateOrderKafkaMessagePublisher.java delete mode 100644 order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/PayOrderKafkaMessagePublisher.java diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/DomainConstants.java b/common/common-domain/src/main/java/com/food/order/system/DomainConstants.java similarity index 79% rename from common/common-domain/src/main/java/com/food/order/sysyem/DomainConstants.java rename to common/common-domain/src/main/java/com/food/order/system/DomainConstants.java index 8327e68..1207512 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/DomainConstants.java +++ b/common/common-domain/src/main/java/com/food/order/system/DomainConstants.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem; +package com.food.order.system; public class DomainConstants { diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/entity/AggregateRoot.java b/common/common-domain/src/main/java/com/food/order/system/entity/AggregateRoot.java similarity index 65% rename from common/common-domain/src/main/java/com/food/order/sysyem/entity/AggregateRoot.java rename to common/common-domain/src/main/java/com/food/order/system/entity/AggregateRoot.java index ca10e2a..91fda43 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/entity/AggregateRoot.java +++ b/common/common-domain/src/main/java/com/food/order/system/entity/AggregateRoot.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.entity; +package com.food.order.system.entity; public abstract class AggregateRoot extends BaseEntity { diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/entity/BaseEntity.java b/common/common-domain/src/main/java/com/food/order/system/entity/BaseEntity.java similarity index 92% rename from common/common-domain/src/main/java/com/food/order/sysyem/entity/BaseEntity.java rename to common/common-domain/src/main/java/com/food/order/system/entity/BaseEntity.java index 7056f87..a0e1a14 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/entity/BaseEntity.java +++ b/common/common-domain/src/main/java/com/food/order/system/entity/BaseEntity.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.entity; +package com.food.order.system.entity; public abstract class BaseEntity { private ID id; diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/event/DomainEvent.java b/common/common-domain/src/main/java/com/food/order/system/event/DomainEvent.java similarity index 66% rename from common/common-domain/src/main/java/com/food/order/sysyem/event/DomainEvent.java rename to common/common-domain/src/main/java/com/food/order/system/event/DomainEvent.java index be1257b..3952d24 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/event/DomainEvent.java +++ b/common/common-domain/src/main/java/com/food/order/system/event/DomainEvent.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.event; +package com.food.order.system.event; // Base Domain Event Generic Class diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/event/publisher/DomainEventPublisher.java b/common/common-domain/src/main/java/com/food/order/system/event/publisher/DomainEventPublisher.java similarity index 50% rename from common/common-domain/src/main/java/com/food/order/sysyem/event/publisher/DomainEventPublisher.java rename to common/common-domain/src/main/java/com/food/order/system/event/publisher/DomainEventPublisher.java index 55f6db6..69dabfb 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/event/publisher/DomainEventPublisher.java +++ b/common/common-domain/src/main/java/com/food/order/system/event/publisher/DomainEventPublisher.java @@ -1,6 +1,6 @@ -package com.food.order.sysyem.event.publisher; +package com.food.order.system.event.publisher; -import com.food.order.sysyem.event.DomainEvent; +import com.food.order.system.event.DomainEvent; public interface DomainEventPublisher { void publish(T event); diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/exception/DomainException.java b/common/common-domain/src/main/java/com/food/order/system/exception/DomainException.java similarity index 85% rename from common/common-domain/src/main/java/com/food/order/sysyem/exception/DomainException.java rename to common/common-domain/src/main/java/com/food/order/system/exception/DomainException.java index 8136d73..e28a1f2 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/exception/DomainException.java +++ b/common/common-domain/src/main/java/com/food/order/system/exception/DomainException.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.exception; +package com.food.order.system.exception; public class DomainException extends RuntimeException { diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/BaseId.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/BaseId.java similarity index 91% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/BaseId.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/BaseId.java index c560ab7..0ac2add 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/BaseId.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/BaseId.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; public abstract class BaseId { diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/CustomerId.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/CustomerId.java similarity index 76% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/CustomerId.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/CustomerId.java index aa35238..ba7a43a 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/CustomerId.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/CustomerId.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; import java.util.UUID; diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/Money.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/Money.java similarity index 97% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/Money.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/Money.java index 6098945..d3cf564 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/Money.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/Money.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; import java.math.BigDecimal; import java.math.RoundingMode; diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderApprovalStatus.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/OrderApprovalStatus.java similarity index 59% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderApprovalStatus.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/OrderApprovalStatus.java index a1a5c1d..a7df470 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderApprovalStatus.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/OrderApprovalStatus.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; public enum OrderApprovalStatus { APPROVED, diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderId.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/OrderId.java similarity index 75% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderId.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/OrderId.java index 8428d9d..9d0f9f8 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderId.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/OrderId.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; import java.util.UUID; diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderStatus.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/OrderStatus.java similarity index 69% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderStatus.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/OrderStatus.java index 80bcf32..d3f4896 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderStatus.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/OrderStatus.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; public enum OrderStatus { PENDING, diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/PaymentOrderStatus.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/PaymentOrderStatus.java similarity index 59% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/PaymentOrderStatus.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/PaymentOrderStatus.java index b777250..b59cd28 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/PaymentOrderStatus.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/PaymentOrderStatus.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; public enum PaymentOrderStatus { PENDING, diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/PaymentStatus.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/PaymentStatus.java similarity index 58% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/PaymentStatus.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/PaymentStatus.java index 3deba79..ada0bf6 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/PaymentStatus.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/PaymentStatus.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; public enum PaymentStatus { COMPLETED,CANCELED,FAILED diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/ProductId.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/ProductId.java similarity index 76% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/ProductId.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/ProductId.java index a4b3b63..9368f2b 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/ProductId.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/ProductId.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; import java.util.UUID; diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/RestaurantId.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/RestaurantId.java similarity index 77% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/RestaurantId.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/RestaurantId.java index 28a4b40..8e15768 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/RestaurantId.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/RestaurantId.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; import java.util.UUID; diff --git a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/RestaurantOrderStatus.java b/common/common-domain/src/main/java/com/food/order/system/valueobject/RestaurantOrderStatus.java similarity index 52% rename from common/common-domain/src/main/java/com/food/order/sysyem/valueobject/RestaurantOrderStatus.java rename to common/common-domain/src/main/java/com/food/order/system/valueobject/RestaurantOrderStatus.java index d485e55..e190b1b 100644 --- a/common/common-domain/src/main/java/com/food/order/sysyem/valueobject/RestaurantOrderStatus.java +++ b/common/common-domain/src/main/java/com/food/order/system/valueobject/RestaurantOrderStatus.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.valueobject; +package com.food.order.system.valueobject; public enum RestaurantOrderStatus { PAID 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 deleted file mode 100644 index 4301ef8..0000000 --- a/common/common-domain/src/main/java/com/food/order/sysyem/event/EmptyEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -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/kafka/kafka-producer/pom.xml b/infrastructure/kafka/kafka-producer/pom.xml index a6f7d0a..e14fbbe 100644 --- a/infrastructure/kafka/kafka-producer/pom.xml +++ b/infrastructure/kafka/kafka-producer/pom.xml @@ -41,6 +41,10 @@ io.confluent kafka-avro-serializer + + com.food.order + outbox + diff --git a/infrastructure/kafka/kafka-producer/src/main/java/com/food/order/system/kafka/producer/KafkaMessageHelper.java b/infrastructure/kafka/kafka-producer/src/main/java/com/food/order/system/kafka/producer/KafkaMessageHelper.java index 5089369..ce3d8c8 100644 --- a/infrastructure/kafka/kafka-producer/src/main/java/com/food/order/system/kafka/producer/KafkaMessageHelper.java +++ b/infrastructure/kafka/kafka-producer/src/main/java/com/food/order/system/kafka/producer/KafkaMessageHelper.java @@ -1,34 +1,59 @@ package com.food.order.system.kafka.producer; +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 lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.producer.RecordMetadata; import org.springframework.kafka.support.SendResult; import org.springframework.stereotype.Component; import org.springframework.util.concurrent.ListenableFutureCallback; +import java.util.function.BiConsumer; + @Component @Slf4j +@RequiredArgsConstructor public class KafkaMessageHelper { - public ListenableFutureCallback> getKafkaCallBack - (String responseTopicName, T t,String orderId, String requestAvroModelName) { - return new ListenableFutureCallback<>() { + private final ObjectMapper objectMapper; + + + public ListenableFutureCallback> + getKafkaCallback(String responseTopicName, T avroModel, U outboxMessage, + BiConsumer outboxCallback, + String orderId, String avroModelName) { + return new ListenableFutureCallback>() { @Override public void onFailure(Throwable ex) { - log.error("Error while sending " + requestAvroModelName + - " to " + responseTopicName + " for orderId " + orderId, ex); + log.error("Error while sending {} with message: {} and outbox type: {} to topic {}", + avroModelName, avroModel.toString(), outboxMessage.getClass().getName(), responseTopicName, ex); + outboxCallback.accept(outboxMessage, OutboxStatus.FAILED); } @Override public void onSuccess(SendResult result) { - RecordMetadata recordMetadata = result.getRecordMetadata(); - log.info("Received successful response from kafka for order id : {} Topic : {} Partition : {} , Offset : {} , Timestamp : {}", + RecordMetadata metadata = result.getRecordMetadata(); + log.info("Received successful response from Kafka for order id: {}" + + " Topic: {} Partition: {} Offset: {} Timestamp: {}", orderId, - recordMetadata.topic(), - recordMetadata.partition(), - recordMetadata.offset(), - recordMetadata.timestamp()); + metadata.topic(), + metadata.partition(), + metadata.offset(), + metadata.timestamp()); + outboxCallback.accept(outboxMessage, OutboxStatus.COMPLETED); } }; } + + public T getOrderEventPayload(String payload, Class outputType) { + try { + return objectMapper.readValue(payload, outputType); + } catch (JsonProcessingException e) { + log.error("Could not read {} object!", outputType.getName(), e); + throw new OrderDomainException("Could not read " + outputType.getName() + " object!", e); + } + } } diff --git a/order-service/order-app/src/main/java/com/food/order/system/service/app/api/OrderController.java b/order-service/order-app/src/main/java/com/food/order/system/service/app/api/OrderController.java index a44317b..1938838 100644 --- a/order-service/order-app/src/main/java/com/food/order/system/service/app/api/OrderController.java +++ b/order-service/order-app/src/main/java/com/food/order/system/service/app/api/OrderController.java @@ -1,10 +1,10 @@ package com.food.order.system.service.app.api; -import com.food.order.sysyem.dto.create.CreateOrderCommand; -import com.food.order.sysyem.dto.create.CreateOrderResponse; -import com.food.order.sysyem.dto.track.TrackOrderQuery; -import com.food.order.sysyem.dto.track.TrackOrderResponse; -import com.food.order.sysyem.ports.input.service.OrderApplicationService; +import com.food.order.system.dto.create.CreateOrderCommand; +import com.food.order.system.dto.create.CreateOrderResponse; +import com.food.order.system.dto.track.TrackOrderQuery; +import com.food.order.system.dto.track.TrackOrderResponse; +import com.food.order.system.ports.input.service.OrderApplicationService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; diff --git a/order-service/order-container/src/main/java/com/food/order/system/order/domain/BeanConfig.java b/order-service/order-container/src/main/java/com/food/order/system/BeanConfig.java similarity index 90% rename from order-service/order-container/src/main/java/com/food/order/system/order/domain/BeanConfig.java rename to order-service/order-container/src/main/java/com/food/order/system/BeanConfig.java index 0ca3acd..c90c77f 100644 --- a/order-service/order-container/src/main/java/com/food/order/system/order/domain/BeanConfig.java +++ b/order-service/order-container/src/main/java/com/food/order/system/BeanConfig.java @@ -1,4 +1,4 @@ -package com.food.order.system.order.domain; +package com.food.order.system; import com.food.order.system.domain.service.OrderDomainService; import com.food.order.system.domain.service.impl.OrderDomainServiceImpl; diff --git a/order-service/order-container/src/main/java/com/food/order/system/order/domain/OrderServiceApplication.java b/order-service/order-container/src/main/java/com/food/order/system/OrderServiceApplication.java similarity index 94% rename from order-service/order-container/src/main/java/com/food/order/system/order/domain/OrderServiceApplication.java rename to order-service/order-container/src/main/java/com/food/order/system/OrderServiceApplication.java index 8201a72..f8a3bed 100644 --- a/order-service/order-container/src/main/java/com/food/order/system/order/domain/OrderServiceApplication.java +++ b/order-service/order-container/src/main/java/com/food/order/system/OrderServiceApplication.java @@ -1,4 +1,4 @@ -package com.food.order.system.order.domain; +package com.food.order.system; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/adapter/CustomerRepositoryImpl.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/adapter/CustomerRepositoryImpl.java index 5e90a19..478bb95 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/adapter/CustomerRepositoryImpl.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/adapter/CustomerRepositoryImpl.java @@ -1,6 +1,6 @@ package com.food.order.system.data.access.customer.adapter; -import com.food.order.sysyem.ports.output.repository.CustomerRepository; +import com.food.order.system.ports.output.repository.CustomerRepository; import com.food.order.system.data.access.customer.mapper.CustomerDataAccessMapper; import com.food.order.system.data.access.customer.repository.CustomerJPARepository; import com.food.order.system.domain.entity.Customer; diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/mapper/CustomerDataAccessMapper.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/mapper/CustomerDataAccessMapper.java index e1246cd..da39c37 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/mapper/CustomerDataAccessMapper.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/mapper/CustomerDataAccessMapper.java @@ -1,6 +1,6 @@ package com.food.order.system.data.access.customer.mapper; -import com.food.order.sysyem.valueobject.CustomerId; +import com.food.order.system.valueobject.CustomerId; import com.food.order.system.data.access.customer.entity.CustomerEntity; import com.food.order.system.domain.entity.Customer; import org.springframework.stereotype.Component; 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 41ff899..4b72291 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 @@ -1,6 +1,6 @@ package com.food.order.system.data.access.order.adapter; -import com.food.order.sysyem.ports.output.repository.OrderRepository; +import com.food.order.system.ports.output.repository.OrderRepository; import com.food.order.system.data.access.order.mapper.OrderDataAccessMapper; import com.food.order.system.data.access.order.repository.OrderJpaRepository; import com.food.order.system.domain.entity.Order; diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/entity/OrderEntity.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/entity/OrderEntity.java index 162a091..ce9eee3 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/entity/OrderEntity.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/order/entity/OrderEntity.java @@ -1,6 +1,6 @@ package com.food.order.system.data.access.order.entity; -import com.food.order.sysyem.valueobject.OrderStatus; +import com.food.order.system.valueobject.OrderStatus; import lombok.*; import org.hibernate.annotations.DynamicUpdate; 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 d043016..d7a641d 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 @@ -9,7 +9,7 @@ import com.food.order.system.domain.entity.Product; import com.food.order.system.domain.valueobject.OrderItemId; import com.food.order.system.domain.valueobject.StreetAddress; import com.food.order.system.domain.valueobject.TrackingId; -import com.food.order.sysyem.valueobject.*; +import com.food.order.system.valueobject.*; import org.springframework.stereotype.Component; import java.util.ArrayList; diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/adapter/PaymentOutboxRepositoryImpl.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/adapter/PaymentOutboxRepositoryImpl.java index e2b3df8..5623cd0 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/adapter/PaymentOutboxRepositoryImpl.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/adapter/PaymentOutboxRepositoryImpl.java @@ -5,8 +5,8 @@ import com.food.order.system.data.access.outbox.payment.mapper.PaymentOutboxData import com.food.order.system.data.access.outbox.payment.repository.PaymentOutboxJpaRepository; 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.repository.PaymentOutboxRepository; +import com.food.order.system.outbox.model.payment.OrderPaymentOutboxMessage; +import com.food.order.system.ports.output.repository.PaymentOutboxRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/entity/PaymentOutboxEntity.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/entity/PaymentOutboxEntity.java index a69f837..0b987ce 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/entity/PaymentOutboxEntity.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/entity/PaymentOutboxEntity.java @@ -3,7 +3,7 @@ package com.food.order.system.data.access.outbox.payment.entity; import com.food.order.system.outbox.OutboxStatus; import com.food.order.system.saga.SagaStatus; -import com.food.order.sysyem.valueobject.OrderStatus; +import com.food.order.system.valueobject.OrderStatus; import lombok.*; import javax.persistence.*; diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/mapper/PaymentOutboxDataAccessMapper.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/mapper/PaymentOutboxDataAccessMapper.java index 49cef36..5220e6c 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/mapper/PaymentOutboxDataAccessMapper.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/payment/mapper/PaymentOutboxDataAccessMapper.java @@ -1,7 +1,7 @@ package com.food.order.system.data.access.outbox.payment.mapper; import com.food.order.system.data.access.outbox.payment.entity.PaymentOutboxEntity; -import com.food.order.sysyem.outbox.model.payment.OrderPaymentOutboxMessage; +import com.food.order.system.outbox.model.payment.OrderPaymentOutboxMessage; import org.springframework.stereotype.Component; @Component diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/adapter/ApprovalOutboxRepositoryImpl.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/adapter/ApprovalOutboxRepositoryImpl.java index e26bdd7..83e12ef 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/adapter/ApprovalOutboxRepositoryImpl.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/adapter/ApprovalOutboxRepositoryImpl.java @@ -6,8 +6,8 @@ import com.food.order.system.data.access.outbox.restaurantapproval.mapper.Approv import com.food.order.system.data.access.outbox.restaurantapproval.repository.ApprovalOutboxJpaRepository; 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 com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage; +import com.food.order.system.ports.output.repository.ApprovalOutboxRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/entity/ApprovalOutboxEntity.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/entity/ApprovalOutboxEntity.java index 0f6df94..a798f7c 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/entity/ApprovalOutboxEntity.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/entity/ApprovalOutboxEntity.java @@ -2,7 +2,7 @@ package com.food.order.system.data.access.outbox.restaurantapproval.entity; import com.food.order.system.outbox.OutboxStatus; import com.food.order.system.saga.SagaStatus; -import com.food.order.sysyem.valueobject.OrderStatus; +import com.food.order.system.valueobject.OrderStatus; import lombok.*; import javax.persistence.*; diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/mapper/ApprovalOutboxDataAccessMapper.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/mapper/ApprovalOutboxDataAccessMapper.java index cd08ec3..2a70075 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/mapper/ApprovalOutboxDataAccessMapper.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/outbox/restaurantapproval/mapper/ApprovalOutboxDataAccessMapper.java @@ -1,7 +1,7 @@ package com.food.order.system.data.access.outbox.restaurantapproval.mapper; import com.food.order.system.data.access.outbox.restaurantapproval.entity.ApprovalOutboxEntity; -import com.food.order.sysyem.outbox.model.approval.OrderApprovalOutboxMessage; +import com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage; import org.springframework.stereotype.Component; @Component diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/restaurant/adapter/RestaurantRepositoryImpl.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/restaurant/adapter/RestaurantRepositoryImpl.java index a6ea604..5739b50 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/restaurant/adapter/RestaurantRepositoryImpl.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/restaurant/adapter/RestaurantRepositoryImpl.java @@ -3,7 +3,7 @@ package com.food.order.system.data.access.restaurant.adapter; 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.domain.entity.Restaurant; -import com.food.order.sysyem.ports.output.repository.RestaurantRepository; +import com.food.order.system.ports.output.repository.RestaurantRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/restaurant/mapper/RestaurantDataAccessMapper.java b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/restaurant/mapper/RestaurantDataAccessMapper.java index 1d29e8f..23291c7 100644 --- a/order-service/order-data-access/src/main/java/com/food/order/system/data/access/restaurant/mapper/RestaurantDataAccessMapper.java +++ b/order-service/order-data-access/src/main/java/com/food/order/system/data/access/restaurant/mapper/RestaurantDataAccessMapper.java @@ -4,9 +4,9 @@ import com.food.order.system.common.data.access.entity.RestaurantEntity; import com.food.order.system.common.data.access.exception.RestaurantDataAccessException; import com.food.order.system.domain.entity.Product; import com.food.order.system.domain.entity.Restaurant; -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.system.valueobject.Money; +import com.food.order.system.valueobject.ProductId; +import com.food.order.system.valueobject.RestaurantId; import org.springframework.stereotype.Component; import java.util.List; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderApplicationServiceImpl.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/OrderApplicationServiceImpl.java similarity index 70% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderApplicationServiceImpl.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/OrderApplicationServiceImpl.java index 2a10745..0690ab2 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderApplicationServiceImpl.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/OrderApplicationServiceImpl.java @@ -1,10 +1,10 @@ -package com.food.order.sysyem; +package com.food.order.system; -import com.food.order.sysyem.dto.create.CreateOrderCommand; -import com.food.order.sysyem.dto.create.CreateOrderResponse; -import com.food.order.sysyem.dto.track.TrackOrderQuery; -import com.food.order.sysyem.dto.track.TrackOrderResponse; -import com.food.order.sysyem.ports.input.service.OrderApplicationService; +import com.food.order.system.dto.create.CreateOrderCommand; +import com.food.order.system.dto.create.CreateOrderResponse; +import com.food.order.system.dto.track.TrackOrderQuery; +import com.food.order.system.dto.track.TrackOrderResponse; +import com.food.order.system.ports.input.service.OrderApplicationService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; 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/system/OrderCreateCommandHandler.java similarity index 79% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderCreateCommandHandler.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/OrderCreateCommandHandler.java index 5bca96a..b341051 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/system/OrderCreateCommandHandler.java @@ -1,12 +1,12 @@ -package com.food.order.sysyem; +package com.food.order.system; +import com.food.order.system.dto.create.CreateOrderCommand; +import com.food.order.system.dto.create.CreateOrderResponse; 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.outbox.scheduler.payment.PaymentOutboxHelper; +import com.food.order.system.helper.OrderCreateHelper; +import com.food.order.system.helper.OrderSagaHelper; +import com.food.order.system.mapper.OrderDataMapper; +import com.food.order.system.outbox.scheduler.payment.PaymentOutboxHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderTrackCommandHandler.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/OrderTrackCommandHandler.java similarity index 78% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderTrackCommandHandler.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/OrderTrackCommandHandler.java index cf490f2..1628aad 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderTrackCommandHandler.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/OrderTrackCommandHandler.java @@ -1,9 +1,9 @@ -package com.food.order.sysyem; +package com.food.order.system; -import com.food.order.sysyem.dto.track.TrackOrderQuery; -import com.food.order.sysyem.dto.track.TrackOrderResponse; -import com.food.order.sysyem.mapper.OrderDataMapper; -import com.food.order.sysyem.ports.output.repository.OrderRepository; +import com.food.order.system.dto.track.TrackOrderQuery; +import com.food.order.system.dto.track.TrackOrderResponse; +import com.food.order.system.mapper.OrderDataMapper; +import com.food.order.system.ports.output.repository.OrderRepository; import com.food.order.system.domain.exception.OrderNotFoundException; import com.food.order.system.domain.valueobject.TrackingId; 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/system/PaymentResponseMessageListenerImpl.java similarity index 81% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/PaymentResponseMessageListenerImpl.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/PaymentResponseMessageListenerImpl.java index fc56410..dad9c9c 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/system/PaymentResponseMessageListenerImpl.java @@ -1,8 +1,8 @@ -package com.food.order.sysyem; +package com.food.order.system; -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 com.food.order.system.dto.message.PaymentResponse; +import com.food.order.system.ports.input.message.listener.payment.PaymentResponseMessageListener; +import com.food.order.system.saga.OrderPaymentSaga; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; 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/system/RestaurantApprovalResponseMessageListenerImpl.java similarity index 80% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/RestaurantApprovalResponseMessageListenerImpl.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/RestaurantApprovalResponseMessageListenerImpl.java index f8097bd..149b9ff 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/system/RestaurantApprovalResponseMessageListenerImpl.java @@ -1,8 +1,8 @@ -package com.food.order.sysyem; +package com.food.order.system; -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 com.food.order.system.dto.message.RestaurantApprovalResponse; +import com.food.order.system.ports.input.message.listener.restaurantapproval.RestaurantApprovalResponseMessageListener; +import com.food.order.system.saga.OrderApprovalSaga; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/config/OrderServiceConfigData.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/config/OrderServiceConfigData.java similarity index 92% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/config/OrderServiceConfigData.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/config/OrderServiceConfigData.java index 2ebdfa6..c4ed3e7 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/config/OrderServiceConfigData.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/config/OrderServiceConfigData.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.config; +package com.food.order.system.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/CreateOrderCommand.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/CreateOrderCommand.java similarity index 91% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/CreateOrderCommand.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/CreateOrderCommand.java index 131448e..7b86d59 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/CreateOrderCommand.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/CreateOrderCommand.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.dto.create; +package com.food.order.system.dto.create; import lombok.Builder; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/CreateOrderResponse.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/CreateOrderResponse.java similarity index 75% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/CreateOrderResponse.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/CreateOrderResponse.java index 3763d5c..18772bb 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/CreateOrderResponse.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/CreateOrderResponse.java @@ -1,6 +1,6 @@ -package com.food.order.sysyem.dto.create; +package com.food.order.system.dto.create; -import com.food.order.sysyem.valueobject.OrderStatus; +import com.food.order.system.valueobject.OrderStatus; import lombok.Builder; import javax.validation.constraints.NotNull; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/OrderAddress.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/OrderAddress.java similarity index 90% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/OrderAddress.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/OrderAddress.java index 40ea566..adfef95 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/OrderAddress.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/OrderAddress.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.dto.create; +package com.food.order.system.dto.create; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/OrderItem.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/OrderItem.java similarity index 89% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/OrderItem.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/OrderItem.java index 902aba6..53f9354 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/OrderItem.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/create/OrderItem.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.dto.create; +package com.food.order.system.dto.create; import lombok.Builder; import lombok.Getter; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/message/PaymentResponse.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/message/PaymentResponse.java similarity index 83% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/message/PaymentResponse.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/message/PaymentResponse.java index bfc191d..f7a44e5 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/message/PaymentResponse.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/message/PaymentResponse.java @@ -1,6 +1,6 @@ -package com.food.order.sysyem.dto.message; +package com.food.order.system.dto.message; -import com.food.order.sysyem.valueobject.PaymentStatus; +import com.food.order.system.valueobject.PaymentStatus; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/message/RestaurantApprovalResponse.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/message/RestaurantApprovalResponse.java similarity index 81% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/message/RestaurantApprovalResponse.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/message/RestaurantApprovalResponse.java index 41995a8..c53fb18 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/message/RestaurantApprovalResponse.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/message/RestaurantApprovalResponse.java @@ -1,6 +1,6 @@ -package com.food.order.sysyem.dto.message; +package com.food.order.system.dto.message; -import com.food.order.sysyem.valueobject.OrderApprovalStatus; +import com.food.order.system.valueobject.OrderApprovalStatus; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/track/TrackOrderQuery.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/track/TrackOrderQuery.java similarity index 80% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/track/TrackOrderQuery.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/track/TrackOrderQuery.java index bae61da..0d85f0c 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/track/TrackOrderQuery.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/track/TrackOrderQuery.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.dto.track; +package com.food.order.system.dto.track; import lombok.Builder; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/track/TrackOrderResponse.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/track/TrackOrderResponse.java similarity index 77% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/track/TrackOrderResponse.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/track/TrackOrderResponse.java index c5a50d3..e79e8e7 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/track/TrackOrderResponse.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/dto/track/TrackOrderResponse.java @@ -1,6 +1,6 @@ -package com.food.order.sysyem.dto.track; +package com.food.order.system.dto.track; -import com.food.order.sysyem.valueobject.OrderStatus; +import com.food.order.system.valueobject.OrderStatus; import lombok.Builder; import javax.validation.constraints.NotNull; 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/system/helper/OrderCreateHelper.java similarity index 85% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderCreateHelper.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/helper/OrderCreateHelper.java index 7afb14a..75f7d74 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/system/helper/OrderCreateHelper.java @@ -1,11 +1,10 @@ -package com.food.order.sysyem.helper; +package com.food.order.system.helper; -import com.food.order.sysyem.dto.create.CreateOrderCommand; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; -import com.food.order.sysyem.mapper.OrderDataMapper; -import com.food.order.sysyem.ports.output.repository.CustomerRepository; -import com.food.order.sysyem.ports.output.repository.OrderRepository; -import com.food.order.sysyem.ports.output.repository.RestaurantRepository; +import com.food.order.system.dto.create.CreateOrderCommand; +import com.food.order.system.mapper.OrderDataMapper; +import com.food.order.system.ports.output.repository.CustomerRepository; +import com.food.order.system.ports.output.repository.OrderRepository; +import com.food.order.system.ports.output.repository.RestaurantRepository; import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.entity.Restaurant; import com.food.order.system.domain.event.OrderCreatedEvent; 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/system/helper/OrderSagaHelper.java similarity index 87% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/helper/OrderSagaHelper.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/helper/OrderSagaHelper.java index f0bc541..e7ba97e 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/system/helper/OrderSagaHelper.java @@ -1,10 +1,10 @@ -package com.food.order.sysyem.helper; +package com.food.order.system.helper; import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.exception.OrderNotFoundException; +import com.food.order.system.ports.output.repository.OrderRepository; import com.food.order.system.saga.SagaStatus; -import com.food.order.sysyem.ports.output.repository.OrderRepository; -import com.food.order.sysyem.valueobject.OrderStatus; +import com.food.order.system.valueobject.OrderStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; 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/system/mapper/OrderDataMapper.java similarity index 78% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/mapper/OrderDataMapper.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/mapper/OrderDataMapper.java index 8797924..f8e5a18 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/system/mapper/OrderDataMapper.java @@ -1,20 +1,21 @@ -package com.food.order.sysyem.mapper; +package com.food.order.system.mapper; 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.OrderCancelledEvent; import com.food.order.system.domain.event.OrderCreatedEvent; import com.food.order.system.domain.event.OrderPaidEvent; 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.outbox.model.approval.OrderApprovalEventPayload; -import com.food.order.sysyem.outbox.model.approval.OrderApprovalProduct; -import com.food.order.sysyem.outbox.model.payment.OrderPaymentEventPayload; -import com.food.order.sysyem.valueobject.*; +import com.food.order.system.dto.create.CreateOrderCommand; +import com.food.order.system.dto.create.CreateOrderResponse; +import com.food.order.system.dto.create.OrderAddress; +import com.food.order.system.dto.track.TrackOrderResponse; +import com.food.order.system.outbox.model.approval.OrderApprovalEventPayload; +import com.food.order.system.outbox.model.approval.OrderApprovalProduct; +import com.food.order.system.outbox.model.payment.OrderPaymentEventPayload; +import com.food.order.system.valueobject.*; import org.springframework.stereotype.Component; import java.util.List; @@ -23,6 +24,17 @@ import java.util.UUID; @Component public class OrderDataMapper { + public OrderPaymentEventPayload orderCancelledEventToOrderPaymentEventPayload( + OrderCancelledEvent orderCancelledEvent) { + return OrderPaymentEventPayload.builder() + .orderId(orderCancelledEvent.getOrder().getId().getValue().toString()) + .paymentOrderStatus(PaymentOrderStatus.CANCELLED.name()) + .customerId(orderCancelledEvent.getOrder().getCustomerId().getValue().toString()) + .price(orderCancelledEvent.getOrder().getPrice().getAmount()) + .createdAt(orderCancelledEvent.getCreatedAt()) + .build(); + } + public OrderApprovalEventPayload orderPaidEventToOrderApprovalEventPayload(OrderPaidEvent orderPaidEvent) { return OrderApprovalEventPayload.builder() .orderId(orderPaidEvent.getOrder().getId().getValue().toString()) @@ -80,7 +92,7 @@ public class OrderDataMapper { .build(); } - private List orderItemsToOrderItemEntities(List orderItems) { + private List orderItemsToOrderItemEntities(List orderItems) { return orderItems.stream() .map(orderItem -> OrderItem.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/system/outbox/model/approval/OrderApprovalEventPayload.java similarity index 92% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalEventPayload.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/model/approval/OrderApprovalEventPayload.java index 832ca19..a82c868 100644 --- 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/system/outbox/model/approval/OrderApprovalEventPayload.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.outbox.model.approval; +package com.food.order.system.outbox.model.approval; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; 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/system/outbox/model/approval/OrderApprovalOutboxMessage.java similarity index 86% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalOutboxMessage.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/model/approval/OrderApprovalOutboxMessage.java index 7d58527..9e01e7a 100644 --- 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/system/outbox/model/approval/OrderApprovalOutboxMessage.java @@ -1,8 +1,8 @@ -package com.food.order.sysyem.outbox.model.approval; +package com.food.order.system.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 com.food.order.system.valueobject.OrderStatus; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; 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/system/outbox/model/approval/OrderApprovalProduct.java similarity index 85% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/approval/OrderApprovalProduct.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/model/approval/OrderApprovalProduct.java index 9c1524e..f400f5a 100644 --- 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/system/outbox/model/approval/OrderApprovalProduct.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.outbox.model.approval; +package com.food.order.system.outbox.model.approval; import com.fasterxml.jackson.annotation.JsonProperty; 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/system/outbox/model/payment/OrderPaymentEventPayload.java similarity index 91% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/payment/OrderPaymentEventPayload.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/model/payment/OrderPaymentEventPayload.java index d175728..034b6b4 100644 --- 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/system/outbox/model/payment/OrderPaymentEventPayload.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.outbox.model.payment; +package com.food.order.system.outbox.model.payment; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; 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/system/outbox/model/payment/OrderPaymentOutboxMessage.java similarity index 86% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/model/payment/OrderPaymentOutboxMessage.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/model/payment/OrderPaymentOutboxMessage.java index 84ee120..c824f8f 100644 --- 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/system/outbox/model/payment/OrderPaymentOutboxMessage.java @@ -1,8 +1,8 @@ -package com.food.order.sysyem.outbox.model.payment; +package com.food.order.system.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 com.food.order.system.valueobject.OrderStatus; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; 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/system/outbox/scheduler/approval/ApprovalOutboxHelper.java similarity index 87% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/ApprovalOutboxHelper.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/scheduler/approval/ApprovalOutboxHelper.java index 8337a38..b55641b 100644 --- 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/system/outbox/scheduler/approval/ApprovalOutboxHelper.java @@ -1,14 +1,14 @@ -package com.food.order.sysyem.outbox.scheduler.approval; +package com.food.order.system.outbox.scheduler.approval; 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.outbox.model.approval.OrderApprovalEventPayload; +import com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage; import com.food.order.system.saga.SagaStatus; -import com.food.order.sysyem.outbox.model.approval.OrderApprovalEventPayload; -import com.food.order.sysyem.outbox.model.approval.OrderApprovalOutboxMessage; -import com.food.order.sysyem.ports.output.repository.ApprovalOutboxRepository; -import com.food.order.sysyem.valueobject.OrderStatus; +import com.food.order.system.ports.output.repository.ApprovalOutboxRepository; +import com.food.order.system.valueobject.OrderStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -73,9 +73,9 @@ public class ApprovalOutboxHelper { @Transactional public void saveApprovalOutboxMessage(OrderApprovalEventPayload payload, OrderStatus orderStatus, - SagaStatus sagaStatus, - OutboxStatus outboxStatus, - UUID sagaId) { + SagaStatus sagaStatus, + OutboxStatus outboxStatus, + UUID sagaId) { save(OrderApprovalOutboxMessage.builder() .id(UUID.randomUUID()) 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/system/outbox/scheduler/approval/RestaurantApprovalOutboxCleanerSchedule.java similarity index 89% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxCleaner.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/scheduler/approval/RestaurantApprovalOutboxCleanerSchedule.java index c6c6273..10d0886 100644 --- 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/system/outbox/scheduler/approval/RestaurantApprovalOutboxCleanerSchedule.java @@ -1,10 +1,10 @@ -package com.food.order.sysyem.outbox.scheduler.approval; +package com.food.order.system.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.outbox.model.approval.OrderApprovalOutboxMessage; 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; @@ -16,7 +16,7 @@ import java.util.stream.Collectors; @Slf4j @Component @RequiredArgsConstructor -public class RestaurantApprovalOutboxCleaner implements OutboxScheduler { +public class RestaurantApprovalOutboxCleanerSchedule implements OutboxScheduler { private final ApprovalOutboxHelper approvalOutboxHelper; 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/system/outbox/scheduler/approval/RestaurantApprovalOutboxScheduler.java similarity index 91% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/approval/RestaurantApprovalOutboxMessage.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/scheduler/approval/RestaurantApprovalOutboxScheduler.java index 8d9d9f9..65469b1 100644 --- 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/system/outbox/scheduler/approval/RestaurantApprovalOutboxScheduler.java @@ -1,11 +1,11 @@ -package com.food.order.sysyem.outbox.scheduler.approval; +package com.food.order.system.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.outbox.model.approval.OrderApprovalOutboxMessage; 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 com.food.order.system.ports.output.message.publisher.restaurantapproval.RestaurantApprovalRequestMessagePublisher; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; @@ -18,7 +18,7 @@ import java.util.stream.Collectors; @Slf4j @Component @RequiredArgsConstructor -public class RestaurantApprovalOutboxMessage implements OutboxScheduler { +public class RestaurantApprovalOutboxScheduler implements OutboxScheduler { private final ApprovalOutboxHelper approvalOutboxHelper; private final RestaurantApprovalRequestMessagePublisher restaurantApprovalRequestMessagePublisher; 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/system/outbox/scheduler/payment/PaymentOutboxCleaner.java similarity index 93% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxCleaner.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/scheduler/payment/PaymentOutboxCleaner.java index 2d7ce1e..f362a61 100644 --- 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/system/outbox/scheduler/payment/PaymentOutboxCleaner.java @@ -1,10 +1,10 @@ -package com.food.order.sysyem.outbox.scheduler.payment; +package com.food.order.system.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.outbox.model.payment.OrderPaymentOutboxMessage; 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; 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/system/outbox/scheduler/payment/PaymentOutboxHelper.java similarity index 92% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxHelper.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/scheduler/payment/PaymentOutboxHelper.java index 1ef0ca2..402d65c 100644 --- 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/system/outbox/scheduler/payment/PaymentOutboxHelper.java @@ -1,14 +1,14 @@ -package com.food.order.sysyem.outbox.scheduler.payment; +package com.food.order.system.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.outbox.model.payment.OrderPaymentEventPayload; +import com.food.order.system.outbox.model.payment.OrderPaymentOutboxMessage; +import com.food.order.system.ports.output.repository.PaymentOutboxRepository; 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 com.food.order.system.valueobject.OrderStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; 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/system/outbox/scheduler/payment/PaymentOutboxScheduler.java similarity index 80% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/outbox/scheduler/payment/PaymentOutboxScheduler.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/outbox/scheduler/payment/PaymentOutboxScheduler.java index 1afbfff..5beb713 100644 --- 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/system/outbox/scheduler/payment/PaymentOutboxScheduler.java @@ -1,12 +1,11 @@ -package com.food.order.sysyem.outbox.scheduler.payment; +package com.food.order.system.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.outbox.model.payment.OrderPaymentOutboxMessage; +import com.food.order.system.ports.output.message.publisher.payment.PaymentRequestMessagePublisher; 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; @@ -17,12 +16,17 @@ import java.util.stream.Collectors; @Slf4j @Component -@RequiredArgsConstructor +//@RequiredArgsConstructor public class PaymentOutboxScheduler implements OutboxScheduler { private final PaymentOutboxHelper paymentOutboxHelper; private final PaymentRequestMessagePublisher paymentRequestMessagePublisher; + public PaymentOutboxScheduler(PaymentOutboxHelper paymentOutboxHelper, PaymentRequestMessagePublisher paymentRequestMessagePublisher) { + this.paymentOutboxHelper = paymentOutboxHelper; + this.paymentRequestMessagePublisher = paymentRequestMessagePublisher; + } + @Override @Transactional @Scheduled(fixedDelayString = "${order-service.outbox-scheduler-fixed-rate}", @@ -39,7 +43,7 @@ public class PaymentOutboxScheduler implements OutboxScheduler { .orElseThrow( () -> new OrderDomainException("No outbox message found for processing")); - if (Objects.nonNull(outboxMessageResponse) && outboxMessageResponse.size() > 0) { + if (Objects.nonNull(outboxMessageResponse) && !outboxMessageResponse.isEmpty()) { log.info("Received {} OrderPaymentOutboxMessage with ids : {} , sending message bus !" , outboxMessageResponse.size(), diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/message/listener/payment/PaymentResponseMessageListener.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/input/message/listener/payment/PaymentResponseMessageListener.java similarity index 59% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/message/listener/payment/PaymentResponseMessageListener.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/input/message/listener/payment/PaymentResponseMessageListener.java index a724115..a7c3a81 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/message/listener/payment/PaymentResponseMessageListener.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/input/message/listener/payment/PaymentResponseMessageListener.java @@ -1,6 +1,6 @@ -package com.food.order.sysyem.ports.input.message.listener.payment; +package com.food.order.system.ports.input.message.listener.payment; -import com.food.order.sysyem.dto.message.PaymentResponse; +import com.food.order.system.dto.message.PaymentResponse; public interface PaymentResponseMessageListener { diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java similarity index 65% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java index 646ccc6..3f0ae45 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java @@ -1,6 +1,6 @@ -package com.food.order.sysyem.ports.input.message.listener.restaurantapproval; +package com.food.order.system.ports.input.message.listener.restaurantapproval; -import com.food.order.sysyem.dto.message.RestaurantApprovalResponse; +import com.food.order.system.dto.message.RestaurantApprovalResponse; public interface RestaurantApprovalResponseMessageListener { void orderApproved(RestaurantApprovalResponse restaurantApprovalResponse); diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/input/service/OrderApplicationService.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/input/service/OrderApplicationService.java new file mode 100644 index 0000000..0860bd0 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/input/service/OrderApplicationService.java @@ -0,0 +1,15 @@ +package com.food.order.system.ports.input.service; + +import com.food.order.system.dto.create.CreateOrderCommand; +import com.food.order.system.dto.create.CreateOrderResponse; +import com.food.order.system.dto.track.TrackOrderQuery; +import com.food.order.system.dto.track.TrackOrderResponse; + +import javax.validation.Valid; + +public interface OrderApplicationService { + + CreateOrderResponse createOrder(@Valid CreateOrderCommand createOrderCommand); + TrackOrderResponse trackOrder(@Valid TrackOrderQuery trackOrderQuery); + +} 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/system/ports/output/message/publisher/payment/PaymentRequestMessagePublisher.java similarity index 70% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/payment/PaymentRequestMessagePublisher.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/message/publisher/payment/PaymentRequestMessagePublisher.java index 05750f7..8b08b22 100644 --- 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/system/ports/output/message/publisher/payment/PaymentRequestMessagePublisher.java @@ -1,7 +1,7 @@ -package com.food.order.sysyem.ports.output.message.publisher.payment; +package com.food.order.system.ports.output.message.publisher.payment; import com.food.order.system.outbox.OutboxStatus; -import com.food.order.sysyem.outbox.model.payment.OrderPaymentOutboxMessage; +import com.food.order.system.outbox.model.payment.OrderPaymentOutboxMessage; import java.util.function.BiConsumer; 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/system/ports/output/message/publisher/restaurantapproval/RestaurantApprovalRequestMessagePublisher.java similarity index 71% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/message/publisher/restaurantapproval/RestaurantApprovalRequestMessagePublisher.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/message/publisher/restaurantapproval/RestaurantApprovalRequestMessagePublisher.java index 8f14f8d..6d33c46 100644 --- 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/system/ports/output/message/publisher/restaurantapproval/RestaurantApprovalRequestMessagePublisher.java @@ -1,7 +1,7 @@ -package com.food.order.sysyem.ports.output.message.publisher.restaurantapproval; +package com.food.order.system.ports.output.message.publisher.restaurantapproval; import com.food.order.system.outbox.OutboxStatus; -import com.food.order.sysyem.outbox.model.approval.OrderApprovalOutboxMessage; +import com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage; import java.util.function.BiConsumer; 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/system/ports/output/repository/ApprovalOutboxRepository.java similarity index 90% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/ApprovalOutboxRepository.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/ApprovalOutboxRepository.java index 4cc7355..20b5db4 100644 --- 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/system/ports/output/repository/ApprovalOutboxRepository.java @@ -1,8 +1,8 @@ -package com.food.order.sysyem.ports.output.repository; +package com.food.order.system.ports.output.repository; import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage; import com.food.order.system.saga.SagaStatus; -import com.food.order.sysyem.outbox.model.approval.OrderApprovalOutboxMessage; import java.util.List; import java.util.Optional; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/CustomerRepository.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/CustomerRepository.java similarity index 78% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/CustomerRepository.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/CustomerRepository.java index 7918c19..a1ba827 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/CustomerRepository.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/CustomerRepository.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.ports.output.repository; +package com.food.order.system.ports.output.repository; import com.food.order.system.domain.entity.Customer; 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/system/ports/output/repository/OrderRepository.java similarity index 85% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/OrderRepository.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/OrderRepository.java index 95c0b17..6319317 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/system/ports/output/repository/OrderRepository.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.ports.output.repository; +package com.food.order.system.ports.output.repository; import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.valueobject.TrackingId; 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/system/ports/output/repository/PaymentOutboxRepository.java similarity index 90% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/PaymentOutboxRepository.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/PaymentOutboxRepository.java index a3016a7..35705ee 100644 --- 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/system/ports/output/repository/PaymentOutboxRepository.java @@ -1,8 +1,8 @@ -package com.food.order.sysyem.ports.output.repository; +package com.food.order.system.ports.output.repository; import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.outbox.model.payment.OrderPaymentOutboxMessage; import com.food.order.system.saga.SagaStatus; -import com.food.order.sysyem.outbox.model.payment.OrderPaymentOutboxMessage; import java.util.List; import java.util.Optional; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/RestaurantRepository.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/RestaurantRepository.java similarity index 78% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/RestaurantRepository.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/RestaurantRepository.java index 00574df..3eaaca2 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/RestaurantRepository.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/RestaurantRepository.java @@ -1,4 +1,4 @@ -package com.food.order.sysyem.ports.output.repository; +package com.food.order.system.ports.output.repository; import com.food.order.system.domain.entity.Restaurant; diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderApprovalSaga.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderApprovalSaga.java new file mode 100644 index 0000000..f82ee27 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderApprovalSaga.java @@ -0,0 +1,141 @@ +package com.food.order.system.saga; + +import com.food.order.system.domain.entity.Order; +import com.food.order.system.domain.event.OrderCancelledEvent; +import com.food.order.system.domain.exception.OrderDomainException; +import com.food.order.system.domain.service.OrderDomainService; +import com.food.order.system.helper.OrderSagaHelper; +import com.food.order.system.mapper.OrderDataMapper; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage; +import com.food.order.system.outbox.scheduler.approval.ApprovalOutboxHelper; +import com.food.order.system.outbox.scheduler.payment.PaymentOutboxHelper; +import com.food.order.system.dto.message.RestaurantApprovalResponse; +import com.food.order.system.valueobject.OrderStatus; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.UUID; + +import static com.food.order.system.DomainConstants.UTC; + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderApprovalSaga implements SagaStep { + + private final OrderDomainService orderDomainService; + private final OrderSagaHelper orderSagaHelper; + private final PaymentOutboxHelper paymentOutboxHelper; + private final OrderDataMapper orderDataMapper; + private final ApprovalOutboxHelper approvalOutboxHelper; + + + + @Override + @Transactional + public void process(RestaurantApprovalResponse data) { + + var messageResponse = + approvalOutboxHelper.getApprovalOutboxMessageBySagaIdAndSagaStatus( + UUID.fromString(data.getSagaId()), + SagaStatus.PROCESSING) + .orElseThrow(() -> { + log.error("Approval outbox message not found for saga id: {}", data.getSagaId()); + return new OrderDomainException("Approval outbox message not found for saga id: " + data.getSagaId()); + }); + + var order = approveOrder(data); + + var sagaStatus = orderSagaHelper.orderStatusToSagaStatus(order.getStatus()); + + approvalOutboxHelper.save(getUpdatedApprovalOutboxMessage(messageResponse,order.getStatus(), sagaStatus)); + + approvalOutboxHelper.save(getUpdatedPaymentOutboxMessage(messageResponse.getSagaId(), + order.getStatus(), sagaStatus)); + + + + log.info("Order approved: {}", order); + } + + private OrderApprovalOutboxMessage getUpdatedPaymentOutboxMessage(UUID sagaId, + OrderStatus status, + SagaStatus sagaStatus) { + var message = approvalOutboxHelper.getApprovalOutboxMessageBySagaIdAndSagaStatus( + sagaId, + SagaStatus.PROCESSING) + .orElseThrow(() -> { + log.error("Approval outbox message not found for saga id: {}", sagaId); + return new OrderDomainException("Approval outbox message not found for saga id: " + sagaId); + }); + + message.setProcessedAt(ZonedDateTime.now(ZoneId.of(UTC))); + message.setSagaStatus(sagaStatus); + message.setOrderStatus(status); + return message; + } + + private OrderApprovalOutboxMessage getUpdatedApprovalOutboxMessage(OrderApprovalOutboxMessage messageResponse, + OrderStatus status, + SagaStatus sagaStatus) { + messageResponse.setProcessedAt(ZonedDateTime.now(ZoneId.of(UTC))); + messageResponse.setSagaStatus(sagaStatus); + messageResponse.setOrderStatus(status); + return messageResponse; + } + + + private Order approveOrder(RestaurantApprovalResponse data) { + var order = orderSagaHelper.findOrder(data.getOrderId()); + orderDomainService.approve(order); + orderSagaHelper.saveOrder(order); + return order; + } + + + @Override + @Transactional + public void rollback(RestaurantApprovalResponse data) { + + var message = approvalOutboxHelper.getApprovalOutboxMessageBySagaIdAndSagaStatus( + UUID.fromString(data.getSagaId()), + SagaStatus.PROCESSING) + .orElseThrow( + () -> { + log.error("Approval outbox message not found for saga id: {}", data.getSagaId()); + return new OrderDomainException("Approval outbox message not found for saga id: " + + data.getSagaId()); + } + ); + + var event = rollbackOrder(data); + + var sagaStatus = orderSagaHelper.orderStatusToSagaStatus(event.getOrder().getStatus()); + + approvalOutboxHelper.save(getUpdatedApprovalOutboxMessage(message, event.getOrder().getStatus(), sagaStatus)); + + paymentOutboxHelper.savePaymentOutboxMessage( + orderDataMapper.orderCancelledEventToOrderPaymentEventPayload(event), + event.getOrder().getStatus(), + sagaStatus, + OutboxStatus.STARTED, + message.getSagaId() + ); + + log.info("Order cancelled event id: {}", event.getOrder().getId()); + } + + private OrderCancelledEvent rollbackOrder(RestaurantApprovalResponse data) { + var order = orderSagaHelper.findOrder(data.getOrderId()); + var event = orderDomainService.cancelOrderPayment( + order, + data.getFailureMessages()); + orderSagaHelper.saveOrder(order); + return event; + } +} 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/system/saga/OrderPaymentSaga.java similarity index 90% rename from order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderPaymentSaga.java rename to order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderPaymentSaga.java index 508574f..5e47427 100644 --- 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/system/saga/OrderPaymentSaga.java @@ -1,21 +1,19 @@ -package com.food.order.sysyem.saga; +package com.food.order.system.saga; import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.event.OrderPaidEvent; import com.food.order.system.domain.exception.OrderDomainException; import com.food.order.system.domain.service.OrderDomainService; +import com.food.order.system.dto.message.PaymentResponse; import com.food.order.system.outbox.OutboxStatus; -import com.food.order.system.saga.SagaStatus; -import com.food.order.system.saga.SagaStep; -import com.food.order.sysyem.dto.message.PaymentResponse; -import com.food.order.sysyem.helper.OrderSagaHelper; -import com.food.order.sysyem.mapper.OrderDataMapper; -import com.food.order.sysyem.outbox.model.approval.OrderApprovalOutboxMessage; -import com.food.order.sysyem.outbox.model.payment.OrderPaymentOutboxMessage; -import com.food.order.sysyem.outbox.scheduler.approval.ApprovalOutboxHelper; -import com.food.order.sysyem.outbox.scheduler.payment.PaymentOutboxHelper; -import com.food.order.sysyem.valueobject.OrderStatus; -import com.food.order.sysyem.valueobject.PaymentStatus; +import com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage; +import com.food.order.system.outbox.model.payment.OrderPaymentOutboxMessage; +import com.food.order.system.helper.OrderSagaHelper; +import com.food.order.system.mapper.OrderDataMapper; +import com.food.order.system.outbox.scheduler.approval.ApprovalOutboxHelper; +import com.food.order.system.outbox.scheduler.payment.PaymentOutboxHelper; +import com.food.order.system.valueobject.OrderStatus; +import com.food.order.system.valueobject.PaymentStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -25,7 +23,7 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.UUID; -import static com.food.order.sysyem.DomainConstants.UTC; +import static com.food.order.system.DomainConstants.UTC; @Slf4j @Component diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/service/OrderApplicationService.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/service/OrderApplicationService.java deleted file mode 100644 index 0942040..0000000 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/service/OrderApplicationService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.food.order.sysyem.ports.input.service; - -import com.food.order.sysyem.dto.create.CreateOrderCommand; -import com.food.order.sysyem.dto.create.CreateOrderResponse; -import com.food.order.sysyem.dto.track.TrackOrderQuery; -import com.food.order.sysyem.dto.track.TrackOrderResponse; - -import javax.validation.Valid; - -public interface OrderApplicationService { - - CreateOrderResponse createOrder(@Valid CreateOrderCommand createOrderCommand); - TrackOrderResponse trackOrder(@Valid TrackOrderQuery trackOrderQuery); - -} 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 deleted file mode 100644 index 9246ff7..0000000 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/saga/OrderApprovalSaga.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.food.order.sysyem.saga; - -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.helper.OrderSagaHelper; -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 OrderSagaHelper orderSagaHelper; - - - - @Override - @Transactional - public void 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); - } - - - @Override - @Transactional - public void rollback(RestaurantApprovalResponse data) { - log.info("Approving order with id: {}", data.getOrderId()); - var order = orderSagaHelper.findOrder(data.getOrderId()); - var cancelEvent = orderDomainService.cancelOrderPayment - (order, - data.getFailureMessages()); - orderSagaHelper.saveOrder(order); - log.info("Order cancelled: {}", order); - } -} diff --git a/order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderApplicationServiceTest.java b/order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderApplicationServiceTest.java new file mode 100644 index 0000000..01891f9 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderApplicationServiceTest.java @@ -0,0 +1,237 @@ +package com.food.order.system; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.food.order.system.domain.entity.Customer; +import com.food.order.system.domain.entity.Order; +import com.food.order.system.domain.entity.Product; +import com.food.order.system.domain.entity.Restaurant; +import com.food.order.system.domain.exception.OrderDomainException; +import com.food.order.system.dto.create.CreateOrderCommand; +import com.food.order.system.dto.create.CreateOrderResponse; +import com.food.order.system.dto.create.OrderAddress; +import com.food.order.system.dto.create.OrderItem; +import com.food.order.system.mapper.OrderDataMapper; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.outbox.model.payment.OrderPaymentEventPayload; +import com.food.order.system.outbox.model.payment.OrderPaymentOutboxMessage; +import com.food.order.system.ports.input.service.OrderApplicationService; +import com.food.order.system.ports.output.repository.CustomerRepository; +import com.food.order.system.ports.output.repository.OrderRepository; +import com.food.order.system.ports.output.repository.PaymentOutboxRepository; +import com.food.order.system.ports.output.repository.RestaurantRepository; +import com.food.order.system.saga.SagaStatus; +import com.food.order.system.valueobject.*; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.math.BigDecimal; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static com.food.order.system.outbox.order.SagaConst.ORDER_PROCESSING_SAGA; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@SpringBootTest(classes = OrderTestConfiguration.class) +class OrderApplicationServiceTest { + + @Autowired + private OrderApplicationService orderApplicationService; + + @Autowired + private OrderDataMapper orderDataMapper; + + @Autowired + private OrderRepository orderRepository; + + @Autowired + private CustomerRepository customerRepository; + + @Autowired + private RestaurantRepository restaurantRepository; + + @Autowired + private PaymentOutboxRepository paymentOutboxRepository; + + @Autowired + private ObjectMapper objectMapper; + + private CreateOrderCommand createOrderCommand; + private CreateOrderCommand createOrderCommandWrongPrice; + private CreateOrderCommand createOrderCommandWrongProductPrice; + private final UUID CUSTOMER_ID = UUID.fromString("d215b5f8-0249-4dc5-89a3-51fd148cfb41"); + private final UUID RESTAURANT_ID = UUID.fromString("d215b5f8-0249-4dc5-89a3-51fd148cfb45"); + private final UUID PRODUCT_ID = UUID.fromString("d215b5f8-0249-4dc5-89a3-51fd148cfb48"); + private final UUID ORDER_ID = UUID.fromString("15a497c1-0f4b-4eff-b9f4-c402c8c07afb"); + private final UUID SAGA_ID = UUID.fromString("15a497c1-0f4b-4eff-b9f4-c402c8c07afa"); + private final BigDecimal PRICE = new BigDecimal("200.00"); + + @BeforeAll + public void init() { + createOrderCommand = CreateOrderCommand.builder() + .customerId(CUSTOMER_ID) + .restaurantId(RESTAURANT_ID) + .orderAddress(OrderAddress.builder() + .street("street_1") + .postalCode("1000AB") + .city("Paris") + .build()) + .price(PRICE) + .orderItems(List.of(OrderItem.builder() + .productId(PRODUCT_ID) + .quantity(1) + .price(new BigDecimal("50.00")) + .subTotal(new BigDecimal("50.00")) + .build(), + OrderItem.builder() + .productId(PRODUCT_ID) + .quantity(3) + .price(new BigDecimal("50.00")) + .subTotal(new BigDecimal("150.00")) + .build())) + .build(); + + createOrderCommandWrongPrice = CreateOrderCommand.builder() + .customerId(CUSTOMER_ID) + .restaurantId(RESTAURANT_ID) + .orderAddress(OrderAddress.builder() + .street("street_1") + .postalCode("1000AB") + .city("Paris") + .build()) + .price(new BigDecimal("250.00")) + .orderItems(List.of(OrderItem.builder() + .productId(PRODUCT_ID) + .quantity(1) + .price(new BigDecimal("50.00")) + .subTotal(new BigDecimal("50.00")) + .build(), + OrderItem.builder() + .productId(PRODUCT_ID) + .quantity(3) + .price(new BigDecimal("50.00")) + .subTotal(new BigDecimal("150.00")) + .build())) + .build(); + + createOrderCommandWrongProductPrice = CreateOrderCommand.builder() + .customerId(CUSTOMER_ID) + .restaurantId(RESTAURANT_ID) + .orderAddress(OrderAddress.builder() + .street("street_1") + .postalCode("1000AB") + .city("Paris") + .build()) + .price(new BigDecimal("210.00")) + .orderItems(List.of(OrderItem.builder() + .productId(PRODUCT_ID) + .quantity(1) + .price(new BigDecimal("60.00")) + .subTotal(new BigDecimal("60.00")) + .build(), + OrderItem.builder() + .productId(PRODUCT_ID) + .quantity(3) + .price(new BigDecimal("50.00")) + .subTotal(new BigDecimal("150.00")) + .build())) + .build(); + + Customer customer = new Customer(new CustomerId(CUSTOMER_ID)); + + Restaurant restaurantResponse = Restaurant.builder() + .id(new RestaurantId(createOrderCommand.restaurantId())) + .products(List.of(new Product(new ProductId(PRODUCT_ID), "product-1", new Money(new BigDecimal("50.00"))), + new Product(new ProductId(PRODUCT_ID), "product-2", new Money(new BigDecimal("50.00"))))) + .isActive(true) + .build(); + + Order order = orderDataMapper.createOrderCommandToOrder(createOrderCommand); + order.setId(new OrderId(ORDER_ID)); + + when(customerRepository.findCustomer(CUSTOMER_ID)).thenReturn(Optional.of(customer)); + when(restaurantRepository.findRestaurantInformation(orderDataMapper.createOrderCommandToRestaurant(createOrderCommand))) + .thenReturn(Optional.of(restaurantResponse)); + when(orderRepository.save(any(Order.class))).thenReturn(order); + when(paymentOutboxRepository.save(any(OrderPaymentOutboxMessage.class))).thenReturn(getOrderPaymentOutboxMessage()); + } + + @Test + void testCreateOrder() { + CreateOrderResponse createOrderResponse = orderApplicationService.createOrder(createOrderCommand); + assertEquals(OrderStatus.PENDING, createOrderResponse.orderStatus()); + assertEquals("Order created successfully", createOrderResponse.message()); + assertNotNull(createOrderResponse.orderTrackingId()); + } + + @Test + void testCreateOrderWithWrongTotalPrice() { + OrderDomainException orderDomainException = assertThrows(OrderDomainException.class, + () -> orderApplicationService.createOrder(createOrderCommandWrongPrice)); + assertEquals("Total price: 250.00 is not equal to Order items total: 200.00!", + orderDomainException.getMessage()); + } + + @Test + void testCreateOrderWithWrongProductPrice() { + OrderDomainException orderDomainException = assertThrows(OrderDomainException.class, + () -> orderApplicationService.createOrder(createOrderCommandWrongProductPrice)); + assertEquals(orderDomainException.getMessage(), + "Order item price: 60.00 is not valid for product " + PRODUCT_ID); + } + + @Test + void testCreateOrderWithPassiveRestaurant() { + Restaurant restaurantResponse = Restaurant.builder() + .id(new RestaurantId(createOrderCommand.restaurantId())) + .products(List.of(new Product(new ProductId(PRODUCT_ID), "product-1", new Money(new BigDecimal("50.00"))), + new Product(new ProductId(PRODUCT_ID), "product-2", new Money(new BigDecimal("50.00"))))) + .isActive(false) + .build(); + when(restaurantRepository.findRestaurantInformation(orderDataMapper.createOrderCommandToRestaurant(createOrderCommand))) + .thenReturn(Optional.of(restaurantResponse)); + OrderDomainException orderDomainException = assertThrows(OrderDomainException.class, + () -> orderApplicationService.createOrder(createOrderCommand)); + assertEquals(orderDomainException.getMessage(), + "Restaurant with id " + RESTAURANT_ID + " is currently not active!"); + } + + private OrderPaymentOutboxMessage getOrderPaymentOutboxMessage() { + OrderPaymentEventPayload orderPaymentEventPayload = OrderPaymentEventPayload.builder() + .orderId(ORDER_ID.toString()) + .customerId(CUSTOMER_ID.toString()) + .price(PRICE) + .createdAt(ZonedDateTime.now()) + .paymentOrderStatus(PaymentOrderStatus.PENDING.name()) + .build(); + + return OrderPaymentOutboxMessage.builder() + .id(UUID.randomUUID()) + .sagaId(SAGA_ID) + .createdAt(ZonedDateTime.now()) + .type(ORDER_PROCESSING_SAGA) + .payload(createPayload(orderPaymentEventPayload)) + .orderStatus(OrderStatus.PENDING) + .sagaStatus(SagaStatus.STARTED) + .outboxStatus(OutboxStatus.STARTED) + .version(0) + .build(); + } + + private String createPayload(OrderPaymentEventPayload orderPaymentEventPayload) { + try { + return objectMapper.writeValueAsString(orderPaymentEventPayload); + } catch (JsonProcessingException e) { + throw new OrderDomainException("Cannot create OrderPaymentEventPayload object!"); + } + } + +} diff --git a/order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderTestConfiguration.java b/order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderTestConfiguration.java new file mode 100644 index 0000000..e7b26c1 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderTestConfiguration.java @@ -0,0 +1,55 @@ +package com.food.order.system; + +import com.food.order.system.domain.service.OrderDomainService; +import com.food.order.system.domain.service.impl.OrderDomainServiceImpl; +import com.food.order.system.ports.output.message.publisher.payment.PaymentRequestMessagePublisher; +import com.food.order.system.ports.output.message.publisher.restaurantapproval.RestaurantApprovalRequestMessagePublisher; +import com.food.order.system.ports.output.repository.*; +import org.mockito.Mockito; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication(scanBasePackages = "com.food.order") +public class OrderTestConfiguration { + + @Bean + public PaymentRequestMessagePublisher paymentRequestMessagePublisher() { + return Mockito.mock(PaymentRequestMessagePublisher.class); + } + + @Bean + public RestaurantApprovalRequestMessagePublisher restaurantApprovalRequestMessagePublisher() { + return Mockito.mock(RestaurantApprovalRequestMessagePublisher.class); + } + + @Bean + public OrderRepository orderRepository() { + return Mockito.mock(OrderRepository.class); + } + + @Bean + public CustomerRepository customerRepository() { + return Mockito.mock(CustomerRepository.class); + } + + @Bean + public RestaurantRepository restaurantRepository() { + return Mockito.mock(RestaurantRepository.class); + } + + @Bean + public PaymentOutboxRepository paymentOutboxRepository() { + return Mockito.mock(PaymentOutboxRepository.class); + } + + @Bean + public ApprovalOutboxRepository approvalOutboxRepository() { + return Mockito.mock(ApprovalOutboxRepository.class); + } + + @Bean + public OrderDomainService orderDomainService() { + return new OrderDomainServiceImpl(); + } + +} diff --git a/order-service/order-domain/order-application-service/src/test/resources/application.yml b/order-service/order-domain/order-application-service/src/test/resources/application.yml new file mode 100644 index 0000000..f3c1b18 --- /dev/null +++ b/order-service/order-domain/order-application-service/src/test/resources/application.yml @@ -0,0 +1,3 @@ +order-service: + outbox-scheduler-fixed-rate: 10000 + outbox-scheduler-initial-delay: 10000 \ No newline at end of file diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Customer.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Customer.java index 996d62d..609d45c 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Customer.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Customer.java @@ -1,7 +1,7 @@ package com.food.order.system.domain.entity; -import com.food.order.sysyem.entity.AggregateRoot; -import com.food.order.sysyem.valueobject.CustomerId; +import com.food.order.system.entity.AggregateRoot; +import com.food.order.system.valueobject.CustomerId; public class Customer extends AggregateRoot { 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 c9fc1ce..e380c9e 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 @@ -1,11 +1,11 @@ package com.food.order.system.domain.entity; -import com.food.order.sysyem.entity.AggregateRoot; +import com.food.order.system.entity.AggregateRoot; import com.food.order.system.domain.exception.OrderDomainException; import com.food.order.system.domain.valueobject.OrderItemId; import com.food.order.system.domain.valueobject.StreetAddress; import com.food.order.system.domain.valueobject.TrackingId; -import com.food.order.sysyem.valueobject.*; +import com.food.order.system.valueobject.*; import java.util.List; import java.util.Objects; diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/OrderItem.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/OrderItem.java index 6c426f4..c93e112 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/OrderItem.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/OrderItem.java @@ -1,8 +1,8 @@ package com.food.order.system.domain.entity; -import com.food.order.sysyem.entity.BaseEntity; -import com.food.order.sysyem.valueobject.Money; -import com.food.order.sysyem.valueobject.OrderId; +import com.food.order.system.entity.BaseEntity; +import com.food.order.system.valueobject.Money; +import com.food.order.system.valueobject.OrderId; import com.food.order.system.domain.valueobject.OrderItemId; public class OrderItem extends BaseEntity { diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Product.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Product.java index 3c75f8e..d598484 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Product.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Product.java @@ -1,8 +1,8 @@ package com.food.order.system.domain.entity; -import com.food.order.sysyem.entity.BaseEntity; -import com.food.order.sysyem.valueobject.Money; -import com.food.order.sysyem.valueobject.ProductId; +import com.food.order.system.entity.BaseEntity; +import com.food.order.system.valueobject.Money; +import com.food.order.system.valueobject.ProductId; public class Product extends BaseEntity { private String name; diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Restaurant.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Restaurant.java index e5ef9df..c344570 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Restaurant.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Restaurant.java @@ -1,7 +1,7 @@ package com.food.order.system.domain.entity; -import com.food.order.sysyem.entity.AggregateRoot; -import com.food.order.sysyem.valueobject.RestaurantId; +import com.food.order.system.entity.AggregateRoot; +import com.food.order.system.valueobject.RestaurantId; import java.util.List; diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderCancelledEvent.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderCancelledEvent.java index 2eefa1c..00c208e 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderCancelledEvent.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderCancelledEvent.java @@ -1,7 +1,6 @@ package com.food.order.system.domain.event; import com.food.order.system.domain.entity.Order; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; import java.time.ZonedDateTime; diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderEvent.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderEvent.java index 69ae7d3..891de31 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderEvent.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderEvent.java @@ -1,6 +1,6 @@ package com.food.order.system.domain.event; -import com.food.order.sysyem.event.DomainEvent; +import com.food.order.system.event.DomainEvent; import com.food.order.system.domain.entity.Order; import java.time.ZonedDateTime; diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderPaidEvent.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderPaidEvent.java index b38a388..9f56c03 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderPaidEvent.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/event/OrderPaidEvent.java @@ -1,7 +1,6 @@ package com.food.order.system.domain.event; import com.food.order.system.domain.entity.Order; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; import java.time.ZonedDateTime; diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/exception/OrderDomainException.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/exception/OrderDomainException.java index 5e99d4b..b91858c 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/exception/OrderDomainException.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/exception/OrderDomainException.java @@ -1,6 +1,6 @@ package com.food.order.system.domain.exception; -import com.food.order.sysyem.exception.DomainException; +import com.food.order.system.exception.DomainException; public class OrderDomainException extends DomainException { diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/exception/OrderNotFoundException.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/exception/OrderNotFoundException.java index d68adc8..414c5bc 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/exception/OrderNotFoundException.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/exception/OrderNotFoundException.java @@ -1,6 +1,6 @@ package com.food.order.system.domain.exception; -import com.food.order.sysyem.exception.DomainException; +import com.food.order.system.exception.DomainException; public class OrderNotFoundException extends DomainException { diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/OrderItemId.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/OrderItemId.java index 163a1e9..7e2d838 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/OrderItemId.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/OrderItemId.java @@ -1,6 +1,6 @@ package com.food.order.system.domain.valueobject; -import com.food.order.sysyem.valueobject.BaseId; +import com.food.order.system.valueobject.BaseId; public class OrderItemId extends BaseId { diff --git a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/TrackingId.java b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/TrackingId.java index 2c073bc..40b3856 100644 --- a/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/TrackingId.java +++ b/order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/TrackingId.java @@ -1,6 +1,6 @@ package com.food.order.system.domain.valueobject; -import com.food.order.sysyem.valueobject.BaseId; +import com.food.order.system.valueobject.BaseId; import java.util.UUID; diff --git a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/listener/kafka/PaymentResponseKafkaListener.java b/order-service/order-messaging/src/main/java/com/food/order/system/messaging/listener/kafka/PaymentResponseKafkaListener.java similarity index 92% rename from order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/listener/kafka/PaymentResponseKafkaListener.java rename to order-service/order-messaging/src/main/java/com/food/order/system/messaging/listener/kafka/PaymentResponseKafkaListener.java index d00dea3..c4f5714 100644 --- a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/listener/kafka/PaymentResponseKafkaListener.java +++ b/order-service/order-messaging/src/main/java/com/food/order/system/messaging/listener/kafka/PaymentResponseKafkaListener.java @@ -1,10 +1,10 @@ -package com.food.order.system.order.messaging.listener.kafka; +package com.food.order.system.messaging.listener.kafka; import com.food.order.system.kafka.consumer.KafkaConsumer; import com.food.order.system.kafka.order.avro.model.PaymentResponseAvroModel; import com.food.order.system.kafka.order.avro.model.PaymentStatus; -import com.food.order.system.order.messaging.mapper.OrderMessagingDataMapper; -import com.food.order.sysyem.ports.input.message.listener.payment.PaymentResponseMessageListener; +import com.food.order.system.messaging.mapper.OrderMessagingDataMapper; +import com.food.order.system.ports.input.message.listener.payment.PaymentResponseMessageListener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.kafka.annotation.KafkaListener; diff --git a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/listener/kafka/RestaurantApprovalResponseKafkaListener.java b/order-service/order-messaging/src/main/java/com/food/order/system/messaging/listener/kafka/RestaurantApprovalResponseKafkaListener.java similarity index 92% rename from order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/listener/kafka/RestaurantApprovalResponseKafkaListener.java rename to order-service/order-messaging/src/main/java/com/food/order/system/messaging/listener/kafka/RestaurantApprovalResponseKafkaListener.java index 1448cca..beb6ad9 100644 --- a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/listener/kafka/RestaurantApprovalResponseKafkaListener.java +++ b/order-service/order-messaging/src/main/java/com/food/order/system/messaging/listener/kafka/RestaurantApprovalResponseKafkaListener.java @@ -1,10 +1,10 @@ -package com.food.order.system.order.messaging.listener.kafka; +package com.food.order.system.messaging.listener.kafka; import com.food.order.system.kafka.consumer.KafkaConsumer; import com.food.order.system.kafka.order.avro.model.OrderApprovalStatus; import com.food.order.system.kafka.order.avro.model.RestaurantApprovalResponseAvroModel; -import com.food.order.system.order.messaging.mapper.OrderMessagingDataMapper; -import com.food.order.sysyem.ports.input.message.listener.restaurantapproval.RestaurantApprovalResponseMessageListener; +import com.food.order.system.messaging.mapper.OrderMessagingDataMapper; +import com.food.order.system.ports.input.message.listener.restaurantapproval.RestaurantApprovalResponseMessageListener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.kafka.annotation.KafkaListener; 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/messaging/mapper/OrderMessagingDataMapper.java similarity index 63% rename from order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/mapper/OrderMessagingDataMapper.java rename to order-service/order-messaging/src/main/java/com/food/order/system/messaging/mapper/OrderMessagingDataMapper.java index 1ddd3a8..6400fbb 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/messaging/mapper/OrderMessagingDataMapper.java @@ -1,13 +1,15 @@ -package com.food.order.system.order.messaging.mapper; +package com.food.order.system.messaging.mapper; import com.food.order.system.domain.event.OrderCancelledEvent; import com.food.order.system.domain.event.OrderCreatedEvent; import com.food.order.system.domain.event.OrderPaidEvent; import com.food.order.system.kafka.order.avro.model.*; -import com.food.order.sysyem.dto.message.PaymentResponse; -import com.food.order.sysyem.dto.message.RestaurantApprovalResponse; -import com.food.order.sysyem.valueobject.OrderApprovalStatus; -import com.food.order.sysyem.valueobject.PaymentStatus; +import com.food.order.system.dto.message.PaymentResponse; +import com.food.order.system.dto.message.RestaurantApprovalResponse; +import com.food.order.system.outbox.model.approval.OrderApprovalEventPayload; +import com.food.order.system.outbox.model.payment.OrderPaymentEventPayload; +import com.food.order.system.valueobject.OrderApprovalStatus; +import com.food.order.system.valueobject.PaymentStatus; import org.springframework.stereotype.Component; import java.util.UUID; @@ -87,4 +89,38 @@ public class OrderMessagingDataMapper { .failureMessages(message.getFailureMessages()) .build(); } + + public RestaurantApprovalRequestAvroModel + orderApprovalEventToRestaurantApprovalRequestAvroModel(String sagaId, OrderApprovalEventPayload + orderApprovalEventPayload) { + return RestaurantApprovalRequestAvroModel.newBuilder() + .setId(UUID.randomUUID().toString()) + .setSagaId(sagaId) + .setOrderId(orderApprovalEventPayload.getOrderId()) + .setRestaurantId(orderApprovalEventPayload.getRestaurantId()) + .setRestaurantOrderStatus(RestaurantOrderStatus + .valueOf(orderApprovalEventPayload.getRestaurantOrderStatus())) + .setProducts(orderApprovalEventPayload.getProducts().stream().map(orderApprovalEventProduct -> + Product.newBuilder() + .setId(orderApprovalEventProduct.getId()) + .setQuantity(orderApprovalEventProduct.getQuantity()) + .build()).toList()) + .setPrice(orderApprovalEventPayload.getPrice()) + .setCreatedAt(orderApprovalEventPayload.getCreatedAt().toInstant()) + .build(); + } + + public PaymentRequestAvroModel orderPaymentEventToPaymentRequestAvroModel(String sagaId, OrderPaymentEventPayload orderPaymentEventPayload) { + return PaymentRequestAvroModel.newBuilder() + .setId(UUID.randomUUID().toString()) + .setSagaId(sagaId) + .setCustomerId(orderPaymentEventPayload.getCustomerId()) + .setOrderId(orderPaymentEventPayload.getOrderId()) + .setPrice(orderPaymentEventPayload.getPrice()) + .setCreatedAt(orderPaymentEventPayload.getCreatedAt().toInstant()) + .setPaymentOrderStatus(PaymentOrderStatus.valueOf(orderPaymentEventPayload.getPaymentOrderStatus())) + .build(); + + + } } diff --git a/order-service/order-messaging/src/main/java/com/food/order/system/messaging/publisher/kafka/OrderApprovalEventKafkaPublisher.java b/order-service/order-messaging/src/main/java/com/food/order/system/messaging/publisher/kafka/OrderApprovalEventKafkaPublisher.java new file mode 100644 index 0000000..89e652f --- /dev/null +++ b/order-service/order-messaging/src/main/java/com/food/order/system/messaging/publisher/kafka/OrderApprovalEventKafkaPublisher.java @@ -0,0 +1,69 @@ +package com.food.order.system.messaging.publisher.kafka; + + +import com.food.order.system.kafka.order.avro.model.RestaurantApprovalRequestAvroModel; +import com.food.order.system.kafka.producer.KafkaMessageHelper; +import com.food.order.system.kafka.producer.service.KafkaProducer; +import com.food.order.system.messaging.mapper.OrderMessagingDataMapper; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.config.OrderServiceConfigData; +import com.food.order.system.outbox.model.approval.OrderApprovalEventPayload; +import com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage; +import com.food.order.system.ports.output.message.publisher.restaurantapproval.RestaurantApprovalRequestMessagePublisher; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.function.BiConsumer; + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderApprovalEventKafkaPublisher implements RestaurantApprovalRequestMessagePublisher { + + private final OrderMessagingDataMapper orderMessagingDataMapper; + private final KafkaProducer kafkaProducer; + private final OrderServiceConfigData orderServiceConfigData; + private final KafkaMessageHelper kafkaMessageHelper; + + + + @Override + public void publish(OrderApprovalOutboxMessage orderApprovalOutboxMessage, + BiConsumer outboxCallback) { + OrderApprovalEventPayload orderApprovalEventPayload = + kafkaMessageHelper.getOrderEventPayload(orderApprovalOutboxMessage.getPayload(), + OrderApprovalEventPayload.class); + + String sagaId = orderApprovalOutboxMessage.getSagaId().toString(); + + log.info("Received OrderApprovalOutboxMessage for order id: {} and saga id: {}", + orderApprovalEventPayload.getOrderId(), + sagaId); + + try { + RestaurantApprovalRequestAvroModel restaurantApprovalRequestAvroModel = + orderMessagingDataMapper + .orderApprovalEventToRestaurantApprovalRequestAvroModel(sagaId, + orderApprovalEventPayload); + + kafkaProducer.send(orderServiceConfigData.getRestaurantApprovalRequestTopicName(), + sagaId, + restaurantApprovalRequestAvroModel, + kafkaMessageHelper.getKafkaCallback(orderServiceConfigData.getRestaurantApprovalRequestTopicName(), + restaurantApprovalRequestAvroModel, + orderApprovalOutboxMessage, + outboxCallback, + orderApprovalEventPayload.getOrderId(), + "RestaurantApprovalRequestAvroModel")); + + log.info("OrderApprovalEventPayload sent to kafka for order id: {} and saga id: {}", + restaurantApprovalRequestAvroModel.getOrderId(), sagaId); + } catch (Exception e) { + log.error("Error while sending OrderApprovalEventPayload to kafka for order id: {} and saga id: {}," + + " error: {}", orderApprovalEventPayload.getOrderId(), sagaId, e.getMessage()); + } + + + } +} diff --git a/order-service/order-messaging/src/main/java/com/food/order/system/messaging/publisher/kafka/OrderPaymentEventKafkaPublisher.java b/order-service/order-messaging/src/main/java/com/food/order/system/messaging/publisher/kafka/OrderPaymentEventKafkaPublisher.java new file mode 100644 index 0000000..c6fd4f1 --- /dev/null +++ b/order-service/order-messaging/src/main/java/com/food/order/system/messaging/publisher/kafka/OrderPaymentEventKafkaPublisher.java @@ -0,0 +1,66 @@ +package com.food.order.system.messaging.publisher.kafka; + +import com.food.order.system.kafka.order.avro.model.PaymentRequestAvroModel; +import com.food.order.system.kafka.producer.KafkaMessageHelper; +import com.food.order.system.kafka.producer.service.KafkaProducer; +import com.food.order.system.messaging.mapper.OrderMessagingDataMapper; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.config.OrderServiceConfigData; +import com.food.order.system.outbox.model.payment.OrderPaymentEventPayload; +import com.food.order.system.outbox.model.payment.OrderPaymentOutboxMessage; +import com.food.order.system.ports.output.message.publisher.payment.PaymentRequestMessagePublisher; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.function.BiConsumer; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderPaymentEventKafkaPublisher implements PaymentRequestMessagePublisher { + + private final OrderMessagingDataMapper orderMessagingDataMapper; + private final KafkaProducer kafkaProducer; + private final OrderServiceConfigData orderServiceConfigData; + private final KafkaMessageHelper kafkaMessageHelper; + + @Override + public void publish(OrderPaymentOutboxMessage orderPaymentOutboxMessage, + BiConsumer outboxCallback) { + OrderPaymentEventPayload orderPaymentEventPayload = + kafkaMessageHelper.getOrderEventPayload(orderPaymentOutboxMessage.getPayload(), + OrderPaymentEventPayload.class); + + String sagaId = orderPaymentOutboxMessage.getSagaId().toString(); + + log.info("Received OrderPaymentOutboxMessage for order id: {} and saga id: {}", + orderPaymentEventPayload.getOrderId(), + sagaId); + + try { + PaymentRequestAvroModel paymentRequestAvroModel = orderMessagingDataMapper + .orderPaymentEventToPaymentRequestAvroModel(sagaId, orderPaymentEventPayload); + + kafkaProducer.send(orderServiceConfigData.getPaymentRequestTopicName(), + sagaId, + paymentRequestAvroModel, + kafkaMessageHelper.getKafkaCallback(orderServiceConfigData.getPaymentRequestTopicName(), + paymentRequestAvroModel, + orderPaymentOutboxMessage, + outboxCallback, + orderPaymentEventPayload.getOrderId(), + "PaymentRequestAvroModel")); + + log.info("OrderPaymentEventPayload sent to Kafka for order id: {} and saga id: {}", + orderPaymentEventPayload.getOrderId(), sagaId); + } catch (Exception e) { + log.error("Error while sending OrderPaymentEventPayload" + + " to kafka with order id: {} and saga id: {}, error: {}", + orderPaymentEventPayload.getOrderId(), sagaId, e.getMessage()); + } + + + } +} diff --git a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/CancelOrderKafkaMessagePublisher.java b/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/CancelOrderKafkaMessagePublisher.java deleted file mode 100644 index 868ad25..0000000 --- a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/CancelOrderKafkaMessagePublisher.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.food.order.system.order.messaging.publisher.kafka; - -import com.food.order.system.domain.event.OrderCancelledEvent; -import com.food.order.system.kafka.order.avro.model.PaymentRequestAvroModel; -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.event.publisher.DomainEventPublisher; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Slf4j -@Component -public class CancelOrderKafkaMessagePublisher implements DomainEventPublisher { - - private final OrderMessagingDataMapper orderMessagingDataMapper; - private final OrderServiceConfigData configData; - private final KafkaProducer kafkaProducer; - - private final KafkaMessageHelper kafkaMessageHelper; - - @Override - public void publish(OrderCancelledEvent event) { - - var orderId = event.getOrder().getId().getValue().toString(); - log.info("Publishing order cancel event for order id: {}", orderId); - - try{ - var paymentRequestAvroModel = - orderMessagingDataMapper.orderCancelledEventToPaymentRequestAvroModel(event); - - kafkaProducer.send( - configData.getPaymentRequestTopicName(), - orderId, - paymentRequestAvroModel, - kafkaMessageHelper.getKafkaCallBack(configData.getPaymentRequestTopicName() - ,paymentRequestAvroModel, - orderId, - "PaymentRequestAvroModel")); - log.info("Published order cancel event for order id: {}", orderId); - - } - catch(Exception e){ - log.error("Error publishing order cancel event for order id: {}", orderId, e); - } - - - } - - -} 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 deleted file mode 100644 index cce3831..0000000 --- a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/CreateOrderKafkaMessagePublisher.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.food.order.system.order.messaging.publisher.kafka; - - -import com.food.order.system.domain.event.OrderCreatedEvent; -import com.food.order.system.kafka.order.avro.model.PaymentRequestAvroModel; -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.event.publisher.DomainEventPublisher; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class CreateOrderKafkaMessagePublisher implements DomainEventPublisher { - - private final OrderMessagingDataMapper orderMessagingDataMapper; - private final OrderServiceConfigData configData; - private final KafkaProducer kafkaProducer; - private final KafkaMessageHelper kafkaMessageHelper; - - - @Override - public void publish(OrderCreatedEvent event) { - var orderId = event.getOrder().getId().getValue().toString(); - log.info("Publishing order created event for order id: {}", orderId); - - try{ - var paymentRequestAvroModel = - orderMessagingDataMapper.orderCreatedEventToPaymentRequestAvroModel(event); - - kafkaProducer.send( - configData.getPaymentRequestTopicName(), - orderId, - paymentRequestAvroModel, - kafkaMessageHelper.getKafkaCallBack(configData.getPaymentRequestTopicName(), - paymentRequestAvroModel, - orderId, - "PaymentRequestAvroModel")); - log.info("Published order created event for order id: {}", orderId); - - } - catch(Exception e){ - log.error("Error publishing order created event for order id: {} and message is {}", orderId, e.getMessage(), e); - } - - } - -} 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 deleted file mode 100644 index 24551fb..0000000 --- a/order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/publisher/kafka/PayOrderKafkaMessagePublisher.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.food.order.system.order.messaging.publisher.kafka; - -import com.food.order.system.domain.event.OrderPaidEvent; -import com.food.order.system.kafka.order.avro.model.RestaurantApprovalRequestAvroModel; -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.event.publisher.DomainEventPublisher; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class PayOrderKafkaMessagePublisher implements DomainEventPublisher { - - private final OrderMessagingDataMapper orderMessagingDataMapper; - private final OrderServiceConfigData configData; - private final KafkaProducer kafkaProducer; - private final KafkaMessageHelper kafkaMessageHelper; - - @Override - public void publish(OrderPaidEvent event) { - - var orderId = event.getOrder().getId().getValue().toString(); - - try { - var message = - orderMessagingDataMapper.orderPaidEventToRestaurantApprovalRequestAvroModel(event); - - kafkaProducer.send(configData.getRestaurantApprovalRequestTopicName(), - orderId, - message, - kafkaMessageHelper.getKafkaCallBack(configData.getRestaurantApprovalRequestTopicName(), message, - orderId, - "RestaurantApprovalRequestAvroModel")); - - log.info("Published order paid event for order id: {}", orderId); - } - catch (Exception e) { - log.error("Error publishing order paid event for order id: {}", orderId, e); - } - - } -} diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/adapter/CreditEntryRepositoryImpl.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/adapter/CreditEntryRepositoryImpl.java index a04c5a9..8ab8638 100644 --- a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/adapter/CreditEntryRepositoryImpl.java +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/adapter/CreditEntryRepositoryImpl.java @@ -5,7 +5,7 @@ import com.food.order.system.payment.application.service.ports.output.repository import com.food.order.system.payment.data.access.creditentry.mapper.CreditEntryDataAccessMapper; import com.food.order.system.payment.data.access.creditentry.repository.CreditEntryJpaRepository; import com.food.order.system.payment.service.domain.entity.CreditEntry; -import com.food.order.sysyem.valueobject.CustomerId; +import com.food.order.system.valueobject.CustomerId; import org.springframework.stereotype.Component; import java.util.Optional; diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/mapper/CreditEntryDataAccessMapper.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/mapper/CreditEntryDataAccessMapper.java index ff37152..4c87e8b 100644 --- a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/mapper/CreditEntryDataAccessMapper.java +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/mapper/CreditEntryDataAccessMapper.java @@ -4,8 +4,8 @@ package com.food.order.system.payment.data.access.creditentry.mapper; import com.food.order.system.payment.data.access.creditentry.entity.CreditEntryEntity; import com.food.order.system.payment.service.domain.entity.CreditEntry; import com.food.order.system.payment.service.domain.valueobject.CreditEntryId; -import com.food.order.sysyem.valueobject.CustomerId; -import com.food.order.sysyem.valueobject.Money; +import com.food.order.system.valueobject.CustomerId; +import com.food.order.system.valueobject.Money; import org.springframework.stereotype.Component; @Component 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 acc8788..c0317a3 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 @@ -6,7 +6,7 @@ import com.food.order.system.payment.data.access.credithistory.entity.CreditHist 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; -import com.food.order.sysyem.valueobject.CustomerId; +import com.food.order.system.valueobject.CustomerId; import org.springframework.stereotype.Component; import java.util.List; diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/mapper/CreditHistoryDataAccessMapper.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/mapper/CreditHistoryDataAccessMapper.java index 001218f..efbb1fd 100644 --- a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/mapper/CreditHistoryDataAccessMapper.java +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/mapper/CreditHistoryDataAccessMapper.java @@ -4,8 +4,8 @@ package com.food.order.system.payment.data.access.credithistory.mapper; import com.food.order.system.payment.data.access.credithistory.entity.CreditHistoryEntity; import com.food.order.system.payment.service.domain.entity.CreditHistory; import com.food.order.system.payment.service.domain.valueobject.CreditHistoryId; -import com.food.order.sysyem.valueobject.CustomerId; -import com.food.order.sysyem.valueobject.Money; +import com.food.order.system.valueobject.CustomerId; +import com.food.order.system.valueobject.Money; import org.springframework.stereotype.Component; @Component diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/entity/PaymentEntity.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/entity/PaymentEntity.java index b733b68..4c576e6 100644 --- a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/entity/PaymentEntity.java +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/entity/PaymentEntity.java @@ -1,6 +1,6 @@ package com.food.order.system.payment.data.access.payment.entity; -import com.food.order.sysyem.valueobject.PaymentStatus; +import com.food.order.system.valueobject.PaymentStatus; import lombok.*; import javax.persistence.*; diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/mapper/PaymentDataAccessMapper.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/mapper/PaymentDataAccessMapper.java index b1e7ac7..78927cf 100644 --- a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/mapper/PaymentDataAccessMapper.java +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/mapper/PaymentDataAccessMapper.java @@ -4,9 +4,9 @@ package com.food.order.system.payment.data.access.payment.mapper; import com.food.order.system.payment.data.access.payment.entity.PaymentEntity; import com.food.order.system.payment.service.domain.entity.Payment; import com.food.order.system.payment.service.domain.valueobject.PaymentId; -import com.food.order.sysyem.valueobject.CustomerId; -import com.food.order.sysyem.valueobject.Money; -import com.food.order.sysyem.valueobject.OrderId; +import com.food.order.system.valueobject.CustomerId; +import com.food.order.system.valueobject.Money; +import com.food.order.system.valueobject.OrderId; import org.springframework.stereotype.Component; @Component diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java index 0ba13d1..a40b1f2 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java @@ -14,8 +14,8 @@ import com.food.order.system.payment.service.domain.event.PaymentCancelledEvent; import com.food.order.system.payment.service.domain.event.PaymentCompletedEvent; import com.food.order.system.payment.service.domain.event.PaymentEvent; import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; -import com.food.order.sysyem.valueobject.CustomerId; +import com.food.order.system.event.publisher.DomainEventPublisher; +import com.food.order.system.valueobject.CustomerId; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/dto/PaymentRequest.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/dto/PaymentRequest.java index d98c845..5b178fa 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/dto/PaymentRequest.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/dto/PaymentRequest.java @@ -1,6 +1,6 @@ package com.food.order.system.payment.application.service.dto; -import com.food.order.sysyem.valueobject.PaymentOrderStatus; +import com.food.order.system.valueobject.PaymentOrderStatus; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/exception/PaymentApplicationServiceException.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/exception/PaymentApplicationServiceException.java index 8ad2bec..0bab672 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/exception/PaymentApplicationServiceException.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/exception/PaymentApplicationServiceException.java @@ -1,6 +1,6 @@ package com.food.order.system.payment.application.service.exception; -import com.food.order.sysyem.exception.DomainException; +import com.food.order.system.exception.DomainException; public class PaymentApplicationServiceException extends DomainException { diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/mapper/PaymentDataMapper.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/mapper/PaymentDataMapper.java index 1de2426..1358d2a 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/mapper/PaymentDataMapper.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/mapper/PaymentDataMapper.java @@ -2,9 +2,9 @@ package com.food.order.system.payment.application.service.mapper; import com.food.order.system.payment.application.service.dto.PaymentRequest; import com.food.order.system.payment.service.domain.entity.Payment; -import com.food.order.sysyem.valueobject.CustomerId; -import com.food.order.sysyem.valueobject.Money; -import com.food.order.sysyem.valueobject.OrderId; +import com.food.order.system.valueobject.CustomerId; +import com.food.order.system.valueobject.Money; +import com.food.order.system.valueobject.OrderId; import org.springframework.stereotype.Component; import java.util.UUID; diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCancelledMessagePublisher.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCancelledMessagePublisher.java index 6fb5925..9fb7072 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCancelledMessagePublisher.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCancelledMessagePublisher.java @@ -1,7 +1,7 @@ package com.food.order.system.payment.application.service.ports.output.message.publisher; import com.food.order.system.payment.service.domain.event.PaymentCancelledEvent; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; +import com.food.order.system.event.publisher.DomainEventPublisher; public interface PaymentCancelledMessagePublisher extends DomainEventPublisher { } diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCompletedMessagePublisher.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCompletedMessagePublisher.java index a50ede5..6015feb 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCompletedMessagePublisher.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCompletedMessagePublisher.java @@ -1,7 +1,7 @@ package com.food.order.system.payment.application.service.ports.output.message.publisher; import com.food.order.system.payment.service.domain.event.PaymentCompletedEvent; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; +import com.food.order.system.event.publisher.DomainEventPublisher; public interface PaymentCompletedMessagePublisher extends DomainEventPublisher { } diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentFailedMessagePublisher.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentFailedMessagePublisher.java index 5cf76ff..cd8807b 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentFailedMessagePublisher.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentFailedMessagePublisher.java @@ -1,7 +1,7 @@ package com.food.order.system.payment.application.service.ports.output.message.publisher; import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; +import com.food.order.system.event.publisher.DomainEventPublisher; public interface PaymentFailedMessagePublisher extends DomainEventPublisher { } diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/CreditEntryRepository.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/CreditEntryRepository.java index 87d2100..dcc04af 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/CreditEntryRepository.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/CreditEntryRepository.java @@ -1,7 +1,7 @@ package com.food.order.system.payment.application.service.ports.output.repository; import com.food.order.system.payment.service.domain.entity.CreditEntry; -import com.food.order.sysyem.valueobject.CustomerId; +import com.food.order.system.valueobject.CustomerId; import java.util.Optional; diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/CreditHistoryRepository.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/CreditHistoryRepository.java index 443ed81..62d21bc 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/CreditHistoryRepository.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/CreditHistoryRepository.java @@ -1,7 +1,7 @@ package com.food.order.system.payment.application.service.ports.output.repository; import com.food.order.system.payment.service.domain.entity.CreditHistory; -import com.food.order.sysyem.valueobject.CustomerId; +import com.food.order.system.valueobject.CustomerId; import java.util.List; import java.util.Optional; diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainService.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainService.java index 1c050a9..223d2dd 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainService.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainService.java @@ -7,7 +7,7 @@ import com.food.order.system.payment.service.domain.event.PaymentCancelledEvent; import com.food.order.system.payment.service.domain.event.PaymentCompletedEvent; import com.food.order.system.payment.service.domain.event.PaymentEvent; import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; +import com.food.order.system.event.publisher.DomainEventPublisher; import java.util.List; 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 f3bb89e..2078010 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 @@ -9,9 +9,9 @@ import com.food.order.system.payment.service.domain.event.PaymentEvent; import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; import com.food.order.system.payment.service.domain.valueobject.CreditHistoryId; import com.food.order.system.payment.service.domain.valueobject.TransactionType; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; -import com.food.order.sysyem.valueobject.Money; -import com.food.order.sysyem.valueobject.PaymentStatus; +import com.food.order.system.event.publisher.DomainEventPublisher; +import com.food.order.system.valueobject.Money; +import com.food.order.system.valueobject.PaymentStatus; import lombok.extern.slf4j.Slf4j; import java.time.ZoneId; @@ -19,7 +19,7 @@ import java.time.ZonedDateTime; import java.util.List; import java.util.UUID; -import static com.food.order.sysyem.DomainConstants.UTC; +import static com.food.order.system.DomainConstants.UTC; @Slf4j public class PaymentDomainServiceImpl implements PaymentDomainService { diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/CreditEntry.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/CreditEntry.java index 2e03161..6c6339c 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/CreditEntry.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/CreditEntry.java @@ -1,9 +1,9 @@ package com.food.order.system.payment.service.domain.entity; import com.food.order.system.payment.service.domain.valueobject.CreditEntryId; -import com.food.order.sysyem.entity.BaseEntity; -import com.food.order.sysyem.valueobject.CustomerId; -import com.food.order.sysyem.valueobject.Money; +import com.food.order.system.entity.BaseEntity; +import com.food.order.system.valueobject.CustomerId; +import com.food.order.system.valueobject.Money; public class CreditEntry extends BaseEntity { diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/CreditHistory.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/CreditHistory.java index 9c1f1d0..3f4ed86 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/CreditHistory.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/CreditHistory.java @@ -2,9 +2,9 @@ package com.food.order.system.payment.service.domain.entity; import com.food.order.system.payment.service.domain.valueobject.CreditHistoryId; import com.food.order.system.payment.service.domain.valueobject.TransactionType; -import com.food.order.sysyem.entity.BaseEntity; -import com.food.order.sysyem.valueobject.CustomerId; -import com.food.order.sysyem.valueobject.Money; +import com.food.order.system.entity.BaseEntity; +import com.food.order.system.valueobject.CustomerId; +import com.food.order.system.valueobject.Money; public class CreditHistory extends BaseEntity { diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/Payment.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/Payment.java index 7577f02..7209304 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/Payment.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/Payment.java @@ -1,11 +1,11 @@ package com.food.order.system.payment.service.domain.entity; import com.food.order.system.payment.service.domain.valueobject.PaymentId; -import com.food.order.sysyem.entity.AggregateRoot; -import com.food.order.sysyem.valueobject.CustomerId; -import com.food.order.sysyem.valueobject.Money; -import com.food.order.sysyem.valueobject.OrderId; -import com.food.order.sysyem.valueobject.PaymentStatus; +import com.food.order.system.entity.AggregateRoot; +import com.food.order.system.valueobject.CustomerId; +import com.food.order.system.valueobject.Money; +import com.food.order.system.valueobject.OrderId; +import com.food.order.system.valueobject.PaymentStatus; import java.time.ZoneId; import java.time.ZonedDateTime; diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCancelledEvent.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCancelledEvent.java index 835d5fa..73bce8a 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCancelledEvent.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCancelledEvent.java @@ -1,7 +1,7 @@ package com.food.order.system.payment.service.domain.event; import com.food.order.system.payment.service.domain.entity.Payment; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; +import com.food.order.system.event.publisher.DomainEventPublisher; import java.time.ZonedDateTime; import java.util.Collections; diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCompletedEvent.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCompletedEvent.java index 399b34d..a60e9cd 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCompletedEvent.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCompletedEvent.java @@ -1,7 +1,7 @@ package com.food.order.system.payment.service.domain.event; import com.food.order.system.payment.service.domain.entity.Payment; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; +import com.food.order.system.event.publisher.DomainEventPublisher; import java.time.ZonedDateTime; import java.util.Collections; diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentEvent.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentEvent.java index ce361d2..49d76c6 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentEvent.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentEvent.java @@ -1,7 +1,7 @@ package com.food.order.system.payment.service.domain.event; import com.food.order.system.payment.service.domain.entity.Payment; -import com.food.order.sysyem.event.DomainEvent; +import com.food.order.system.event.DomainEvent; import java.time.ZonedDateTime; import java.util.List; diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentFailedEvent.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentFailedEvent.java index 6838c43..d609892 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentFailedEvent.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentFailedEvent.java @@ -1,7 +1,7 @@ package com.food.order.system.payment.service.domain.event; import com.food.order.system.payment.service.domain.entity.Payment; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; +import com.food.order.system.event.publisher.DomainEventPublisher; import java.time.ZonedDateTime; import java.util.List; diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/exception/PayemntDomainException.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/exception/PayemntDomainException.java index eaa11ba..7655eda 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/exception/PayemntDomainException.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/exception/PayemntDomainException.java @@ -1,6 +1,6 @@ package com.food.order.system.payment.service.domain.exception; -import com.food.order.sysyem.exception.DomainException; +import com.food.order.system.exception.DomainException; public class PayemntDomainException extends DomainException { public PayemntDomainException(String message) { diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/exception/PaymentNotFoundException.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/exception/PaymentNotFoundException.java index 8f52ba1..8d9d81d 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/exception/PaymentNotFoundException.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/exception/PaymentNotFoundException.java @@ -1,6 +1,6 @@ package com.food.order.system.payment.service.domain.exception; -import com.food.order.sysyem.exception.DomainException; +import com.food.order.system.exception.DomainException; public class PaymentNotFoundException extends DomainException { public PaymentNotFoundException(String message) { diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/CreditEntryId.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/CreditEntryId.java index 043d8ac..9b40949 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/CreditEntryId.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/CreditEntryId.java @@ -1,6 +1,6 @@ package com.food.order.system.payment.service.domain.valueobject; -import com.food.order.sysyem.valueobject.BaseId; +import com.food.order.system.valueobject.BaseId; import java.util.UUID; diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/CreditHistoryId.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/CreditHistoryId.java index b37a105..78c56c2 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/CreditHistoryId.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/CreditHistoryId.java @@ -1,6 +1,6 @@ package com.food.order.system.payment.service.domain.valueobject; -import com.food.order.sysyem.valueobject.BaseId; +import com.food.order.system.valueobject.BaseId; import java.util.UUID; diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/PaymentId.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/PaymentId.java index 3dc8d61..2d67922 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/PaymentId.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/PaymentId.java @@ -1,6 +1,6 @@ package com.food.order.system.payment.service.domain.valueobject; -import com.food.order.sysyem.valueobject.BaseId; +import com.food.order.system.valueobject.BaseId; import java.util.UUID; diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/listener/kafka/PaymentRequestKafkaListener.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/listener/kafka/PaymentRequestKafkaListener.java index 0a66271..00787cf 100644 --- a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/listener/kafka/PaymentRequestKafkaListener.java +++ b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/listener/kafka/PaymentRequestKafkaListener.java @@ -4,7 +4,7 @@ import com.food.order.system.kafka.consumer.KafkaConsumer; import com.food.order.system.kafka.order.avro.model.PaymentRequestAvroModel; import com.food.order.system.payment.application.service.ports.input.message.listener.PaymentRequestMessageListener; import com.food.order.system.payment.messaging.mapper.PaymentMessagingDataMapper; -import com.food.order.sysyem.valueobject.PaymentOrderStatus; +import com.food.order.system.valueobject.PaymentOrderStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.kafka.annotation.KafkaListener; diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/mapper/PaymentMessagingDataMapper.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/mapper/PaymentMessagingDataMapper.java index 5569f56..83aee89 100644 --- a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/mapper/PaymentMessagingDataMapper.java +++ b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/mapper/PaymentMessagingDataMapper.java @@ -7,7 +7,7 @@ import com.food.order.system.payment.application.service.dto.PaymentRequest; import com.food.order.system.payment.service.domain.event.PaymentCancelledEvent; import com.food.order.system.payment.service.domain.event.PaymentCompletedEvent; import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; -import com.food.order.sysyem.valueobject.PaymentOrderStatus; +import com.food.order.system.valueobject.PaymentOrderStatus; import org.springframework.stereotype.Component; import java.util.UUID; diff --git a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/entity/OrderApprovalEntity.java b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/entity/OrderApprovalEntity.java index faf4ea5..f43cef3 100644 --- a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/entity/OrderApprovalEntity.java +++ b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/entity/OrderApprovalEntity.java @@ -1,6 +1,6 @@ package com.food.order.system.data.access.restaurant.entity; -import com.food.order.sysyem.valueobject.OrderApprovalStatus; +import com.food.order.system.valueobject.OrderApprovalStatus; import lombok.*; import javax.persistence.*; 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 740cb64..e65f1c3 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 @@ -8,10 +8,10 @@ import com.food.order.system.restaurant.domain.core.entity.OrderDetail; import com.food.order.system.restaurant.domain.core.entity.Product; import com.food.order.system.restaurant.domain.core.entity.Restaurant; import com.food.order.system.restaurant.domain.core.valueobject.OrderApprovalId; -import com.food.order.sysyem.valueobject.Money; -import com.food.order.sysyem.valueobject.OrderId; -import com.food.order.sysyem.valueobject.ProductId; -import com.food.order.sysyem.valueobject.RestaurantId; +import com.food.order.system.valueobject.Money; +import com.food.order.system.valueobject.OrderId; +import com.food.order.system.valueobject.ProductId; +import com.food.order.system.valueobject.RestaurantId; import org.springframework.stereotype.Component; import java.util.List; 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 index af7d3cf..3dc7de2 100644 --- 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 @@ -10,7 +10,7 @@ import com.food.order.system.restaurant.domain.service.ports.output.message.publ 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 com.food.order.system.valueobject.OrderId; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 index 4cdbb50..5820644 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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,7 +1,7 @@ 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; +import com.food.order.system.valueobject.RestaurantOrderStatus; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 index 72a116b..8b3d2a2 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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,6 +1,6 @@ package com.food.order.system.restaurant.domain.service.exception; -import com.food.order.sysyem.exception.DomainException; +import com.food.order.system.exception.DomainException; public class RestaurantApplicationServiceException extends DomainException { diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 index ff918a7..9caa32f 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 @@ -3,10 +3,10 @@ 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; import com.food.order.system.restaurant.domain.core.entity.Restaurant; -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.order.system.valueobject.Money; +import com.food.order.system.valueobject.OrderId; +import com.food.order.system.valueobject.OrderStatus; +import com.food.order.system.valueobject.RestaurantId; import com.food.order.system.restaurant.domain.service.dto.RestaurantApprovalRequest; import org.springframework.stereotype.Component; diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 index f113fdc..004b435 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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,7 +1,7 @@ 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; +import com.food.order.system.event.publisher.DomainEventPublisher; public interface OrderApprovedMessagePublisher extends DomainEventPublisher { } diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 index b5b47cf..d6bbbfc 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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,7 +1,7 @@ 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; +import com.food.order.system.event.publisher.DomainEventPublisher; public interface OrderRejectedMessagePublisher extends DomainEventPublisher { } diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainService.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainService.java index 7ec250f..fbde8f2 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainService.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainService.java @@ -4,7 +4,7 @@ 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.event.OrderApprovedEvent; import com.food.order.system.restaurant.domain.core.event.OrderRejectedEvent; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; +import com.food.order.system.event.publisher.DomainEventPublisher; import java.util.List; diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainServiceImpl.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainServiceImpl.java index 8559162..9943f81 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainServiceImpl.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainServiceImpl.java @@ -4,15 +4,15 @@ 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.event.OrderApprovedEvent; import com.food.order.system.restaurant.domain.core.event.OrderRejectedEvent; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; -import com.food.order.sysyem.valueobject.OrderApprovalStatus; +import com.food.order.system.event.publisher.DomainEventPublisher; +import com.food.order.system.valueobject.OrderApprovalStatus; import lombok.extern.slf4j.Slf4j; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.List; -import static com.food.order.sysyem.DomainConstants.UTC; +import static com.food.order.system.DomainConstants.UTC; @Slf4j public class RestaurantDomainServiceImpl implements RestaurantDomainService { diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/OrderApproval.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/OrderApproval.java index 79416d9..716c958 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/OrderApproval.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/OrderApproval.java @@ -1,10 +1,10 @@ package com.food.order.system.restaurant.domain.core.entity; import com.food.order.system.restaurant.domain.core.valueobject.OrderApprovalId; -import com.food.order.sysyem.entity.BaseEntity; -import com.food.order.sysyem.valueobject.OrderApprovalStatus; -import com.food.order.sysyem.valueobject.OrderId; -import com.food.order.sysyem.valueobject.RestaurantId; +import com.food.order.system.entity.BaseEntity; +import com.food.order.system.valueobject.OrderApprovalStatus; +import com.food.order.system.valueobject.OrderId; +import com.food.order.system.valueobject.RestaurantId; public class OrderApproval extends BaseEntity { diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/OrderDetail.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/OrderDetail.java index a8831e4..7ed70c0 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/OrderDetail.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/OrderDetail.java @@ -1,9 +1,9 @@ package com.food.order.system.restaurant.domain.core.entity; -import com.food.order.sysyem.entity.BaseEntity; -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.system.entity.BaseEntity; +import com.food.order.system.valueobject.Money; +import com.food.order.system.valueobject.OrderId; +import com.food.order.system.valueobject.OrderStatus; import java.util.List; diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/Product.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/Product.java index c997d06..0be6d44 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/Product.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/Product.java @@ -1,8 +1,8 @@ package com.food.order.system.restaurant.domain.core.entity; -import com.food.order.sysyem.entity.BaseEntity; -import com.food.order.sysyem.valueobject.Money; -import com.food.order.sysyem.valueobject.ProductId; +import com.food.order.system.entity.BaseEntity; +import com.food.order.system.valueobject.Money; +import com.food.order.system.valueobject.ProductId; public class Product extends BaseEntity { diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/Restaurant.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/Restaurant.java index 050bf9d..8617720 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/Restaurant.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/Restaurant.java @@ -1,11 +1,11 @@ package com.food.order.system.restaurant.domain.core.entity; import com.food.order.system.restaurant.domain.core.valueobject.OrderApprovalId; -import com.food.order.sysyem.entity.AggregateRoot; -import com.food.order.sysyem.valueobject.Money; -import com.food.order.sysyem.valueobject.OrderApprovalStatus; -import com.food.order.sysyem.valueobject.OrderStatus; -import com.food.order.sysyem.valueobject.RestaurantId; +import com.food.order.system.entity.AggregateRoot; +import com.food.order.system.valueobject.Money; +import com.food.order.system.valueobject.OrderApprovalStatus; +import com.food.order.system.valueobject.OrderStatus; +import com.food.order.system.valueobject.RestaurantId; import java.util.List; import java.util.UUID; diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovalEvent.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovalEvent.java index 064e683..f763bc9 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovalEvent.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovalEvent.java @@ -1,8 +1,8 @@ package com.food.order.system.restaurant.domain.core.event; import com.food.order.system.restaurant.domain.core.entity.OrderApproval; -import com.food.order.sysyem.event.DomainEvent; -import com.food.order.sysyem.valueobject.RestaurantId; +import com.food.order.system.event.DomainEvent; +import com.food.order.system.valueobject.RestaurantId; import java.time.ZonedDateTime; import java.util.List; diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovedEvent.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovedEvent.java index 02baddc..347db3a 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovedEvent.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovedEvent.java @@ -1,8 +1,8 @@ package com.food.order.system.restaurant.domain.core.event; import com.food.order.system.restaurant.domain.core.entity.OrderApproval; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; -import com.food.order.sysyem.valueobject.RestaurantId; +import com.food.order.system.event.publisher.DomainEventPublisher; +import com.food.order.system.valueobject.RestaurantId; import java.time.ZonedDateTime; import java.util.List; diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderRejectedEvent.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderRejectedEvent.java index db850e5..faf3114 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderRejectedEvent.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderRejectedEvent.java @@ -1,8 +1,8 @@ package com.food.order.system.restaurant.domain.core.event; import com.food.order.system.restaurant.domain.core.entity.OrderApproval; -import com.food.order.sysyem.event.publisher.DomainEventPublisher; -import com.food.order.sysyem.valueobject.RestaurantId; +import com.food.order.system.event.publisher.DomainEventPublisher; +import com.food.order.system.valueobject.RestaurantId; import java.time.ZonedDateTime; import java.util.List; diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/exception/RestaurantDomainException.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/exception/RestaurantDomainException.java index c4d8ea3..328b3b6 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/exception/RestaurantDomainException.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/exception/RestaurantDomainException.java @@ -1,6 +1,6 @@ package com.food.order.system.restaurant.domain.core.exception; -import com.food.order.sysyem.exception.DomainException; +import com.food.order.system.exception.DomainException; public class RestaurantDomainException extends DomainException { public RestaurantDomainException(String message) { diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/exception/RestaurantNotFoundException.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/exception/RestaurantNotFoundException.java index 39edb1e..7c315c1 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/exception/RestaurantNotFoundException.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/exception/RestaurantNotFoundException.java @@ -1,6 +1,6 @@ package com.food.order.system.restaurant.domain.core.exception; -import com.food.order.sysyem.exception.DomainException; +import com.food.order.system.exception.DomainException; public class RestaurantNotFoundException extends DomainException { public RestaurantNotFoundException(String message) { diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/valueobject/OrderApprovalId.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/valueobject/OrderApprovalId.java index 08a77d1..c576eb8 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/valueobject/OrderApprovalId.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/valueobject/OrderApprovalId.java @@ -1,6 +1,6 @@ package com.food.order.system.restaurant.domain.core.valueobject; -import com.food.order.sysyem.valueobject.BaseId; +import com.food.order.system.valueobject.BaseId; import java.util.UUID; 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 226cb5c..ba99e1e 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 @@ -7,8 +7,8 @@ import com.food.order.system.kafka.order.avro.model.RestaurantApprovalResponseAv import com.food.order.system.restaurant.domain.core.entity.Product; 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.order.system.valueobject.ProductId; +import com.food.order.system.valueobject.RestaurantOrderStatus; import com.food.order.system.restaurant.domain.service.dto.RestaurantApprovalRequest; import org.springframework.stereotype.Component; From 68e7f14dca2229ace98a868812416d467cd92435 Mon Sep 17 00:00:00 2001 From: Ali CANLI Date: Sat, 16 Jul 2022 20:40:52 +0300 Subject: [PATCH 2/4] Outbox Message and Scheduler class implemented part - 4. --- order-service/order-container/pom.xml | 5 + .../order/system/OrderPaymentSagaTest.java | 121 ++++++++++ .../sql/OrderPaymentSagaTestCleanUp.sql | 3 + .../sql/OrderPaymentSagaTestSetUp.sql | 15 ++ .../order/adapter/OrderRepositoryImpl.java | 8 +- .../order/system/helper/OrderSagaHelper.java | 5 +- .../output/repository/OrderRepository.java | 3 +- .../order/system/saga/OrderApprovalSaga.java | 151 ++++++------- .../order/system/saga/OrderPaymentSaga.java | 209 ++++++++++-------- .../system/OrderApplicationServiceTest.java | 6 +- .../src/main/resources/application.yml | 2 + .../src/main/resources/init-schema.sql | 29 ++- .../payment-application-service/pom.xml | 19 ++ .../service/PaymentRequestHelper.java | 78 +++++-- .../PaymentRequestMessageListenerImpl.java | 12 +- .../exception/PaymentDomainException.java | 14 ++ .../service/mapper/PaymentDataMapper.java | 15 ++ .../outbox/model/OrderEventPayload.java | 38 ++++ .../outbox/model/OrderOutboxMessage.java | 38 ++++ .../OrderOutboxCleanerScheduler.java | 36 +++ .../outbox/scheduler/OrderOutboxHelper.java | 96 ++++++++ .../scheduler/OrderOutboxScheduler.java | 44 ++++ .../PaymentCancelledMessagePublisher.java | 7 - .../PaymentCompletedMessagePublisher.java | 7 - .../PaymentFailedMessagePublisher.java | 7 - .../PaymentResponseMessagePublisher.java | 11 + .../repository/OrderOutboxRepository.java | 26 +++ .../service/domain/PaymentDomainService.java | 12 +- .../domain/PaymentDomainServiceImpl.java | 16 +- .../domain/event/PaymentCancelledEvent.java | 10 +- .../domain/event/PaymentCompletedEvent.java | 10 +- .../domain/event/PaymentFailedEvent.java | 10 +- ...PaymentCancelledKafkaMessagePublisher.java | 4 +- ...PaymentCompletedKafkaMessagePublisher.java | 4 +- .../PaymentFailedKafkaMessagePublisher.java | 4 +- pom.xml | 2 +- 36 files changed, 786 insertions(+), 291 deletions(-) create mode 100644 order-service/order-container/src/test/java/com/food/order/system/OrderPaymentSagaTest.java create mode 100644 order-service/order-container/src/test/resources/sql/OrderPaymentSagaTestCleanUp.sql create mode 100644 order-service/order-container/src/test/resources/sql/OrderPaymentSagaTestSetUp.sql create mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/exception/PaymentDomainException.java create mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/model/OrderEventPayload.java create mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/model/OrderOutboxMessage.java create mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxCleanerScheduler.java create mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxHelper.java create mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxScheduler.java delete mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCancelledMessagePublisher.java delete mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCompletedMessagePublisher.java delete mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentFailedMessagePublisher.java create mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentResponseMessagePublisher.java create mode 100644 payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/OrderOutboxRepository.java diff --git a/order-service/order-container/pom.xml b/order-service/order-container/pom.xml index c59331a..0e780b2 100644 --- a/order-service/order-container/pom.xml +++ b/order-service/order-container/pom.xml @@ -36,6 +36,11 @@ order-messaging + + org.springframework.boot + spring-boot-starter-test + + org.springframework.boot spring-boot-starter diff --git a/order-service/order-container/src/test/java/com/food/order/system/OrderPaymentSagaTest.java b/order-service/order-container/src/test/java/com/food/order/system/OrderPaymentSagaTest.java new file mode 100644 index 0000000..46ba834 --- /dev/null +++ b/order-service/order-container/src/test/java/com/food/order/system/OrderPaymentSagaTest.java @@ -0,0 +1,121 @@ +package com.food.order.system; + + +import com.food.order.system.data.access.outbox.payment.entity.PaymentOutboxEntity; +import com.food.order.system.data.access.outbox.payment.repository.PaymentOutboxJpaRepository; +import com.food.order.system.dto.message.PaymentResponse; +import com.food.order.system.saga.OrderPaymentSaga; +import com.food.order.system.saga.SagaStatus; +import com.food.order.system.valueobject.PaymentStatus; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.OptimisticLockingFailureException; +import org.springframework.test.context.jdbc.Sql; + +import java.math.BigDecimal; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.CountDownLatch; + +import static com.food.order.system.outbox.order.SagaConst.ORDER_PROCESSING_SAGA; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_METHOD; + +@Slf4j +@SpringBootTest(classes = OrderServiceApplication.class) +@Sql(value = {"classpath:sql/OrderPaymentSagaTestSetUp.sql"}) +@Sql(value = {"classpath:sql/OrderPaymentSagaTestCleanUp.sql"}, executionPhase = AFTER_TEST_METHOD) +class OrderPaymentSagaTest { + + @Autowired + private OrderPaymentSaga orderPaymentSaga; + + @Autowired + private PaymentOutboxJpaRepository paymentOutboxJpaRepository; + + private final UUID SAGA_ID = UUID.fromString("15a497c1-0f4b-4eff-b9f4-c402c8c07afa"); + private final UUID ORDER_ID = UUID.fromString("d215b5f8-0249-4dc5-89a3-51fd148cfb17"); + private final UUID CUSTOMER_ID = UUID.fromString("d215b5f8-0249-4dc5-89a3-51fd148cfb41"); + private final UUID PAYMENT_ID = UUID.randomUUID(); + private final BigDecimal PRICE = new BigDecimal("100"); + + @Test + void testDoublePayment() { + orderPaymentSaga.process(getPaymentResponse()); + orderPaymentSaga.process(getPaymentResponse()); + } + + @Test + void testDoublePaymentWithThreads() throws InterruptedException { + Thread thread1 = new Thread(() -> orderPaymentSaga.process(getPaymentResponse())); + Thread thread2 = new Thread(() -> orderPaymentSaga.process(getPaymentResponse())); + + thread1.start(); + thread2.start(); + + thread1.join(); + thread2.join(); + + assertPaymentOutbox(); + } + + @Test + void testDoublePaymentWithLatch() throws InterruptedException { + CountDownLatch latch = new CountDownLatch(2); + + Thread thread1 = new Thread(() -> { + try { + orderPaymentSaga.process(getPaymentResponse()); + } catch (OptimisticLockingFailureException e) { + log.error("OptimisticLockingFailureException occurred for thread1"); + } finally { + latch.countDown(); + } + }); + + Thread thread2 = new Thread(() -> { + try { + orderPaymentSaga.process(getPaymentResponse()); + } catch (OptimisticLockingFailureException e) { + log.error("OptimisticLockingFailureException occurred for thread2"); + } finally { + latch.countDown(); + } + }); + + thread1.start(); + thread2.start(); + + latch.await(); + + assertPaymentOutbox(); + + } + + private void assertPaymentOutbox() { + Optional paymentOutboxEntity = + paymentOutboxJpaRepository.findByTypeAndSagaIdAndSagaStatusIn(ORDER_PROCESSING_SAGA, SAGA_ID, + List.of(SagaStatus.PROCESSING)); + assertTrue(paymentOutboxEntity.isPresent()); + } + + private PaymentResponse getPaymentResponse() { + return PaymentResponse.builder() + .id(UUID.randomUUID().toString()) + .sagaId(SAGA_ID.toString()) + .paymentStatus(PaymentStatus.COMPLETED) + .paymentId(PAYMENT_ID.toString()) + .orderId(ORDER_ID.toString()) + .customerId(CUSTOMER_ID.toString()) + .price(PRICE) + .createdAt(Instant.now()) + .failureMessages(new ArrayList<>()) + .build(); + } + +} \ No newline at end of file diff --git a/order-service/order-container/src/test/resources/sql/OrderPaymentSagaTestCleanUp.sql b/order-service/order-container/src/test/resources/sql/OrderPaymentSagaTestCleanUp.sql new file mode 100644 index 0000000..33a8265 --- /dev/null +++ b/order-service/order-container/src/test/resources/sql/OrderPaymentSagaTestCleanUp.sql @@ -0,0 +1,3 @@ +delete from "order".orders where id = 'd215b5f8-0249-4dc5-89a3-51fd148cfb17'; + +delete from "order".payment_outbox where id = '8904808e-286f-449b-9b56-b63ba8351cf2'; \ No newline at end of file diff --git a/order-service/order-container/src/test/resources/sql/OrderPaymentSagaTestSetUp.sql b/order-service/order-container/src/test/resources/sql/OrderPaymentSagaTestSetUp.sql new file mode 100644 index 0000000..741b3fe --- /dev/null +++ b/order-service/order-container/src/test/resources/sql/OrderPaymentSagaTestSetUp.sql @@ -0,0 +1,15 @@ +insert into "order".orders(id, customer_id, restaurant_id, tracking_id, price, order_status, failure_messages) +values('d215b5f8-0249-4dc5-89a3-51fd148cfb17', 'd215b5f8-0249-4dc5-89a3-51fd148cfb41', 'd215b5f8-0249-4dc5-89a3-51fd148cfb45', + 'd215b5f8-0249-4dc5-89a3-51fd148cfb18', 100.00, 'PENDING', ''); + +insert into "order".order_items(id, order_id, product_id, price, quantity, sub_total) +values(1, 'd215b5f8-0249-4dc5-89a3-51fd148cfb17', 'd215b5f8-0249-4dc5-89a3-51fd148cfb47', 100.00, 1, 100.00); + +insert into "order".order_address(id, order_id, street, postal_code, city) +values('d215b5f8-0249-4dc5-89a3-51fd148cfb15', 'd215b5f8-0249-4dc5-89a3-51fd148cfb17', 'test street', '1000AA', 'test city'); + +insert into "order".payment_outbox(id, saga_id, created_at, type, payload, outbox_status, saga_status, order_status, version) +values ('8904808e-286f-449b-9b56-b63ba8351cf2', '15a497c1-0f4b-4eff-b9f4-c402c8c07afa', current_timestamp, 'OrderProcessingSaga', + '{"price": 100, "orderId": "ef471dac-ec22-43a7-a3f4-9d04195567a5", "createdAt": "2022-01-07T16:21:42.917756+01:00", + "customerId": "d215b5f8-0249-4dc5-89a3-51fd148cfb41", "paymentOrderStatus": "PENDING"}', +'STARTED', 'STARTED', 'PENDING', 0); \ No newline at end of file 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 4b72291..2a97bd3 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 @@ -1,16 +1,16 @@ package com.food.order.system.data.access.order.adapter; -import com.food.order.system.ports.output.repository.OrderRepository; import com.food.order.system.data.access.order.mapper.OrderDataAccessMapper; import com.food.order.system.data.access.order.repository.OrderJpaRepository; import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.valueobject.TrackingId; +import com.food.order.system.ports.output.repository.OrderRepository; +import com.food.order.system.valueobject.OrderId; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Optional; -import java.util.UUID; @Service @RequiredArgsConstructor @@ -28,8 +28,8 @@ public class OrderRepositoryImpl implements OrderRepository { } @Override - public Optional findById(String orderId) { - return orderJpaRepository.findById(UUID.fromString(orderId)) + public Optional findById(OrderId orderId) { + return orderJpaRepository.findById(orderId.getValue()) .map(orderDataAccessMapper::orderEntityToOrder); } diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/helper/OrderSagaHelper.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/helper/OrderSagaHelper.java index e7ba97e..e619ddb 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/helper/OrderSagaHelper.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/helper/OrderSagaHelper.java @@ -4,11 +4,14 @@ import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.exception.OrderNotFoundException; import com.food.order.system.ports.output.repository.OrderRepository; import com.food.order.system.saga.SagaStatus; +import com.food.order.system.valueobject.OrderId; import com.food.order.system.valueobject.OrderStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.UUID; + @Slf4j @Component @RequiredArgsConstructor @@ -17,7 +20,7 @@ public class OrderSagaHelper { private final OrderRepository orderRepository; public Order findOrder(String orderId) { - return orderRepository.findById(orderId) + return orderRepository.findById(new OrderId(UUID.fromString(orderId))) .orElseThrow(() -> new OrderNotFoundException("Order not found -> Order id :" + orderId)); } diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/OrderRepository.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/OrderRepository.java index 6319317..426550a 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/OrderRepository.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/ports/output/repository/OrderRepository.java @@ -2,6 +2,7 @@ package com.food.order.system.ports.output.repository; import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.valueobject.TrackingId; +import com.food.order.system.valueobject.OrderId; import java.util.Optional; @@ -9,7 +10,7 @@ public interface OrderRepository { Order save(Order order); - Optional findById(String trackingId); + Optional findById(OrderId trackingId); Optional findByTrackingId(TrackingId trackingId); diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderApprovalSaga.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderApprovalSaga.java index f82ee27..47a1421 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderApprovalSaga.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderApprovalSaga.java @@ -4,13 +4,14 @@ import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.event.OrderCancelledEvent; import com.food.order.system.domain.exception.OrderDomainException; import com.food.order.system.domain.service.OrderDomainService; +import com.food.order.system.dto.message.RestaurantApprovalResponse; import com.food.order.system.helper.OrderSagaHelper; import com.food.order.system.mapper.OrderDataMapper; import com.food.order.system.outbox.OutboxStatus; import com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage; +import com.food.order.system.outbox.model.payment.OrderPaymentOutboxMessage; import com.food.order.system.outbox.scheduler.approval.ApprovalOutboxHelper; import com.food.order.system.outbox.scheduler.payment.PaymentOutboxHelper; -import com.food.order.system.dto.message.RestaurantApprovalResponse; import com.food.order.system.valueobject.OrderStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -19,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.Optional; import java.util.UUID; import static com.food.order.system.DomainConstants.UTC; @@ -35,107 +37,96 @@ public class OrderApprovalSaga implements SagaStep { private final ApprovalOutboxHelper approvalOutboxHelper; - @Override @Transactional - public void process(RestaurantApprovalResponse data) { - - var messageResponse = + public void process(RestaurantApprovalResponse restaurantApprovalResponse) { + var orderApprovalOutboxMessageResponse = approvalOutboxHelper.getApprovalOutboxMessageBySagaIdAndSagaStatus( - UUID.fromString(data.getSagaId()), - SagaStatus.PROCESSING) - .orElseThrow(() -> { - log.error("Approval outbox message not found for saga id: {}", data.getSagaId()); - return new OrderDomainException("Approval outbox message not found for saga id: " + data.getSagaId()); - }); + UUID.fromString(restaurantApprovalResponse.getSagaId()), + SagaStatus.PROCESSING).orElseThrow( + () -> new OrderDomainException("OrderApprovalSaga: Order approval outbox message not found")); - var order = approveOrder(data); + var order = approveOrder(restaurantApprovalResponse); var sagaStatus = orderSagaHelper.orderStatusToSagaStatus(order.getStatus()); - approvalOutboxHelper.save(getUpdatedApprovalOutboxMessage(messageResponse,order.getStatus(), sagaStatus)); - - approvalOutboxHelper.save(getUpdatedPaymentOutboxMessage(messageResponse.getSagaId(), + approvalOutboxHelper.save(getUpdatedApprovalOutboxMessage(orderApprovalOutboxMessageResponse, order.getStatus(), sagaStatus)); + paymentOutboxHelper.save(getUpdatedPaymentOutboxMessage(restaurantApprovalResponse.getSagaId(), + order.getStatus(), sagaStatus)); - - log.info("Order approved: {}", order); + log.info("Order with id: {} is approved", order.getId().getValue()); } - private OrderApprovalOutboxMessage getUpdatedPaymentOutboxMessage(UUID sagaId, - OrderStatus status, - SagaStatus sagaStatus) { - var message = approvalOutboxHelper.getApprovalOutboxMessageBySagaIdAndSagaStatus( - sagaId, - SagaStatus.PROCESSING) - .orElseThrow(() -> { - log.error("Approval outbox message not found for saga id: {}", sagaId); - return new OrderDomainException("Approval outbox message not found for saga id: " + sagaId); - }); + @Override + @Transactional + public void rollback(RestaurantApprovalResponse restaurantApprovalResponse) { + var orderApprovalOutboxMessageResponse = + approvalOutboxHelper.getApprovalOutboxMessageBySagaIdAndSagaStatus( + UUID.fromString(restaurantApprovalResponse.getSagaId()), + SagaStatus.PROCESSING).orElseThrow( + () -> new OrderDomainException("OrderApprovalSaga: Order approval outbox message not found")); - message.setProcessedAt(ZonedDateTime.now(ZoneId.of(UTC))); - message.setSagaStatus(sagaStatus); - message.setOrderStatus(status); - return message; + var domainEvent = rollbackOrder(restaurantApprovalResponse); + + var sagaStatus = orderSagaHelper.orderStatusToSagaStatus(domainEvent.getOrder().getStatus()); + + approvalOutboxHelper.save(getUpdatedApprovalOutboxMessage(orderApprovalOutboxMessageResponse, + domainEvent.getOrder().getStatus(), sagaStatus)); + + paymentOutboxHelper.savePaymentOutboxMessage(orderDataMapper + .orderCancelledEventToOrderPaymentEventPayload(domainEvent), + domainEvent.getOrder().getStatus(), + sagaStatus, + OutboxStatus.STARTED, + UUID.fromString(restaurantApprovalResponse.getSagaId())); + + log.info("Order with id: {} is cancelling", domainEvent.getOrder().getId().getValue()); } - private OrderApprovalOutboxMessage getUpdatedApprovalOutboxMessage(OrderApprovalOutboxMessage messageResponse, - OrderStatus status, - SagaStatus sagaStatus) { - messageResponse.setProcessedAt(ZonedDateTime.now(ZoneId.of(UTC))); - messageResponse.setSagaStatus(sagaStatus); - messageResponse.setOrderStatus(status); - return messageResponse; - } - - - private Order approveOrder(RestaurantApprovalResponse data) { - var order = orderSagaHelper.findOrder(data.getOrderId()); + private Order approveOrder(RestaurantApprovalResponse restaurantApprovalResponse) { + log.info("Approving order with id: {}", restaurantApprovalResponse.getOrderId()); + Order order = orderSagaHelper.findOrder(restaurantApprovalResponse.getOrderId()); orderDomainService.approve(order); orderSagaHelper.saveOrder(order); return order; } - - @Override - @Transactional - public void rollback(RestaurantApprovalResponse data) { - - var message = approvalOutboxHelper.getApprovalOutboxMessageBySagaIdAndSagaStatus( - UUID.fromString(data.getSagaId()), - SagaStatus.PROCESSING) - .orElseThrow( - () -> { - log.error("Approval outbox message not found for saga id: {}", data.getSagaId()); - return new OrderDomainException("Approval outbox message not found for saga id: " + - data.getSagaId()); - } - ); - - var event = rollbackOrder(data); - - var sagaStatus = orderSagaHelper.orderStatusToSagaStatus(event.getOrder().getStatus()); - - approvalOutboxHelper.save(getUpdatedApprovalOutboxMessage(message, event.getOrder().getStatus(), sagaStatus)); - - paymentOutboxHelper.savePaymentOutboxMessage( - orderDataMapper.orderCancelledEventToOrderPaymentEventPayload(event), - event.getOrder().getStatus(), - sagaStatus, - OutboxStatus.STARTED, - message.getSagaId() - ); - - log.info("Order cancelled event id: {}", event.getOrder().getId()); + private OrderApprovalOutboxMessage getUpdatedApprovalOutboxMessage(OrderApprovalOutboxMessage + orderApprovalOutboxMessage, + OrderStatus + orderStatus, + SagaStatus + sagaStatus) { + orderApprovalOutboxMessage.setProcessedAt(ZonedDateTime.now(ZoneId.of(UTC))); + orderApprovalOutboxMessage.setOrderStatus(orderStatus); + orderApprovalOutboxMessage.setSagaStatus(sagaStatus); + return orderApprovalOutboxMessage; } - private OrderCancelledEvent rollbackOrder(RestaurantApprovalResponse data) { - var order = orderSagaHelper.findOrder(data.getOrderId()); - var event = orderDomainService.cancelOrderPayment( - order, - data.getFailureMessages()); + private OrderPaymentOutboxMessage getUpdatedPaymentOutboxMessage(String sagaId, + OrderStatus orderStatus, + SagaStatus sagaStatus) { + Optional orderPaymentOutboxMessageResponse = paymentOutboxHelper + .getPaymentOutboxMessageBySagaIdAndSagaStatus(UUID.fromString(sagaId), SagaStatus.PROCESSING); + if (orderPaymentOutboxMessageResponse.isEmpty()) { + throw new OrderDomainException("Payment outbox message cannot be found in " + + SagaStatus.PROCESSING.name() + " state"); + } + OrderPaymentOutboxMessage orderPaymentOutboxMessage = orderPaymentOutboxMessageResponse.get(); + orderPaymentOutboxMessage.setProcessedAt(ZonedDateTime.now(ZoneId.of(UTC))); + orderPaymentOutboxMessage.setOrderStatus(orderStatus); + orderPaymentOutboxMessage.setSagaStatus(sagaStatus); + return orderPaymentOutboxMessage; + } + + private OrderCancelledEvent rollbackOrder(RestaurantApprovalResponse restaurantApprovalResponse) { + log.info("Cancelling order with id: {}", restaurantApprovalResponse.getOrderId()); + Order order = orderSagaHelper.findOrder(restaurantApprovalResponse.getOrderId()); + OrderCancelledEvent domainEvent = orderDomainService.cancelOrderPayment(order, + restaurantApprovalResponse.getFailureMessages()); orderSagaHelper.saveOrder(order); - return event; + return domainEvent; } } diff --git a/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderPaymentSaga.java b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderPaymentSaga.java index 5e47427..c5cd24b 100644 --- a/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderPaymentSaga.java +++ b/order-service/order-domain/order-application-service/src/main/java/com/food/order/system/saga/OrderPaymentSaga.java @@ -3,15 +3,18 @@ package com.food.order.system.saga; import com.food.order.system.domain.entity.Order; import com.food.order.system.domain.event.OrderPaidEvent; import com.food.order.system.domain.exception.OrderDomainException; +import com.food.order.system.domain.exception.OrderNotFoundException; import com.food.order.system.domain.service.OrderDomainService; import com.food.order.system.dto.message.PaymentResponse; +import com.food.order.system.helper.OrderSagaHelper; +import com.food.order.system.mapper.OrderDataMapper; import com.food.order.system.outbox.OutboxStatus; import com.food.order.system.outbox.model.approval.OrderApprovalOutboxMessage; import com.food.order.system.outbox.model.payment.OrderPaymentOutboxMessage; -import com.food.order.system.helper.OrderSagaHelper; -import com.food.order.system.mapper.OrderDataMapper; import com.food.order.system.outbox.scheduler.approval.ApprovalOutboxHelper; import com.food.order.system.outbox.scheduler.payment.PaymentOutboxHelper; +import com.food.order.system.ports.output.repository.OrderRepository; +import com.food.order.system.valueobject.OrderId; import com.food.order.system.valueobject.OrderStatus; import com.food.order.system.valueobject.PaymentStatus; import lombok.RequiredArgsConstructor; @@ -21,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.Optional; import java.util.UUID; import static com.food.order.system.DomainConstants.UTC; @@ -29,92 +33,125 @@ import static com.food.order.system.DomainConstants.UTC; @Component @RequiredArgsConstructor public class OrderPaymentSaga implements SagaStep { - private final OrderDomainService orderDomainService; + private final OrderRepository orderRepository; + private final PaymentOutboxHelper paymentOutboxHelper; + private final ApprovalOutboxHelper approvalOutboxHelper; private final OrderSagaHelper orderSagaHelper; private final OrderDataMapper orderDataMapper; - private final ApprovalOutboxHelper approvalOutboxHelper; - private final PaymentOutboxHelper paymentOutboxHelper; - @Override @Transactional - public void process(PaymentResponse data) { - - var messageResponse = + public void process(PaymentResponse paymentResponse) { + Optional orderPaymentOutboxMessageResponse = paymentOutboxHelper.getPaymentOutboxMessageBySagaIdAndSagaStatus( - UUID.fromString(data.getSagaId()), - SagaStatus.STARTED) - .orElseThrow(() -> { - log.error("Payment outbox message not found for saga id: {}", data.getSagaId()); - return new OrderDomainException("Payment outbox message not found for saga id: " + data.getSagaId()); - }); + UUID.fromString(paymentResponse.getSagaId()), + SagaStatus.STARTED); - - var paidEvent = completePaymentForOrder(data); - - var sagaStatus = orderSagaHelper.orderStatusToSagaStatus(paidEvent.getOrder().getStatus()); - - paymentOutboxHelper.save(getUpdatedPaymentOutboxMessage(messageResponse, - paidEvent.getOrder().getStatus(), - sagaStatus)); - - approvalOutboxHelper.saveApprovalOutboxMessage( - orderDataMapper.orderPaidEventToOrderApprovalEventPayload(paidEvent), - paidEvent.getOrder().getStatus(), - sagaStatus, - OutboxStatus.STARTED, - messageResponse.getSagaId() - ); - - log.info("Payment completed for order with id: {}", paidEvent.getOrder().getId().getValue()); - } - - private OrderPaymentOutboxMessage getUpdatedPaymentOutboxMessage(OrderPaymentOutboxMessage messageResponse, - OrderStatus status, - SagaStatus sagaStatus) { - messageResponse.setProcessedAt(ZonedDateTime.now(ZoneId.of(UTC))); - messageResponse.setOrderStatus(status); - messageResponse.setSagaStatus(sagaStatus); - return messageResponse; - } - - @Override - @Transactional - public void rollback(PaymentResponse data) { - - var messageResponse = - paymentOutboxHelper.getPaymentOutboxMessageBySagaIdAndSagaStatus( - UUID.fromString(data.getSagaId()), - getCurrentSagaStatus(data.getPaymentStatus())) - .orElseThrow( - () -> { - log.error("Payment outbox message not found for saga id: {}", data.getSagaId()); - return new OrderDomainException("Payment outbox message not found for saga id: " + data.getSagaId()); - } - ); - - var orderRollback = rollbackPaymentForOrder(data); - - var sagaStatus = orderSagaHelper.orderStatusToSagaStatus(orderRollback.getStatus()); - - paymentOutboxHelper.save(getUpdatedPaymentOutboxMessage(messageResponse, - orderRollback.getStatus(), - sagaStatus)); - - if (data.getPaymentStatus().equals(PaymentStatus.CANCELED)) { - approvalOutboxHelper.save(getUpdatedApprovalOutboxMessage(data.getSagaId(), - orderRollback.getStatus(), - sagaStatus)); + if (orderPaymentOutboxMessageResponse.isEmpty()) { + log.info("An outbox message with saga id: {} is already processed!", paymentResponse.getSagaId()); + return; } - log.info("Payment rolled back for order with id: {}", orderRollback.getId()); + OrderPaymentOutboxMessage orderPaymentOutboxMessage = orderPaymentOutboxMessageResponse.get(); + + OrderPaidEvent domainEvent = completePaymentForOrder(paymentResponse); + + SagaStatus sagaStatus = orderSagaHelper.orderStatusToSagaStatus(domainEvent.getOrder().getStatus()); + + paymentOutboxHelper.save(getUpdatedPaymentOutboxMessage(orderPaymentOutboxMessage, + domainEvent.getOrder().getStatus(), sagaStatus)); + + approvalOutboxHelper + .saveApprovalOutboxMessage(orderDataMapper.orderPaidEventToOrderApprovalEventPayload(domainEvent), + domainEvent.getOrder().getStatus(), + sagaStatus, + OutboxStatus.STARTED, + UUID.fromString(paymentResponse.getSagaId())); + + log.info("Order with id: {} is paid", domainEvent.getOrder().getId().getValue()); + } + + @Override + @Transactional + public void rollback(PaymentResponse paymentResponse) { + + Optional orderPaymentOutboxMessageResponse = + paymentOutboxHelper.getPaymentOutboxMessageBySagaIdAndSagaStatus( + UUID.fromString(paymentResponse.getSagaId()), + getCurrentSagaStatus(paymentResponse.getPaymentStatus())); + + if (orderPaymentOutboxMessageResponse.isEmpty()) { + log.info("An outbox message with saga id: {} is already roll backed!", paymentResponse.getSagaId()); + return; + } + + OrderPaymentOutboxMessage orderPaymentOutboxMessage = orderPaymentOutboxMessageResponse.get(); + + Order order = rollbackPaymentForOrder(paymentResponse); + + SagaStatus sagaStatus = orderSagaHelper.orderStatusToSagaStatus(order.getStatus()); + + paymentOutboxHelper.save(getUpdatedPaymentOutboxMessage(orderPaymentOutboxMessage, + order.getStatus(), sagaStatus)); + + if (paymentResponse.getPaymentStatus() == PaymentStatus.CANCELED) { + approvalOutboxHelper.save(getUpdatedApprovalOutboxMessage(paymentResponse.getSagaId(), + order.getStatus(), sagaStatus)); + } + + log.info("Order with id: {} is cancelled", order.getId().getValue()); + } + + private Order findOrder(String orderId) { + Optional orderResponse = orderRepository.findById(new OrderId(UUID.fromString(orderId))); + if (orderResponse.isEmpty()) { + log.error("Order with id: {} could not be found!", orderId); + throw new OrderNotFoundException("Order with id " + orderId + " could not be found!"); + } + return orderResponse.get(); + } + + private OrderPaymentOutboxMessage getUpdatedPaymentOutboxMessage(OrderPaymentOutboxMessage + orderPaymentOutboxMessage, + OrderStatus + orderStatus, + SagaStatus + sagaStatus) { + orderPaymentOutboxMessage.setProcessedAt(ZonedDateTime.now(ZoneId.of(UTC))); + orderPaymentOutboxMessage.setOrderStatus(orderStatus); + orderPaymentOutboxMessage.setSagaStatus(sagaStatus); + return orderPaymentOutboxMessage; + } + + private OrderPaidEvent completePaymentForOrder(PaymentResponse paymentResponse) { + log.info("Completing payment for order with id: {}", paymentResponse.getOrderId()); + Order order = findOrder(paymentResponse.getOrderId()); + OrderPaidEvent domainEvent = orderDomainService.payOrder(order); + orderRepository.save(order); + return domainEvent; + } + + private SagaStatus[] getCurrentSagaStatus(PaymentStatus paymentStatus) { + return switch (paymentStatus) { + case COMPLETED -> new SagaStatus[] { SagaStatus.STARTED }; + case CANCELED -> new SagaStatus[] { SagaStatus.PROCESSING }; + case FAILED -> new SagaStatus[] { SagaStatus.STARTED, SagaStatus.PROCESSING }; + }; + } + + private Order rollbackPaymentForOrder(PaymentResponse paymentResponse) { + log.info("Cancelling order with id: {}", paymentResponse.getOrderId()); + Order order = findOrder(paymentResponse.getOrderId()); + orderDomainService.cancelOrder(order, paymentResponse.getFailureMessages()); + orderRepository.save(order); + return order; } private OrderApprovalOutboxMessage getUpdatedApprovalOutboxMessage(String sagaId, OrderStatus orderStatus, SagaStatus sagaStatus) { - var orderApprovalOutboxMessageResponse = + Optional orderApprovalOutboxMessageResponse = approvalOutboxHelper.getApprovalOutboxMessageBySagaIdAndSagaStatus( UUID.fromString(sagaId), SagaStatus.COMPENSATING); @@ -122,34 +159,10 @@ public class OrderPaymentSaga implements SagaStep { throw new OrderDomainException("Approval outbox message could not be found in " + SagaStatus.COMPENSATING.name() + " status!"); } - var orderApprovalOutboxMessage = orderApprovalOutboxMessageResponse.get(); + OrderApprovalOutboxMessage orderApprovalOutboxMessage = orderApprovalOutboxMessageResponse.get(); orderApprovalOutboxMessage.setProcessedAt(ZonedDateTime.now(ZoneId.of(UTC))); orderApprovalOutboxMessage.setOrderStatus(orderStatus); orderApprovalOutboxMessage.setSagaStatus(sagaStatus); return orderApprovalOutboxMessage; } - - private Order rollbackPaymentForOrder(PaymentResponse paymentResponse) { - log.info("Cancelling order with id: {}", paymentResponse.getOrderId()); - var order = orderSagaHelper.findOrder(paymentResponse.getOrderId()); - orderDomainService.cancelOrder(order, paymentResponse.getFailureMessages()); - orderSagaHelper.saveOrder(order); - return order; - } - - private SagaStatus[] getCurrentSagaStatus(PaymentStatus paymentStatus) { - return switch (paymentStatus) { - case COMPLETED -> new SagaStatus[]{SagaStatus.STARTED}; - case CANCELED -> new SagaStatus[]{SagaStatus.PROCESSING}; - case FAILED -> new SagaStatus[]{SagaStatus.STARTED, SagaStatus.PROCESSING}; - }; - } - - private OrderPaidEvent completePaymentForOrder(PaymentResponse data) { - var order = orderSagaHelper.findOrder(data.getOrderId()); - var paidEvent = orderDomainService.payOrder(order); - orderSagaHelper.saveOrder(order); - log.info("Payment completed for order with id: {}", order.getId()); - return paidEvent; - } } diff --git a/order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderApplicationServiceTest.java b/order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderApplicationServiceTest.java index 01891f9..268f842 100644 --- a/order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderApplicationServiceTest.java +++ b/order-service/order-domain/order-application-service/src/test/java/com/food/order/system/OrderApplicationServiceTest.java @@ -176,7 +176,7 @@ class OrderApplicationServiceTest { void testCreateOrderWithWrongTotalPrice() { OrderDomainException orderDomainException = assertThrows(OrderDomainException.class, () -> orderApplicationService.createOrder(createOrderCommandWrongPrice)); - assertEquals("Total price: 250.00 is not equal to Order items total: 200.00!", + assertEquals("Order total price is not equal to the sum of order items prices", orderDomainException.getMessage()); } @@ -185,7 +185,7 @@ class OrderApplicationServiceTest { OrderDomainException orderDomainException = assertThrows(OrderDomainException.class, () -> orderApplicationService.createOrder(createOrderCommandWrongProductPrice)); assertEquals(orderDomainException.getMessage(), - "Order item price: 60.00 is not valid for product " + PRODUCT_ID); + "Order item price is not valid"); } @Test @@ -201,7 +201,7 @@ class OrderApplicationServiceTest { OrderDomainException orderDomainException = assertThrows(OrderDomainException.class, () -> orderApplicationService.createOrder(createOrderCommand)); assertEquals(orderDomainException.getMessage(), - "Restaurant with id " + RESTAURANT_ID + " is currently not active!"); + "Restaurant is not active, please try again later. Restaurant id: " + restaurantResponse.getId()); } private OrderPaymentOutboxMessage getOrderPaymentOutboxMessage() { diff --git a/payment-service/payment-container/src/main/resources/application.yml b/payment-service/payment-container/src/main/resources/application.yml index 3521f3c..f0b0dbf 100644 --- a/payment-service/payment-container/src/main/resources/application.yml +++ b/payment-service/payment-container/src/main/resources/application.yml @@ -8,6 +8,8 @@ logging: payment-service: payment-request-topic-name: payment-request-value payment-response-topic-name: payment-response-value + outbox-scheduler-fixed-rate: 10000 + outbox-scheduler-initial-delay: 10000 spring: jpa: diff --git a/payment-service/payment-container/src/main/resources/init-schema.sql b/payment-service/payment-container/src/main/resources/init-schema.sql index b6c34f6..5b82854 100644 --- a/payment-service/payment-container/src/main/resources/init-schema.sql +++ b/payment-service/payment-container/src/main/resources/init-schema.sql @@ -44,4 +44,31 @@ CREATE TABLE "payment".credit_history amount numeric(10,2) NOT NULL, type transaction_type NOT NULL, CONSTRAINT credit_history_pkey PRIMARY KEY (id) -); \ No newline at end of file +); + +DROP TYPE IF EXISTS outbox_status; +CREATE TYPE outbox_status AS ENUM ('STARTED', 'COMPLETED', 'FAILED'); + +DROP TABLE IF EXISTS "payment".order_outbox CASCADE; + +CREATE TABLE "payment".order_outbox +( + id uuid NOT NULL, + saga_id uuid NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL, + processed_at TIMESTAMP WITH TIME ZONE, + type character varying COLLATE pg_catalog."default" NOT NULL, + payload jsonb NOT NULL, + outbox_status outbox_status NOT NULL, + payment_status payment_status NOT NULL, + version integer NOT NULL, + CONSTRAINT order_outbox_pkey PRIMARY KEY (id) +); + +CREATE INDEX "payment_order_outbox_saga_status" + ON "payment".order_outbox + (type, payment_status); + +CREATE UNIQUE INDEX "payment_order_outbox_saga_id_payment_status_outbox_status" + ON "payment".order_outbox + (type, saga_id, payment_status, outbox_status); \ No newline at end of file diff --git a/payment-service/payment-domain/payment-application-service/pom.xml b/payment-service/payment-domain/payment-application-service/pom.xml index e599691..4e638e2 100644 --- a/payment-service/payment-domain/payment-application-service/pom.xml +++ b/payment-service/payment-domain/payment-application-service/pom.xml @@ -34,6 +34,25 @@ payment-domain-core + + org.springframework.boot + spring-boot-starter-json + + + + org.springframework.boot + spring-boot-starter-test + + + + com.food.order + outbox + + + com.food.order + saga + + diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java index a40b1f2..8f046bb 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java @@ -1,8 +1,11 @@ package com.food.order.system.payment.application.service; +import com.food.order.system.outbox.OutboxStatus; import com.food.order.system.payment.application.service.dto.PaymentRequest; import com.food.order.system.payment.application.service.exception.PaymentApplicationServiceException; import com.food.order.system.payment.application.service.mapper.PaymentDataMapper; +import com.food.order.system.payment.application.service.outbox.scheduler.OrderOutboxHelper; +import com.food.order.system.payment.application.service.ports.output.message.publisher.PaymentResponseMessagePublisher; import com.food.order.system.payment.application.service.ports.output.repository.CreditEntryRepository; import com.food.order.system.payment.application.service.ports.output.repository.CreditHistoryRepository; import com.food.order.system.payment.application.service.ports.output.repository.PaymentRepository; @@ -10,12 +13,8 @@ import com.food.order.system.payment.service.domain.PaymentDomainService; import com.food.order.system.payment.service.domain.entity.CreditEntry; import com.food.order.system.payment.service.domain.entity.CreditHistory; import com.food.order.system.payment.service.domain.entity.Payment; -import com.food.order.system.payment.service.domain.event.PaymentCancelledEvent; -import com.food.order.system.payment.service.domain.event.PaymentCompletedEvent; -import com.food.order.system.payment.service.domain.event.PaymentEvent; -import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; -import com.food.order.system.event.publisher.DomainEventPublisher; import com.food.order.system.valueobject.CustomerId; +import com.food.order.system.valueobject.PaymentStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -30,18 +29,24 @@ import java.util.UUID; @RequiredArgsConstructor public class PaymentRequestHelper { private final PaymentDomainService paymentDomainService; + + private final OrderOutboxHelper orderOutboxHelper; + + private final PaymentResponseMessagePublisher paymentResponseMessagePublisher; private final PaymentDataMapper paymentDataMapper; private final PaymentRepository paymentRepository; private final CreditEntryRepository creditEntryRepository; private final CreditHistoryRepository creditHistoryRepository; - private final DomainEventPublisher publisher; - private final DomainEventPublisher publisherCancelled; - - private final DomainEventPublisher failedEventDomainEventPublisher; @Transactional - public PaymentEvent persistPayment(PaymentRequest paymentRequest) { + public void persistPayment(PaymentRequest paymentRequest) { + + if (publishIfOutboxMessageProcessedForPayment(paymentRequest,PaymentStatus.COMPLETED)) { + log.info("Outbox Message with sagaId : {} already save !", paymentRequest.getSagaId()); + return; + } + log.info("Received payment complete event for id : {}", paymentRequest.getOrderId()); var payment = paymentDataMapper.paymentRequestModelToPayment(paymentRequest); var creditEntry = getCreditEntry(payment.getCustomerId()); @@ -49,14 +54,40 @@ public class PaymentRequestHelper { List failureMessage = new ArrayList<>(); var paymentEvent = paymentDomainService.validateAndInitializePayment - (payment, creditEntry, creditHistory, failureMessage,publisher,failedEventDomainEventPublisher); + (payment, creditEntry, creditHistory, failureMessage); persistDbObject(payment, creditEntry, creditHistory, failureMessage); - return paymentEvent; + + orderOutboxHelper.saveOrderOutboxMessage(paymentDataMapper.paymentEventToOrderEventPayload(paymentEvent), + paymentEvent.getPayment().getStatus(), + OutboxStatus.STARTED, + UUID.fromString(paymentRequest.getSagaId())); + + + + + } + + private boolean publishIfOutboxMessageProcessedForPayment(PaymentRequest paymentRequest, + PaymentStatus paymentStatus) { + var outboxMessage = orderOutboxHelper.getCompletedOrderOutboxMessageBySagaIdAndPaymentStatus( + UUID.fromString(paymentRequest.getSagaId()), paymentStatus); + if (outboxMessage.isPresent()) { + paymentResponseMessagePublisher.publish(outboxMessage.get(), + orderOutboxHelper::updateOutboxMessage); + return true; + } + return false; } - public PaymentEvent persistCancelPayment(PaymentRequest paymentRequest) { + public void persistCancelPayment(PaymentRequest paymentRequest) { + + if (publishIfOutboxMessageProcessedForPayment(paymentRequest,PaymentStatus.CANCELED)) { + log.info("Outbox Message with sagaId : {} already save !", paymentRequest.getSagaId()); + return; + } + log.info("Received payment cancel event for id : {}", paymentRequest.getOrderId()); var payment = paymentRepository.findByOrderId (UUID.fromString(paymentRequest.getOrderId())).orElseThrow( @@ -65,13 +96,22 @@ public class PaymentRequestHelper { var creditHistory = getCreditHistory(payment.getCustomerId()); List failureMessage = new ArrayList<>(); var paymentEvent = paymentDomainService.validateAndCancelledPayment - (payment, creditEntry, creditHistory, failureMessage,publisherCancelled,failedEventDomainEventPublisher); + (payment, creditEntry, creditHistory, failureMessage); persistDbObject(payment, creditEntry, creditHistory, failureMessage); - return paymentEvent; + + + orderOutboxHelper.saveOrderOutboxMessage(paymentDataMapper.paymentEventToOrderEventPayload(paymentEvent), + paymentEvent.getPayment().getStatus(), + OutboxStatus.STARTED, + UUID.fromString(paymentRequest.getSagaId())); + } - private void persistDbObject(Payment payment, CreditEntry creditEntry, List creditHistory, List failureMessage) { + private void persistDbObject(Payment payment, + CreditEntry creditEntry, + List creditHistory, + List failureMessage) { paymentRepository.save(payment); if (failureMessage.isEmpty()) { creditEntryRepository.save(creditEntry); @@ -80,11 +120,13 @@ public class PaymentRequestHelper { } private List getCreditHistory(CustomerId customerId) { return creditHistoryRepository.findByCustomerId(customerId).orElseThrow( - () -> new PaymentApplicationServiceException("No credit history found for customer id : " + customerId)); + () -> new PaymentApplicationServiceException + ("No credit history found for customer id : " + customerId)); } private CreditEntry getCreditEntry(CustomerId customerId) { return creditEntryRepository.findByCustomerId(customerId).orElseThrow( - () -> new PaymentApplicationServiceException("Credit entry not found for customer id : " + customerId)); + () -> new PaymentApplicationServiceException + ("Credit entry not found for customer id : " + customerId)); } } diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestMessageListenerImpl.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestMessageListenerImpl.java index ce7ad55..e6c06d0 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestMessageListenerImpl.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestMessageListenerImpl.java @@ -2,7 +2,6 @@ package com.food.order.system.payment.application.service; import com.food.order.system.payment.application.service.dto.PaymentRequest; import com.food.order.system.payment.application.service.ports.input.message.listener.PaymentRequestMessageListener; -import com.food.order.system.payment.service.domain.event.PaymentEvent; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -16,20 +15,13 @@ public class PaymentRequestMessageListenerImpl implements PaymentRequestMessageL @Override public void completePayment(PaymentRequest paymentRequest) { - var event = paymentRequestHelper.persistPayment(paymentRequest); - fireEvent(event); + paymentRequestHelper.persistPayment(paymentRequest); } @Override public void cancelPayment(PaymentRequest paymentRequest) { - var event = paymentRequestHelper.persistCancelPayment(paymentRequest); - fireEvent(event); + paymentRequestHelper.persistCancelPayment(paymentRequest); } - private void fireEvent(PaymentEvent event) { - log.info("Firing event : {}", event); - event.fire(); - - } } diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/exception/PaymentDomainException.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/exception/PaymentDomainException.java new file mode 100644 index 0000000..f89cf4c --- /dev/null +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/exception/PaymentDomainException.java @@ -0,0 +1,14 @@ +package com.food.order.system.payment.application.service.exception; + +import com.food.order.system.exception.DomainException; + +public class PaymentDomainException extends DomainException { + + public PaymentDomainException(String message) { + super(message); + } + + public PaymentDomainException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/mapper/PaymentDataMapper.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/mapper/PaymentDataMapper.java index 1358d2a..a8e8a54 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/mapper/PaymentDataMapper.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/mapper/PaymentDataMapper.java @@ -1,7 +1,9 @@ package com.food.order.system.payment.application.service.mapper; import com.food.order.system.payment.application.service.dto.PaymentRequest; +import com.food.order.system.payment.application.service.outbox.model.OrderEventPayload; import com.food.order.system.payment.service.domain.entity.Payment; +import com.food.order.system.payment.service.domain.event.PaymentEvent; import com.food.order.system.valueobject.CustomerId; import com.food.order.system.valueobject.Money; import com.food.order.system.valueobject.OrderId; @@ -20,4 +22,17 @@ public class PaymentDataMapper { .price(new Money(paymentRequest.getPrice())) .build(); } + + public OrderEventPayload paymentEventToOrderEventPayload(PaymentEvent payment) { + return OrderEventPayload.builder() + .orderId(payment.getPayment().getOrderId().getValue().toString()) + .customerId(payment.getPayment().getCustomerId().getValue().toString()) + .price(payment.getPayment().getPrice().getAmount()) + .paymentId(payment.getPayment().getId().toString()) + .createdAt(payment.getCreatedAt()) + .failureMessages(payment.getFailureMessages()) + .paymentStatus(payment.getPayment().getStatus().toString()) + .build(); + + } } diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/model/OrderEventPayload.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/model/OrderEventPayload.java new file mode 100644 index 0000000..5d95eb6 --- /dev/null +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/model/OrderEventPayload.java @@ -0,0 +1,38 @@ +package com.food.order.system.payment.application.service.outbox.model; + +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 OrderEventPayload { + + @JsonProperty + private String paymentId; + + @JsonProperty + private String customerId; + + @JsonProperty + private String orderId; + + @JsonProperty + private BigDecimal price; + + @JsonProperty + private String paymentStatus; + + @JsonProperty + private ZonedDateTime createdAt; + + @JsonProperty + private List failureMessages; + +} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/model/OrderOutboxMessage.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/model/OrderOutboxMessage.java new file mode 100644 index 0000000..bc56c40 --- /dev/null +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/model/OrderOutboxMessage.java @@ -0,0 +1,38 @@ +package com.food.order.system.payment.application.service.outbox.model; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.valueobject.PaymentStatus; +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 OrderOutboxMessage { + + private UUID id; + + private UUID sagaId; + + private ZonedDateTime createdAt; + + private ZonedDateTime processedAt; + + private String type; + + private String payload; + + private PaymentStatus paymentStatus; + + @Setter + private OutboxStatus outboxStatus; + + private int version; + + +} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxCleanerScheduler.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxCleanerScheduler.java new file mode 100644 index 0000000..21d44e7 --- /dev/null +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxCleanerScheduler.java @@ -0,0 +1,36 @@ +package com.food.order.system.payment.application.service.outbox.scheduler; + + +import com.food.order.system.outbox.OutboxScheduler; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.payment.application.service.outbox.model.OrderOutboxMessage; +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.List; +import java.util.Optional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderOutboxCleanerScheduler implements OutboxScheduler { + + private final OrderOutboxHelper orderOutboxHelper; + + @Override + @Transactional + @Scheduled(cron = "@midnight") + public void processOutboxMessage() { + Optional> outboxMessagesResponse = + orderOutboxHelper.getOrderOutboxMessageByOutboxStatus(OutboxStatus.COMPLETED); + if (outboxMessagesResponse.isPresent() && outboxMessagesResponse.get().size() > 0) { + List outboxMessages = outboxMessagesResponse.get(); + log.info("Received {} OrderOutboxMessage for clean-up!", outboxMessages.size()); + orderOutboxHelper.deleteOrderOutboxMessageByOutboxStatus(OutboxStatus.COMPLETED); + log.info("Deleted {} OrderOutboxMessage!", outboxMessages.size()); + } + } +} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxHelper.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxHelper.java new file mode 100644 index 0000000..700513e --- /dev/null +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxHelper.java @@ -0,0 +1,96 @@ +package com.food.order.system.payment.application.service.outbox.scheduler; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.payment.application.service.outbox.model.OrderEventPayload; +import com.food.order.system.payment.application.service.outbox.model.OrderOutboxMessage; +import com.food.order.system.payment.application.service.ports.output.repository.OrderOutboxRepository; +import com.food.order.system.payment.application.service.exception.PaymentDomainException; +import com.food.order.system.valueobject.PaymentStatus; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +import static com.food.order.system.DomainConstants.UTC; +import static com.food.order.system.outbox.order.SagaConst.ORDER_PROCESSING_SAGA; + +@Component +@Slf4j +@RequiredArgsConstructor +public class OrderOutboxHelper { + + private final ObjectMapper objectMapper; + private final OrderOutboxRepository orderOutboxRepository; + + + @Transactional(readOnly = true) + public Optional getCompletedOrderOutboxMessageBySagaIdAndPaymentStatus(UUID sagaId, + PaymentStatus + paymentStatus) { + return orderOutboxRepository.findByTypeAndSagaIdAndPaymentStatusAndOutboxStatus(ORDER_PROCESSING_SAGA, sagaId, + paymentStatus, OutboxStatus.COMPLETED); + } + + @Transactional(readOnly = true) + public Optional> getOrderOutboxMessageByOutboxStatus(OutboxStatus outboxStatus) { + return orderOutboxRepository.findByTypeAndOutboxStatus(ORDER_PROCESSING_SAGA, outboxStatus); + } + + @Transactional + public void deleteOrderOutboxMessageByOutboxStatus(OutboxStatus outboxStatus) { + orderOutboxRepository.deleteByTypeAndOutboxStatus(ORDER_PROCESSING_SAGA, outboxStatus); + } + + @Transactional + public void saveOrderOutboxMessage(OrderEventPayload orderEventPayload, + PaymentStatus paymentStatus, + OutboxStatus outboxStatus, + UUID sagaId) { + save(OrderOutboxMessage.builder() + .id(UUID.randomUUID()) + .sagaId(sagaId) + .createdAt(orderEventPayload.getCreatedAt()) + .processedAt(ZonedDateTime.now(ZoneId.of(UTC))) + .type(ORDER_PROCESSING_SAGA) + .payload(createPayload(orderEventPayload)) + .paymentStatus(paymentStatus) + .outboxStatus(outboxStatus) + .build()); + } + + @Transactional + public void updateOutboxMessage(OrderOutboxMessage orderOutboxMessage, OutboxStatus outboxStatus) { + orderOutboxMessage.setOutboxStatus(outboxStatus); + save(orderOutboxMessage); + log.info("Order outbox table status is updated as: {}", outboxStatus.name()); + } + + private String createPayload(OrderEventPayload orderEventPayload) { + try { + return objectMapper.writeValueAsString(orderEventPayload); + } catch (JsonProcessingException e) { + log.error("Could not create OrderEventPayload json!", e); + throw new PaymentDomainException("Could not create OrderEventPayload json!", e); + } + } + + private void save(OrderOutboxMessage orderOutboxMessage) { + OrderOutboxMessage response = orderOutboxRepository.save(orderOutboxMessage); + if (Objects.isNull(response)) { + log.error("Could not save OrderOutboxMessage!"); + throw new PaymentDomainException("Could not save OrderOutboxMessage!"); + } + log.info("OrderOutboxMessage is saved with id: {}", orderOutboxMessage.getId()); + } + + +} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxScheduler.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxScheduler.java new file mode 100644 index 0000000..bfb91bd --- /dev/null +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/outbox/scheduler/OrderOutboxScheduler.java @@ -0,0 +1,44 @@ +package com.food.order.system.payment.application.service.outbox.scheduler; + +import com.food.order.system.outbox.OutboxScheduler; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.payment.application.service.outbox.model.OrderOutboxMessage; +import com.food.order.system.payment.application.service.ports.output.message.publisher.PaymentResponseMessagePublisher; +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.List; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderOutboxScheduler implements OutboxScheduler { + + private final OrderOutboxHelper orderOutboxHelper; + private final PaymentResponseMessagePublisher paymentResponseMessagePublisher; + + + @Override + @Transactional + @Scheduled(fixedRateString = "${payment-service.outbox-scheduler-fixed-rate}", + initialDelayString = "${payment-service.outbox-scheduler-initial-delay}") + public void processOutboxMessage() { + var outboxMessagesResponse = + orderOutboxHelper.getOrderOutboxMessageByOutboxStatus(OutboxStatus.STARTED); + if (outboxMessagesResponse.isPresent() && outboxMessagesResponse.get().size() > 0) { + List outboxMessages = outboxMessagesResponse.get(); + log.info("Received {} OrderOutboxMessage with ids {}, sending to message bus!", outboxMessages.size(), + outboxMessages.stream().map(outboxMessage -> + outboxMessage.getId().toString()).collect(Collectors.joining(","))); + outboxMessages.forEach(orderOutboxMessage -> + paymentResponseMessagePublisher.publish(orderOutboxMessage, + orderOutboxHelper::updateOutboxMessage)); + log.info("{} OrderOutboxMessage sent to message bus!", outboxMessages.size()); + } + } + +} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCancelledMessagePublisher.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCancelledMessagePublisher.java deleted file mode 100644 index 9fb7072..0000000 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCancelledMessagePublisher.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.food.order.system.payment.application.service.ports.output.message.publisher; - -import com.food.order.system.payment.service.domain.event.PaymentCancelledEvent; -import com.food.order.system.event.publisher.DomainEventPublisher; - -public interface PaymentCancelledMessagePublisher extends DomainEventPublisher { -} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCompletedMessagePublisher.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCompletedMessagePublisher.java deleted file mode 100644 index 6015feb..0000000 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCompletedMessagePublisher.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.food.order.system.payment.application.service.ports.output.message.publisher; - -import com.food.order.system.payment.service.domain.event.PaymentCompletedEvent; -import com.food.order.system.event.publisher.DomainEventPublisher; - -public interface PaymentCompletedMessagePublisher extends DomainEventPublisher { -} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentFailedMessagePublisher.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentFailedMessagePublisher.java deleted file mode 100644 index cd8807b..0000000 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentFailedMessagePublisher.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.food.order.system.payment.application.service.ports.output.message.publisher; - -import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; -import com.food.order.system.event.publisher.DomainEventPublisher; - -public interface PaymentFailedMessagePublisher extends DomainEventPublisher { -} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentResponseMessagePublisher.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentResponseMessagePublisher.java new file mode 100644 index 0000000..3812f97 --- /dev/null +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentResponseMessagePublisher.java @@ -0,0 +1,11 @@ +package com.food.order.system.payment.application.service.ports.output.message.publisher; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.payment.application.service.outbox.model.OrderOutboxMessage; + +import java.util.function.BiConsumer; + +public interface PaymentResponseMessagePublisher { + void publish(OrderOutboxMessage message, + BiConsumer updateOutboxMessage); +} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/OrderOutboxRepository.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/OrderOutboxRepository.java new file mode 100644 index 0000000..6c5052b --- /dev/null +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/OrderOutboxRepository.java @@ -0,0 +1,26 @@ +package com.food.order.system.payment.application.service.ports.output.repository; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.payment.application.service.outbox.model.OrderOutboxMessage; +import com.food.order.system.valueobject.PaymentStatus; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface OrderOutboxRepository { + + OrderOutboxMessage save(OrderOutboxMessage orderOutboxMessage); + + Optional> findByTypeAndOutboxStatus(String type, OutboxStatus status); + + Optional findByTypeAndSagaIdAndPaymentStatusAndOutboxStatus(String type, + UUID sagaId, + PaymentStatus paymentStatus, + OutboxStatus outboxStatus); + void deleteByTypeAndOutboxStatus(String type, OutboxStatus status); + + +} diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainService.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainService.java index 223d2dd..56a1963 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainService.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainService.java @@ -3,11 +3,7 @@ package com.food.order.system.payment.service.domain; import com.food.order.system.payment.service.domain.entity.CreditEntry; import com.food.order.system.payment.service.domain.entity.CreditHistory; import com.food.order.system.payment.service.domain.entity.Payment; -import com.food.order.system.payment.service.domain.event.PaymentCancelledEvent; -import com.food.order.system.payment.service.domain.event.PaymentCompletedEvent; import com.food.order.system.payment.service.domain.event.PaymentEvent; -import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; -import com.food.order.system.event.publisher.DomainEventPublisher; import java.util.List; @@ -16,14 +12,10 @@ public interface PaymentDomainService { PaymentEvent validateAndInitializePayment( Payment paymentEvent, CreditEntry creditEntry, List creditHistory, - List failureMessages, - DomainEventPublisher publisher, - DomainEventPublisher failedEventDomainEventPublisher); + List failureMessages); PaymentEvent validateAndCancelledPayment( Payment paymentEvent, CreditEntry creditEntry, List creditHistory, - List failureMessages, - DomainEventPublisher publisher, - DomainEventPublisher failedEventDomainEventPublisher); + List failureMessages); } 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 2078010..3ce0493 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 @@ -29,9 +29,7 @@ public class PaymentDomainServiceImpl implements PaymentDomainService { public PaymentEvent validateAndInitializePayment(Payment payment, CreditEntry creditEntry, List creditHistory, - List failureMessages, - DomainEventPublisher publisher, - DomainEventPublisher failedPublisher) { + List failureMessages) { payment.validatePayment(failureMessages); payment.initializePayment(); validateCreditEntry(payment,creditEntry,failureMessages); @@ -42,11 +40,11 @@ public class PaymentDomainServiceImpl implements PaymentDomainService { if (failureMessages.isEmpty()) { log.info("Payment is valid and initialized"); payment.updateStatus(PaymentStatus.COMPLETED); - return new PaymentCompletedEvent(payment, ZonedDateTime.now(ZoneId.of(UTC)),publisher ); + return new PaymentCompletedEvent(payment, ZonedDateTime.now(ZoneId.of(UTC)) ); } else { log.info("Payment is invalid and not initialized"); payment.updateStatus(PaymentStatus.FAILED); - return new PaymentFailedEvent(payment, ZonedDateTime.now(ZoneId.of(UTC)), failureMessages,failedPublisher); + return new PaymentFailedEvent(payment, ZonedDateTime.now(ZoneId.of(UTC)), failureMessages); } } @@ -55,9 +53,7 @@ public class PaymentDomainServiceImpl implements PaymentDomainService { public PaymentEvent validateAndCancelledPayment(Payment payment, CreditEntry creditEntry, List creditHistory, - List failureMessages, - DomainEventPublisher publisher, - DomainEventPublisher failedPublisher) { + List failureMessages) { payment.validatePayment(failureMessages); addCreditEntry(payment,creditEntry); @@ -66,11 +62,11 @@ public class PaymentDomainServiceImpl implements PaymentDomainService { if (failureMessages.isEmpty()) { log.info("Payment is valid and cancelled"); payment.updateStatus(PaymentStatus.CANCELED); - return new PaymentCancelledEvent(payment, ZonedDateTime.now(ZoneId.of(UTC)),publisher); + return new PaymentCancelledEvent(payment, ZonedDateTime.now(ZoneId.of(UTC))); } else { log.info("Payment is invalid and not cancelled"); payment.updateStatus(PaymentStatus.FAILED); - return new PaymentFailedEvent(payment, ZonedDateTime.now(ZoneId.of(UTC)), failureMessages,failedPublisher); + return new PaymentFailedEvent(payment, ZonedDateTime.now(ZoneId.of(UTC)), failureMessages); } } diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCancelledEvent.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCancelledEvent.java index 73bce8a..6fd1e49 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCancelledEvent.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCancelledEvent.java @@ -1,23 +1,15 @@ package com.food.order.system.payment.service.domain.event; import com.food.order.system.payment.service.domain.entity.Payment; -import com.food.order.system.event.publisher.DomainEventPublisher; import java.time.ZonedDateTime; import java.util.Collections; public class PaymentCancelledEvent extends PaymentEvent{ - private final DomainEventPublisher publisher; - public PaymentCancelledEvent(Payment payment, ZonedDateTime createdAt, DomainEventPublisher publisher) { + public PaymentCancelledEvent(Payment payment, ZonedDateTime createdAt) { super(payment, createdAt, Collections.emptyList()); - this.publisher = publisher; } - - @Override - public void fire() { - publisher.publish(this); - } } diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCompletedEvent.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCompletedEvent.java index a60e9cd..896664f 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCompletedEvent.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCompletedEvent.java @@ -8,18 +8,10 @@ import java.util.Collections; public class PaymentCompletedEvent extends PaymentEvent{ - private final DomainEventPublisher publisher; public PaymentCompletedEvent(Payment payment, - ZonedDateTime createdAt, - DomainEventPublisher publisher) { + ZonedDateTime createdAt) { super(payment, createdAt , Collections.emptyList()); - this.publisher = publisher; } - - @Override - public void fire() { - publisher.publish(this); - } } diff --git a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentFailedEvent.java b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentFailedEvent.java index d609892..07e2eba 100644 --- a/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentFailedEvent.java +++ b/payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentFailedEvent.java @@ -1,23 +1,15 @@ package com.food.order.system.payment.service.domain.event; import com.food.order.system.payment.service.domain.entity.Payment; -import com.food.order.system.event.publisher.DomainEventPublisher; import java.time.ZonedDateTime; import java.util.List; public class PaymentFailedEvent extends PaymentEvent{ - private final DomainEventPublisher publisher; - public PaymentFailedEvent(Payment payment, ZonedDateTime createdAt, List failureMessages, - DomainEventPublisher publisher) { + public PaymentFailedEvent(Payment payment, ZonedDateTime createdAt, List failureMessages) { super(payment, createdAt, failureMessages); - this.publisher = publisher; } - @Override - public void fire() { - publisher.publish(this); - } } diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCancelledKafkaMessagePublisher.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCancelledKafkaMessagePublisher.java index 538b711..7d92464 100644 --- a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCancelledKafkaMessagePublisher.java +++ b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCancelledKafkaMessagePublisher.java @@ -1,10 +1,10 @@ package com.food.order.system.payment.messaging.publisher.kafka; +import com.food.order.system.event.publisher.DomainEventPublisher; import com.food.order.system.kafka.order.avro.model.PaymentResponseAvroModel; import com.food.order.system.kafka.producer.KafkaMessageHelper; import com.food.order.system.kafka.producer.service.KafkaProducer; import com.food.order.system.payment.application.service.config.PaymentServiceConfigData; -import com.food.order.system.payment.application.service.ports.output.message.publisher.PaymentCancelledMessagePublisher; import com.food.order.system.payment.messaging.mapper.PaymentMessagingDataMapper; import com.food.order.system.payment.service.domain.event.PaymentCancelledEvent; import lombok.RequiredArgsConstructor; @@ -14,7 +14,7 @@ import org.springframework.stereotype.Component; @Component @Slf4j @RequiredArgsConstructor -public class PaymentCancelledKafkaMessagePublisher implements PaymentCancelledMessagePublisher { +public class PaymentCancelledKafkaMessagePublisher implements DomainEventPublisher { private final PaymentMessagingDataMapper paymentDataMapper; private final KafkaProducer kafkaProducer; diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCompletedKafkaMessagePublisher.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCompletedKafkaMessagePublisher.java index 4e38a67..e8de915 100644 --- a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCompletedKafkaMessagePublisher.java +++ b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCompletedKafkaMessagePublisher.java @@ -1,10 +1,10 @@ package com.food.order.system.payment.messaging.publisher.kafka; +import com.food.order.system.event.publisher.DomainEventPublisher; import com.food.order.system.kafka.order.avro.model.PaymentResponseAvroModel; import com.food.order.system.kafka.producer.KafkaMessageHelper; import com.food.order.system.kafka.producer.service.KafkaProducer; import com.food.order.system.payment.application.service.config.PaymentServiceConfigData; -import com.food.order.system.payment.application.service.ports.output.message.publisher.PaymentCompletedMessagePublisher; import com.food.order.system.payment.messaging.mapper.PaymentMessagingDataMapper; import com.food.order.system.payment.service.domain.event.PaymentCompletedEvent; import lombok.RequiredArgsConstructor; @@ -14,7 +14,7 @@ import org.springframework.stereotype.Component; @Component @Slf4j @RequiredArgsConstructor -public class PaymentCompletedKafkaMessagePublisher implements PaymentCompletedMessagePublisher { +public class PaymentCompletedKafkaMessagePublisher implements DomainEventPublisher { private final PaymentMessagingDataMapper paymentDataMapper; private final KafkaProducer kafkaProducer; diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentFailedKafkaMessagePublisher.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentFailedKafkaMessagePublisher.java index 56a6f08..1a599e9 100644 --- a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentFailedKafkaMessagePublisher.java +++ b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentFailedKafkaMessagePublisher.java @@ -1,10 +1,10 @@ package com.food.order.system.payment.messaging.publisher.kafka; +import com.food.order.system.event.publisher.DomainEventPublisher; import com.food.order.system.kafka.order.avro.model.PaymentResponseAvroModel; import com.food.order.system.kafka.producer.KafkaMessageHelper; import com.food.order.system.kafka.producer.service.KafkaProducer; import com.food.order.system.payment.application.service.config.PaymentServiceConfigData; -import com.food.order.system.payment.application.service.ports.output.message.publisher.PaymentFailedMessagePublisher; import com.food.order.system.payment.messaging.mapper.PaymentMessagingDataMapper; import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; import lombok.RequiredArgsConstructor; @@ -14,7 +14,7 @@ import org.springframework.stereotype.Component; @Component @Slf4j @RequiredArgsConstructor -public class PaymentFailedKafkaMessagePublisher implements PaymentFailedMessagePublisher { +public class PaymentFailedKafkaMessagePublisher implements DomainEventPublisher { private final PaymentMessagingDataMapper paymentDataMapper; private final KafkaProducer kafkaProducer; diff --git a/pom.xml b/pom.xml index 1a2cb8f..becb702 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ spring-boot-starter-parent org.springframework.boot - 2.6.7 + 2.7.1 4.0.0 From 2ff4b7b3d50f8dd6a3e56ac8e36cff1cfbaec080 Mon Sep 17 00:00:00 2001 From: Ali CANLI Date: Sat, 16 Jul 2022 22:20:20 +0300 Subject: [PATCH 3/4] Outbox Message and Scheduler class implemented part - 5. --- .../PaymentRequestMessageListenerTest.java | 115 ++++++++++++++++++ .../adapter/OrderOutboxRepositoryImpl.java | 58 +++++++++ .../outobx/entity/OrderOutboxEntity.java | 49 ++++++++ .../OrderOutboxNotFoundException.java | 8 ++ .../mapper/OrderOutboxDataAccessMapper.java | 37 ++++++ .../repository/OrderOutboxJpaRepository.java | 26 ++++ .../service/PaymentRequestHelper.java | 7 +- payment-service/payment-messaging/pom.xml | 5 + .../kafka/PaymentRequestKafkaListener.java | 41 +++++-- .../mapper/PaymentMessagingDataMapper.java | 60 +++------ ...PaymentCancelledKafkaMessagePublisher.java | 47 ------- ...PaymentCompletedKafkaMessagePublisher.java | 48 -------- .../kafka/PaymentEventKafkaPublisher.java | 61 ++++++++++ .../PaymentFailedKafkaMessagePublisher.java | 48 -------- 14 files changed, 409 insertions(+), 201 deletions(-) create mode 100644 payment-service/payment-container/src/test/java/com/food/order/system/PaymentRequestMessageListenerTest.java create mode 100644 payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/adapter/OrderOutboxRepositoryImpl.java create mode 100644 payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/entity/OrderOutboxEntity.java create mode 100644 payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/exception/OrderOutboxNotFoundException.java create mode 100644 payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/mapper/OrderOutboxDataAccessMapper.java create mode 100644 payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/repository/OrderOutboxJpaRepository.java delete mode 100644 payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCancelledKafkaMessagePublisher.java delete mode 100644 payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCompletedKafkaMessagePublisher.java create mode 100644 payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentEventKafkaPublisher.java delete mode 100644 payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentFailedKafkaMessagePublisher.java diff --git a/payment-service/payment-container/src/test/java/com/food/order/system/PaymentRequestMessageListenerTest.java b/payment-service/payment-container/src/test/java/com/food/order/system/PaymentRequestMessageListenerTest.java new file mode 100644 index 0000000..7f64d62 --- /dev/null +++ b/payment-service/payment-container/src/test/java/com/food/order/system/PaymentRequestMessageListenerTest.java @@ -0,0 +1,115 @@ +package com.food.order.system; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.payment.application.service.dto.PaymentRequest; +import com.food.order.system.payment.application.service.ports.input.message.listener.PaymentRequestMessageListener; +import com.food.order.system.payment.data.access.outobx.entity.OrderOutboxEntity; +import com.food.order.system.payment.data.access.outobx.repository.OrderOutboxJpaRepository; +import com.food.order.system.payment.service.domain.PaymentServiceApplication; +import com.food.order.system.valueobject.PaymentOrderStatus; +import com.food.order.system.valueobject.PaymentStatus; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.postgresql.util.PSQLException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.DataAccessException; + +import java.math.BigDecimal; +import java.time.Instant; +import java.util.*; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static com.food.order.system.outbox.order.SagaConst.ORDER_PROCESSING_SAGA; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@Slf4j +@SpringBootTest(classes = {PaymentServiceApplication.class}) +class PaymentRequestMessageListenerTest { + + @Autowired + private PaymentRequestMessageListener paymentRequestMessageListener; + + @Autowired + private OrderOutboxJpaRepository orderOutboxRepository; + + private final static String CUSTOMER_ID = "d215b5f8-0249-4dc5-89a3-51fd148cfb41"; + private final static BigDecimal PRICE = new BigDecimal("100"); + + @Test + void testDoublePayment() { + String sagaId = UUID.randomUUID().toString(); + paymentRequestMessageListener.completePayment(getPaymentRequest(sagaId)); + try { + paymentRequestMessageListener.completePayment(getPaymentRequest(sagaId)); + } catch (DataAccessException e) { + log.error("DataAccessException occurred with sql state: {}", + ((PSQLException) Objects.requireNonNull(e.getRootCause())).getSQLState()); + } + assertOrderOutbox(sagaId); + } + + @Test + void testDoublePaymentWithThreads() { + String sagaId = UUID.randomUUID().toString(); + ExecutorService executor = null; + + try { + executor = Executors.newFixedThreadPool(2); + List> tasks = new ArrayList<>(); + + tasks.add(Executors.callable(() -> { + try { + paymentRequestMessageListener.completePayment(getPaymentRequest(sagaId)); + } catch (DataAccessException e) { + log.error("DataAccessException occurred for thread 1 with sql state: {}", + ((PSQLException) Objects.requireNonNull(e.getRootCause())).getSQLState()); + } + })); + + tasks.add(Executors.callable(() -> { + try { + paymentRequestMessageListener.completePayment(getPaymentRequest(sagaId)); + } catch (DataAccessException e) { + log.error("DataAccessException occurred for thread 2 with sql state: {}", + ((PSQLException) Objects.requireNonNull(e.getRootCause())).getSQLState()); + } + })); + + executor.invokeAll(tasks); + + assertOrderOutbox(sagaId); + } catch (InterruptedException e) { + log.error("Error calling complete payment!", e); + } finally { + if (executor != null) { + executor.shutdown(); + } + } + } + + private void assertOrderOutbox(String sagaId) { + Optional orderOutboxEntity = orderOutboxRepository + .findByTypeAndSagaIdAndPaymentStatusAndOutboxStatus(ORDER_PROCESSING_SAGA, + UUID.fromString(sagaId), + PaymentStatus.COMPLETED, + OutboxStatus.STARTED); + assertTrue(orderOutboxEntity.isPresent()); + assertEquals(orderOutboxEntity.get().getSagaId().toString(), sagaId); + } + + private PaymentRequest getPaymentRequest(String sagaId) { + return PaymentRequest.builder() + .id(UUID.randomUUID().toString()) + .sagaId(sagaId) + .orderId(UUID.randomUUID().toString()) + .status(PaymentOrderStatus.PENDING) + .customerId(CUSTOMER_ID) + .price(PRICE) + .createdAt(Instant.now()) + .build(); + } +} diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/adapter/OrderOutboxRepositoryImpl.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/adapter/OrderOutboxRepositoryImpl.java new file mode 100644 index 0000000..66347d4 --- /dev/null +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/adapter/OrderOutboxRepositoryImpl.java @@ -0,0 +1,58 @@ +package com.food.order.system.payment.data.access.outobx.adapter; + + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.payment.application.service.outbox.model.OrderOutboxMessage; +import com.food.order.system.payment.application.service.ports.output.repository.OrderOutboxRepository; +import com.food.order.system.payment.data.access.outobx.exception.OrderOutboxNotFoundException; +import com.food.order.system.payment.data.access.outobx.mapper.OrderOutboxDataAccessMapper; +import com.food.order.system.payment.data.access.outobx.repository.OrderOutboxJpaRepository; +import com.food.order.system.valueobject.PaymentStatus; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; + +@Component +@RequiredArgsConstructor +public class OrderOutboxRepositoryImpl implements OrderOutboxRepository { + + private final OrderOutboxJpaRepository orderOutboxJpaRepository; + private final OrderOutboxDataAccessMapper orderOutboxDataAccessMapper; + + @Override + public OrderOutboxMessage save(OrderOutboxMessage orderPaymentOutboxMessage) { + return orderOutboxDataAccessMapper + .orderOutboxEntityToOrderOutboxMessage(orderOutboxJpaRepository + .save(orderOutboxDataAccessMapper + .orderOutboxMessageToOutboxEntity(orderPaymentOutboxMessage))); + } + + @Override + public Optional> findByTypeAndOutboxStatus(String sagaType, OutboxStatus outboxStatus) { + return Optional.of(orderOutboxJpaRepository.findByTypeAndOutboxStatus(sagaType, outboxStatus) + .orElseThrow(() -> new OrderOutboxNotFoundException("Approval outbox object " + + "cannot be found for saga type " + sagaType)) + .stream() + .map(orderOutboxDataAccessMapper::orderOutboxEntityToOrderOutboxMessage) + .collect(Collectors.toList())); + } + + @Override + public Optional findByTypeAndSagaIdAndPaymentStatusAndOutboxStatus(String sagaType, + UUID sagaId, + PaymentStatus paymentStatus, + OutboxStatus outboxStatus) { + return orderOutboxJpaRepository.findByTypeAndSagaIdAndPaymentStatusAndOutboxStatus(sagaType, sagaId, + paymentStatus, outboxStatus) + .map(orderOutboxDataAccessMapper::orderOutboxEntityToOrderOutboxMessage); + } + + @Override + public void deleteByTypeAndOutboxStatus(String sagaType, OutboxStatus outboxStatus) { + orderOutboxJpaRepository.deleteByTypeAndOutboxStatus(sagaType, outboxStatus); + } +} diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/entity/OrderOutboxEntity.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/entity/OrderOutboxEntity.java new file mode 100644 index 0000000..173e8e3 --- /dev/null +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/entity/OrderOutboxEntity.java @@ -0,0 +1,49 @@ +package com.food.order.system.payment.data.access.outobx.entity; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.valueobject.PaymentStatus; +import lombok.*; + +import javax.persistence.*; +import java.time.ZonedDateTime; +import java.util.Objects; +import java.util.UUID; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "order_outbox") +@Entity +public class OrderOutboxEntity { + + @Id + private UUID id; + private UUID sagaId; + private ZonedDateTime createdAt; + private ZonedDateTime processedAt; + private String type; + private String payload; + @Enumerated(EnumType.STRING) + private OutboxStatus outboxStatus; + @Enumerated(EnumType.STRING) + private PaymentStatus paymentStatus; + @Version + private int version; + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OrderOutboxEntity that = (OrderOutboxEntity) o; + return id.equals(that.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} + diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/exception/OrderOutboxNotFoundException.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/exception/OrderOutboxNotFoundException.java new file mode 100644 index 0000000..48ade07 --- /dev/null +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/exception/OrderOutboxNotFoundException.java @@ -0,0 +1,8 @@ +package com.food.order.system.payment.data.access.outobx.exception; + +public class OrderOutboxNotFoundException extends RuntimeException { + + public OrderOutboxNotFoundException(String message) { + super(message); + } +} diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/mapper/OrderOutboxDataAccessMapper.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/mapper/OrderOutboxDataAccessMapper.java new file mode 100644 index 0000000..a6ed8c8 --- /dev/null +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/mapper/OrderOutboxDataAccessMapper.java @@ -0,0 +1,37 @@ +package com.food.order.system.payment.data.access.outobx.mapper; + + +import com.food.order.system.payment.application.service.outbox.model.OrderOutboxMessage; +import com.food.order.system.payment.data.access.outobx.entity.OrderOutboxEntity; +import org.springframework.stereotype.Component; + +@Component +public class OrderOutboxDataAccessMapper { + + public OrderOutboxEntity orderOutboxMessageToOutboxEntity(OrderOutboxMessage orderOutboxMessage) { + return OrderOutboxEntity.builder() + .id(orderOutboxMessage.getId()) + .sagaId(orderOutboxMessage.getSagaId()) + .createdAt(orderOutboxMessage.getCreatedAt()) + .type(orderOutboxMessage.getType()) + .payload(orderOutboxMessage.getPayload()) + .outboxStatus(orderOutboxMessage.getOutboxStatus()) + .paymentStatus(orderOutboxMessage.getPaymentStatus()) + .version(orderOutboxMessage.getVersion()) + .build(); + } + + public OrderOutboxMessage orderOutboxEntityToOrderOutboxMessage(OrderOutboxEntity paymentOutboxEntity) { + return OrderOutboxMessage.builder() + .id(paymentOutboxEntity.getId()) + .sagaId(paymentOutboxEntity.getSagaId()) + .createdAt(paymentOutboxEntity.getCreatedAt()) + .type(paymentOutboxEntity.getType()) + .payload(paymentOutboxEntity.getPayload()) + .outboxStatus(paymentOutboxEntity.getOutboxStatus()) + .paymentStatus(paymentOutboxEntity.getPaymentStatus()) + .version(paymentOutboxEntity.getVersion()) + .build(); + } + +} diff --git a/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/repository/OrderOutboxJpaRepository.java b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/repository/OrderOutboxJpaRepository.java new file mode 100644 index 0000000..e67f7f6 --- /dev/null +++ b/payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/outobx/repository/OrderOutboxJpaRepository.java @@ -0,0 +1,26 @@ +package com.food.order.system.payment.data.access.outobx.repository; + + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.payment.data.access.outobx.entity.OrderOutboxEntity; +import com.food.order.system.valueobject.PaymentStatus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface OrderOutboxJpaRepository extends JpaRepository { + + Optional> findByTypeAndOutboxStatus(String type, OutboxStatus outboxStatus); + + Optional findByTypeAndSagaIdAndPaymentStatusAndOutboxStatus(String type, + UUID sagaId, + PaymentStatus paymentStatus, + OutboxStatus outboxStatus); + + void deleteByTypeAndOutboxStatus(String type, OutboxStatus outboxStatus); + +} diff --git a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java index 8f046bb..d40a01c 100644 --- a/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java +++ b/payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java @@ -13,6 +13,7 @@ import com.food.order.system.payment.service.domain.PaymentDomainService; import com.food.order.system.payment.service.domain.entity.CreditEntry; import com.food.order.system.payment.service.domain.entity.CreditHistory; import com.food.order.system.payment.service.domain.entity.Payment; +import com.food.order.system.payment.service.domain.exception.PaymentNotFoundException; import com.food.order.system.valueobject.CustomerId; import com.food.order.system.valueobject.PaymentStatus; import lombok.RequiredArgsConstructor; @@ -62,10 +63,6 @@ public class PaymentRequestHelper { paymentEvent.getPayment().getStatus(), OutboxStatus.STARTED, UUID.fromString(paymentRequest.getSagaId())); - - - - } private boolean publishIfOutboxMessageProcessedForPayment(PaymentRequest paymentRequest, @@ -91,7 +88,7 @@ public class PaymentRequestHelper { log.info("Received payment cancel event for id : {}", paymentRequest.getOrderId()); var payment = paymentRepository.findByOrderId (UUID.fromString(paymentRequest.getOrderId())).orElseThrow( - () -> new PaymentApplicationServiceException("Payment not found")); + () -> new PaymentNotFoundException("Payment not found")); var creditEntry = getCreditEntry(payment.getCustomerId()); var creditHistory = getCreditHistory(payment.getCustomerId()); List failureMessage = new ArrayList<>(); diff --git a/payment-service/payment-messaging/pom.xml b/payment-service/payment-messaging/pom.xml index cd274e4..67b72b5 100644 --- a/payment-service/payment-messaging/pom.xml +++ b/payment-service/payment-messaging/pom.xml @@ -31,5 +31,10 @@ com.food.order kafka-model + + + org.postgresql + postgresql + \ No newline at end of file diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/listener/kafka/PaymentRequestKafkaListener.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/listener/kafka/PaymentRequestKafkaListener.java index 00787cf..1adf019 100644 --- a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/listener/kafka/PaymentRequestKafkaListener.java +++ b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/listener/kafka/PaymentRequestKafkaListener.java @@ -2,18 +2,24 @@ package com.food.order.system.payment.messaging.listener.kafka; import com.food.order.system.kafka.consumer.KafkaConsumer; import com.food.order.system.kafka.order.avro.model.PaymentRequestAvroModel; +import com.food.order.system.payment.application.service.exception.PaymentApplicationServiceException; import com.food.order.system.payment.application.service.ports.input.message.listener.PaymentRequestMessageListener; import com.food.order.system.payment.messaging.mapper.PaymentMessagingDataMapper; +import com.food.order.system.payment.service.domain.exception.PaymentNotFoundException; import com.food.order.system.valueobject.PaymentOrderStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.postgresql.util.PSQLState; +import org.springframework.dao.DataAccessException; 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 java.sql.SQLException; import java.util.List; +import java.util.Objects; @Component @Slf4j @@ -38,14 +44,33 @@ public class PaymentRequestKafkaListener implements KafkaConsumer { - if (PaymentOrderStatus.PENDING.name().equalsIgnoreCase(paymentRequestAvroModel.getPaymentOrderStatus().name())) { - log.info("Processing payment for order id: {}", paymentRequestAvroModel.getOrderId()); - paymentRequestMessageListener.completePayment(paymentMessagingDataMapper - .paymentRequestAvroModelToPaymentRequest(paymentRequestAvroModel)); - } else if(PaymentOrderStatus.CANCELLED.name().equalsIgnoreCase(paymentRequestAvroModel.getPaymentOrderStatus().name())) { - log.info("Cancelling payment for order id: {}", paymentRequestAvroModel.getOrderId()); - paymentRequestMessageListener.cancelPayment(paymentMessagingDataMapper - .paymentRequestAvroModelToPaymentRequest(paymentRequestAvroModel)); + try { + if (Objects.equals(PaymentOrderStatus.PENDING.name(), + paymentRequestAvroModel.getPaymentOrderStatus().name())) { + log.info("Processing payment for order id: {}", paymentRequestAvroModel.getOrderId()); + paymentRequestMessageListener.completePayment(paymentMessagingDataMapper + .paymentRequestAvroModelToPaymentRequest(paymentRequestAvroModel)); + } else if(PaymentOrderStatus.CANCELLED.name().equals + (paymentRequestAvroModel.getPaymentOrderStatus().name())) { + log.info("Cancelling payment for order id: {}", paymentRequestAvroModel.getOrderId()); + paymentRequestMessageListener.cancelPayment(paymentMessagingDataMapper + .paymentRequestAvroModelToPaymentRequest(paymentRequestAvroModel)); + } + } catch (DataAccessException e) { + SQLException sqlException = (SQLException) e.getRootCause(); + if (sqlException != null && sqlException.getSQLState() != null && + PSQLState.UNIQUE_VIOLATION.getState().equals(sqlException.getSQLState())) { + //NO-OP for unique constraint exception + log.error("Caught unique constraint exception with sql state: {} " + + "in PaymentRequestKafkaListener for order id: {}", + sqlException.getSQLState(), paymentRequestAvroModel.getOrderId()); + } else { + throw new PaymentApplicationServiceException("Throwing DataAccessException in" + + " PaymentRequestKafkaListener: " + e.getMessage(), e); + } + } catch (PaymentNotFoundException e) { + //NO-OP for PaymentNotFoundException + log.error("No payment found for order id: {}", paymentRequestAvroModel.getOrderId()); } }); diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/mapper/PaymentMessagingDataMapper.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/mapper/PaymentMessagingDataMapper.java index 83aee89..0057c4e 100644 --- a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/mapper/PaymentMessagingDataMapper.java +++ b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/mapper/PaymentMessagingDataMapper.java @@ -4,9 +4,7 @@ import com.food.order.system.kafka.order.avro.model.PaymentRequestAvroModel; import com.food.order.system.kafka.order.avro.model.PaymentResponseAvroModel; import com.food.order.system.kafka.order.avro.model.PaymentStatus; import com.food.order.system.payment.application.service.dto.PaymentRequest; -import com.food.order.system.payment.service.domain.event.PaymentCancelledEvent; -import com.food.order.system.payment.service.domain.event.PaymentCompletedEvent; -import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; +import com.food.order.system.payment.application.service.outbox.model.OrderEventPayload; import com.food.order.system.valueobject.PaymentOrderStatus; import org.springframework.stereotype.Component; @@ -15,47 +13,6 @@ import java.util.UUID; @Component public class PaymentMessagingDataMapper { - public PaymentResponseAvroModel paymentCompletedEventToPaymentResponseAvroModel(PaymentCompletedEvent paymentCompletedEvent) { - return PaymentResponseAvroModel.newBuilder() - .setId(UUID.randomUUID().toString()) - .setSagaId("") - .setPaymentId(paymentCompletedEvent.getPayment().getId().getValue().toString()) - .setCustomerId(paymentCompletedEvent.getPayment().getCustomerId().getValue().toString()) - .setOrderId(paymentCompletedEvent.getPayment().getOrderId().getValue().toString()) - .setPrice(paymentCompletedEvent.getPayment().getPrice().getAmount()) - .setCreatedAt(paymentCompletedEvent.getPayment().getCreatedAt().toInstant()) - .setPaymentStatus(PaymentStatus.valueOf(paymentCompletedEvent.getPayment().getStatus().name())) - .setFailureMessages(paymentCompletedEvent.getFailureMessages()) - .build(); - } - - public PaymentResponseAvroModel paymentCancelEventToPaymentResponseAvroModel(PaymentCancelledEvent paymentCancelledEvent) { - return PaymentResponseAvroModel.newBuilder() - .setId(UUID.randomUUID().toString()) - .setSagaId("") - .setPaymentId(paymentCancelledEvent.getPayment().getId().getValue().toString()) - .setCustomerId(paymentCancelledEvent.getPayment().getCustomerId().getValue().toString()) - .setOrderId(paymentCancelledEvent.getPayment().getOrderId().getValue().toString()) - .setPrice(paymentCancelledEvent.getPayment().getPrice().getAmount()) - .setCreatedAt(paymentCancelledEvent.getPayment().getCreatedAt().toInstant()) - .setPaymentStatus(PaymentStatus.valueOf(paymentCancelledEvent.getPayment().getStatus().name())) - .setFailureMessages(paymentCancelledEvent.getFailureMessages()) - .build(); - } - - public PaymentResponseAvroModel paymentFailedEventToPaymentResponseAvroModel(PaymentFailedEvent paymentFailedEvent) { - return PaymentResponseAvroModel.newBuilder() - .setId(UUID.randomUUID().toString()) - .setSagaId("") - .setPaymentId(paymentFailedEvent.getPayment().getId().getValue().toString()) - .setCustomerId(paymentFailedEvent.getPayment().getCustomerId().getValue().toString()) - .setOrderId(paymentFailedEvent.getPayment().getOrderId().getValue().toString()) - .setPrice(paymentFailedEvent.getPayment().getPrice().getAmount()) - .setCreatedAt(paymentFailedEvent.getPayment().getCreatedAt().toInstant()) - .setPaymentStatus(PaymentStatus.valueOf(paymentFailedEvent.getPayment().getStatus().name())) - .setFailureMessages(paymentFailedEvent.getFailureMessages()) - .build(); - } public PaymentRequest paymentRequestAvroModelToPaymentRequest(PaymentRequestAvroModel paymentRequestAvroModel) { return PaymentRequest.builder() @@ -69,6 +26,19 @@ public class PaymentMessagingDataMapper { .build(); } - + public PaymentResponseAvroModel orderEventPayloadToPaymentResponseAvroModel(String sagaId, + OrderEventPayload orderEventPayload) { + return PaymentResponseAvroModel.newBuilder() + .setId(UUID.randomUUID().toString()) + .setSagaId(sagaId) + .setPaymentId(orderEventPayload.getPaymentId()) + .setCustomerId(orderEventPayload.getCustomerId()) + .setOrderId(orderEventPayload.getOrderId()) + .setPrice(orderEventPayload.getPrice()) + .setCreatedAt(orderEventPayload.getCreatedAt().toInstant())//?? + .setPaymentStatus(PaymentStatus.valueOf(orderEventPayload.getPaymentStatus())) + .setFailureMessages(orderEventPayload.getFailureMessages()) + .build(); + } } diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCancelledKafkaMessagePublisher.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCancelledKafkaMessagePublisher.java deleted file mode 100644 index 7d92464..0000000 --- a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCancelledKafkaMessagePublisher.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.food.order.system.payment.messaging.publisher.kafka; - -import com.food.order.system.event.publisher.DomainEventPublisher; -import com.food.order.system.kafka.order.avro.model.PaymentResponseAvroModel; -import com.food.order.system.kafka.producer.KafkaMessageHelper; -import com.food.order.system.kafka.producer.service.KafkaProducer; -import com.food.order.system.payment.application.service.config.PaymentServiceConfigData; -import com.food.order.system.payment.messaging.mapper.PaymentMessagingDataMapper; -import com.food.order.system.payment.service.domain.event.PaymentCancelledEvent; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class PaymentCancelledKafkaMessagePublisher implements DomainEventPublisher { - - private final PaymentMessagingDataMapper paymentDataMapper; - private final KafkaProducer kafkaProducer; - private final PaymentServiceConfigData paymentServiceConfigData; - private final KafkaMessageHelper kafkaMessageHelper; - - - @Override - public void publish(PaymentCancelledEvent event) { - log.info("Publishing payment cancelled event to kafka"); - var orderId = event.getPayment().getOrderId().getValue().toString(); - try { - var paymentResponseAvroModel = - paymentDataMapper.paymentCancelEventToPaymentResponseAvroModel(event); - - kafkaProducer.send(paymentServiceConfigData.getPaymentResponseTopicName(), - orderId, - paymentResponseAvroModel, - kafkaMessageHelper.getKafkaCallBack( - paymentServiceConfigData.getPaymentResponseTopicName(), - paymentResponseAvroModel, - orderId, - "PaymentResponseAvroModel")); - - log.info("Published payment cancelled event to kafka"); - } catch (Exception e) { - log.error("Error while publishing payment cancelled event to kafka", e); - } - } -} diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCompletedKafkaMessagePublisher.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCompletedKafkaMessagePublisher.java deleted file mode 100644 index e8de915..0000000 --- a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCompletedKafkaMessagePublisher.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.food.order.system.payment.messaging.publisher.kafka; - -import com.food.order.system.event.publisher.DomainEventPublisher; -import com.food.order.system.kafka.order.avro.model.PaymentResponseAvroModel; -import com.food.order.system.kafka.producer.KafkaMessageHelper; -import com.food.order.system.kafka.producer.service.KafkaProducer; -import com.food.order.system.payment.application.service.config.PaymentServiceConfigData; -import com.food.order.system.payment.messaging.mapper.PaymentMessagingDataMapper; -import com.food.order.system.payment.service.domain.event.PaymentCompletedEvent; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class PaymentCompletedKafkaMessagePublisher implements DomainEventPublisher { - - private final PaymentMessagingDataMapper paymentDataMapper; - private final KafkaProducer kafkaProducer; - private final PaymentServiceConfigData paymentServiceConfigData; - - private final KafkaMessageHelper kafkaMessageHelper; - - - @Override - public void publish(PaymentCompletedEvent event) { - log.info("Publishing payment completed event to kafka"); - var orderId = event.getPayment().getOrderId().getValue().toString(); - try { - var paymentResponseAvroModel = - paymentDataMapper.paymentCompletedEventToPaymentResponseAvroModel(event); - - kafkaProducer.send(paymentServiceConfigData.getPaymentResponseTopicName(), - orderId, - paymentResponseAvroModel, - kafkaMessageHelper.getKafkaCallBack( - paymentServiceConfigData.getPaymentResponseTopicName(), - paymentResponseAvroModel, - orderId, - "PaymentResponseAvroModel")); - - log.info("Published payment completed event to kafka"); - } catch (Exception e) { - log.error("Error while publishing payment completed event to kafka", e); - } - } -} diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentEventKafkaPublisher.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentEventKafkaPublisher.java new file mode 100644 index 0000000..8986d2c --- /dev/null +++ b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentEventKafkaPublisher.java @@ -0,0 +1,61 @@ +package com.food.order.system.payment.messaging.publisher.kafka; + +import com.food.order.system.kafka.order.avro.model.PaymentResponseAvroModel; +import com.food.order.system.kafka.producer.KafkaMessageHelper; +import com.food.order.system.kafka.producer.service.KafkaProducer; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.payment.application.service.config.PaymentServiceConfigData; +import com.food.order.system.payment.application.service.outbox.model.OrderEventPayload; +import com.food.order.system.payment.application.service.outbox.model.OrderOutboxMessage; +import com.food.order.system.payment.application.service.ports.output.message.publisher.PaymentResponseMessagePublisher; +import com.food.order.system.payment.messaging.mapper.PaymentMessagingDataMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.function.BiConsumer; + +@Component +@Slf4j +@RequiredArgsConstructor +public class PaymentEventKafkaPublisher implements PaymentResponseMessagePublisher { + + private final PaymentMessagingDataMapper paymentMessagingDataMapper; + private final KafkaProducer kafkaProducer; + private final PaymentServiceConfigData paymentServiceConfigData; + private final KafkaMessageHelper kafkaMessageHelper; + + @Override + public void publish(OrderOutboxMessage message, + BiConsumer outboxCallback) { + + var payload = + kafkaMessageHelper.getOrderEventPayload(message.getPayload(), OrderEventPayload.class); + + var sagaId = message.getSagaId().toString(); + + log.info("Publishing payment response for order id: {}", sagaId); + + try { + var paymentResponseAvroModel = + paymentMessagingDataMapper.orderEventPayloadToPaymentResponseAvroModel(sagaId,payload); + + kafkaProducer.send(paymentServiceConfigData.getPaymentResponseTopicName(), + sagaId, paymentResponseAvroModel, + kafkaMessageHelper.getKafkaCallback( + paymentServiceConfigData.getPaymentResponseTopicName(), + paymentResponseAvroModel, + message, + outboxCallback, + payload.getOrderId(), + "PaymentResponseAvroModel" + )); + + log.info("PaymentResponseAvroModel sent to kafka for order id: {} and saga id: {}", + paymentResponseAvroModel.getOrderId(), sagaId); + } + catch (Exception e) { + log.error("Error while publishing payment response for order id: {}", sagaId, e); + } + } +} diff --git a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentFailedKafkaMessagePublisher.java b/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentFailedKafkaMessagePublisher.java deleted file mode 100644 index 1a599e9..0000000 --- a/payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentFailedKafkaMessagePublisher.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.food.order.system.payment.messaging.publisher.kafka; - -import com.food.order.system.event.publisher.DomainEventPublisher; -import com.food.order.system.kafka.order.avro.model.PaymentResponseAvroModel; -import com.food.order.system.kafka.producer.KafkaMessageHelper; -import com.food.order.system.kafka.producer.service.KafkaProducer; -import com.food.order.system.payment.application.service.config.PaymentServiceConfigData; -import com.food.order.system.payment.messaging.mapper.PaymentMessagingDataMapper; -import com.food.order.system.payment.service.domain.event.PaymentFailedEvent; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class PaymentFailedKafkaMessagePublisher implements DomainEventPublisher { - - private final PaymentMessagingDataMapper paymentDataMapper; - private final KafkaProducer kafkaProducer; - private final PaymentServiceConfigData paymentServiceConfigData; - - private final KafkaMessageHelper kafkaMessageHelper; - - - @Override - public void publish(PaymentFailedEvent event) { - log.info("Publishing payment failed event to kafka"); - var orderId = event.getPayment().getOrderId().getValue().toString(); - try { - var paymentResponseAvroModel = - paymentDataMapper.paymentFailedEventToPaymentResponseAvroModel(event); - - kafkaProducer.send(paymentServiceConfigData.getPaymentResponseTopicName(), - orderId, - paymentResponseAvroModel, - kafkaMessageHelper.getKafkaCallBack( - paymentServiceConfigData.getPaymentResponseTopicName(), - paymentResponseAvroModel, - orderId, - "PaymentResponseAvroModel")); - - log.info("Published payment failed event to kafka"); - } catch (Exception e) { - log.error("Error while publishing payment failed event to kafka", e); - } - } -} From 3626ed70de2e1f68a071e6330e7eb42b5fb52ae9 Mon Sep 17 00:00:00 2001 From: Ali CANLI Date: Sat, 16 Jul 2022 22:55:17 +0300 Subject: [PATCH 4/4] Outbox Message and Scheduler class implemented part - 6 and finish. --- .../src/main/resources/application.yml | 2 + .../src/main/resources/init-data.sql | 20 ++-- .../src/main/resources/init-schema.sql | 81 ++++++++++------ .../restaurant-dataaccess/pom.xml | 5 +- .../adapter/OrderOutboxRepositoryImpl.java | 54 +++++++++++ .../outbox/entity/OrderOutboxEntity.java | 48 ++++++++++ .../OrderOutboxNotFoundException.java | 8 ++ .../mapper/OrderOutboxDataAccessMapper.java | 36 +++++++ .../repository/OrderOutboxJpaRepository.java | 21 +++++ .../restaurant-application-service/pom.xml | 13 ++- .../RestaurantApprovalRequestHelper.java | 64 ++++++++----- ...antApprovalRequestMessageListenerImpl.java | 3 +- .../service/mapper/RestaurantDataMapper.java | 14 ++- .../outbox/model/OrderEventPayload.java | 32 +++++++ .../outbox/model/OrderOutboxMessage.java | 29 ++++++ .../OrderOutboxCleanerScheduler.java | 34 +++++++ .../outbox/scheduler/OrderOutboxHelper.java | 93 +++++++++++++++++++ .../scheduler/OrderOutboxScheduler.java | 46 +++++++++ .../OrderApprovedMessagePublisher.java | 8 -- .../OrderRejectedMessagePublisher.java | 8 -- ...urantApprovalResponseMessagePublisher.java | 12 +++ .../repository/OrderOutboxRepository.java | 22 +++++ .../domain/core/RestaurantDomainService.java | 7 +- .../core/RestaurantDomainServiceImpl.java | 9 +- .../domain/core/event/OrderApprovedEvent.java | 12 +-- .../domain/core/event/OrderRejectedEvent.java | 10 +- .../mapper/RestaurantMessagingDataMapper.java | 45 +++------ .../OrderRejectedKafkaMessagePublisher.java | 53 ----------- ...estaurantApprovalEventKafkaPublisher.java} | 43 ++++++--- 29 files changed, 620 insertions(+), 212 deletions(-) create mode 100644 restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/adapter/OrderOutboxRepositoryImpl.java create mode 100644 restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/entity/OrderOutboxEntity.java create mode 100644 restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/exception/OrderOutboxNotFoundException.java create mode 100644 restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/mapper/OrderOutboxDataAccessMapper.java create mode 100644 restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/repository/OrderOutboxJpaRepository.java create mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/model/OrderEventPayload.java create mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/model/OrderOutboxMessage.java create mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxCleanerScheduler.java create mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxHelper.java create mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxScheduler.java delete mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/OrderApprovedMessagePublisher.java delete mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/OrderRejectedMessagePublisher.java create mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/RestaurantApprovalResponseMessagePublisher.java create mode 100644 restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/OrderOutboxRepository.java delete mode 100644 restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderRejectedKafkaMessagePublisher.java rename restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/{OrderApprovedKafkaMessagePublisher.java => RestaurantApprovalEventKafkaPublisher.java} (51%) diff --git a/restaurant-service/restaurant-container/src/main/resources/application.yml b/restaurant-service/restaurant-container/src/main/resources/application.yml index 8e36e2f..2d20c61 100644 --- a/restaurant-service/restaurant-container/src/main/resources/application.yml +++ b/restaurant-service/restaurant-container/src/main/resources/application.yml @@ -8,6 +8,8 @@ logging: restaurant-service: restaurant-approval-request-topic-name: restaurant-approval-request-value restaurant-approval-response-topic-name: restaurant-approval-response-value + outbox-scheduler-fixed-rate: 10000 + outbox-scheduler-initial-delay: 10000 spring: jpa: diff --git a/restaurant-service/restaurant-container/src/main/resources/init-data.sql b/restaurant-service/restaurant-container/src/main/resources/init-data.sql index 6311c69..5307e48 100644 --- a/restaurant-service/restaurant-container/src/main/resources/init-data.sql +++ b/restaurant-service/restaurant-container/src/main/resources/init-data.sql @@ -1,22 +1,22 @@ INSERT INTO restaurant.restaurants(id, name, active) - VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb45', 'restaurant_1', TRUE); +VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb45', 'restaurant_1', TRUE); INSERT INTO restaurant.restaurants(id, name, active) - VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb46', 'restaurant_2', FALSE); +VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb46', 'restaurant_2', FALSE); INSERT INTO restaurant.products(id, name, price, available) - VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb47', 'product_1', 25.00, FALSE); +VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb47', 'product_1', 25.00, FALSE); INSERT INTO restaurant.products(id, name, price, available) - VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb48', 'product_2', 50.00, TRUE); +VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb48', 'product_2', 50.00, TRUE); INSERT INTO restaurant.products(id, name, price, available) - VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb49', 'product_3', 20.00, FALSE); +VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb49', 'product_3', 20.00, FALSE); INSERT INTO restaurant.products(id, name, price, available) - VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb50', 'product_4', 40.00, TRUE); +VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb50', 'product_4', 40.00, TRUE); INSERT INTO restaurant.restaurant_products(id, restaurant_id, product_id) - VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb51', 'd215b5f8-0249-4dc5-89a3-51fd148cfb45', 'd215b5f8-0249-4dc5-89a3-51fd148cfb47'); +VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb51', 'd215b5f8-0249-4dc5-89a3-51fd148cfb45', 'd215b5f8-0249-4dc5-89a3-51fd148cfb47'); INSERT INTO restaurant.restaurant_products(id, restaurant_id, product_id) - VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb52', 'd215b5f8-0249-4dc5-89a3-51fd148cfb45', 'd215b5f8-0249-4dc5-89a3-51fd148cfb48'); +VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb52', 'd215b5f8-0249-4dc5-89a3-51fd148cfb45', 'd215b5f8-0249-4dc5-89a3-51fd148cfb48'); INSERT INTO restaurant.restaurant_products(id, restaurant_id, product_id) - VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb53', 'd215b5f8-0249-4dc5-89a3-51fd148cfb46', 'd215b5f8-0249-4dc5-89a3-51fd148cfb49'); +VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb53', 'd215b5f8-0249-4dc5-89a3-51fd148cfb46', 'd215b5f8-0249-4dc5-89a3-51fd148cfb49'); INSERT INTO restaurant.restaurant_products(id, restaurant_id, product_id) - VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb54', 'd215b5f8-0249-4dc5-89a3-51fd148cfb46', 'd215b5f8-0249-4dc5-89a3-51fd148cfb50'); +VALUES ('d215b5f8-0249-4dc5-89a3-51fd148cfb54', 'd215b5f8-0249-4dc5-89a3-51fd148cfb46', 'd215b5f8-0249-4dc5-89a3-51fd148cfb50'); 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 8f47d26..ef0fadd 100644 --- a/restaurant-service/restaurant-container/src/main/resources/init-schema.sql +++ b/restaurant-service/restaurant-container/src/main/resources/init-schema.sql @@ -52,34 +52,61 @@ CREATE TABLE restaurant.restaurant_products ALTER TABLE restaurant.restaurant_products ADD CONSTRAINT "FK_RESTAURANT_ID" FOREIGN KEY (restaurant_id) - REFERENCES restaurant.restaurants (id) MATCH SIMPLE - ON UPDATE NO ACTION - ON DELETE RESTRICT - NOT VALID; + REFERENCES restaurant.restaurants (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE RESTRICT + NOT VALID; ALTER TABLE restaurant.restaurant_products ADD CONSTRAINT "FK_PRODUCT_ID" FOREIGN KEY (product_id) - REFERENCES restaurant.products (id) MATCH SIMPLE - ON UPDATE NO ACTION - ON DELETE RESTRICT - NOT VALID; + REFERENCES restaurant.products (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE RESTRICT + NOT VALID; + +DROP TYPE IF EXISTS outbox_status; +CREATE TYPE outbox_status AS ENUM ('STARTED', 'COMPLETED', 'FAILED'); + +DROP TABLE IF EXISTS restaurant.order_outbox CASCADE; + +CREATE TABLE restaurant.order_outbox +( + id uuid NOT NULL, + saga_id uuid NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL, + processed_at TIMESTAMP WITH TIME ZONE, + type character varying COLLATE pg_catalog."default" NOT NULL, + payload jsonb NOT NULL, + outbox_status outbox_status NOT NULL, + approval_status approval_status NOT NULL, + version integer NOT NULL, + CONSTRAINT order_outbox_pkey PRIMARY KEY (id) +); + +CREATE INDEX "restaurant_order_outbox_saga_status" + ON "restaurant".order_outbox + (type, approval_status); + +CREATE UNIQUE INDEX "restaurant_order_outbox_saga_id" + ON "restaurant".order_outbox + (type, saga_id, approval_status, outbox_status); DROP MATERIALIZED VIEW IF EXISTS restaurant.order_restaurant_m_view; CREATE MATERIALIZED VIEW restaurant.order_restaurant_m_view -TABLESPACE pg_default + TABLESPACE pg_default AS - SELECT r.id AS restaurant_id, - r.name AS restaurant_name, - r.active AS restaurant_active, - p.id AS product_id, - p.name AS product_name, - p.price AS product_price, - p.available AS product_active - FROM restaurant.restaurants r, - restaurant.products p, - restaurant.restaurant_products rp - WHERE r.id = rp.restaurant_id AND p.id = rp.product_id +SELECT r.id AS restaurant_id, + r.name AS restaurant_name, + r.active AS restaurant_active, + p.id AS product_id, + p.name AS product_name, + p.price AS product_price, + p.available AS product_available +FROM restaurant.restaurants r, + restaurant.products p, + restaurant.restaurant_products rp +WHERE r.id = rp.restaurant_id AND p.id = rp.product_id WITH DATA; refresh materialized VIEW restaurant.order_restaurant_m_view; @@ -87,17 +114,17 @@ refresh materialized VIEW restaurant.order_restaurant_m_view; DROP function IF EXISTS restaurant.refresh_order_restaurant_m_view; CREATE OR replace function restaurant.refresh_order_restaurant_m_view() -returns trigger + returns trigger AS ' -BEGIN - refresh materialized VIEW restaurant.order_restaurant_m_view; - return null; -END; + BEGIN + refresh materialized VIEW restaurant.order_restaurant_m_view; + return null; + END; ' LANGUAGE plpgsql; DROP trigger IF EXISTS refresh_order_restaurant_m_view ON restaurant.restaurant_products; CREATE trigger refresh_order_restaurant_m_view -after INSERT OR UPDATE OR DELETE OR truncate -ON restaurant.restaurant_products FOR each statement + after INSERT OR UPDATE OR DELETE OR truncate + ON restaurant.restaurant_products FOR each statement EXECUTE PROCEDURE restaurant.refresh_order_restaurant_m_view(); \ No newline at end of file diff --git a/restaurant-service/restaurant-dataaccess/pom.xml b/restaurant-service/restaurant-dataaccess/pom.xml index 0d8bc00..9d01c63 100644 --- a/restaurant-service/restaurant-dataaccess/pom.xml +++ b/restaurant-service/restaurant-dataaccess/pom.xml @@ -18,7 +18,10 @@ com.food.order restaurant-application-service - + + com.food.order + outbox + org.springframework.boot spring-boot-starter-data-jpa diff --git a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/adapter/OrderOutboxRepositoryImpl.java b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/adapter/OrderOutboxRepositoryImpl.java new file mode 100644 index 0000000..0655ac1 --- /dev/null +++ b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/adapter/OrderOutboxRepositoryImpl.java @@ -0,0 +1,54 @@ +package com.food.order.system.data.access.restaurant.outbox.adapter; + + +import com.food.order.system.data.access.restaurant.outbox.exception.OrderOutboxNotFoundException; +import com.food.order.system.data.access.restaurant.outbox.mapper.OrderOutboxDataAccessMapper; +import com.food.order.system.data.access.restaurant.outbox.repository.OrderOutboxJpaRepository; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderOutboxMessage; +import com.food.order.system.restaurant.domain.service.ports.output.repository.OrderOutboxRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; + +@Component +@RequiredArgsConstructor +public class OrderOutboxRepositoryImpl implements OrderOutboxRepository { + + private final OrderOutboxJpaRepository orderOutboxJpaRepository; + private final OrderOutboxDataAccessMapper orderOutboxDataAccessMapper; + + @Override + public OrderOutboxMessage save(OrderOutboxMessage orderPaymentOutboxMessage) { + return orderOutboxDataAccessMapper + .orderOutboxEntityToOrderOutboxMessage(orderOutboxJpaRepository + .save(orderOutboxDataAccessMapper + .orderOutboxMessageToOutboxEntity(orderPaymentOutboxMessage))); + } + + @Override + public Optional> findByTypeAndOutboxStatus(String sagaType, OutboxStatus outboxStatus) { + return Optional.of(orderOutboxJpaRepository.findByTypeAndOutboxStatus(sagaType, outboxStatus) + .orElseThrow(() -> new OrderOutboxNotFoundException("Approval outbox object " + + "cannot be found for saga type " + sagaType)) + .stream() + .map(orderOutboxDataAccessMapper::orderOutboxEntityToOrderOutboxMessage) + .collect(Collectors.toList())); + } + + @Override + public Optional findByTypeAndSagaIdAndOutboxStatus(String type, UUID sagaId, + OutboxStatus outboxStatus) { + return orderOutboxJpaRepository.findByTypeAndSagaIdAndOutboxStatus(type, sagaId, outboxStatus) + .map(orderOutboxDataAccessMapper::orderOutboxEntityToOrderOutboxMessage); + } + + @Override + public void deleteByTypeAndOutboxStatus(String type, OutboxStatus outboxStatus) { + orderOutboxJpaRepository.deleteByTypeAndOutboxStatus(type, outboxStatus); + } +} diff --git a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/entity/OrderOutboxEntity.java b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/entity/OrderOutboxEntity.java new file mode 100644 index 0000000..2c31a7e --- /dev/null +++ b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/entity/OrderOutboxEntity.java @@ -0,0 +1,48 @@ +package com.food.order.system.data.access.restaurant.outbox.entity; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.valueobject.OrderApprovalStatus; +import lombok.*; + +import javax.persistence.*; +import java.time.ZonedDateTime; +import java.util.Objects; +import java.util.UUID; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "order_outbox") +@Entity +public class OrderOutboxEntity { + + @Id + private UUID id; + private UUID sagaId; + private ZonedDateTime createdAt; + private ZonedDateTime processedAt; + private String type; + private String payload; + @Enumerated(EnumType.STRING) + private OutboxStatus outboxStatus; + @Enumerated(EnumType.STRING) + private OrderApprovalStatus approvalStatus; + private int version; + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OrderOutboxEntity that = (OrderOutboxEntity) o; + return id.equals(that.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} + diff --git a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/exception/OrderOutboxNotFoundException.java b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/exception/OrderOutboxNotFoundException.java new file mode 100644 index 0000000..b47c6e4 --- /dev/null +++ b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/exception/OrderOutboxNotFoundException.java @@ -0,0 +1,8 @@ +package com.food.order.system.data.access.restaurant.outbox.exception; + +public class OrderOutboxNotFoundException extends RuntimeException { + + public OrderOutboxNotFoundException(String message) { + super(message); + } +} diff --git a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/mapper/OrderOutboxDataAccessMapper.java b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/mapper/OrderOutboxDataAccessMapper.java new file mode 100644 index 0000000..929aabc --- /dev/null +++ b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/mapper/OrderOutboxDataAccessMapper.java @@ -0,0 +1,36 @@ +package com.food.order.system.data.access.restaurant.outbox.mapper; + +import com.food.order.system.data.access.restaurant.outbox.entity.OrderOutboxEntity; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderOutboxMessage; +import org.springframework.stereotype.Component; + +@Component +public class OrderOutboxDataAccessMapper { + + public OrderOutboxEntity orderOutboxMessageToOutboxEntity(OrderOutboxMessage orderOutboxMessage) { + return OrderOutboxEntity.builder() + .id(orderOutboxMessage.getId()) + .sagaId(orderOutboxMessage.getSagaId()) + .createdAt(orderOutboxMessage.getCreatedAt()) + .type(orderOutboxMessage.getType()) + .payload(orderOutboxMessage.getPayload()) + .outboxStatus(orderOutboxMessage.getOutboxStatus()) + .approvalStatus(orderOutboxMessage.getApprovalStatus()) + .version(orderOutboxMessage.getVersion()) + .build(); + } + + public OrderOutboxMessage orderOutboxEntityToOrderOutboxMessage(OrderOutboxEntity paymentOutboxEntity) { + return OrderOutboxMessage.builder() + .id(paymentOutboxEntity.getId()) + .sagaId(paymentOutboxEntity.getSagaId()) + .createdAt(paymentOutboxEntity.getCreatedAt()) + .type(paymentOutboxEntity.getType()) + .payload(paymentOutboxEntity.getPayload()) + .outboxStatus(paymentOutboxEntity.getOutboxStatus()) + .approvalStatus(paymentOutboxEntity.getApprovalStatus()) + .version(paymentOutboxEntity.getVersion()) + .build(); + } + +} diff --git a/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/repository/OrderOutboxJpaRepository.java b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/repository/OrderOutboxJpaRepository.java new file mode 100644 index 0000000..daa3d17 --- /dev/null +++ b/restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/outbox/repository/OrderOutboxJpaRepository.java @@ -0,0 +1,21 @@ +package com.food.order.system.data.access.restaurant.outbox.repository; + +import com.food.order.system.data.access.restaurant.outbox.entity.OrderOutboxEntity; +import com.food.order.system.outbox.OutboxStatus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface OrderOutboxJpaRepository extends JpaRepository { + + Optional> findByTypeAndOutboxStatus(String type, OutboxStatus outboxStatus); + + Optional findByTypeAndSagaIdAndOutboxStatus(String type, UUID sagaId, OutboxStatus outboxStatus); + + void deleteByTypeAndOutboxStatus(String type, OutboxStatus outboxStatus); + +} diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/pom.xml b/restaurant-service/restaurant-domain/restaurant-application-service/pom.xml index 8a10a47..613a838 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/pom.xml +++ b/restaurant-service/restaurant-domain/restaurant-application-service/pom.xml @@ -33,7 +33,18 @@ org.springframework spring-tx - + + com.food.order + outbox + + + com.food.order + saga + + + org.springframework.boot + spring-boot-starter-json + \ No newline at end of file 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 index 3dc7de2..3a5f9d6 100644 --- 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 @@ -1,16 +1,19 @@ package com.food.order.system.restaurant.domain.service; +import com.food.order.system.outbox.OutboxStatus; 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.outbox.model.OrderOutboxMessage; +import com.food.order.system.restaurant.domain.service.outbox.scheduler.OrderOutboxHelper; +import com.food.order.system.restaurant.domain.service.ports.output.message.publisher.RestaurantApprovalResponseMessagePublisher; 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.system.valueobject.OrderId; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -22,39 +25,40 @@ 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; + private final OrderOutboxHelper orderOutboxHelper; + private final RestaurantApprovalResponseMessagePublisher restaurantApprovalResponseMessagePublisher; - 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); + public void persistOrderApproval(RestaurantApprovalRequest restaurantApprovalRequest) { + if (publishIfOutboxMessageProcessed(restaurantApprovalRequest)) { + log.info("An outbox message with saga id: {} already saved to database!", + restaurantApprovalRequest.getSagaId()); + return; + } + log.info("Processing restaurant approval for order id: {}", restaurantApprovalRequest.getOrderId()); + List failureMessages = new ArrayList<>(); + Restaurant restaurant = findRestaurant(restaurantApprovalRequest); + OrderApprovalEvent orderApprovalEvent = + restaurantDomainService.validateOrder( + restaurant, + failureMessages); orderApprovalRepository.save(restaurant.getOrderApproval()); - return event; + + orderOutboxHelper + .saveOrderOutboxMessage(restaurantDataMapper. + orderApprovalEventToOrderEventPayload(orderApprovalEvent), + orderApprovalEvent.getOrderApproval().getStatus(), + OutboxStatus.STARTED, + UUID.fromString(restaurantApprovalRequest.getSagaId())); } @@ -80,4 +84,16 @@ public class RestaurantApprovalRequestHelper { return restaurant; } + + private boolean publishIfOutboxMessageProcessed(RestaurantApprovalRequest restaurantApprovalRequest) { + Optional orderOutboxMessage = + orderOutboxHelper.getCompletedOrderOutboxMessageBySagaIdAndOutboxStatus(UUID + .fromString(restaurantApprovalRequest.getSagaId()), OutboxStatus.COMPLETED); + if (orderOutboxMessage.isPresent()) { + restaurantApprovalResponseMessagePublisher.publish(orderOutboxMessage.get(), + orderOutboxHelper::updateOutboxStatus); + return true; + } + return false; + } } diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 index eb2c020..431bc7c 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 @@ -14,7 +14,6 @@ public class RestaurantApprovalRequestMessageListenerImpl implements RestaurantA @Override public void approveOrder(RestaurantApprovalRequest request) { - var event = restaurantApprovalRequestHelper.persistOrderApproval(request); - event.fire(); + restaurantApprovalRequestHelper.persistOrderApproval(request); } } diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 index 9caa32f..fdf1ae7 100644 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 @@ -3,11 +3,13 @@ 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; 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.service.dto.RestaurantApprovalRequest; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderEventPayload; import com.food.order.system.valueobject.Money; import com.food.order.system.valueobject.OrderId; import com.food.order.system.valueobject.OrderStatus; import com.food.order.system.valueobject.RestaurantId; -import com.food.order.system.restaurant.domain.service.dto.RestaurantApprovalRequest; import org.springframework.stereotype.Component; import java.util.UUID; @@ -31,4 +33,14 @@ public class RestaurantDataMapper { .build()) .build(); } + public OrderEventPayload + orderApprovalEventToOrderEventPayload(OrderApprovalEvent orderApprovalEvent) { + return OrderEventPayload.builder() + .orderId(orderApprovalEvent.getOrderApproval().getOrderId().getValue().toString()) + .restaurantId(orderApprovalEvent.getRestaurantId().getValue().toString()) + .orderApprovalStatus(orderApprovalEvent.getOrderApproval().getStatus().name()) + .createdAt(orderApprovalEvent.getCreatedAt()) + .failureMessages(orderApprovalEvent.getFailureMessages()) + .build(); + } } diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/model/OrderEventPayload.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/model/OrderEventPayload.java new file mode 100644 index 0000000..3069877 --- /dev/null +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/model/OrderEventPayload.java @@ -0,0 +1,32 @@ +package com.food.order.system.restaurant.domain.service.outbox.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.time.ZonedDateTime; +import java.util.List; + +@Getter +@Builder +@AllArgsConstructor +public class OrderEventPayload { + + @JsonProperty + private String orderId; + + @JsonProperty + private String restaurantId; + + @JsonProperty + private ZonedDateTime createdAt; + + @JsonProperty + private String orderApprovalStatus; + + @JsonProperty + private List failureMessages; + + +} diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/model/OrderOutboxMessage.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/model/OrderOutboxMessage.java new file mode 100644 index 0000000..a4ed76f --- /dev/null +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/model/OrderOutboxMessage.java @@ -0,0 +1,29 @@ +package com.food.order.system.restaurant.domain.service.outbox.model; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.valueobject.OrderApprovalStatus; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.time.ZonedDateTime; +import java.util.UUID; + +@Getter +@Builder +@AllArgsConstructor +public class OrderOutboxMessage { + private UUID id; + private UUID sagaId; + private ZonedDateTime createdAt; + private ZonedDateTime processedAt; + private String type; + private String payload; + private OutboxStatus outboxStatus; + private OrderApprovalStatus approvalStatus; + private int version; + + public void setOutboxStatus(OutboxStatus status) { + this.outboxStatus = status; + } +} diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxCleanerScheduler.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxCleanerScheduler.java new file mode 100644 index 0000000..333f93c --- /dev/null +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxCleanerScheduler.java @@ -0,0 +1,34 @@ +package com.food.order.system.restaurant.domain.service.outbox.scheduler; + +import com.food.order.system.outbox.OutboxScheduler; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderOutboxMessage; +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.List; +import java.util.Optional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderOutboxCleanerScheduler implements OutboxScheduler { + + private final OrderOutboxHelper orderOutboxHelper; + @Transactional + @Scheduled(cron = "@midnight") + @Override + public void processOutboxMessage() { + Optional> outboxMessagesResponse = + orderOutboxHelper.getOrderOutboxMessageByOutboxStatus(OutboxStatus.COMPLETED); + if (outboxMessagesResponse.isPresent() && outboxMessagesResponse.get().size() > 0) { + List outboxMessages = outboxMessagesResponse.get(); + log.info("Received {} OrderOutboxMessage for clean-up!", outboxMessages.size()); + orderOutboxHelper.deleteOrderOutboxMessageByOutboxStatus(OutboxStatus.COMPLETED); + log.info("Deleted {} OrderOutboxMessage!", outboxMessages.size()); + } + } +} \ No newline at end of file diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxHelper.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxHelper.java new file mode 100644 index 0000000..e7eee61 --- /dev/null +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxHelper.java @@ -0,0 +1,93 @@ +package com.food.order.system.restaurant.domain.service.outbox.scheduler; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.restaurant.domain.core.exception.RestaurantDomainException; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderEventPayload; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderOutboxMessage; +import com.food.order.system.restaurant.domain.service.ports.output.repository.OrderOutboxRepository; +import com.food.order.system.valueobject.OrderApprovalStatus; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static com.food.order.system.DomainConstants.UTC; +import static com.food.order.system.outbox.order.SagaConst.ORDER_PROCESSING_SAGA; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderOutboxHelper { + + private final OrderOutboxRepository orderOutboxRepository; + private final ObjectMapper objectMapper; + + + @Transactional(readOnly = true) + public Optional getCompletedOrderOutboxMessageBySagaIdAndOutboxStatus(UUID sagaId, + OutboxStatus + outboxStatus) { + return orderOutboxRepository.findByTypeAndSagaIdAndOutboxStatus(ORDER_PROCESSING_SAGA, sagaId, outboxStatus); + } + + @Transactional(readOnly = true) + public Optional> getOrderOutboxMessageByOutboxStatus(OutboxStatus outboxStatus) { + return orderOutboxRepository.findByTypeAndOutboxStatus(ORDER_PROCESSING_SAGA, outboxStatus); + } + + @Transactional + public void deleteOrderOutboxMessageByOutboxStatus(OutboxStatus outboxStatus) { + orderOutboxRepository.deleteByTypeAndOutboxStatus(ORDER_PROCESSING_SAGA, outboxStatus); + } + + @Transactional + public void saveOrderOutboxMessage(OrderEventPayload orderEventPayload, + OrderApprovalStatus approvalStatus, + OutboxStatus outboxStatus, + UUID sagaId) { + save(OrderOutboxMessage.builder() + .id(UUID.randomUUID()) + .sagaId(sagaId) + .createdAt(orderEventPayload.getCreatedAt()) + .processedAt(ZonedDateTime.now(ZoneId.of(UTC))) + .type(ORDER_PROCESSING_SAGA) + .payload(createPayload(orderEventPayload)) + .approvalStatus(approvalStatus) + .outboxStatus(outboxStatus) + .build()); + } + + @Transactional + public void updateOutboxStatus(OrderOutboxMessage orderPaymentOutboxMessage, OutboxStatus outboxStatus) { + orderPaymentOutboxMessage.setOutboxStatus(outboxStatus); + save(orderPaymentOutboxMessage); + log.info("Order outbox table status is updated as: {}", outboxStatus.name()); + } + + private void save(OrderOutboxMessage orderPaymentOutboxMessage) { + OrderOutboxMessage response = orderOutboxRepository.save(orderPaymentOutboxMessage); + if (response == null) { + throw new RestaurantDomainException("Could not save OrderOutboxMessage!"); + } + log.info("OrderOutboxMessage saved with id: {}", orderPaymentOutboxMessage.getId()); + } + + private String createPayload(OrderEventPayload orderEventPayload) { + try { + return objectMapper.writeValueAsString(orderEventPayload); + } catch (JsonProcessingException e) { + log.error("Could not create OrderEventPayload json!", e); + throw new RestaurantDomainException("Could not create OrderEventPayload json!", e); + } + } + +} diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxScheduler.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxScheduler.java new file mode 100644 index 0000000..8df2b4d --- /dev/null +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/outbox/scheduler/OrderOutboxScheduler.java @@ -0,0 +1,46 @@ +package com.food.order.system.restaurant.domain.service.outbox.scheduler; + +import com.food.order.system.outbox.OutboxScheduler; +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderOutboxMessage; +import com.food.order.system.restaurant.domain.service.ports.output.message.publisher.RestaurantApprovalResponseMessagePublisher; +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.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class OrderOutboxScheduler implements OutboxScheduler { + + private final OrderOutboxHelper orderOutboxHelper; + private final RestaurantApprovalResponseMessagePublisher responseMessagePublisher; + + @Transactional + @Scheduled(fixedRateString = "${restaurant-service.outbox-scheduler-fixed-rate}", + initialDelayString = "${restaurant-service.outbox-scheduler-initial-delay}") + @Override + public void processOutboxMessage() { + Optional> outboxMessagesResponse = + orderOutboxHelper.getOrderOutboxMessageByOutboxStatus(OutboxStatus.STARTED); + if (outboxMessagesResponse.isPresent() && !outboxMessagesResponse.get().isEmpty()) { + List outboxMessages = outboxMessagesResponse.get(); + log.info("Received {} OrderOutboxMessage with ids {}, sending to message bus!", outboxMessages.size(), + outboxMessages.stream().map(outboxMessage -> + outboxMessage.getId().toString()).collect(Collectors.joining(","))); + outboxMessages.forEach(orderOutboxMessage -> + responseMessagePublisher.publish(orderOutboxMessage, + orderOutboxHelper::updateOutboxStatus)); + log.info("{} OrderOutboxMessage sent to message bus!", outboxMessages.size()); + } + } + + + +} \ No newline at end of file diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 deleted file mode 100644 index 004b435..0000000 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/OrderApprovedMessagePublisher.java +++ /dev/null @@ -1,8 +0,0 @@ -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.system.event.publisher.DomainEventPublisher; - -public interface OrderApprovedMessagePublisher extends DomainEventPublisher { -} - diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/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 deleted file mode 100644 index d6bbbfc..0000000 --- a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/OrderRejectedMessagePublisher.java +++ /dev/null @@ -1,8 +0,0 @@ -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.system.event.publisher.DomainEventPublisher; - -public interface OrderRejectedMessagePublisher extends DomainEventPublisher { -} - diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/RestaurantApprovalResponseMessagePublisher.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/RestaurantApprovalResponseMessagePublisher.java new file mode 100644 index 0000000..8a2f364 --- /dev/null +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/message/publisher/RestaurantApprovalResponseMessagePublisher.java @@ -0,0 +1,12 @@ +package com.food.order.system.restaurant.domain.service.ports.output.message.publisher; + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderOutboxMessage; + +import java.util.function.BiConsumer; + +public interface RestaurantApprovalResponseMessagePublisher { + + void publish(OrderOutboxMessage orderOutboxMessage, + BiConsumer outboxCallback); +} diff --git a/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/OrderOutboxRepository.java b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/OrderOutboxRepository.java new file mode 100644 index 0000000..9abf63b --- /dev/null +++ b/restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/OrderOutboxRepository.java @@ -0,0 +1,22 @@ +package com.food.order.system.restaurant.domain.service.ports.output.repository; + + +import com.food.order.system.outbox.OutboxStatus; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderOutboxMessage; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface OrderOutboxRepository { + + OrderOutboxMessage save(OrderOutboxMessage orderOutboxMessage); + + Optional> findByTypeAndOutboxStatus(String type, OutboxStatus outboxStatus); + + Optional findByTypeAndSagaIdAndOutboxStatus(String type, UUID sagaId, + OutboxStatus outboxStatus); + + void deleteByTypeAndOutboxStatus(String type, OutboxStatus outboxStatus); + +} diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainService.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainService.java index fbde8f2..d3bcaaa 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainService.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainService.java @@ -2,16 +2,11 @@ package com.food.order.system.restaurant.domain.core; 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.event.OrderApprovedEvent; -import com.food.order.system.restaurant.domain.core.event.OrderRejectedEvent; -import com.food.order.system.event.publisher.DomainEventPublisher; import java.util.List; public interface RestaurantDomainService { OrderApprovalEvent validateOrder(Restaurant restaurant, - List failureMessages, - DomainEventPublisher publisher, - DomainEventPublisher rejectedPublisher); + List failureMessages); } diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainServiceImpl.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainServiceImpl.java index 9943f81..17eb972 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainServiceImpl.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainServiceImpl.java @@ -4,7 +4,6 @@ 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.event.OrderApprovedEvent; import com.food.order.system.restaurant.domain.core.event.OrderRejectedEvent; -import com.food.order.system.event.publisher.DomainEventPublisher; import com.food.order.system.valueobject.OrderApprovalStatus; import lombok.extern.slf4j.Slf4j; @@ -19,21 +18,19 @@ public class RestaurantDomainServiceImpl implements RestaurantDomainService { @Override public OrderApprovalEvent validateOrder(Restaurant restaurant, - List failureMessages, - DomainEventPublisher publisher, - DomainEventPublisher rejectedPublisher) { + List failureMessages) { restaurant.validateOrder(failureMessages); log.info("Order validation with id {}", restaurant.getOrderDetail().getId()); if (failureMessages.isEmpty()) { log.info("Order validation with id {} is successful", restaurant.getOrderDetail().getId()); restaurant.constructOrderApproval(OrderApprovalStatus.APPROVED); return new OrderApprovedEvent(restaurant.getOrderApproval(), restaurant.getId(), - failureMessages, ZonedDateTime.now(ZoneId.of(UTC)), publisher); + failureMessages, ZonedDateTime.now(ZoneId.of(UTC))); } else { log.info("Order validation with id {} is failed", restaurant.getOrderDetail().getId()); restaurant.constructOrderApproval(OrderApprovalStatus.REJECTED); return new OrderRejectedEvent(restaurant.getOrderApproval(), restaurant.getId(), - failureMessages, ZonedDateTime.now(), rejectedPublisher); + failureMessages, ZonedDateTime.now()); } } diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovedEvent.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovedEvent.java index 347db3a..acd3b32 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovedEvent.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovedEvent.java @@ -1,7 +1,6 @@ package com.food.order.system.restaurant.domain.core.event; import com.food.order.system.restaurant.domain.core.entity.OrderApproval; -import com.food.order.system.event.publisher.DomainEventPublisher; import com.food.order.system.valueobject.RestaurantId; import java.time.ZonedDateTime; @@ -9,20 +8,11 @@ import java.util.List; public class OrderApprovedEvent extends OrderApprovalEvent { - - private final DomainEventPublisher publisher; - public OrderApprovedEvent(OrderApproval orderApproval, RestaurantId restaurantId, List failureMessages, - ZonedDateTime createdAt, - DomainEventPublisher publisher) { + ZonedDateTime createdAt) { super(orderApproval, restaurantId, failureMessages, createdAt); - this.publisher = publisher; } - @Override - public void fire() { - publisher.publish(this); - } } diff --git a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderRejectedEvent.java b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderRejectedEvent.java index faf3114..1715094 100644 --- a/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderRejectedEvent.java +++ b/restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderRejectedEvent.java @@ -9,19 +9,11 @@ import java.util.List; public class OrderRejectedEvent extends OrderApprovalEvent { - private final DomainEventPublisher publisher; public OrderRejectedEvent(OrderApproval orderApproval, RestaurantId restaurantId, List failureMessages, - ZonedDateTime createdAt, - DomainEventPublisher publisher) { + ZonedDateTime createdAt) { super(orderApproval, restaurantId, failureMessages, createdAt); - this.publisher = publisher; - } - - @Override - public void fire() { - publisher.publish(this); } } 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 ba99e1e..560b47d 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 @@ -5,11 +5,10 @@ import com.food.order.system.kafka.order.avro.model.OrderApprovalStatus; import com.food.order.system.kafka.order.avro.model.RestaurantApprovalRequestAvroModel; import com.food.order.system.kafka.order.avro.model.RestaurantApprovalResponseAvroModel; import com.food.order.system.restaurant.domain.core.entity.Product; -import com.food.order.system.restaurant.domain.core.event.OrderApprovedEvent; -import com.food.order.system.restaurant.domain.core.event.OrderRejectedEvent; +import com.food.order.system.restaurant.domain.service.dto.RestaurantApprovalRequest; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderEventPayload; import com.food.order.system.valueobject.ProductId; import com.food.order.system.valueobject.RestaurantOrderStatus; -import com.food.order.system.restaurant.domain.service.dto.RestaurantApprovalRequest; import org.springframework.stereotype.Component; import java.util.UUID; @@ -17,33 +16,6 @@ import java.util.stream.Collectors; @Component public class RestaurantMessagingDataMapper { - public RestaurantApprovalResponseAvroModel - orderApprovedEventToRestaurantApprovalResponseAvroModel(OrderApprovedEvent orderApprovedEvent) { - return RestaurantApprovalResponseAvroModel.newBuilder() - .setId(UUID.randomUUID().toString()) - .setSagaId("") - .setOrderId(orderApprovedEvent.getOrderApproval().getOrderId().getValue().toString()) - .setRestaurantId(orderApprovedEvent.getRestaurantId().getValue().toString()) - .setCreatedAt(orderApprovedEvent.getCreatedAt().toInstant()) - .setOrderApprovalStatus(OrderApprovalStatus.valueOf(orderApprovedEvent. - getOrderApproval().getStatus().name())) - .setFailureMessages(orderApprovedEvent.getFailureMessages()) - .build(); - } - - public RestaurantApprovalResponseAvroModel - orderRejectedEventToRestaurantApprovalResponseAvroModel(OrderRejectedEvent orderRejectedEvent) { - return RestaurantApprovalResponseAvroModel.newBuilder() - .setId(UUID.randomUUID().toString()) - .setSagaId("") - .setOrderId(orderRejectedEvent.getOrderApproval().getOrderId().getValue().toString()) - .setRestaurantId(orderRejectedEvent.getRestaurantId().getValue().toString()) - .setCreatedAt(orderRejectedEvent.getCreatedAt().toInstant()) - .setOrderApprovalStatus(OrderApprovalStatus.valueOf(orderRejectedEvent. - getOrderApproval().getStatus().name())) - .setFailureMessages(orderRejectedEvent.getFailureMessages()) - .build(); - } public RestaurantApprovalRequest restaurantApprovalRequestAvroModelToRestaurantApproval(RestaurantApprovalRequestAvroModel @@ -66,4 +38,17 @@ public class RestaurantMessagingDataMapper { .createdAt(restaurantApprovalRequestAvroModel.getCreatedAt()) .build(); } + + public RestaurantApprovalResponseAvroModel + orderEventPayloadToRestaurantApprovalResponseAvroModel(String sagaId, OrderEventPayload orderEventPayload) { + return RestaurantApprovalResponseAvroModel.newBuilder() + .setId(UUID.randomUUID().toString()) + .setSagaId(sagaId) + .setOrderId(orderEventPayload.getOrderId()) + .setRestaurantId(orderEventPayload.getRestaurantId()) + .setCreatedAt(orderEventPayload.getCreatedAt().toInstant()) + .setOrderApprovalStatus(OrderApprovalStatus.valueOf(orderEventPayload.getOrderApprovalStatus())) + .setFailureMessages(orderEventPayload.getFailureMessages()) + .build(); + } } 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 deleted file mode 100644 index 254a23b..0000000 --- a/restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderRejectedKafkaMessagePublisher.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.food.order.system.restaurant.messaging.publisher.kafka; - - -import com.food.order.system.kafka.order.avro.model.RestaurantApprovalResponseAvroModel; -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.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; - -@Slf4j -@RequiredArgsConstructor -@Component -public class OrderRejectedKafkaMessagePublisher implements OrderRejectedMessagePublisher { - - private final RestaurantMessagingDataMapper restaurantMessagingDataMapper; - private final KafkaProducer kafkaProducer; - private final RestaurantServiceConfigData restaurantServiceConfigData; - private final KafkaMessageHelper kafkaMessageHelper; - - - @Override - public void publish(OrderRejectedEvent orderRejectedEvent) { - String orderId = orderRejectedEvent.getOrderApproval().getOrderId().getValue().toString(); - - log.info("Received OrderRejectedEvent for order id: {}", orderId); - - try { - RestaurantApprovalResponseAvroModel restaurantApprovalResponseAvroModel = - restaurantMessagingDataMapper - .orderRejectedEventToRestaurantApprovalResponseAvroModel(orderRejectedEvent); - - kafkaProducer.send(restaurantServiceConfigData.getRestaurantApprovalResponseTopicName(), - orderId, - restaurantApprovalResponseAvroModel, - kafkaMessageHelper.getKafkaCallBack(restaurantServiceConfigData - .getRestaurantApprovalResponseTopicName(), - restaurantApprovalResponseAvroModel, - orderId, - "RestaurantApprovalResponseAvroModel")); - - log.info("RestaurantApprovalResponseAvroModel sent to kafka at: {}", System.nanoTime()); - } catch (Exception e) { - log.error("Error while sending RestaurantApprovalResponseAvroModel message" + - " to kafka with order id: {}, error: {}", orderId, e.getMessage()); - } - } - -} 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/RestaurantApprovalEventKafkaPublisher.java similarity index 51% rename from restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/OrderApprovedKafkaMessagePublisher.java rename to restaurant-service/restaurant-messaging/src/main/java/com/food/order/system/restaurant/messaging/publisher/kafka/RestaurantApprovalEventKafkaPublisher.java index 001b530..b91ed5d 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/RestaurantApprovalEventKafkaPublisher.java @@ -1,21 +1,24 @@ package com.food.order.system.restaurant.messaging.publisher.kafka; - import com.food.order.system.kafka.order.avro.model.RestaurantApprovalResponseAvroModel; 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.order.system.outbox.OutboxStatus; import com.food.order.system.restaurant.domain.service.config.RestaurantServiceConfigData; -import com.food.order.system.restaurant.domain.service.ports.output.message.publisher.OrderApprovedMessagePublisher; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderEventPayload; +import com.food.order.system.restaurant.domain.service.outbox.model.OrderOutboxMessage; +import com.food.order.system.restaurant.domain.service.ports.output.message.publisher.RestaurantApprovalResponseMessagePublisher; +import com.food.order.system.restaurant.messaging.mapper.RestaurantMessagingDataMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.function.BiConsumer; + @Slf4j -@Component @RequiredArgsConstructor -public class OrderApprovedKafkaMessagePublisher implements OrderApprovedMessagePublisher { +@Component +public class RestaurantApprovalEventKafkaPublisher implements RestaurantApprovalResponseMessagePublisher { private final RestaurantMessagingDataMapper restaurantMessagingDataMapper; private final KafkaProducer kafkaProducer; @@ -24,29 +27,39 @@ public class OrderApprovedKafkaMessagePublisher implements OrderApprovedMessageP @Override - public void publish(OrderApprovedEvent orderApprovedEvent) { - String orderId = orderApprovedEvent.getOrderApproval().getOrderId().getValue().toString(); + public void publish(OrderOutboxMessage orderOutboxMessage, + BiConsumer outboxCallback) { + OrderEventPayload orderEventPayload = + kafkaMessageHelper.getOrderEventPayload(orderOutboxMessage.getPayload(), + OrderEventPayload.class); - log.info("Received OrderApprovedEvent for order id: {}", orderId); + String sagaId = orderOutboxMessage.getSagaId().toString(); + log.info("Received OrderOutboxMessage for order id: {} and saga id: {}", + orderEventPayload.getOrderId(), + sagaId); try { RestaurantApprovalResponseAvroModel restaurantApprovalResponseAvroModel = restaurantMessagingDataMapper - .orderApprovedEventToRestaurantApprovalResponseAvroModel(orderApprovedEvent); + .orderEventPayloadToRestaurantApprovalResponseAvroModel(sagaId, orderEventPayload); kafkaProducer.send(restaurantServiceConfigData.getRestaurantApprovalResponseTopicName(), - orderId, + sagaId, restaurantApprovalResponseAvroModel, - kafkaMessageHelper.getKafkaCallBack(restaurantServiceConfigData + kafkaMessageHelper.getKafkaCallback(restaurantServiceConfigData .getRestaurantApprovalResponseTopicName(), restaurantApprovalResponseAvroModel, - orderId, + orderOutboxMessage, + outboxCallback, + orderEventPayload.getOrderId(), "RestaurantApprovalResponseAvroModel")); - log.info("RestaurantApprovalResponseAvroModel sent to kafka at: {}", System.nanoTime()); + log.info("RestaurantApprovalResponseAvroModel sent to kafka for order id: {} and saga id: {}", + restaurantApprovalResponseAvroModel.getOrderId(), sagaId); } catch (Exception e) { log.error("Error while sending RestaurantApprovalResponseAvroModel message" + - " to kafka with order id: {}, error: {}", orderId, e.getMessage()); + " to kafka with order id: {} and saga id: {}, error: {}", + orderEventPayload.getOrderId(), sagaId, e.getMessage()); } }