package Ġde . inst aton ne . backend . services Ċ Ċ import Ġde . inst aton ne . backend . core . repositories . Message Repository Ċ import Ġde . inst aton ne . backend . core . to Nullable Ċ import Ġde . inst aton ne . backend . models . Conversation Ċ import Ġde . inst aton ne . backend . models . Message Ċ import Ġde . inst aton ne . backend . models . User Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ import Ġjava . time . Offset DateTime Ċ Ċ @ Service Ċ @ Transactional Ċ class ĠMessage Service ( val Ġmessage Repository : ĠMessage Repository ) Ġ{ ĊĠĠĠ Ġfun Ġget Messages Between ( user 1 : ĠUser , Ġuser 2 : ĠUser ): ĠList < Message > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmessage Repository . findAll By Author And Receiver Or Author And Receiver OrderBy Created ( user 1 , Ġuser 2 , Ġuser 2 , Ġuser 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Most Recent Message Between ( user 1 : ĠUser , Ġuser 2 : ĠUser ): ĠMessage Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmessage Repository . findFirst By Author And Receiver Or Author And Receiver OrderBy Created Desc ( user 1 , Ġuser 2 , Ġuser 2 , Ġuser 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Con versations In cluding ( user : ĠUser ): ĠList < Conversation > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġas Author Ġ= Ġmessage Repository . findBy Author ( user ) ĊĠĠĠĠĠĠĠ Ġval Ġas Receiver Ġ= Ġmessage Repository . findBy Receiver ( user ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= ĠArrayList < Any >() ĊĠĠĠĠĠĠĠ Ġtotal . addAll ( as Author ) ĊĠĠĠĠĠĠĠ Ġtotal . addAll ( as Receiver ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconversations Ġ= Ġtotal . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġit Ġas ĠArray < *> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCon versation ( item [ 0 ] Ġas ĠLong , Ġitem [ 1 ] Ġas ĠLong , Ġitem [ 2 ] Ġas ĠUser ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconversations . grouping By Ġ{ Ġit . with User Ġ}. aggregate Ġ{ Ġ_, Ġaccumulator : ĠCon versation ?, Ġelement , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( accumulator Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator . message Count Ġ+= Ġelement . message Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator . unread Message Count Ġ+= Ġelement . unread Message Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. values . toList (). filter NotNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Message ( text : ĠString , Ġfrom : ĠUser , Ġto : ĠUser ): ĠMessage Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠMessage ("", Ġtext , ĠOffset DateTime . now (), Ġfalse , Ġfrom , Ġto ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmessage Repository . save ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetMessage ById ( id : ĠString ): ĠMessage ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmessage Repository . findById ( id ). to Nullable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmark Message As Read ( id : ĠString ): ĠMessage ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġmessage Repository . findById ( id ). to Nullable () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġmessage . read Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġmessage Repository . save ( message ) ĊĠĠĠ Ġ} Ċ }