package Ġorg . du ke con . data . repository Ċ Ċ import Ġio . ktor . util . date . GMT Date Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġorg . du ke con . aspect s . logging . LogLevel Ċ import Ġorg . du ke con . aspect s . logging . log Ċ import Ġorg . du ke con . data . mapper .* Ċ import Ġorg . du ke con . data . model . Event Entity Ċ import Ġorg . du ke con . data . model . Favorite Entity Ċ import Ġorg . du ke con . data . model . Room Entity Ċ import Ġorg . du ke con . data . model . Speaker Entity Ċ import Ġorg . du ke con . data . source . Event Cache DataStore Ċ import Ġorg . du ke con . data . source . Event Remote DataStore Ċ import Ġorg . du ke con . domain . model .* Ċ import Ġorg . du ke con . domain . repository . Conference Repository Ċ Ċ /** Ċ Ġ* ĠProvides Ġan Ġimplementation Ġof Ġthe Ġ[ Conference Repository ] Ġinterface Ġfor Ġcommunic ating Ġto Ġand Ġfrom Ċ Ġ* Ġdata Ġsources Ċ Ġ*/ Ċ class ĠLocal And Remote Data Repository Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġremote DataStore : ĠEvent Remote DataStore , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlocal DataStore : ĠEvent Cache DataStore , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġconference Data Cache : ĠConference Data Cache , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġevent Mapper : ĠEvent Mapper , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġspeaker Mapper : ĠS peaker Mapper , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġroom Mapper : ĠRoom Mapper , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfeedback Mapper : ĠFeedback Mapper , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfavorite Mapper : ĠF avorite Mapper , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmetadata Mapper : ĠMeta Date Mapper Ċ Ċ ) Ġ: ĠConference Repository Ġ{ ĊĊĠĠĠ Ġoverride Ġvar Ġon Refresh Listeners : ĠList < () Ġ-> ĠUnit > Ġ= Ġempty List () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetKey Clo ak (): ĠKey cloak Ġ= ĠKey cloak ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrealm Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Server Url Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġssl Required Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredirect Uri Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Account Management Ġ= Ġfalse ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsubmit Feedback ( feedback : ĠFeedback ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote DataStore . submit Feedback ( feedback Mapper . map To Entity ( feedback )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAny () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsave Favorite ( favorite : ĠF avorite ): ĠList < Favorite > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġmerge Ġlocal Ġlist ĊĠĠĠĠĠĠĠ Ġval Ġlocal F avorites Ġ= Ġlocal DataStore . getF avorites (). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġlocal F avorites . removeAll Ġ{ Ġit . id Ġ== Ġfavorite . id Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( favorite . selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal F avorites . add ( Favorite Entity ( favorite . id , Ġfavorite . version )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsave Ġto Ġremote ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote F avorites Ġ= Ġremote DataStore . getF avorites (). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote F avorites . removeAll Ġ{ Ġit . id Ġ== Ġfavorite . id Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfavor ites Ġ= Ġmerge F avorites ( local F avorites , Ġremote F avorites ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal DataStore . save F avorites ( favorites ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote DataStore . save F avorites ( favorites ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfavor ites Ġ= Ġmerge F avorites ( local F avorites , Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal DataStore . save F avorites ( favorites ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcall Refresh Listeners () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġget F avorites () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget F avorites (): ĠList < Favorite > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlocal DataStore . getF avorites (). map Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavorite Mapper . map From Entity ( list ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Speaker ( id : ĠString ): ĠS peaker Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġspeaker Mapper . map From Entity ( local DataStore . getS peak ers (). first Ġ{ Ġit . id Ġ== Ġid Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Event ( id : ĠString ): ĠEvent Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" getEvent =${ id } Ġ== >") ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Store Ġ= Ġlocal DataStore ĊĊĠĠĠĠĠĠĠ Ġval Ġspeak ers Ġ= Ġdata Store . getS peak ers (). map Ġ{ Ġspeaker Mapper . map From Entity ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfavor ites Ġ= Ġdata Store . getF avorites (). map Ġ{ Ġfavorite Mapper . map From Entity ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠmetaData Ġ= Ġmetadata Mapper . map From Entity ( data Store . get MetaData ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġevent Mapper . map From Entity ( data Store . get Events (). first Ġ{ Ġit . id Ġ== Ġid Ġ}, Ġspeak ers , Ġfavor ites , ĠmetaData ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" getEvent =${ id } Ġ<= =") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Rooms (): ĠList < Room > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Store Ġ= Ġlocal DataStore ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Store . get Rooms (). map Ġ{ Ġroom Mapper . map From Entity ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsave S peak ers ( speak ers : ĠList < Speaker >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Entities Ġ= Ġspeak ers . map Ġ{ Ġspeaker Mapper . map To Entity ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsave S peak ers Entities ( event Entities ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsave Rooms ( rooms : ĠList < Room >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Entities Ġ= Ġrooms . map Ġ{ Ġroom Mapper . map To Entity ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsav Rooms Entities ( event Entities ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetS peak ers (): ĠList < Speaker > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Store Ġ= Ġlocal DataStore ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Store . getS peak ers () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeaker Mapper . map From Entity ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. sorted By Ġ{ Ġit . name Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Event Dates (): ĠList < GMT Date > Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" getEvent Dates == >") ĊĠĠĠĠĠĠĠ Ġval Ġdata Store Ġ= Ġlocal DataStore ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġdata Store . get Events () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . distinct By Ġ{ Ġit . startTime . day OfMonth Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. sorted By Ġ{ Ġit . day OfMonth Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" getEvent Dates <= =") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List < GMT Date >(). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( LogLevel . ERROR , Ġ" Local And Remote Data Repository ", Ġ" getEvent Dates <= =") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsave Events ( events : ĠList < Event >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Entities Ġ= Ġevents . map Ġ{ Ġevent Mapper . map To Entity ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsave Event Entities ( event Entities ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Event Entities ( events : ĠList < Event Entity >) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlocal DataStore . save Events ( events ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave S peak ers Entities ( speak ers : ĠList < Speaker Entity >) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlocal DataStore . save S peak ers ( speak ers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsav Rooms Entities ( speak ers : ĠList < Room Entity >) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlocal DataStore . save Rooms ( speak ers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Refresh Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġon Refresh Listeners . forEach Ġ{ Ġit () Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" update == >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġremote DataStore . get Events () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" update Ġ- Ġremote DataStore . get Events () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal DataStore . save Events ( events ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" update Ġ- Ġsave Events ( events )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal DataStore . save MetaData ( remote DataStore . get MetaData ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġmerged Ġ= Ġmerge F avorites ( local DataStore . getF avorites (), Ġremote DataStore . getF avorites ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlocal DataStore . save F avorites ( merged ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" update Ġ- Ġsave MetaData ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal DataStore . save S peak ers ( remote DataStore . getS peak ers ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Refresh Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" update <= =") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( LogLevel . ERROR , Ġ" Local And Remote Data Repository ", Ġ" update ĠERROR ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal DataStore . save Events ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmerge F avorites ( favorites 1 : ĠList < Favorite Entity >, Ġfavor ites 2 : ĠList < Favorite Entity >): ĠList < Favorite Entity > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Favorite Entity >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġfavor ites 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġfavor ites 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result . contains ( e )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Events ( day : ĠInt ): ĠList < Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" get Events =${ day } Ġ== >") ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Store Ġ= Ġlocal DataStore ĊĊĠĠĠĠĠĠĠ Ġval Ġspeak ers Ġ= Ġdata Store . getS peak ers (). map Ġ{ Ġspeaker Mapper . map From Entity ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfavor ites Ġ= Ġdata Store . getF avorites (). map Ġ{ Ġfavorite Mapper . map From Entity ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠmetaData Ġ= Ġmetadata Mapper . map From Entity ( data Store . get MetaData ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Entities Ġ= Ġdata Store . get Events () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġevent Entities . all By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( day Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startTime . day OfMonth Ġ== Ġday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Mapper . map From Entity ( it , Ġspeak ers , Ġfavor ites , ĠmetaData ) ĊĠĠĠĠĠĠĠ Ġ}. sorted By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . startTime ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( LogLevel . DEBUG , Ġ" Local And Remote Data Repository ", Ġ" events =${ it . size } Ġget Events =${ day } Ġ<= =") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget MetaData (): ĠMeta Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Store Ġ= Ġlocal DataStore ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmetadata Mapper . map From Entity ( data Store . get MetaData ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġcontaining Ġelements Ġfrom Ġthe Ġgiven Ġcollection Ġby Ġthe Ġgiven Ġ[ selector ] Ġfunction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġ< T > ĠIterable < T >. all By ( selector : Ġ( T ) Ġ-> ĠBoolean ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < T >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selector ( e )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} Ċ }