Outbox Message and Scheduler class implemented part - 2.

This commit is contained in:
Ali CANLI
2022-07-15 21:45:48 +03:00
parent d49b533f7e
commit 3affe7ccdd
25 changed files with 913 additions and 96 deletions

View File

@@ -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

View File

@@ -4,6 +4,4 @@ package com.food.order.sysyem.event;
// Base Domain Event Generic Class
public interface DomainEvent<T> {
void fire();
}

View File

@@ -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);
}

View File

@@ -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));
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}

View File

@@ -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));
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -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())

View File

@@ -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;

View File

@@ -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");
}
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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