Outbox Message and Scheduler class implemented part - 2.
This commit is contained in:
337
.idea/sonarlint/issuestore/index.pb
generated
337
.idea/sonarlint/issuestore/index.pb
generated
@@ -7,27 +7,322 @@ U
|
||||
%order-service/order-container/pom.xml,5\e\5edc4f773e0205d9c5812143cbbd1132b3c3de4c
|
||||
O
|
||||
order-service/order-app/pom.xml,2\5\255f6fd0140e765f25a0c5ea7d6c33af3bb1ecec
|
||||
U
|
||||
%order-service/order-messaging/pom.xml,c\1\c19aa6db8e37c3805307311ca17ddea372646d36
|
||||
R
|
||||
"order-service/order-domain/pom.xml,6\c\6c488d4235eb8af9fe6c7a0dcd6d396f5fb3b9db
|
||||
L
|
||||
common/common-domain/pom.xml,3\e\3ebe72cff67b25b3f376cc963b57146cc5d43487
|
||||
>
|
||||
common/pom.xml,4\8\488bdbea7e8b73c44bd2a54e63f6012f10969196
|
||||
7
|
||||
pom.xml,4\4\442292b8a7efeabbe4cc176709b833b1792140ec
|
||||
<EFBFBD>
|
||||
vorder-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/StreetAddress.java,f\7\f74133100119166e8b876daa424b93e0d64b9b80
|
||||
<EFBFBD>
|
||||
sorder-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/entity/CustomerEntity.java,a\3\a3d0249dc9ec483df31a5f520a586bcdbe6f777c
|
||||
<EFBFBD>
|
||||
~order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/repository/CustomerJPARepository.java,5\4\548371b5e6ebbbbe24b839de042f70fc2f764316
|
||||
<EFBFBD>
|
||||
xorder-service/order-data-access/src/main/java/com/food/order/system/data/access/order/repository/OrderJpaRepository.java,4\0\40da9fb64727cbca8732bf490a71748e13ad2197
|
||||
E
|
||||
order-service/pom.xml,d\3\d3bf53ecc442740843266a635cbfe9807b992566
|
||||
<EFBFBD>
|
||||
Qcommon/common-domain/src/main/java/com/food/order/domain/valueobject/OrderId.java,7\3\73533e03c456839a625223f6070a82fe26a051d1
|
||||
<EFBFBD>
|
||||
Rcommon/common-domain/src/main/java/com/food/order/sysyem/entity/AggregateRoot.java,c\c\cc687f6a595bab80c5e573f18747043940db2e05
|
||||
|
||||
Ocommon/common-domain/src/main/java/com/food/order/domain/valueobject/Money.java,1\9\19055dd2bdebc31a1868d96dadab8510f24e71ee
|
||||
<EFBFBD>
|
||||
Ucommon/common-domain/src/main/java/com/food/order/domain/valueobject/OrderStatus.java,6\a\6a4ab22cb9f8e43dd5b01a714d3f60035154029f
|
||||
<EFBFBD>
|
||||
Scommon/common-domain/src/main/java/com/food/order/domain/valueobject/ProductId.java,9\0\90ca37cd91bd840352dc5fe9846f4b160b829982
|
||||
<EFBFBD>
|
||||
Vcommon/common-domain/src/main/java/com/food/order/domain/valueobject/RestaurantId.java,b\d\bd99e8fd918c1d01925143dbc2e08a8064258f70
|
||||
<EFBFBD>
|
||||
Tcommon/common-domain/src/main/java/com/food/order/domain/valueobject/CustomerId.java,c\2\c2aadaf5638ecab2404c0c3149e923f596cb777d
|
||||
Ocommon/common-domain/src/main/java/com/food/order/sysyem/entity/BaseEntity.java,f\b\fbda5fe4b42ac2a311824c02836f11c7d24db0d3
|
||||
<EFBFBD>
|
||||
^order-service/order-container/src/main/java/com/food/order/system/order/domain/BeanConfig.java,a\1\a1c09366ca4c2abdfc90bc1beacf797ac2103a3b
|
||||
<EFBFBD>
|
||||
{order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/CreateOrderCommand.java,d\c\dc92bf07b0bed6658fc54cbe0ff01dbeee0c414c
|
||||
<EFBFBD>
|
||||
lorder-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Customer.java,7\4\74a68a7e9f08b7fca383a0d424516f5987b099dd
|
||||
<EFBFBD>
|
||||
}order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/mapper/CustomerDataAccessMapper.java,8\6\869ec14f296d908f53b6edd9f087f51238dffec0
|
||||
<EFBFBD>
|
||||
Tcommon/common-domain/src/main/java/com/food/order/sysyem/valueobject/CustomerId.java,5\0\500e4021725078024436d6eaddaf3a5ce80f87c3
|
||||
<EFBFBD>
|
||||
<EFBFBD>order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/CustomerRepository.java,2\4\243d2baeb6d671f73acce01d5673f03f03328ae7
|
||||
<EFBFBD>
|
||||
|order-service/order-data-access/src/main/java/com/food/order/system/data/access/customer/adapter/CustomerRepositoryImpl.java,8\0\808a4e6022bab0f1bb8e5502a77c933f746cb380
|
||||
<EFBFBD>
|
||||
Wcommon/common-domain/src/main/java/com/food/order/sysyem/exception/DomainException.java,b\c\bc831ad083de7cf458fb4a2ebce1d9434a1922ee
|
||||
<EFBFBD>
|
||||
uorder-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/OrderAddress.java,5\e\5e090b61d663849123e622ef98bfe4742229191a
|
||||
<EFBFBD>
|
||||
morder-service/order-data-access/src/main/java/com/food/order/system/data/access/order/entity/OrderEntity.java,e\d\ede9a92270a067f79a85b238a144b459eca8662b
|
||||
<EFBFBD>
|
||||
Qcommon/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderId.java,c\d\cdff6de4b3446e3efaa50f9d01263053fea2139c
|
||||
<EFBFBD>
|
||||
rorder-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/OrderItem.java,f\b\fb43567b0066ced0815bbf02432cd16fed9c608a
|
||||
<EFBFBD>
|
||||
torder-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/OrderItemId.java,3\3\331b29df1b4bc0c1299f8bb1af8f70edf79e923a
|
||||
<EFBFBD>
|
||||
}order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/exception/OrderNotFoundException.java,a\3\a31c0821fec53a50af20e3383ba61e44d9dd567d
|
||||
<EFBFBD>
|
||||
vorder-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderTrackCommandHandler.java,f\2\f2d0dd97f438393a8cc6c9859c953f3d005925ed
|
||||
<EFBFBD>
|
||||
korder-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/Product.java,0\5\05295c0ef124c56014b3b6b04e0808e407995151
|
||||
<EFBFBD>
|
||||
Scommon/common-domain/src/main/java/com/food/order/sysyem/valueobject/ProductId.java,b\0\b0d8076babec863faea4aefc2e42755cde57012c
|
||||
<EFBFBD>
|
||||
<EFBFBD>order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/message/RestaurantApprovalResponse.java,c\b\cb772c96c93d2fc2e4fc760f3d40a29945b2c327
|
||||
<EFBFBD>
|
||||
<EFBFBD>order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/message/listener/restaurantapproval/RestaurantApprovalResponseMessageListener.java,6\9\690a6444f8a326a40054c16acbcb8c4d3e14ebf4
|
||||
<EFBFBD>
|
||||
Vcommon/common-domain/src/main/java/com/food/order/sysyem/valueobject/RestaurantId.java,2\b\2b3a056b9b3fde4b15f1d05d7861846d59926dfa
|
||||
<EFBFBD>
|
||||
sorder-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/valueobject/TrackingId.java,0\c\0c483d5138a4e1e7237a72d7888989bcd840fe2c
|
||||
<EFBFBD>
|
||||
worder-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/track/TrackOrderQuery.java,1\4\149b5ecef8503b928e6b223bb6db52a4a3a6afe5
|
||||
<EFBFBD>
|
||||
zorder-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/track/TrackOrderResponse.java,3\4\34e02ed9f253ce066f33cd48e40346510e7fb7cf
|
||||
<EFBFBD>
|
||||
qorder-service/order-data-access/src/main/java/com/food/order/system/data/access/order/entity/OrderItemEntity.java,c\5\c520ec00a75c1b87bc1497a34f1b0acab96aedeb
|
||||
<EFBFBD>
|
||||
sorder-service/order-data-access/src/main/java/com/food/order/system/data/access/order/entity/OrderItemEntityId.java,f\2\f20575f9c726daa75f956eb5c320094d8a1b65f8
|
||||
<EFBFBD>
|
||||
<EFBFBD>order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/message/listener/payment/PaymentResponseMessageListener.java,d\7\d7462ec5060343a2ca3aa497ba1550597538e5d5
|
||||
9
|
||||
README.md,8\e\8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d
|
||||
<EFBFBD>
|
||||
minfrastructure/kafka/kafka-config/src/main/java/com/food/order/kafka/config/data/KafkaProducerConfigData.java,1\4\147bb8ad56bcda10398aa4b9b972f2386b09c40a
|
||||
<EFBFBD>
|
||||
oinfrastructure/kafka/kafka-producer/src/main/java/com/food/order/system/kafka/producer/KafkaProducerConfig.java,4\e\4e08bd5115c637166f591a535fffd0ab92a42d18
|
||||
H
|
||||
customer-service/pom.xml,5\8\5828c3b58c65a5dabc2340b48a37b3e92462b9b0
|
||||
L
|
||||
infrastructure/kafka/pom.xml,5\7\57d8d8349e1f824686cd44fe2200377b17148804
|
||||
[
|
||||
+infrastructure/docker-compose/zookeeper.yml,2\5\25078b0f9296433af7750df1603d7c084625fc0f
|
||||
X
|
||||
(infrastructure/docker-compose/common.yml,5\9\59e2079c706300654edfdfefb1b0258617f514b7
|
||||
<EFBFBD>
|
||||
{order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/config/OrderServiceConfigData.java,9\5\954530d266381bab329eaec2c32fb8af09ce6299
|
||||
_
|
||||
/infrastructure/docker-compose/kafka_cluster.yml,5\e\5e8bb3a16c76d6344e1b199d9d28ca41c06d612b
|
||||
<EFBFBD>
|
||||
Pcommon/common-domain/src/main/java/com/food/order/sysyem/valueobject/BaseId.java,8\f\8f3bd12b2221204ce618b7bdc1917bf908f691b5
|
||||
<EFBFBD>
|
||||
Wcommon/common-domain/src/main/java/com/food/order/sysyem/valueobject/PaymentStatus.java,9\d\9d04fc94054bc74c3883af7f460ea23903ce071b
|
||||
\
|
||||
,infrastructure/docker-compose/init_kafka.yml,1\2\12c3aaa4a5ab6d91f1d0c2439dd959f1f4446e70
|
||||
R
|
||||
"infrastructure/docker-compose/.env,8\4\84825da1de32497b36ece2e7280bf9e7ea2fc807
|
||||
:
|
||||
|
||||
.gitignore,a\5\a5cc2925ca8258af241be7e5b0381edf30266302
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/exception/CreditEntryDataaccessException.java,9\9\99186cf850e4c3c7b7cead5e8f5e10f4a2990dd7
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/mapper/CreditEntryDataAccessMapper.java,5\3\5312c112e34b9c3095b953321c14a4abdd5a5c98
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/CreditEntryId.java,8\b\8bb3443859c229b62ae98e219040b1aacb946386
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/repository/CreditEntryJpaRepository.java,f\b\fbeba1493b7f71dfd93b47fbff84da00e2007f84
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/CreditEntryRepository.java,c\a\caa192dc17f91ee8b749c660717a36184a3c05d6
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/adapter/CreditEntryRepositoryImpl.java,6\a\6aa6e8ce5f9da7083389c855e733743d921bfba9
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/exception/CreditHistoryDataaccessException.java,d\3\d3f4a2c48e4ecf8c7e126c04208ec05e507174fb
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/mapper/CreditHistoryDataAccessMapper.java,9\8\98c57fc875d10886d09efd0ddb7b39a82e37cb78
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/entity/CreditHistoryEntity.java,6\5\651230dc70c13cbfad780494568f27d0ef9209bd
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/CreditHistoryId.java,8\0\80c44aeefda382eff76cd9f8c74bd0c670c73e65
|
||||
}
|
||||
Mcommon/common-domain/src/main/java/com/food/order/sysyem/DomainConstants.java,e\5\e5b584bef3ba718cae24b87e69ece8ea43c2fb8f
|
||||
|
||||
Ocommon/common-domain/src/main/java/com/food/order/sysyem/valueobject/Money.java,f\2\f2f10975dd8765fc764570c28a233a3a9c89cdd0
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/exception/PayemntDomainException.java,c\6\c623edfbee9db5cb30319890907999902d4ccae0
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/exception/PaymentApplicationServiceException.java,d\9\d9d957f98d7f0d30a2adea129ac4631b206fc061
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCancelledEvent.java,5\6\560399a9750e4d9dafde7225b7302534c0ed9d4a
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCancelledMessagePublisher.java,0\b\0ba58cf064e11f82c83aa840d4af085fe0cc0c0d
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentCompletedEvent.java,5\0\509a6d6aab18102a92a942a4dd736bd4110afb6c
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentCompletedMessagePublisher.java,4\b\4b8f46ac54964317cd5f358f1a462e6b73fba663
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/exception/PaymentDataaccessException.java,a\5\a5ece490bea2fd2276a3bf51703a92fffd10a2fd
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentEvent.java,1\5\1596dfb82cc42ada4d77f57e2707ef856a3c491d
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/event/PaymentFailedEvent.java,3\a\3af8e86e31391041e86e161d3eec0e009faa038e
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/message/publisher/PaymentFailedMessagePublisher.java,5\f\5fe51c223681307c2b7b97965c69c53d8e3ee085
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/valueobject/PaymentId.java,8\5\8517e077559b83db762f2451a5dabe31961fb8b7
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/repository/PaymentJpaRepository.java,d\0\d08709acd3c6ce0ea804ce4d7b2272e450c9c58b
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/exception/PaymentNotFoundException.java,d\5\d578afe6988eefbb0bc312beb1538ca09b3d016d
|
||||
<EFBFBD>
|
||||
\common/common-domain/src/main/java/com/food/order/sysyem/valueobject/PaymentOrderStatus.java,8\c\8cfc34311283c9ce79c84a4bda4eec7d30ed49f8
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/ports/output/repository/PaymentRepository.java,f\9\f9261dfed13ff6ca5d1ea0b592251a98717ade8a
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/dto/PaymentRequest.java,5\4\5491134569866d37cf17fafc904a9cc411b03901
|
||||
Z
|
||||
*payment-service/payment-dataaccess/pom.xml,e\1\e111ed261baa772cb4d6e08c563771132311486d
|
||||
G
|
||||
payment-service/pom.xml,2\5\25baee198b18cf264e9c0dcfc72630a226ed792c
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/credithistory/repository/CreditHistoryJpaRepository.java,b\4\b49bb07e3985f218ed2efad0cefe57332bd4048b
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/creditentry/entity/CreditEntryEntity.java,a\7\a79105dd255d06e1d0efa727796643bd3386bf96
|
||||
U
|
||||
%order-service/order-messaging/pom.xml,c\1\c19aa6db8e37c3805307311ca17ddea372646d36
|
||||
[
|
||||
+infrastructure/kafka/kafka-producer/pom.xml,c\7\c7d5ce453d66546bb66d7c5bfe5df1f88d0c5862
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/config/PaymentServiceConfigData.java,e\b\eb7f9fbb0b2cace2df92dc9d5819ed6a5456d638
|
||||
X
|
||||
(infrastructure/kafka/kafka-model/pom.xml,b\5\b5ebdc449af44ac439d81aad072e585df2d63cc3
|
||||
<EFBFBD>
|
||||
lpayment-service/payment-container/src/main/java/com/food/order/system/payment/service/domain/BeanConfig.java,0\e\0e2f043af840a6f0c4c5f494dfa373e6a3287249
|
||||
<EFBFBD>
|
||||
ninfrastructure/kafka/kafka-producer/src/main/java/com/food/order/system/kafka/producer/KafkaMessageHelper.java,a\5\a5b1ed3b934da0d7bc46e6247f017849d828fa02
|
||||
<EFBFBD>
|
||||
tinfrastructure/kafka/kafka-model/src/main/java/com/food/order/system/kafka/order/avro/model/OrderApprovalStatus.java,b\7\b7f6ce9c30dde5a5d9eb8055e83a4d3ee604e570
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCancelledKafkaMessagePublisher.java,4\2\42f2413f9746aa30ed7d496b9575ecff8f20a2d5
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentCompletedKafkaMessagePublisher.java,f\4\f429e4c46229dca472857e4323ab89434a74ee69
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-messaging/src/main/java/com/food/order/system/payment/messaging/publisher/kafka/PaymentFailedKafkaMessagePublisher.java,1\a\1a308906df5384e6c40641fda8a58d0a640d3f03
|
||||
<EFBFBD>
|
||||
sinfrastructure/kafka/kafka-model/src/main/java/com/food/order/system/kafka/order/avro/model/PaymentOrderStatus.java,2\9\290b3da55c67b50389607e38ae95a4cb6cba4d71
|
||||
<EFBFBD>
|
||||
xinfrastructure/kafka/kafka-model/src/main/java/com/food/order/system/kafka/order/avro/model/PaymentRequestAvroModel.java,f\7\f77456f16799869df9c5c5715d2f8ed3497c2519
|
||||
<EFBFBD>
|
||||
yinfrastructure/kafka/kafka-model/src/main/java/com/food/order/system/kafka/order/avro/model/PaymentResponseAvroModel.java,1\e\1e0c9165eec9a3a8770a07d72e38f1137af3eb60
|
||||
<EFBFBD>
|
||||
ninfrastructure/kafka/kafka-model/src/main/java/com/food/order/system/kafka/order/avro/model/PaymentStatus.java,3\6\3672be2bd188cd93638a2a699d7fee6459eed2b4
|
||||
Y
|
||||
)payment-service/payment-messaging/pom.xml,5\6\56ed16c723f2655c00ae8a35fc001c9d1a71de99
|
||||
<EFBFBD>
|
||||
hinfrastructure/kafka/kafka-model/src/main/java/com/food/order/system/kafka/order/avro/model/Product.java,e\9\e91d1d55ba1a38aca2893c014a5b2ff03826ac50
|
||||
<EFBFBD>
|
||||
<EFBFBD>infrastructure/kafka/kafka-model/src/main/java/com/food/order/system/kafka/order/avro/model/RestaurantApprovalResponseAvroModel.java,1\a\1a8cdd6c032310eea6aa5e9eea4a4f44064cf6c4
|
||||
<EFBFBD>
|
||||
vinfrastructure/kafka/kafka-model/src/main/java/com/food/order/system/kafka/order/avro/model/RestaurantOrderStatus.java,5\0\50e4cb633ca3265d27ba402a4fa00cfe3710ab77
|
||||
<EFBFBD>
|
||||
_common/common-domain/src/main/java/com/food/order/sysyem/valueobject/RestaurantOrderStatus.java,d\e\de5a9499cfd1de9312944b07ebf035e6f38db482
|
||||
Y
|
||||
)payment-service/payment-container/pom.xml,d\3\d319507d8930e27b35fa7ea166ac3b4a66d68640
|
||||
U
|
||||
%order-service/order-container/pom.xml,5\e\5edc4f773e0205d9c5812143cbbd1132b3c3de4c
|
||||
j
|
||||
:payment-service/payment-domain/payment-domain-core/pom.xml,8\0\8064d0f20ca168afe879cc5b60a151cdacfb6d52
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/mapper/PaymentDataMapper.java,f\1\f1792c5c7fb68c718b5d80fa1ba2e668f2890e6a
|
||||
V
|
||||
&payment-service/payment-domain/pom.xml,f\d\fdf4fe8ba7be6f4753e22faf477b9766890d753d
|
||||
R
|
||||
"order-service/order-domain/pom.xml,6\c\6c488d4235eb8af9fe6c7a0dcd6d396f5fb3b9db
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/OrderApproval.java,4\8\489b3cdfab8fecd434040344d80ecad6ceee200c
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovalEvent.java,c\4\c418505b723576c31849d8c877c81542930f66f8
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/valueobject/OrderApprovalId.java,9\e\9e982695e9dc9b623937a3d13ac8887af6084c33
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/repository/OrderApprovalJpaRepository.java,4\c\4c30cce37540f6fb9aceb3833e8dc5ea4ba8e977
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderApprovedEvent.java,3\b\3b201270232a1a2c94a8188804153294f38e3c38
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/event/OrderRejectedEvent.java,5\d\5dd879e29cd62beb97a50b23474d24e68deabe86
|
||||
Q
|
||||
!common/common-data-access/pom.xml,3\2\32df6d070f4ffc683364c978efd79428b5d050d1
|
||||
W
|
||||
'order-service/order-data-access/pom.xml,f\2\f258deaeb6ebc953857cf7cb5342c2c6d7f03934
|
||||
r
|
||||
Bpayment-service/payment-domain/payment-application-service/pom.xml,6\d\6d756c3c984cf48b9a51e07334cc94cf28ea1fe5
|
||||
_
|
||||
/restaurant-service/restaurant-container/pom.xml,0\4\04c5d73b814c0fa8d99213001aba2ffead7cf2e2
|
||||
`
|
||||
0restaurant-service/restaurant-dataaccess/pom.xml,4\9\49d0c1c1fb43880d1807f9fed48d285c58a50d73
|
||||
{
|
||||
Krestaurant-service/restaurant-domain/restaurant-application-service/pom.xml,6\1\6117ad0ec12432616d07d621911c1bc4f02f80d6
|
||||
s
|
||||
Crestaurant-service/restaurant-domain/restaurant-core-domain/pom.xml,f\4\f4182ab70945af3ada6221f0e18bf8f1fac7e2eb
|
||||
\
|
||||
,restaurant-service/restaurant-domain/pom.xml,5\2\528286e8455474a164649915961cfe43c36d78f2
|
||||
_
|
||||
/restaurant-service/restaurant-messaging/pom.xml,e\3\e3c0a92269005ce0f801ef2dc06d6aa1a00e1a16
|
||||
J
|
||||
restaurant-service/pom.xml,f\1\f1a73488b9e5d5fe78f637b81387a1a03077be0d
|
||||
<EFBFBD>
|
||||
}common/common-data-access/src/main/java/com/food/order/system/common/data/access/exception/RestaurantDataAccessException.java,2\9\29f5af9e9b97dd442e3b2762d7206f3cdd3d44fc
|
||||
<EFBFBD>
|
||||
<EFBFBD>order-service/order-data-access/src/main/java/com/food/order/system/data/access/restaurant/mapper/RestaurantDataAccessMapper.java,d\f\df56aea6e7cca961acdfb2d7e0845d7c11affe80
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/exception/RestaurantDomainException.java,0\1\01f10855589a69717b3d534bc555c4b4ebf71011
|
||||
<EFBFBD>
|
||||
ocommon/common-data-access/src/main/java/com/food/order/system/common/data/access/entity/RestaurantEntityId.java,f\9\f9caeadd0ffb8d25d2a99850208b70c1a8784f2f
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/exception/RestaurantNotFoundException.java,2\7\271e8c6599a9b47753cdb7561d54460059472bd6
|
||||
<EFBFBD>
|
||||
ecustomer-service/src/main/java/com/food/order/system/customer/service/CustomerServiceApplication.java,3\9\393f6fa7c918c4529954de3370ff366d10d7a212
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/entity/Restaurant.java,6\a\6a9d2207b0d9ce51a7359468f7a04bcca116f635
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-core-domain/src/main/java/com/food/order/system/restaurant/domain/core/RestaurantDomainServiceImpl.java,4\d\4d877c39a261599f8c4a8c4a790ff3143fedcb26
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/ports/output/repository/RestaurantRepository.java,a\0\a09c218d21582858a2e9072e9616706d9bbca56c
|
||||
<EFBFBD>
|
||||
zinfrastructure/kafka/kafka-producer/src/main/java/com/food/order/system/kafka/producer/service/impl/KafkaProducerImpl.java,3\6\360e8906e84c982c90c5204b896ff036da101c21
|
||||
<EFBFBD>
|
||||
mcommon/common-data-access/src/main/java/com/food/order/system/common/data/access/entity/RestaurantEntity.java,f\6\f6d6367160c5a21258ddb22c3d6e6016faf5ce07
|
||||
<EFBFBD>
|
||||
morder-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/entity/OrderItem.java,4\1\41efbf587fa2c3edceea298959ed919f554f5ec6
|
||||
<EFBFBD>
|
||||
|order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/dto/create/CreateOrderResponse.java,d\e\defb0c01f5710b54b1cb7fcf9550f2a8df2d65c9
|
||||
<EFBFBD>
|
||||
`order-service/order-app/src/main/java/com/food/order/system/service/app/api/OrderController.java,b\b\bb92862728c8d04eaf070a4132867fd23ba8b073
|
||||
<EFBFBD>
|
||||
<EFBFBD>order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/input/service/OrderApplicationService.java,a\d\ad40314bdf019aafa5a9fa840f32dfc101f16bea
|
||||
<EFBFBD>
|
||||
vorder-service/order-messaging/src/main/java/com/food/order/system/order/messaging/mapper/OrderMessagingDataMapper.java,1\c\1c7014ddd3deb73cf65c929b0b924af0cff53ddc
|
||||
<EFBFBD>
|
||||
yorder-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/OrderApplicationServiceImpl.java,5\7\57bd77f4a2092ee1117f6cac595ab47398708c81
|
||||
<EFBFBD>
|
||||
|payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/entity/PaymentEntity.java,7\7\77ecb63f035d722547f8055c99803d5a146c0c32
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/mapper/PaymentDataAccessMapper.java,7\2\72f54cc6a6946cf708c67d75e842373fb9f5fc16
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-dataaccess/src/main/java/com/food/order/system/payment/data/access/payment/adapter/PaymentRepositoryImpl.java,1\0\10d78edd523b7510aa2d72821d4312c8f7f63f55
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-application-service/src/main/java/com/food/order/system/payment/application/service/PaymentRequestHelper.java,6\1\61be9c5145d9055f5954e0566c9a1e8d6fc9fd4e
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainService.java,0\a\0ae006e1f47e9ff41c947eda574122a2af37bb76
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/entity/Payment.java,5\c\5ce3e056edb971712e013f1d85f106545fa82a6b
|
||||
<EFBFBD>
|
||||
]common/common-domain/src/main/java/com/food/order/sysyem/valueobject/OrderApprovalStatus.java,d\a\da94b4a105d8767dc1a7d3703a0cf9f5aa4a3c8a
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/adapter/RestaurantRepositoryImpl.java,5\2\52a371fa8697b7ce536579a6fb3247c963594327
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-dataaccess/src/main/java/com/food/order/system/data/access/restaurant/mapper/RestaurantDataAccessMapper.java,5\c\5cd6a081874366e6d0447efa61720201818dcab1
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-domain/restaurant-application-service/src/main/java/com/food/order/system/restaurant/domain/service/RestaurantApprovalRequestHelper.java,8\f\8f0b95d00176e23105986f415113f7143b8c9757
|
||||
<EFBFBD>
|
||||
iinfrastructure/kafka/kafka-consumer/src/main/java/com/food/order/system/kafka/consumer/KafkaConsumer.java,6\d\6dd91c904a2e322d48824e8e24b38786ed35276b
|
||||
<EFBFBD>
|
||||
<EFBFBD>payment-service/payment-domain/payment-domain-core/src/main/java/com/food/order/system/payment/service/domain/PaymentDomainServiceImpl.java,d\9\d923a60dc4b36941e851edf5b3a65ecf71ec9538
|
||||
<EFBFBD>
|
||||
<EFBFBD>order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/listener/kafka/PaymentResponseKafkaListener.java,1\a\1ad0cd701ade8de2f4f99bb72f8885f29aef60f5
|
||||
<EFBFBD>
|
||||
vorder-service/order-data-access/src/main/java/com/food/order/system/data/access/order/adapter/OrderRepositoryImpl.java,4\8\48b82a9ce4c6810a73182eb48772eea8c92090ad
|
||||
<EFBFBD>
|
||||
<EFBFBD>order-service/order-domain/order-application-service/src/main/java/com/food/order/sysyem/ports/output/repository/OrderRepository.java,e\2\e24c8eecc55733b12167b6a7cc830d109996200a
|
||||
<EFBFBD>
|
||||
<EFBFBD>order-service/order-messaging/src/main/java/com/food/order/system/order/messaging/listener/kafka/RestaurantApprovalResponseKafkaListener.java,c\c\cc02e68832a991aa60651a755e207a12f99a2008
|
||||
<EFBFBD>
|
||||
{order-service/order-domain/order-core-domain/src/main/java/com/food/order/system/domain/exception/OrderDomainException.java,9\0\904804e65376aea729261c26d93b5f48afa2e558
|
||||
<EFBFBD>
|
||||
<EFBFBD>restaurant-service/restaurant-container/src/main/java/com/food/order/system/restaurant/container/RestaurantServiceApplication.java,c\1\c133c0387dc7d1323f8f5f81d35cccc39c9f77d3
|
||||
<EFBFBD>
|
||||
{payment-service/payment-container/src/main/java/com/food/order/system/payment/service/domain/PaymentServiceApplication.java,7\8\78ff547c94bb4c2bb4c10b68b3a21b7473ca6982
|
||||
<EFBFBD>
|
||||
korder-service/order-container/src/main/java/com/food/order/system/order/domain/OrderServiceApplication.java,e\c\ec346e351516b2accd95acebd4dd0f74ca1556d6
|
||||
<EFBFBD>
|
||||
worder-service/order-data-access/src/main/java/com/food/order/system/data/access/order/mapper/OrderDataAccessMapper.java,5\3\538c34b412bb29a862b242c09fc827eca5109504
|
||||
F
|
||||
infrastructure/pom.xml,2\b\2bb83dd43ff74bd2017133cd9dea6897cfe43de3
|
||||
@@ -4,6 +4,4 @@ package com.food.order.sysyem.event;
|
||||
// Base Domain Event Generic Class
|
||||
public interface DomainEvent<T> {
|
||||
|
||||
void fire();
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package com.food.order.system.saga;
|
||||
|
||||
import com.food.order.sysyem.event.DomainEvent;
|
||||
|
||||
public interface SagaStep<T, S extends DomainEvent, U extends DomainEvent> {
|
||||
S process(T data);
|
||||
U rollback(T data);
|
||||
public interface SagaStep<T> {
|
||||
void process(T data);
|
||||
void rollback(T data);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
package com.food.order.system.data.access.outbox.payment.adapter;
|
||||
|
||||
import com.food.order.system.data.access.outbox.payment.exception.PaymentOutboxNotFoundException;
|
||||
import com.food.order.system.data.access.outbox.payment.mapper.PaymentOutboxDataAccessMapper;
|
||||
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 lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class PaymentOutboxRepositoryImpl implements PaymentOutboxRepository {
|
||||
|
||||
private final PaymentOutboxJpaRepository paymentOutboxJpaRepository;
|
||||
private final PaymentOutboxDataAccessMapper paymentOutboxDataAccessMapper;
|
||||
|
||||
|
||||
@Override
|
||||
public OrderPaymentOutboxMessage save(OrderPaymentOutboxMessage orderPaymentOutboxMessage) {
|
||||
return paymentOutboxDataAccessMapper
|
||||
.paymentOutboxEntityToOrderPaymentOutboxMessage(paymentOutboxJpaRepository
|
||||
.save(paymentOutboxDataAccessMapper
|
||||
.orderPaymentOutboxMessageToOutboxEntity(orderPaymentOutboxMessage)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<List<OrderPaymentOutboxMessage>> findByTypeAndOutboxStatusAndSagaStatus(String sagaType,
|
||||
OutboxStatus outboxStatus,
|
||||
SagaStatus... sagaStatus) {
|
||||
return Optional.of(paymentOutboxJpaRepository.findByTypeAndOutboxStatusAndSagaStatusIn(sagaType,
|
||||
outboxStatus,
|
||||
Arrays.asList(sagaStatus))
|
||||
.orElseThrow(() -> new PaymentOutboxNotFoundException("Payment outbox object " +
|
||||
"could not be found for saga type " + sagaType))
|
||||
.stream()
|
||||
.map(paymentOutboxDataAccessMapper::paymentOutboxEntityToOrderPaymentOutboxMessage)
|
||||
.collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<OrderPaymentOutboxMessage> findByTypeAndSagaIdAndSagaStatus(String type,
|
||||
UUID sagaId,
|
||||
SagaStatus... sagaStatus) {
|
||||
return paymentOutboxJpaRepository
|
||||
.findByTypeAndSagaIdAndSagaStatusIn(type, sagaId, Arrays.asList(sagaStatus))
|
||||
.map(paymentOutboxDataAccessMapper::paymentOutboxEntityToOrderPaymentOutboxMessage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteByTypeAndOutboxStatusAndSagaStatus(String type, OutboxStatus outboxStatus, SagaStatus... sagaStatus) {
|
||||
paymentOutboxJpaRepository.deleteByTypeAndOutboxStatusAndSagaStatusIn(type, outboxStatus,
|
||||
Arrays.asList(sagaStatus));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
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 lombok.*;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Table(name = "payment_outbox")
|
||||
@Entity
|
||||
public class PaymentOutboxEntity {
|
||||
|
||||
@Id
|
||||
private UUID id;
|
||||
private UUID sagaId;
|
||||
private ZonedDateTime createdAt;
|
||||
private ZonedDateTime processedAt;
|
||||
private String type;
|
||||
private String payload;
|
||||
@Enumerated(EnumType.STRING)
|
||||
private SagaStatus sagaStatus;
|
||||
@Enumerated(EnumType.STRING)
|
||||
private OrderStatus orderStatus;
|
||||
@Enumerated(EnumType.STRING)
|
||||
private OutboxStatus outboxStatus;
|
||||
@Version
|
||||
private int version;
|
||||
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
PaymentOutboxEntity that = (PaymentOutboxEntity) o;
|
||||
return id.equals(that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.food.order.system.data.access.outbox.payment.exception;
|
||||
|
||||
public class PaymentOutboxNotFoundException extends RuntimeException {
|
||||
|
||||
public PaymentOutboxNotFoundException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
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 org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class PaymentOutboxDataAccessMapper {
|
||||
|
||||
public PaymentOutboxEntity orderPaymentOutboxMessageToOutboxEntity(OrderPaymentOutboxMessage
|
||||
orderPaymentOutboxMessage) {
|
||||
return PaymentOutboxEntity.builder()
|
||||
.id(orderPaymentOutboxMessage.getId())
|
||||
.sagaId(orderPaymentOutboxMessage.getSagaId())
|
||||
.createdAt(orderPaymentOutboxMessage.getCreatedAt())
|
||||
.type(orderPaymentOutboxMessage.getType())
|
||||
.payload(orderPaymentOutboxMessage.getPayload())
|
||||
.orderStatus(orderPaymentOutboxMessage.getOrderStatus())
|
||||
.sagaStatus(orderPaymentOutboxMessage.getSagaStatus())
|
||||
.outboxStatus(orderPaymentOutboxMessage.getOutboxStatus())
|
||||
.version(orderPaymentOutboxMessage.getVersion())
|
||||
.build();
|
||||
}
|
||||
|
||||
public OrderPaymentOutboxMessage paymentOutboxEntityToOrderPaymentOutboxMessage(PaymentOutboxEntity
|
||||
paymentOutboxEntity) {
|
||||
return OrderPaymentOutboxMessage.builder()
|
||||
.id(paymentOutboxEntity.getId())
|
||||
.sagaId(paymentOutboxEntity.getSagaId())
|
||||
.createdAt(paymentOutboxEntity.getCreatedAt())
|
||||
.type(paymentOutboxEntity.getType())
|
||||
.payload(paymentOutboxEntity.getPayload())
|
||||
.orderStatus(paymentOutboxEntity.getOrderStatus())
|
||||
.sagaStatus(paymentOutboxEntity.getSagaStatus())
|
||||
.outboxStatus(paymentOutboxEntity.getOutboxStatus())
|
||||
.version(paymentOutboxEntity.getVersion())
|
||||
.build();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.food.order.system.data.access.outbox.payment.repository;
|
||||
|
||||
import com.food.order.system.data.access.outbox.payment.entity.PaymentOutboxEntity;
|
||||
import com.food.order.system.outbox.OutboxStatus;
|
||||
import com.food.order.system.saga.SagaStatus;
|
||||
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 PaymentOutboxJpaRepository extends JpaRepository<PaymentOutboxEntity, UUID> {
|
||||
|
||||
Optional<List<PaymentOutboxEntity>> findByTypeAndOutboxStatusAndSagaStatusIn(String type,
|
||||
OutboxStatus outboxStatus,
|
||||
List<SagaStatus> sagaStatus);
|
||||
|
||||
Optional<PaymentOutboxEntity> findByTypeAndSagaIdAndSagaStatusIn(String type,
|
||||
UUID sagaId,
|
||||
List<SagaStatus> sagaStatus);
|
||||
|
||||
void deleteByTypeAndOutboxStatusAndSagaStatusIn(String type,
|
||||
OutboxStatus outboxStatus,
|
||||
List<SagaStatus> sagaStatus);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package com.food.order.system.data.access.outbox.restaurantapproval.adapter;
|
||||
|
||||
|
||||
import com.food.order.system.data.access.outbox.restaurantapproval.exception.ApprovalOutboxNotFoundException;
|
||||
import com.food.order.system.data.access.outbox.restaurantapproval.mapper.ApprovalOutboxDataAccessMapper;
|
||||
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 lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class ApprovalOutboxRepositoryImpl implements ApprovalOutboxRepository {
|
||||
|
||||
private final ApprovalOutboxJpaRepository approvalOutboxJpaRepository;
|
||||
private final ApprovalOutboxDataAccessMapper approvalOutboxDataAccessMapper;
|
||||
|
||||
|
||||
@Override
|
||||
public OrderApprovalOutboxMessage save(OrderApprovalOutboxMessage orderApprovalOutboxMessage) {
|
||||
return approvalOutboxDataAccessMapper
|
||||
.approvalOutboxEntityToOrderApprovalOutboxMessage(approvalOutboxJpaRepository
|
||||
.save(approvalOutboxDataAccessMapper
|
||||
.orderCreatedOutboxMessageToOutboxEntity(orderApprovalOutboxMessage)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<List<OrderApprovalOutboxMessage>> findByTypeAndOutboxStatusAndSagaStatus(String sagaType,
|
||||
OutboxStatus outboxStatus,
|
||||
SagaStatus... sagaStatus) {
|
||||
return Optional.of(approvalOutboxJpaRepository.findByTypeAndOutboxStatusAndSagaStatusIn(sagaType, outboxStatus,
|
||||
Arrays.asList(sagaStatus))
|
||||
.orElseThrow(() -> new ApprovalOutboxNotFoundException("Approval outbox object " +
|
||||
"could be found for saga type " + sagaType))
|
||||
.stream()
|
||||
.map(approvalOutboxDataAccessMapper::approvalOutboxEntityToOrderApprovalOutboxMessage)
|
||||
.collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<OrderApprovalOutboxMessage> findByTypeAndSagaIdAndSagaStatus(String type,
|
||||
UUID sagaId,
|
||||
SagaStatus... sagaStatus) {
|
||||
return approvalOutboxJpaRepository
|
||||
.findByTypeAndSagaIdAndSagaStatusIn(type, sagaId,
|
||||
Arrays.asList(sagaStatus))
|
||||
.map(approvalOutboxDataAccessMapper::approvalOutboxEntityToOrderApprovalOutboxMessage);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteByTypeAndOutboxStatusAndSagaStatus(String type, OutboxStatus outboxStatus, SagaStatus... sagaStatus) {
|
||||
approvalOutboxJpaRepository.deleteByTypeAndOutboxStatusAndSagaStatusIn(type, outboxStatus,
|
||||
Arrays.asList(sagaStatus));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
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 lombok.*;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Table(name = "restaurant_approval_outbox")
|
||||
@Entity
|
||||
public class ApprovalOutboxEntity {
|
||||
|
||||
@Id
|
||||
private UUID id;
|
||||
private UUID sagaId;
|
||||
private ZonedDateTime createdAt;
|
||||
private ZonedDateTime processedAt;
|
||||
private String type;
|
||||
private String payload;
|
||||
@Enumerated(EnumType.STRING)
|
||||
private SagaStatus sagaStatus;
|
||||
@Enumerated(EnumType.STRING)
|
||||
private OrderStatus orderStatus;
|
||||
@Enumerated(EnumType.STRING)
|
||||
private OutboxStatus outboxStatus;
|
||||
@Version
|
||||
private int version;
|
||||
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
ApprovalOutboxEntity that = (ApprovalOutboxEntity) o;
|
||||
return id.equals(that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.food.order.system.data.access.outbox.restaurantapproval.exception;
|
||||
|
||||
public class ApprovalOutboxNotFoundException extends RuntimeException {
|
||||
|
||||
public ApprovalOutboxNotFoundException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
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 org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class ApprovalOutboxDataAccessMapper {
|
||||
|
||||
public ApprovalOutboxEntity orderCreatedOutboxMessageToOutboxEntity(OrderApprovalOutboxMessage
|
||||
orderApprovalOutboxMessage) {
|
||||
return ApprovalOutboxEntity.builder()
|
||||
.id(orderApprovalOutboxMessage.getId())
|
||||
.sagaId(orderApprovalOutboxMessage.getSagaId())
|
||||
.createdAt(orderApprovalOutboxMessage.getCreatedAt())
|
||||
.type(orderApprovalOutboxMessage.getType())
|
||||
.payload(orderApprovalOutboxMessage.getPayload())
|
||||
.orderStatus(orderApprovalOutboxMessage.getOrderStatus())
|
||||
.sagaStatus(orderApprovalOutboxMessage.getSagaStatus())
|
||||
.outboxStatus(orderApprovalOutboxMessage.getOutboxStatus())
|
||||
.version(orderApprovalOutboxMessage.getVersion())
|
||||
.build();
|
||||
}
|
||||
|
||||
public OrderApprovalOutboxMessage approvalOutboxEntityToOrderApprovalOutboxMessage(ApprovalOutboxEntity
|
||||
approvalOutboxEntity) {
|
||||
return OrderApprovalOutboxMessage.builder()
|
||||
.id(approvalOutboxEntity.getId())
|
||||
.sagaId(approvalOutboxEntity.getSagaId())
|
||||
.createdAt(approvalOutboxEntity.getCreatedAt())
|
||||
.type(approvalOutboxEntity.getType())
|
||||
.payload(approvalOutboxEntity.getPayload())
|
||||
.orderStatus(approvalOutboxEntity.getOrderStatus())
|
||||
.sagaStatus(approvalOutboxEntity.getSagaStatus())
|
||||
.outboxStatus(approvalOutboxEntity.getOutboxStatus())
|
||||
.version(approvalOutboxEntity.getVersion())
|
||||
.build();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.food.order.system.data.access.outbox.restaurantapproval.repository;
|
||||
|
||||
|
||||
import com.food.order.system.data.access.outbox.restaurantapproval.entity.ApprovalOutboxEntity;
|
||||
import com.food.order.system.outbox.OutboxStatus;
|
||||
import com.food.order.system.saga.SagaStatus;
|
||||
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 ApprovalOutboxJpaRepository extends JpaRepository<ApprovalOutboxEntity, UUID> {
|
||||
|
||||
Optional<List<ApprovalOutboxEntity>> findByTypeAndOutboxStatusAndSagaStatusIn(String type,
|
||||
OutboxStatus outboxStatus,
|
||||
List<SagaStatus> sagaStatus);
|
||||
|
||||
Optional<ApprovalOutboxEntity> findByTypeAndSagaIdAndSagaStatusIn(String type,
|
||||
UUID sagaId,
|
||||
List<SagaStatus> sagaStatus);
|
||||
|
||||
void deleteByTypeAndOutboxStatusAndSagaStatusIn(String type,
|
||||
OutboxStatus outboxStatus,
|
||||
List<SagaStatus> sagaStatus);
|
||||
|
||||
}
|
||||
@@ -18,9 +18,8 @@ public class PaymentResponseMessageListenerImpl implements PaymentResponseMessag
|
||||
|
||||
@Override
|
||||
public void paymentCompleted(PaymentResponse paymentResponse) {
|
||||
var paidEvent = orderPaymentSaga.process(paymentResponse);
|
||||
log.info("Payment completed for order with id: {}", paidEvent.getOrder().getId());
|
||||
paidEvent.fire();
|
||||
orderPaymentSaga.process(paymentResponse);
|
||||
log.info("Order Payment saga process completed id {}", paymentResponse.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -22,8 +22,7 @@ public class RestaurantApprovalResponseMessageListenerImpl implements Restaurant
|
||||
|
||||
@Override
|
||||
public void orderRejected(RestaurantApprovalResponse restaurantApprovalResponse) {
|
||||
var event = orderApprovalSaga.rollback(restaurantApprovalResponse);
|
||||
orderApprovalSaga.rollback(restaurantApprovalResponse);
|
||||
log.info("Order Rejected: {}", restaurantApprovalResponse);
|
||||
event.fire();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,11 +5,14 @@ import com.food.order.system.domain.entity.OrderItem;
|
||||
import com.food.order.system.domain.entity.Product;
|
||||
import com.food.order.system.domain.entity.Restaurant;
|
||||
import com.food.order.system.domain.event.OrderCreatedEvent;
|
||||
import com.food.order.system.domain.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 org.springframework.stereotype.Component;
|
||||
@@ -20,6 +23,22 @@ import java.util.UUID;
|
||||
@Component
|
||||
public class OrderDataMapper {
|
||||
|
||||
public OrderApprovalEventPayload orderPaidEventToOrderApprovalEventPayload(OrderPaidEvent orderPaidEvent) {
|
||||
return OrderApprovalEventPayload.builder()
|
||||
.orderId(orderPaidEvent.getOrder().getId().getValue().toString())
|
||||
.restaurantId(orderPaidEvent.getOrder().getRestaurantId().getValue().toString())
|
||||
.restaurantOrderStatus(RestaurantOrderStatus.PAID.name())
|
||||
.products(orderPaidEvent.getOrder().getItems().stream()
|
||||
.map(orderItem -> OrderApprovalProduct.builder()
|
||||
.id(orderItem.getProduct().getId().getValue().toString())
|
||||
.quantity(orderItem.getQuantity())
|
||||
.build())
|
||||
.toList())
|
||||
.price(orderPaidEvent.getOrder().getPrice().getAmount())
|
||||
.createdAt(orderPaidEvent.getCreatedAt())
|
||||
.build();
|
||||
}
|
||||
|
||||
public OrderPaymentEventPayload orderCreatedEventToOrderPaymentEventPayload(OrderCreatedEvent order) {
|
||||
return OrderPaymentEventPayload.builder()
|
||||
.orderId(order.getOrder().getId().getValue().toString())
|
||||
|
||||
@@ -27,12 +27,16 @@ public class OrderPaymentOutboxMessage {
|
||||
private String type;
|
||||
|
||||
private String payload;
|
||||
|
||||
@Setter
|
||||
private SagaStatus sagaStatus;
|
||||
|
||||
@Setter
|
||||
private OrderStatus orderStatus;
|
||||
|
||||
@Setter
|
||||
private OutboxStatus outboxStatus;
|
||||
|
||||
private int version;
|
||||
|
||||
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
package com.food.order.sysyem.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.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 lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -24,6 +28,8 @@ public class ApprovalOutboxHelper {
|
||||
|
||||
private final ApprovalOutboxRepository approvalOutboxRepository;
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public Optional<List<OrderApprovalOutboxMessage>> getApprovalOutboxMessageByOutboxStatusAndSagaStatus
|
||||
(OutboxStatus outboxStatus, SagaStatus... sagaStatus) {
|
||||
@@ -63,4 +69,33 @@ public class ApprovalOutboxHelper {
|
||||
sagaStatus);
|
||||
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void saveApprovalOutboxMessage(OrderApprovalEventPayload payload,
|
||||
OrderStatus orderStatus,
|
||||
SagaStatus sagaStatus,
|
||||
OutboxStatus outboxStatus,
|
||||
UUID sagaId) {
|
||||
|
||||
save(OrderApprovalOutboxMessage.builder()
|
||||
.id(UUID.randomUUID())
|
||||
.type(ORDER_PROCESSING_SAGA)
|
||||
.createdAt(payload.getCreatedAt())
|
||||
.orderStatus(orderStatus)
|
||||
.sagaStatus(sagaStatus)
|
||||
.outboxStatus(outboxStatus)
|
||||
.sagaId(sagaId)
|
||||
.payload(createPayload(payload))
|
||||
.build());
|
||||
|
||||
|
||||
}
|
||||
|
||||
private String createPayload(OrderApprovalEventPayload payload) {
|
||||
try {
|
||||
return objectMapper.writeValueAsString(payload);
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new OrderDomainException("Failed to create payload for JSON message");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
package com.food.order.sysyem.saga;
|
||||
|
||||
import com.food.order.system.domain.event.OrderCancelledEvent;
|
||||
import com.food.order.system.domain.service.OrderDomainService;
|
||||
import com.food.order.system.saga.SagaStep;
|
||||
import com.food.order.sysyem.dto.message.RestaurantApprovalResponse;
|
||||
import com.food.order.sysyem.event.EmptyEvent;
|
||||
import com.food.order.sysyem.helper.OrderSagaHelper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -14,7 +12,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class OrderApprovalSaga implements SagaStep<RestaurantApprovalResponse, EmptyEvent, OrderCancelledEvent> {
|
||||
public class OrderApprovalSaga implements SagaStep<RestaurantApprovalResponse> {
|
||||
|
||||
private final OrderDomainService orderDomainService;
|
||||
private final OrderSagaHelper orderSagaHelper;
|
||||
@@ -23,27 +21,24 @@ public class OrderApprovalSaga implements SagaStep<RestaurantApprovalResponse, E
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public EmptyEvent process(RestaurantApprovalResponse data) {
|
||||
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);
|
||||
return EmptyEvent.INSTANCE;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public OrderCancelledEvent rollback(RestaurantApprovalResponse data) {
|
||||
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(),
|
||||
messagePublisher);
|
||||
data.getFailureMessages());
|
||||
orderSagaHelper.saveOrder(order);
|
||||
log.info("Order cancelled: {}", order);
|
||||
return cancelEvent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,44 +1,157 @@
|
||||
package com.food.order.sysyem.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.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.event.EmptyEvent;
|
||||
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 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.sysyem.DomainConstants.UTC;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class OrderPaymentSaga implements SagaStep<PaymentResponse, OrderPaidEvent, EmptyEvent> {
|
||||
public class OrderPaymentSaga implements SagaStep<PaymentResponse> {
|
||||
|
||||
private final OrderDomainService orderDomainService;
|
||||
private final OrderSagaHelper orderSagaHelper;
|
||||
private final OrderPaidRestaurantRequestMessagePublisher orderPaidRestaurantRequestMessagePublisher;
|
||||
private final OrderDataMapper orderDataMapper;
|
||||
private final ApprovalOutboxHelper approvalOutboxHelper;
|
||||
private final PaymentOutboxHelper paymentOutboxHelper;
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public OrderPaidEvent process(PaymentResponse data) {
|
||||
log.info("Completing payment for order with id: {}", data.getOrderId());
|
||||
public void process(PaymentResponse data) {
|
||||
|
||||
var messageResponse =
|
||||
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());
|
||||
});
|
||||
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
log.info("Payment rolled back for order with id: {}", orderRollback.getId());
|
||||
}
|
||||
|
||||
private OrderApprovalOutboxMessage getUpdatedApprovalOutboxMessage(String sagaId,
|
||||
OrderStatus orderStatus,
|
||||
SagaStatus sagaStatus) {
|
||||
var orderApprovalOutboxMessageResponse =
|
||||
approvalOutboxHelper.getApprovalOutboxMessageBySagaIdAndSagaStatus(
|
||||
UUID.fromString(sagaId),
|
||||
SagaStatus.COMPENSATING);
|
||||
if (orderApprovalOutboxMessageResponse.isEmpty()) {
|
||||
throw new OrderDomainException("Approval outbox message could not be found in " +
|
||||
SagaStatus.COMPENSATING.name() + " status!");
|
||||
}
|
||||
var 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,orderPaidRestaurantRequestMessagePublisher);
|
||||
var paidEvent = orderDomainService.payOrder(order);
|
||||
orderSagaHelper.saveOrder(order);
|
||||
log.info("Payment completed for order with id: {}", order.getId());
|
||||
return paidEvent;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public EmptyEvent rollback(PaymentResponse data) {
|
||||
log.info("Rolling back payment for order with id: {}", data.getOrderId());
|
||||
var order = orderSagaHelper.findOrder(data.getOrderId());
|
||||
orderDomainService.cancelOrder(order,data.getFailureMessages());
|
||||
orderSagaHelper.saveOrder(order);
|
||||
log.info("Payment rolled back for order with id: {}", order.getId());
|
||||
return EmptyEvent.INSTANCE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,16 +7,8 @@ import java.time.ZonedDateTime;
|
||||
|
||||
public class OrderCancelledEvent extends OrderEvent {
|
||||
|
||||
private final DomainEventPublisher<OrderCancelledEvent> publisher;
|
||||
|
||||
|
||||
public OrderCancelledEvent(Order order, ZonedDateTime utc, DomainEventPublisher<OrderCancelledEvent> publisher) {
|
||||
public OrderCancelledEvent(Order order, ZonedDateTime utc) {
|
||||
super(order, utc);
|
||||
this.publisher = publisher;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fire() {
|
||||
publisher.publish(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,13 @@
|
||||
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;
|
||||
|
||||
public class OrderCreatedEvent extends OrderEvent {
|
||||
|
||||
private final DomainEventPublisher<OrderCreatedEvent> publisher;
|
||||
public OrderCreatedEvent(Order order, ZonedDateTime createdAt, DomainEventPublisher<OrderCreatedEvent> publisher) {
|
||||
public OrderCreatedEvent(Order order, ZonedDateTime createdAt) {
|
||||
super(order, createdAt);
|
||||
this.publisher = publisher;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fire() {
|
||||
publisher.publish(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,15 +7,10 @@ import java.time.ZonedDateTime;
|
||||
|
||||
public class OrderPaidEvent extends OrderEvent {
|
||||
|
||||
private final DomainEventPublisher<OrderPaidEvent> publisher;
|
||||
|
||||
public OrderPaidEvent(Order order, ZonedDateTime utc, DomainEventPublisher<OrderPaidEvent> publisher) {
|
||||
public OrderPaidEvent(Order order, ZonedDateTime utc) {
|
||||
super(order, utc);
|
||||
this.publisher = publisher;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fire() {
|
||||
publisher.publish(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,19 +5,18 @@ 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.sysyem.event.publisher.DomainEventPublisher;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface OrderDomainService {
|
||||
|
||||
OrderCreatedEvent validateAndInitiateOrder(Order order, Restaurant restaurant, DomainEventPublisher<OrderCreatedEvent> publisher);
|
||||
OrderCreatedEvent validateAndInitiateOrder(Order order, Restaurant restaurant);
|
||||
|
||||
OrderPaidEvent payOrder(Order order,DomainEventPublisher<OrderPaidEvent> publisher);
|
||||
OrderPaidEvent payOrder(Order order);
|
||||
|
||||
void approve(Order order);
|
||||
|
||||
OrderCancelledEvent cancelOrderPayment(Order order, List<String> failureMessages,DomainEventPublisher<OrderCancelledEvent> publisher);
|
||||
OrderCancelledEvent cancelOrderPayment(Order order, List<String> failureMessages);
|
||||
|
||||
void cancelOrder(Order order, List<String> failureMessages);
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ import com.food.order.system.domain.event.OrderCreatedEvent;
|
||||
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.sysyem.event.publisher.DomainEventPublisher;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.time.ZoneId;
|
||||
@@ -20,14 +19,13 @@ public class OrderDomainServiceImpl implements OrderDomainService {
|
||||
private static final String UTC = "UTC";
|
||||
|
||||
@Override
|
||||
public OrderCreatedEvent validateAndInitiateOrder(Order order, Restaurant restaurant,
|
||||
DomainEventPublisher<OrderCreatedEvent> publisher) {
|
||||
public OrderCreatedEvent validateAndInitiateOrder(Order order, Restaurant restaurant) {
|
||||
validateRestaurant(restaurant);
|
||||
setOrderProductInformation(order,restaurant);
|
||||
order.validateOrder();
|
||||
order.initializeOrder();
|
||||
log.info("Order with id {} initialize successfully", order.getId().getValue());
|
||||
return new OrderCreatedEvent(order, ZonedDateTime.now(ZoneId.of(UTC)),publisher);
|
||||
return new OrderCreatedEvent(order, ZonedDateTime.now(ZoneId.of(UTC)));
|
||||
}
|
||||
|
||||
private void setOrderProductInformation(Order order, Restaurant restaurant) {
|
||||
@@ -49,10 +47,10 @@ public class OrderDomainServiceImpl implements OrderDomainService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public OrderPaidEvent payOrder(Order order, DomainEventPublisher<OrderPaidEvent> publisher) {
|
||||
public OrderPaidEvent payOrder(Order order) {
|
||||
order.pay();
|
||||
log.info("Order with id {} paid successfully", order.getId().getValue());
|
||||
return new OrderPaidEvent(order, ZonedDateTime.now(ZoneId.of(UTC)),publisher);
|
||||
return new OrderPaidEvent(order, ZonedDateTime.now(ZoneId.of(UTC)));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -62,11 +60,10 @@ public class OrderDomainServiceImpl implements OrderDomainService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public OrderCancelledEvent cancelOrderPayment(Order order, List<String> failureMessages,
|
||||
DomainEventPublisher<OrderCancelledEvent> publisher) {
|
||||
public OrderCancelledEvent cancelOrderPayment(Order order, List<String> failureMessages) {
|
||||
order.initCancel(failureMessages);
|
||||
log.info("Order with id {} cancelled successfully", order.getId().getValue());
|
||||
return new OrderCancelledEvent(order, ZonedDateTime.now(ZoneId.of(UTC)),publisher);
|
||||
return new OrderCancelledEvent(order, ZonedDateTime.now(ZoneId.of(UTC)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user