package Ġcom . sch ib st ed . account . web flows . api Ċ Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . nim bus ds . j ose . j wk . J WK Set Ċ import Ġcom . sch ib st ed . account . web flows . api . Sch ib st ed Account Token Protected Service . Sch ib st ed Account ApiResponse Ċ import Ġcom . sch ib st ed . account . web flows . user . User Ċ import Ġcom . sch ib st ed . account . web flows . util . Either Ċ import Ġcom . sch ib st ed . account . web flows . util . Either . Left Ċ import Ġokhttp 3 . Http Url Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ import Ġjava . io . IOException Ċ Ċ type alias ĠApi Result < T > Ġ= ĠEither < Http Error , ĠT > Ċ Ċ private Ġfun Ġ< T > ĠApi Result < Sch ib st ed Account ApiResponse < T >> . unpack (): ĠApi Result < T > Ġ{ ĊĠĠĠ Ġreturn Ġthis . map Ġ{ Ġit . data Ġ} Ċ } Ċ Ċ internal Ġclass ĠSch ib st ed Account Api ( baseUrl : ĠHttp Url , Ġok HttpClient : ĠOk HttpClient ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġretrofit : ĠRet rofit Ġ= ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠ Ġ. baseUrl ( baseUrl . toString ()) ĊĠĠĠĠĠĠĠ Ġ. add Converter Factory ( create Gson Converter Factory ()) ĊĠĠĠĠĠĠĠ Ġ. client ( api HttpClient ( ok HttpClient . newBuilder ())) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Gson Converter Factory (): ĠGson Converter Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. register Type Adapter ( J WK Set :: class . java , ĠJ WK Set Deserializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGson Converter Factory . create ( gson ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġapi HttpClient ( builder : ĠOk HttpClient . Builder ): ĠOk HttpClient Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Interceptor ( SDK UserAgent Header Interceptor ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsch acc Service Ġ= Ġretrofit . create ( Sch ib st ed Account Service :: class . java ) ĊĊĠĠĠ Ġfun Ġmake Token Request ( ĊĠĠĠĠĠĠĠ Ġtoken Request : ĠUser Token Request , ĊĠĠĠĠĠĠĠ Ġcallback : Ġ( Api Result < User Token Response >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ id " Ġto Ġtoken Request . clientId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" grant _ type " Ġto Ġ" authorization _ code ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" code " Ġto Ġtoken Request . auth Code , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" redirect _ uri " Ġto Ġtoken Request . redirect Uri ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtoken Request . code Verifier ?. let Ġ{ Ġcode Verifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams [" code _ verifier "] Ġ= Ġcode Verifier ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsch acc Service . token Request ( params ). enqueue ( Api Result Callback ( callback )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Token Request ( token Request : ĠRefresh Token Request ): ĠApi Result < User Token Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ id " Ġto Ġtoken Request . clientId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" grant _ type " Ġto Ġ" refresh _ token ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" refresh _ token " Ġto Ġtoken Request . refresh Token , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtoken Request . scope ?. let Ġ{ Ġscope Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams [" scope "] Ġ= Ġscope ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse To Result ( sch acc Service . token Request ( params ). execute ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLeft ( Http Error . Unexpected Error ( e )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlegacy RefreshToken Request ( ĊĠĠĠĠĠĠĠ Ġclient Credentials Basic Auth : ĠString , ĊĠĠĠĠĠĠĠ Ġrefresh Token : ĠString , ĊĠĠĠĠĠĠĠ Ġcallback : Ġ( Api Result < User Token Response >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" grant _ type " Ġto Ġ" refresh _ token ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" refresh _ token " Ġto Ġrefresh Token , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġsch acc Service . legacy Token Request ( client Credentials Basic Auth , Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( Api Result Callback ( callback )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Jw ks ( callback : Ġ( Api Result < J WK Set >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsch acc Service . jw ks (). enqueue ( Api Result Callback ( callback )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġuser Profile ( user : ĠUser , Ġcallback : Ġ( Api Result < UserProfile Response >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpro ct ected Sch acc Api ( user ) Ġ{ Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . user Profile ( user . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( Api Result Callback Ġ{ Ġcallback ( it . unpack ()) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsession Exchange ( ĊĠĠĠĠĠĠĠ Ġuser : ĠUser , ĊĠĠĠĠĠĠĠ ĠclientId : ĠString , ĊĠĠĠĠĠĠĠ Ġredirect Uri : ĠString , ĊĠĠĠĠĠĠĠ Ġstate : ĠString ?, ĊĠĠĠĠĠĠĠ Ġcallback : Ġ( Api Result < Session Exchange Response >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" type " Ġto Ġ" session ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" clientId " Ġto ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" redirect Uri " Ġto Ġredirect Uri ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġstate ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams [" state "] Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpro ct ected Sch acc Api ( user ) Ġ{ Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . session Exchange ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( Api Result Callback Ġ{ Ġcallback ( it . unpack ()) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcode Exchange ( ĊĠĠĠĠĠĠĠ Ġuser : ĠUser , ĊĠĠĠĠĠĠĠ ĠclientId : ĠString , ĊĠĠĠĠĠĠĠ Ġcallback : Ġ( Api Result < Code Exchange Response >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpro ct ected Sch acc Api ( user ) Ġ{ Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . code Exchange ( clientId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( Api Result Callback Ġ{ Ġcallback ( it . unpack ()) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlegacy Code Exchange ( ĊĠĠĠĠĠĠĠ ĠaccessToken : ĠString , ĊĠĠĠĠĠĠĠ ĠclientId : ĠString , ĊĠĠĠĠĠĠĠ Ġcallback : Ġ( Api Result < Code Exchange Response >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsch acc Service . legacy Code Exchange (" Bearer Ġ$ accessToken ", ĠclientId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( Api Result Callback Ġ{ Ġcallback ( it . unpack ()) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpro ct ected Sch acc Api ( ĊĠĠĠĠĠĠĠ Ġuser : ĠUser , ĊĠĠĠĠĠĠĠ Ġblock : Ġ( Sch ib st ed Account Token Protected Service ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= Ġuser . httpClient . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Interceptor ( SDK UserAgent Header Interceptor ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġprotected Sch acc Service Ġ= Ġretrofit . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. client ( httpClient ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( Sch ib st ed Account Token Protected Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġblock ( protected Sch acc Service ) ĊĠĠĠ Ġ} Ċ } Ċ