package Ġcom . github . m aly 7 . service Ċ Ċ import Ġcom . github . m aly 7 . data . Conversation Message Repository Ċ import Ġcom . github . m aly 7 . data . Conversation Repository Ċ import Ġcom . github . m aly 7 . domain . Conversation Ċ import Ġcom . github . m aly 7 . domain . Conversation Message Ċ import Ġcom . github . m aly 7 . exception . BadRequest Exception Ċ import Ġcom . github . m aly 7 . exception . NotFoundException Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . security . access . pre post . Pre Authorize Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ Ċ @ Service Ċ @ Transactional Ċ class ĠCon versation Service ( ĊĠĠĠ Ġval ĠuserService : ĠUserService , ĊĠĠĠ Ġval Ġnotification Service : ĠNotification Service , ĊĠĠĠ Ġval Ġconversation Repository : ĠCon versation Repository , ĊĠĠĠ Ġval Ġconversation Message Repository : ĠCon versation Message Repository Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Conversation Service :: class . java ) ĊĊĠĠĠ Ġfun ĠsendMessage ( conversation Message : ĠCon versation Message ): ĠCon versation Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( conversation Message . to Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception (" Conversation Ġmessages Ġmust Ġspecify Ġa Ġto Ġid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġto Id Ġ= Ġconversation Message . to Id !! ĊĠĠĠĠĠĠĠ Ġval Ġfrom Id Ġ= ĠuserService . getCurrent UserId () ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" At tempting Ġto Ġsend Ġmessage Ġfrom Ġ[ {}] Ġto Ġ[ {} ]", Ġfrom Id , Ġto Id ) ĊĠĠĠĠĠĠĠ Ġval Ġexisting Conversation Ġ= Ġget OrCreate Conversation For Users ( from Id , Ġto Id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinserted Message Ġ= Ġconversation Message Repository . insert ( conversation Message ) ĊĠĠĠĠĠĠĠ Ġexisting Conversation . messages Ġ+= Ġinserted Message ĊĊĠĠĠĠĠĠĠ Ġval Ġconversation Ġ= Ġconversation Repository . save ( existing Conversation ) ĊĠĠĠĠĠĠĠ Ġnotification Service . notify New Message ( to Id , Ġconversation . id !! , Ġinserted Message ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconversation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Pre Authorize ("@ access Control Service . user In Conversation (# conversation Id )") ĊĠĠĠ Ġfun Ġget ( conversation Id : ĠString ): ĠCon versation Ġ= ĊĠĠĠĠĠĠĠ Ġconversation Repository . findById ( conversation Id ). orElse Throw Ġ{ ĠNotFound Exception (" No ĠCon versation ĠFound Ġwith Ġid Ġ$ conversation Id ") Ġ} ĊĊĠĠĠ Ġ@ Pre Authorize ("@ access Control Service . user In Conversation (# conversation Id )") ĊĠĠĠ Ġfun Ġdelete Conversation ( conversation Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconversation Ġ= Ġconversation Repository . findById ( conversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Throw Ġ{ ĠNotFound Exception (" No Ġconversation Ġfound Ġwith Ġid Ġ$ conversation Id ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġconversation Message Repository . delete All ( conversation . messages ) ĊĠĠĠĠĠĠĠ Ġconversation Repository . delete ById ( conversation Id ) ĊĠĠĠĠĠĠĠ Ġnotification Service . notify Conversation Delete ( conversation . participants , Ġconversation Id ) ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" User Ġ[ {}] Ġdeleted Ġconversation Ġ[ {} ]", ĠuserService . getCurrent UserId (), Ġconversation Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Pre Authorize ("@ access Control Service . user In Message (# message Id )") ĊĠĠĠ Ġfun Ġdelete Message ( message Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġconversation Message Repository . findById ( message Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Throw Ġ{ ĠNotFound Exception (" No Ġmessage Ġfound Ġfor Ġid Ġ$ message Id ") Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconversation Ġ= Ġconversation Repository . findBy Messages Containing ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Throw Ġ{ ĠIllegalStateException (" No Ġconversation Ġfound Ġfor Ġexisting Ġmessage ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġconversation Message Repository . delete ById ( message Id ) ĊĠĠĠĠĠĠĠ Ġnotification Service . notify Message Delete ( conversation . participants , Ġconversation . id !! , ĠmessageId ) ĊĠĠĠĠĠĠĠ Ġlog . debug (" User Ġ[ {}] Ġdeleted Ġmessage Ġ[ {} ]", ĠuserService . getCurrent UserId (), ĠmessageId ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( conversation . messages . size Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Conversation Ġ[ {}] Ġshould Ġnow Ġbe Ġempty , Ġdeleting Ġit ", Ġconversation . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Repository . delete ( conversation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Service . notify Conversation Delete ( conversation . participants , Ġconversation . id !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Conversation To Participants ( conversation : ĠCon versation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconversation . participants . forEach Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Adding Ġ[ {}] Ġto Ġconversation Ġ[ {} ]", Ġid , Ġconversation . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠuserService . get ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser . con versations Ġ+= Ġconversation ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserService . save ( user ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget OrCreate Conversation For Users ( from Id : ĠString , Ġto Id : ĠString ): ĠCon versation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Conversation Opt Ġ= Ġconversation Repository . findBy Participants Containing ( to Id , Ġfrom Id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( existing Conversation Opt . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Found Ġconversation Ġbetween Ġ[ {}] Ġand Ġ[ {}] Ġwith Ġid Ġ[ {} ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Conversation Opt . get (). id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Conversation Opt . get () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġexisting Ġconversation Ġfound Ġbetween Ġ[ {}] Ġand Ġ[ {} ], Ġattempting Ġto Ġcreate Ġone ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate ( from Id , Ġto Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate ( from Id : ĠString , Ġto Id : ĠString ): ĠCon versation Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( userService . getCurrent User (). contacts . none Ġ{ Ġit . id Ġ== Ġto Id Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" User Ġ[ {}] Ġattempted Ġto Ġstart Ġconversation Ġwith Ġ[ {} ], Ġbut Ġthey Ġare Ġnot Ġin Ġtheir Ġcontacts ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception (" A ĠUser Ġmay Ġnot Ġsend Ġcontact Ġto Ġa Ġuser Ġno Ġin Ġtheir Ġcontact Ġlist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Starting Ġa Ġnew Ġ 1 : 1 Ġconversation Ġbetween Ġ[ {}] Ġand Ġ[ {} ]", Ġfrom Id , Ġto Id ) ĊĠĠĠĠĠĠĠ Ġval Ġconversation Ġ= Ġconversation Repository . insert ( Conversation ( participants Ġ= ĠlistOf ( from Id , Ġto Id ))) ĊĠĠĠĠĠĠĠ Ġadd Conversation To Participants ( conversation ) ĊĠĠĠĠĠĠĠ Ġreturn Ġconversation ĊĠĠĠ Ġ} Ċ } Ċ