package Ġcom . rich ode mus . reader . subscription _ service Ċ Ċ import Ġcom . rich ode mus . reader . dto . UserId Ċ import Ġcom . rich ode mus . reader . events _ v 2 . Event Ċ import Ġcom . rich ode mus . reader . events _ v 2 . User Sub scribed To Feed Ċ import Ġcom . rich ode mus . reader . events _ v 2 . User Un w atched Item Ċ import Ġcom . rich ode mus . reader . events _ v 2 . User W atched Item Ċ import Ġorg . slf 4 j . LoggerFactory Ċ Ċ data Ġclass ĠUser ( val Ġid : ĠUserId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeeds : ĠList < Feed >) Ġ{ ĊĠĠĠ Ġconstructor ( userId : ĠUserId ) Ġ: Ġthis ( userId , Ġempty List ()) ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( java Class ) ĊĊĠĠĠ Ġinternal Ġfun Ġprocess ( evt : ĠEvent ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevt Ġis ĠUser Sub scribed To Feed Ġ&& Ġevt . userId Ġ== Ġid Ġ-> Ġsubscribe ( evt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevt Ġis ĠUser W atched Item Ġ&& Ġevt . userId Ġ== Ġid Ġ-> Ġwatch ( evt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevt Ġis ĠUser Un w atched Item Ġ&& Ġevt . userId Ġ== Ġid Ġ-> Ġun watch ( evt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe ( evt : ĠUser Sub scribed To Feed ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( feeds . any Ġ{ Ġit . id Ġ== Ġevt . feed Id Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" User Ġ$ id Ġis Ġalready Ġsubscribed Ġto Ġ${ evt . feed Id }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( feeds Ġ= Ġfeeds . plus ( Feed ( evt . feed Id ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwatch ( evt : ĠUser W atched Item ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( feeds . none Ġ{ Ġit . id Ġ== Ġevt . feed Id Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" User Ġ$ id Ġwas Ġnot Ġsubscribed Ġto Ġfeed Ġ${ evt . feed Id } Ġwhen Ġwatching Ġitem Ġ${ evt . itemId }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( feeds Ġ= Ġfeeds . map Ġ{ Ġit . process ( evt ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun watch ( evt : ĠUser Un w atched Item ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( feeds . none Ġ{ Ġit . id Ġ== Ġevt . feed Id Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" User Ġ$ id Ġwas Ġnot Ġsubscribed Ġto Ġfeed Ġ${ evt . feed Id } Ġwhen Ġwatching Ġitem Ġ${ evt . itemId }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( feeds Ġ= Ġfeeds . map Ġ{ Ġit . process ( evt ) Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ