package Ġcom . ke k sec . bic od it _ android . core . data . repository Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . ke k sec . bic od it _ android . App Controller Ċ import Ġcom . ke k sec . bic od it _ android . R Ċ import Ġcom . ke k sec . bic od it _ android . core . data . helpers . Request Helpers Ċ import Ġcom . ke k sec . bic od it _ android . core . data . local . room . dao . rating . Rating Dao Ċ import Ġcom . ke k sec . bic od it _ android . core . data . local . room . dao . user . User Dao Ċ import Ġcom . ke k sec . bic od it _ android . core . data . local . room . helpers . converters . Converters Ċ import Ġcom . ke k sec . bic od it _ android . core . data . local . room . models . rating . Rating Data Ċ import Ġcom . ke k sec . bic od it _ android . core . data . local . room . models . user . UserData Ċ import Ġcom . ke k sec . bic od it _ android . core . data . remote . api . Rating ApiService Ċ import Ġcom . ke k sec . bic od it _ android . core . data . remote . api . User ApiService Ċ import Ġcom . ke k sec . bic od it _ android . core . data . remote . model . Error Ċ import Ġcom . ke k sec . bic od it _ android . core . data . remote . model . Event Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjavax . inject . Singleton Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġis Ġresponsible Ġfor Ġlogic Ġof Ġlogging Ġout Ġuser Ġand Ġgetting Ġuser Ġratings , Ġprofile Ġdata Ċ Ġ*/ Ċ @ Singleton Ċ class ĠHome Repository ( ĊĠĠĠ Ġprivate Ġval Ġuser Dao : ĠUser Dao , ĊĠĠĠ Ġprivate Ġval Ġrating Dao : ĠRating Dao , ĊĠĠĠ Ġprivate Ġval Ġuser ApiService : ĠUser ApiService , ĊĠĠĠ Ġprivate Ġval Ġrating ApiService : ĠRating ApiService Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġresponsible Ġfor Ġlogging Ġout Ġand Ġclearing Ġdata Ġof Ġuser Ġlocally ĊĠĠĠĠ Ġ* ĠFinally , Ġit Ġsets Ġup Ġoperation Ġresult Ġthus Ġnotify ing Ġthe Ġhome Ġfragment Ġof Ġa Ġchange ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlogout Monitor Ġis Ġthe Ġlifecycle Ġimportant Ġlive Ġdata Ġthat Ġholds Ġlogging Ġout Ġoperation Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġlogout User ( logout Monitor : ĠMutable LiveData < Event < Boolean >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogout Monitor . post Value ( Event . loading ()) ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Dao . delete All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrating Dao . delete All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Controller . prefs . accessToken Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Controller . prefs . userId Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogout Monitor . post Value ( Event . success ( null )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogout Monitor . post Value ( Event . error ( Error ( R . string . logout _ failed ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġrequests Ġserver Ġwith Ġauthorization Ġtoken Ġand Ġif Ġsuccessful Ġsaves Ġaccount Ġdata Ġfrom Ġa Ġresponse Ġto Ġthe Ġdatabase ĊĠĠĠĠ Ġ* ĠFinally , Ġit Ġsets Ġup Ġoperation Ġresult Ġthus Ġnotify ing Ġthe Ġhome Ġview Ġmodel Ġof Ġa Ġchange ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlive Data Ġis Ġthe Ġlifecycle Ġimportant Ġlive Ġdata Ġto Ġholds Ġoperation Ġof Ġgetting Ġuser Ġdata Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġget UserData ( live Data : ĠMutable LiveData < Event < UserData >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġlive Data . post Value ( Event . loading ()) ĊĠĠĠĠĠĠĠ Ġval Ġdb User Ġ= Ġuser Dao . getUser ById ( App Controller . prefs . userId !! ) ĊĠĠĠĠĠĠĠ Ġif Ġ( db User Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġuser ApiService . get Account Async () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrequest . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Status Ġ= Ġresponse . code () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Body Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Status Ġ== Ġ 2 0 0 Ġ&& Ġresponse Body Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Dao . insert ( response Body . userData ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Controller . prefs . userId Ġ= Ġresponse Body . userData . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . post Value ( Event . success ( user Dao . getUser ById ( App Controller . prefs . userId !! ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= ĠRequest Helpers . get Home UserData Request ErrorMessage ( response Status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . post Value ( Event . error ( Error ( errorMessage ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= ĠRequest Helpers . get Home UserData Request ErrorMessage (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . post Value ( Event . error ( Error ( errorMessage ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . post Value ( Event . success ( db User )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġrequests Ġserver Ġwith Ġauthorization Ġtoken Ġand Ġif Ġsuccessful Ġsaves Ġall Ġuser Ġrating Ġfrom Ġa Ġresponse Ġto Ġthe Ġdatabase ĊĠĠĠĠ Ġ* ĠFinally , Ġit Ġsets Ġup Ġoperation Ġresult Ġthus Ġnotify ing Ġthe Ġhome Ġview Ġmodel Ġof Ġa Ġchange ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlive Data Ġis Ġthe Ġlifecycle Ġimportant Ġlive Ġdata Ġto Ġholds Ġoperation Ġof Ġgetting Ġuser Ġratings Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun ĠgetAll User Ratings ( live Data : ĠMutable LiveData < Event < List < Rating Data >> >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlive Data . post Value ( Event . loading ()) ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġif Ġ( App Controller . prefs . userId Ġ!= Ġnull ) ĠApp Controller . prefs . userId Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġdb Ratings Ġ= Ġrating Dao . getAll In List ( userId !! ) ĊĠĠĠĠĠĠĠ Ġif Ġ( db Ratings . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġrating ApiService . get Ratings Async () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrequest . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Status Ġ= Ġresponse . code () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Body Ġ= Ġresponse . body () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Status Ġ== Ġ 2 0 0 Ġ&& Ġresponse Body Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Body . ratings . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġratings Ġ= Ġresponse Body . ratings . map Ġ{ Ġrating Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRating Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrating Response . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrating Response . userId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrating Response . user Login , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrating Response . avatar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrating Response . text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrating Response . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConverter s . to Offset DateTime ( rating Response . created Time ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrating Dao . insert All ( ratings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . post Value ( Event . success ( rating Dao . getAll In List ( App Controller . prefs . userId !! ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . post Value ( Event . error ( Error ( R . string . user _ not _ found ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . post Value ( Event . error ( Error ( R . string . failed _ get _ ratings ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . post Value ( Event . success ( db Ratings )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ