package Ġcom . example . clean architecture . data Ċ Ċ import Ġcom . example . clean architecture . data . local . db . App Database Ċ import Ġcom . example . clean architecture . data . model . User Entity Ċ import Ġcom . example . clean architecture . data . model . User Entity Mapper Ċ import Ġcom . example . clean architecture . data . remote . api . User Api Ċ import Ġcom . example . clean architecture . domain . model . User Ċ import Ġcom . example . clean architecture . domain . repository . UserRepository Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Single Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ class ĠUser Repository Impl Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġuser Api : ĠUser Api , ĊĠĠĠ Ġprivate Ġval Ġapp Database : ĠApp Database , ĊĠĠĠ Ġprivate Ġval Ġmapper : ĠUser Entity Mapper Ċ ) Ġ: ĠUser Repository Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġsign in ( userName : ĠString , Ġpassword : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Api . signin ( userName , Ġpassword ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetUser ( id : ĠString , Ġfrom Server : ĠBoolean ): ĠSingle < User > Ġ= Ġwhen Ġ( from Server ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġapp Database . user Dao (). findById ( id ). map Ġ{ Ġmapper . map To Domain ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġuser Api . getUser ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmapper . map To Domain ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Resume Next ( getUser ( id , Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave User ( user : ĠUser ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġset ( mapper . map To Entity ( user )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset ( user Entity : ĠUser Entity ) Ġ= Ġapp Database . user Dao (). insert ( user Entity ) Ċ }