/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . google . samples . apps . ios ched . shared . data . user event Ċ Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġcom . google . samples . apps . ios ched . model . Conference Day Ċ import Ġcom . google . samples . apps . ios ched . model . Session Ċ import Ġcom . google . samples . apps . ios ched . model . SessionId Ċ import Ġcom . google . samples . apps . ios ched . model . userdata . User Event Ċ import Ġcom . google . samples . apps . ios ched . model . userdata . User Session Ċ import Ġcom . google . samples . apps . ios ched . shared . data . session . Session Repository Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . sessions . Load User Session UseCase Result Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . sessions . Load User Sessions By Day UseCase Result Ċ import Ġcom . google . samples . apps . ios ched . shared . domain . users . Star Updated Status Ċ import Ġcom . google . samples . apps . ios ched . shared . result . Result Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ /** Ċ Ġ* ĠSingle Ġpoint Ġof Ġaccess Ġto Ġuser Ġevents Ġdata Ġassociated Ġwith Ġa Ġuser Ġfor Ġthe Ġpresentation Ġlayer . Ċ Ġ*/ Ċ @ Singleton Ċ open Ġclass ĠDefault Session And User Event Repository Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġuser Event DataSource : ĠUser Event DataSource , ĊĠĠĠ Ġprivate Ġval Ġsession Repository : ĠSession Repository Ċ ) Ġ: ĠSession And User Event Repository Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Observable User Events ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString ?, ĊĠĠĠĠĠĠĠ Ġuser Is At tendee : ĠBoolean ĊĠĠĠ Ġ): ĠFlow < Result < Load User Sessions By Day UseCase Result >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġno Ġlogged - in Ġuser , Ġreturn Ġthe Ġmap Ġwith Ġnull ĠUser Events ĊĠĠĠĠĠĠĠ Ġif Ġ( userId Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Event Repository : ĠNo Ġuser Ġlogged Ġin , Ġreturning Ġsessions Ġwithout Ġuser Ġevents ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Sessions Ġ= Ġsession Repository . getS essions ( user Is At tendee ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Sessions Per Day Ġ= Ġmap UserData And Sessions ( null , Ġall Sessions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad User Sessions By Day UseCase Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Sessions Per Day Ġ= Ġuser Sessions Per Day , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Session Count Ġ= Ġall Sessions . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOb serves Ġthe Ġuser Ġevents Ġand Ġmerge s Ġthem Ġwith Ġsession Ġdata . ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Event DataSource . get Observable User Events ( userId ). map Ġ{ Ġuser Events Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Event Repository : ĠReceived Ġ${ user Events . user Events . size } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| user Ġevents Ġchanges """. trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Sessions Ġ= Ġsession Repository . getS essions ( user Is At tendee ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad User Sessions By Day UseCase Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Sessions Per Day Ġ= Ġmap UserData And Sessions ( user Events , Ġall Sessions ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Session Count Ġ= Ġall Sessions . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Observable User Event ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString ?, ĊĠĠĠĠĠĠĠ Ġevent Id : ĠSession Id ĊĠĠĠ Ġ): ĠFlow < Result < Load User Session UseCase Result >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġno Ġlogged - in Ġuser , Ġreturn Ġthe Ġsession Ġwith Ġa Ġnull ĠUser Event ĊĠĠĠĠĠĠĠ Ġif Ġ( userId Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Event Repository : ĠNo Ġuser Ġlogged Ġin , Ġreturning Ġsession Ġwithout Ġuser Ġevent .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġsession Repository . getSession ( eventId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad User Session UseCase Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Session Ġ= ĠUser Session ( session , Ġcreate Default User Event ( session )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOb serves Ġthe Ġuser Ġevents Ġand Ġmerge s Ġthem Ġwith Ġsession Ġdata . ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Event DataSource . get Observable User Event ( userId , Ġevent Id ). map Ġ{ Ġuser Event Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Event Repository : ĠReceived Ġuser Ġevent Ġchanges ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġsession , Ġsynchronous ly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġsession Repository . getSession ( eventId ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMerge s Ġsession Ġwith Ġuser Ġdata Ġand Ġemits Ġthe Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Session Ġ= ĠUser Session ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Event Result . user Event Ġ?: Ġcreate Default User Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Success ( Load User Session UseCase Result ( user Session Ġ= Ġuser Session )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetUser Events ( userId : ĠString ?): ĠList < User Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Event DataSource . getUser Events ( userId Ġ?: Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetUser Session ( userId : ĠString , ĠsessionId : ĠSession Id ): ĠUser Session Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġsession Repository . getSession ( sessionId ) ĊĠĠĠĠĠĠĠ Ġval Ġuser Event Ġ= Ġuser Event DataSource . getUser Event ( userId , ĠsessionId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" User Event Ġnot Ġfound ") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠUser Session ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Ġ= Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Event Ġ= Ġuser Event ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġstar Event ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġuser Event : ĠUser Event ĊĠĠĠ Ġ): ĠResult < Star Updated Status > Ġ= Ġuser Event DataSource . star Event ( userId , Ġuser Event ) ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Default User Event ( session : ĠSession ): ĠUser Event Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠUser Event ( id Ġ= Ġsession . id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMerge s Ġuser Ġdata Ġwith Ġsessions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprivate Ġfun Ġmap UserData And Sessions ( ĊĠĠĠĠĠĠĠ ĠuserData : ĠUser Events Result ?, ĊĠĠĠĠĠĠĠ Ġall Sessions : ĠList < Session > ĊĠĠĠ Ġ): ĠMap < Conference Day , ĠList < User Session >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġconference Days Ġ= Ġsession Repository . get Conference Days () ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġno Ġlogged - in Ġuser , Ġreturn Ġthe Ġmap Ġwith Ġnull ĠUser Events ĊĠĠĠĠĠĠĠ Ġif Ġ( userData Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconference Days . map Ġ{ Ġday Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday Ġto Ġall Sessions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġday . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġsession Ġ-> ĠUser Session ( session , Ġcreate Default User Event ( session )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġuser Events Ġ= ĠuserData . user Events ĊĊĠĠĠĠĠĠĠ Ġval Ġall User Sessions Ġ= Ġmerge User Events And Sessions ( user Events , Ġall Sessions ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconference Days . map Ġ{ Ġday Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġday Ġto Ġall User Sessions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġday . contains ( it . session ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġuser Session Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Session ( user Session . session , Ġuser Session . user Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . session . startTime Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmerge User Events And Sessions ( ĊĠĠĠĠĠĠĠ Ġuser Events : ĠList < User Event >, ĊĠĠĠĠĠĠĠ Ġall Sessions : ĠList < Session > ĊĠĠĠ Ġ): ĠList < User Session > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Id To User Event : ĠMap < String , ĠUser Event ?> Ġ= Ġuser Events . map Ġ{ Ġit . id Ġto Ġit Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġreturn Ġall Sessions . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Session ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Id To User Event [ it . id ] Ġ?: Ġcreate Default User Event ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Conference Days (): ĠList < Conference Day > Ġ= Ġsession Repository . get Conference Days () Ċ } Ċ Ċ interface ĠSession And User Event Repository Ġ{ ĊĊĠĠĠ Ġfun Ġget Observable User Events ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString ?, ĊĠĠĠĠĠĠĠ Ġuser Is At tendee : ĠBoolean ĊĠĠĠ Ġ): ĠFlow < Result < Load User Sessions By Day UseCase Result >> ĊĊĠĠĠ Ġfun Ġget Observable User Event ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString ?, ĊĠĠĠĠĠĠĠ Ġevent Id : ĠSession Id ĊĠĠĠ Ġ): ĠFlow < Result < Load User Session UseCase Result >> ĊĊĠĠĠ Ġfun ĠgetUser Events ( userId : ĠString ?): ĠList < User Event > ĊĊĠĠĠ Ġfun ĠgetUser Session ( userId : ĠString , ĠsessionId : ĠSession Id ): ĠUser Session ĊĊĠĠĠ Ġsuspend Ġfun Ġstar Event ( userId : ĠString , Ġuser Event : ĠUser Event ): ĠResult < Star Updated Status > ĊĊĠĠĠ Ġfun Ġget Conference Days (): ĠList < Conference Day > Ċ } Ċ