package Ġcom . quick . tor . use cases . user Ċ Ċ import Ġcom . quick . tor . Requires Transaction Context Ċ import Ġcom . quick . tor . Starts New Transaction Ċ import Ġcom . quick . tor . Transaction Service Ċ import Ġcom . quick . tor . log . Logger Ċ import Ġcom . quick . tor . use cases . user . port . primary . User Port Ċ import Ġcom . quick . tor . use cases . user . port . secondary . UserData Access Port Ċ import Ġcom . quick . tor . use cases . user . model . User Ċ import Ġcom . quick . tor . use cases . user . model . User Event Ċ import Ġcom . quick . tor . use cases . user . port . secondary . User EventData Access Port Ċ import Ġcom . quick . tor . use cases . user . port . secondary . User Notification Port Ċ import Ġjava . util . UUID Ċ Ċ class ĠUser UseCase ( ĊĠĠĠ Ġprivate Ġval Ġuser Notification Port : ĠUser Notification Port , ĊĠĠĠ Ġprivate Ġval ĠuserData Access Port : ĠUser DataAccess Port , ĊĠĠĠ Ġprivate Ġval Ġuser EventData Access Port : ĠUser EventData Access Port , ĊĠĠĠ Ġprivate Ġval Ġtransaction Service : ĠTransaction Service , ĊĠĠĠ Ġprivate Ġval Ġlog : ĠLogger Ċ ): ĠUser Port Ġ{ ĊĊĠĠĠ Ġ@ Opt In ( Requires Transaction Context :: class ) ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsave ( user : ĠUser ): ĠUser ? Ġ= Ġtransaction Service . transaction Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġexists User Ġ= ĠuserData Access Port . findBy Ide mpot ency ( user . ide mpot ency Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( exists User Ġ!== Ġnull ) Ġreturn @ transaction Ġexists User ĊĊĠĠĠĠĠĠĠ Ġval Ġsaved User Ġ= ĠuserData Access Port . save ( user ) ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠUser Event ( user Ġ= Ġsaved User ) ĊĠĠĠĠĠĠĠ Ġval Ġsaved Event Ġ= Ġuser EventData Access Port . save ( event ) ĊĊĠĠĠĠĠĠĠ Ġreturn @ transaction Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Notification Port . notify ( saved Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser EventData Access Port . delete ( saved Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserData Access Port . update ( saved User . with Send Notification Validated ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġretry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Error Ġin Ġevent ", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved User ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Requires Transaction Context :: class ) ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfind ById ( id : ĠUUID ): ĠUser ? Ġ= Ġtransaction Service . transaction Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlog . info (" try ing Ġto Ġfind Ġuser Ġwith Ġid : Ġ$ id ") ĊĠĠĠĠĠĠĠ Ġval Ġuser Found Ġ= ĠuserData Access Port . findById ( id ) ĊĠĠĠĠĠĠĠ Ġlog . info (" found Ġuser : Ġ$ user Found ") ĊĊĠĠĠĠĠĠĠ Ġreturn @ transaction Ġuser Found ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Requires Transaction Context :: class ) ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate ( user : ĠUser ): ĠUser ? Ġ= Ġtransaction Service . transaction Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Ġ= ĠuserData Access Port . update ( user ) ĊĠĠĠĠĠĠĠ Ġval Ġevent Updated Ġ= Ġuser EventData Access Port . save ( User Event ( user Ġ= Ġupdated )) ĊĊĠĠĠĠĠĠĠ Ġlog . info (" Updated Ġuser : Ġ${ user . id }") ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Notification Port . notify ( event Updated ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser EventData Access Port . delete ( event Updated ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Error Ġin Ġevent ", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġretry ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn @ transaction Ġupdated ĊĠĠĠ Ġ} Ċ Ċ }