package Ġorg . jetbrains . kotlin conf . model Ċ Ċ import Ġio . ktor . client . call .* Ċ import Ġkotlinx . serialization .* Ċ import Ġkotlinx . serialization . json .* Ċ import Ġorg . jetbrains . kotlin conf .* Ċ import Ġorg . jetbrains . kotlin conf . api .* Ċ import Ġorg . jetbrains . kotlin conf . data .* Ċ import Ġorg . jetbrains . kotlin conf . presentation .* Ċ import Ġorg . jetbrains . kotlin conf . storage .* Ċ import Ġkotlin . properties .* Ċ import Ġkotlin . properties . Deleg ates . observable Ċ Ċ class ĠKotlin Conf Data Repository ( ĊĠĠĠĠĠĠĠ Ġend Point : ĠString , ĊĠĠĠĠĠĠĠ Ġuid : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsettings : ĠSettings Ċ ) Ġ: ĠData Repository Ġ{ ĊĠĠĠ Ġprivate Ġval Ġapi Ġ= ĠKotlin Conf Api ( end Point , Ġuid ) ĊĊĠĠĠ Ġoverride Ġvar Ġsessions : ĠList < Session Model >? Ġby Ġbind To Preferences ByKey (" settings Key ", ĠSession Model . serializer (). list ) ĊĠĠĠ Ġoverride Ġvar Ġfavor ites : ĠList < Session Model >? Ġby Ġbind To Preferences ByKey (" favorites Key ", ĠSession Model . serializer (). list ) ĊĠĠĠ Ġoverride Ġvar Ġvotes : ĠList < Vote >? Ġby Ġbind To Preferences ByKey (" votes Key ", ĠV ote . serializer (). list ) ĊĠĠĠ Ġoverride Ġvar ĠuserId : ĠString ? Ġby Ġbind To Preferences ByKey (" userId Key ", ĠString . serializer ()) ĊĊĠĠĠ Ġoverride Ġvar Ġprivacy Policy Accepted : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsettings . getBoolean (" privacy Policy Accepted Key ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . put Boolean (" privacy Policy Accepted Key ", Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlogged In : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( userId Ġ== Ġnull ) ĠuserId Ġ= Ġuid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġon Refresh Listeners : ĠList < () Ġ-> ĠUnit > Ġ= Ġempty List () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! logged In ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . createUser ( userId !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogged In Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi . getAll ( userId ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( cause : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUpdate Problem () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Sessions Ġ= Ġstate . all Sessions () ĊĠĠĠĠĠĠĠ Ġval Ġnew F avorites Ġ= Ġstate . favorite Sessions () ĊĠĠĠĠĠĠĠ Ġval Ġnew Votes Ġ= Ġstate . votes ĊĠĠĠĠĠĠĠ Ġif Ġ( new Sessions Ġ!= Ġsessions Ġ|| Ġnew F avorites Ġ!= Ġfavor ites Ġ|| Ġnew Votes Ġ!= Ġvotes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsessions Ġ= Ġnew Sessions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites Ġ= Ġnew F avorites ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvotes Ġ= Ġnew Votes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Refresh Listeners () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġaccept Privacy Policy () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivacy Policy Accepted Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Rating ( sessionId : ĠString ): ĠSession Rating ? Ġ= ĊĠĠĠĠĠĠĠ Ġvotes ?. find Ġ{ ĠsessionId Ġ== Ġit . sessionId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . rating ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠSession Rating . valueOf ( it ) Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġadd Rating ( sessionId : ĠString , Ġrating : ĠSession Rating ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠuserId Ġ?: Ġthrow ĠUnauthorized () ĊĠĠĠĠĠĠĠ Ġval Ġvote Ġ= ĠV ote ( sessionId , Ġrating . value ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi . post Vote ( vote , ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvotes Ġ= Ġvotes . or Empty (). filter Ġ{ Ġit . sessionId Ġ!= ĠsessionId Ġ}. plus ( vote ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( pipeline Error : ĠReceive Pipeline Fail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Error Ġ= Ġ( pipeline Error . cause Ġas ? ĠApiException ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġapi Error ?. response ?. status ?. value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġwhen Ġ( code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 7 7 Ġ-> ĠToo Early Vote () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 7 8 Ġ-> ĠToo Late Vote () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCannot Post Vote () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCannot Post Vote () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Refresh Listeners () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġremove Rating ( sessionId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠuserId Ġ?: Ġthrow ĠUnauthorized () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi . delete Vote ( Vote ( sessionId , Ġ 0 ), ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvotes Ġ= Ġvotes ?. filter Ġ{ Ġit . sessionId Ġ!= ĠsessionId Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCannot Delete Vote () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Refresh Listeners () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġset Favorite ( sessionId : ĠString , Ġis Favorite : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠuserId Ġ?: Ġthrow ĠUnauthorized () ĊĠĠĠĠĠĠĠ Ġval Ġfavorite Ġ= ĠF avorite ( sessionId ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites Ġ= Ġif Ġ( is Favorite ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . post Favorite ( favorite , ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfavorite Session Ġ= Ġsessions ?. first OrNull Ġ{ Ġit . id Ġ== ĠsessionId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠUnauthorized () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites . or Empty (). plus ( favorite Session ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . delete Favorite ( favorite , ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites ?. filter Ġ{ Ġit . id Ġ!= ĠsessionId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCannot Favorite () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Refresh Listeners () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Refresh Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġon Refresh Listeners . forEach Ġ{ Ġit () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠLocal Ġstorage ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġread ( key : ĠString , Ġelement Serializer : ĠK Serializer < T >) Ġ= Ġsettings ĊĠĠĠĠĠĠĠ Ġ. getString ( key , Ġ"") ĊĠĠĠĠĠĠĠ Ġ. take Unless Ġ{ Ġit . isBlank () Ġ} ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSON . parse ( element Serializer , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġwrite ( key : ĠString , Ġobj : ĠT ?, Ġelement Serializer : ĠK Serializer < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsettings . putString ( key , Ġif Ġ( obj Ġ== Ġnull ) Ġ"" Ġelse ĠJSON . stringify ( element Serializer , Ġobj )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġbind To Preferences ByKey ( ĊĠĠĠĠĠĠĠ Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġelement Serializer : ĠK Serializer < T > ĊĠĠĠ Ġ): ĠRead Write Property < Any ?, ĠT ?> Ġ= Ġobservable ( read ( key , Ġelement Serializer )) Ġ{ Ġ_, Ġ_, Ġnew Ġ-> ĊĠĠĠĠĠĠĠ Ġwrite ( key , Ġnew , Ġelement Serializer ) ĊĠĠĠ Ġ} Ċ }