package Ġit . pol ito . master . ap . group 6 . e commerce . orders ervice . listeners ĊĊ Ċ import Ġcom . google . gson . Gson Ċ import Ġit . pol ito . master . ap . group 6 . e commerce . common . d tos . Delivery List DTO Ċ import Ġit . pol ito . master . ap . group 6 . e commerce . common . d tos . Pl aced Order DTO Ċ import Ġit . pol ito . master . ap . group 6 . e commerce . common . d tos . Rollback DTO Ċ import Ġit . pol ito . master . ap . group 6 . e commerce . orders ervice . mis cellaneous . Response Ċ import Ġit . pol ito . master . ap . group 6 . e commerce . orders ervice . mis cellaneous . ResponseType Ċ import Ġit . pol ito . master . ap . group 6 . e commerce . orders ervice . services . Order Service Async Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . kafka . annotation . Kafka Listener Ċ import Ġorg . springframework . kafka . core . Kafka Template Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ import Ġorg . springframework . transaction . event . Transactional EventListener Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThe Ġorder Ġservice . ĠImplements Ġthe Ġbusiness Ġlogic . Ċ Ġ* Ġ@ param Ġkafka Template Ġa Ġreference Ġto Ġkafka Ġtemplate Ġhandling Ġpublisher - subscriber Ġpar adig m . Ċ Ġ* Ġ@ param Ġorder Service Async Ġa Ġreference Ġto Ġthe Ġservice Ġhandling Ġthe Ġasync Ġorder Ġlifecycle . Ċ Ġ* Ġ@ author ĠFr ances co ĠSem er aro Ċ Ġ*/ Ċ @ Service Ċ class ĠOrder Saga Listener ( ĊĠĠĠ Ġval Ġkafka Template : ĠKafka Template < String , ĠString >, ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġorder Service Async : ĠOrder Service Async , Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġjson Ġ= ĠGson () ĊĊĠĠĠ Ġ@ Kafka Listener ( groupId Ġ= Ġ" orders ervice ", Ġtopics Ġ= Ġ[" create _ order "]) ĊĠĠĠ Ġfun Ġcreate Order ( placed Order Ser : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Order Saga Listener . create Order : ĠReceived ĠKafka Ġmessage Ġon Ġtopic Ġcreate _ order Ġwith Ġmessage Ġ$ placed Order Ser ") ĊĠĠĠĠĠĠĠ Ġval Ġplaced Order : ĠPl aced Order DTO Ġ= Ġjson . fromJson ( placed Order Ser , ĠPl aced Order DTO :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġorder Service Async . create Order ( placed Order ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( response . response Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Type . INVALID _ ORDER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Order Saga Listener . create Order : Ġskipping Ġduplicated Ġs aga ĠID Ġ${ placed Order . saga ID . toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Type . WAIT ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Order Saga . create Order : ĠWaiting Ġfor Ġother ĠMS Ġto Ġrespond Ġfor Ġorder Ġ${ placed Order . saga ID }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprintln (" Order Saga . create Order : Ġ$ response ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Kafka Listener ( groupId Ġ= Ġ" orders ervice ", Ġtopics Ġ= Ġ[" products _ ok "]) ĊĠĠĠ Ġfun Ġproducts Checked ( delivery List Ser : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Order Saga Listener . products Checked : ĠReceived ĠKafka Ġmessage Ġon Ġtopic Ġproducts _ ok Ġwith Ġmessage Ġ$ delivery List Ser ") ĊĠĠĠĠĠĠĠ Ġval Ġdelivery List : ĠDelivery List DTO Ġ= Ġjson . fromJson ( delivery List Ser , ĠDelivery List DTO :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġorder Service Async . products Checked ( delivery List ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( response . response Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Type . INVALID _ ORDER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Order Saga Listener . products Checked : Ġskipping Ġduplicated Ġs aga ĠID Ġ${ delivery List . order ID }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Type . WAIT ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Order Saga . products Checked : ĠWaiting Ġfor Ġother ĠMS Ġto Ġrespond Ġfor Ġorder Ġ${ delivery List . order ID }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprintln (" Order Saga . products Checked : Ġ$ response ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Kafka Listener ( groupId Ġ= Ġ" orders ervice ", Ġtopics Ġ= Ġ[" wallet _ ok "]) ĊĠĠĠ Ġfun Ġwallet Checked ( orderId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Order Saga Listener . wallet Checked : ĠReceived ĠKafka Ġmessage Ġon Ġtopic Ġwallet _ ok Ġwith Ġmessage Ġ$ orderId ") ĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġorder Service Async . wallet Checked ( orderId ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( response . response Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Type . INVALID _ ORDER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Order Saga Listener . wallet Checked : Ġskipping Ġduplicated Ġs aga ĠID Ġ${ orderId }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Type . WAIT ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Order Saga . wallet Checked : ĠWaiting Ġfor Ġother ĠMS Ġto Ġrespond Ġfor Ġorder Ġ${ orderId }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprintln (" Order Saga . wallet Checked : Ġ$ response ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Kafka Listener ( groupId Ġ= Ġ" orders ervice ", Ġtopics Ġ= Ġ[" rollback "]) ĊĠĠĠ Ġfun Ġrollback Order ( rollback DTO Ser : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Order Saga Listener . rollback Order : ĠReceived ĠKafka Ġmessage Ġon Ġtopic Ġrollback Ġwith Ġmessage Ġ$ rollback DTO Ser ") ĊĠĠĠĠĠĠĠ Ġval Ġrollback DTO : ĠRoll back DTO Ġ= Ġjson . fromJson ( rollback DTO Ser , ĠRoll back DTO :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġorder Service Async . rollback Order ( rollback DTO . saga ID . toString ()) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( response . response Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Type . INVALID _ ORDER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Order Saga Listener . rollback Order : Ġskipping Ġduplicated Ġs aga ĠID Ġ${ rollback DTO . saga ID . toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Type . ROLL BACK _ OK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Order Saga . rollback Order : ĠThe Ġorder Ġ${ rollback DTO . saga ID . toString ()} Ġhas Ġbeen Ġcanceled Ġdue Ġto Ġerrors .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprintln (" Order Saga . rollback Order : Ġ$ response ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }