package Ġio . ple o . ant ae us . ret rier . retry . app . services Ċ Ċ import Ġio . ple o . ant ae us . rabbitmq . Bus Ċ import Ġio . ple o . ant ae us . ret rier . retry . domain .* Ċ import Ġio . ple o . ant ae us . ret rier . retry . domain . event . Invoice Pay Retry Approved Event Ċ import Ġio . ple o . ant ae us . ret rier . retry . domain . event . Invoice Pay Retry Exceeded Event Ċ import Ġio . ple o . ant ae us . ret rier . retry . domain . event . Pay Event Ċ import Ġio . ple o . ant ae us . ret rier . retry . infra . db . Payment Dal Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Zone Id Ċ Ċ type alias Ġnow Ġ= Ġ() Ġ-> ĠLocalDateTime Ċ class ĠRetry Service ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdal : ĠPayment Dal , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbus : ĠBus , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnow : Ġnow , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmax Retries : ĠInt Ċ ) Ġ{ ĊĊĠĠĠ Ġ// It Ġaggreg ates Ġall Ġthe Ġpayments Ġfor Ġthat Ġinvoice Ġin Ġorder Ġto Ġdecide Ġwhether Ġto Ġretry Ġor Ġnot ĊĠĠĠ Ġfun Ġpayment Event ( cmd : ĠPayment Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpayment Ġ= Ġdal . fetch Payment Aggregation ( cmd . invoice Id ) ĊĠĠĠĠĠĠĠ Ġpayment . add ( cmd ) ĊĊĠĠĠĠĠĠĠ Ġdal . persist Changes ( payment ) ĊĠĠĠĠĠĠĠ Ġretry ( payment , Ġcmd . invoice Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Timestamp (): ĠLong Ġ= Ġnow (). at Zone ( Zone Id . of (" UTC ")). to Instant (). to Epoch Milli () ĊĊĠĠĠ Ġprivate Ġfun Ġretry ( payment : ĠPayment , Ġinvoice Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( payment . final Status () Ġ== ĠStatus . FAILED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( val Ġtotal Ġ= Ġpayment . total Changes ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġmax Retries Ġdown To Ġ 0 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoice Pay Retry Approved Event ( invoice ID Ġ= Ġinvoice Id , Ġtimestamp Ġ= Ġget Timestamp ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let ( bus :: publish Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoice Pay Retry Exceeded Event ( invoice ID Ġ= Ġinvoice Id , Ġtimestamp Ġ= Ġget Timestamp (), Ġmax Retries Ġ= Ġmax Retries ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let ( bus :: publish Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }