package Ġorg . simple . clin ic . login Ċ Ċ import Ġcom . f 2 pr ate ek . rx . preferences 2 . Preference Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġdagger . Lazy Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Single Ċ import Ġorg . simple . clin ic . analytics . Analytics Ċ import Ġorg . simple . clin ic . facility . Facility Repository Ċ import Ġorg . simple . clin ic . sync . Data Sync Ċ import Ġorg . simple . clin ic . user . LoggedIn User Payload Ċ import Ġorg . simple . clin ic . user . User Ċ import Ġorg . simple . clin ic . util . Just Ċ import Ġorg . simple . clin ic . util . Optional Ċ import Ġorg . simple . clin ic . util . read ErrorResponse Json Ċ import Ġorg . simple . clin ic . util . scheduler . Schedulers Provider Ċ import Ġretrofit 2 . HttpException Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Named Ċ Ċ class ĠLogin User With O tp Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġlogin Api : ĠLogin Api , ĊĠĠĠ Ġprivate Ġval Ġdata Sync : ĠData Sync , ĊĠĠĠ Ġprivate Ġval Ġuser Dao : ĠUser . Room Dao , ĊĠĠĠ Ġprivate Ġval Ġfacility Repository : ĠFac ility Repository , ĊĠĠĠ Ġprivate Ġval Ġs chedulers Provider : ĠS chedulers Provider , ĊĠĠĠ Ġprivate Ġval Ġm oshi : ĠM oshi , ĊĠĠĠ Ġ@ Named (" preference _ access _ token ") Ġprivate Ġval ĠaccessToken Preference : ĠPreference < Optional < String >> Ċ ) Ġ{ ĊĊĠ Ġfun Ġlogin With O tp ( phoneNumber : ĠString , Ġpin : ĠString , Ġo tp : ĠString ): ĠSingle < Login Result > Ġ{ ĊĠĠĠ Ġreturn ĠSingle . just ( User Payload ( phoneNumber , Ġpin , Ġo tp )) ĊĠĠĠĠĠĠĠ Ġ. map (:: Login Request ) ĊĠĠĠĠĠĠĠ Ġ. flatMap ( login Api :: login ) ĊĠĠĠĠĠĠĠ Ġ. flatMap (:: store User And AccessToken ) ĊĠĠĠĠĠĠĠ Ġ. do On Success (:: report User LoggedIn To Analytics ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠLogin Result . Success Ġas ĠLogin Result Ġ} ĊĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġsync On Login Result () Ġ} ĊĠĠĠĠĠĠĠ Ġ. onError Return (:: map Error To Login Result ) ĊĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĠTim ber . i (" Login Ġresult : Ġ$ it ") Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġstore User And AccessToken ( response : ĠLogin Response ): ĠSingle < User > Ġ{ ĊĠĠĠ Ġval Ġuser Ġ= Ġmap Payload To User ( response . logged In User ) ĊĠĠĠ Ġval Ġfacility Uuid Ġ= Ġresponse . logged In User . registration Facility Id ĊĊĠĠĠ Ġreturn ĠComp letable ĊĠĠĠĠĠĠĠ Ġ. from Action Ġ{ Ġuser Dao . create OrUpdate ( user ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. and Then ( facility Repository . associate User With Fac ilities ( user , ĠlistOf ( facility Uuid ), Ġcurrent Facility Ġ= Ġfacility Uuid )) ĊĠĠĠĠĠĠĠ Ġ. and Then ( Comp letable . from Action Ġ{ ĠaccessToken Preference . set ( Just ( response . accessToken )) Ġ}) ĊĠĠĠĠĠĠĠ Ġ. and Then ( Single . just ( user )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmap Payload To User ( payload : ĠLog ged In User Payload ): ĠUser Ġ{ ĊĠĠĠ Ġreturn Ġwith ( payload ) Ġ{ ĊĠĠĠĠĠ ĠUser ( ĊĠĠĠĠĠĠĠĠĠ Ġuuid Ġ= Ġuuid , ĊĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= ĠfullName , ĊĠĠĠĠĠĠĠĠĠ ĠphoneNumber Ġ= ĠphoneNumber , ĊĠĠĠĠĠĠĠĠĠ Ġpin Digest Ġ= Ġpin Digest , ĊĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġstatus , ĊĠĠĠĠĠĠĠĠĠ ĠcreatedAt Ġ= ĠcreatedAt , ĊĠĠĠĠĠĠĠĠĠ ĠupdatedAt Ġ= ĠupdatedAt , ĊĠĠĠĠĠĠĠĠĠ Ġlogged In Status Ġ= ĠUser . LoggedIn Status . LOG GED _ IN ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmap Error To Login Result ( error : ĠThrowable ): ĠLogin Result Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠ Ġerror Ġis ĠIOException Ġ-> ĠLogin Result . Network Error ĊĠĠĠĠĠ Ġerror Ġis ĠHttp Exception Ġ&& Ġerror . code () Ġ== Ġ 4 0 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Response Ġ= Ġread ErrorResponse Json < Login ErrorResponse >( error , Ġm oshi ) ĊĠĠĠĠĠĠĠ ĠLogin Result . ServerError ( error Response . first Error ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . e ( error ) ĊĠĠĠĠĠĠĠ ĠLogin Result . Unexpected Error ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġreport User LoggedIn To Analytics ( user : ĠUser ) Ġ{ ĊĠĠĠ ĠAnalytics . set LoggedIn User ( user ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsync On Login Result () Ġ{ ĊĠĠĠ Ġdata Sync ĊĠĠĠĠĠĠĠ Ġ. sync The World () ĊĠĠĠĠĠĠĠ Ġ. subscribe On ( schedul ers Provider . io ()) ĊĠĠĠĠĠĠĠ Ġ. onError Complete () ĊĠĠĠĠĠĠĠ Ġ. subscribe () ĊĠ Ġ} Ċ } Ċ