package Ġservices . api . client Ċ Ċ import Ġkotlinx . c interop . CP o inter Ċ import Ġkotlinx . c interop . ref To Ċ import Ġkotlinx . c interop . to K String Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlinx . serialization . decode FromString Ċ import Ġkotlinx . serialization . encode ToString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġplatform . posix . FILE Ċ import Ġplatform . posix . NULL Ċ import Ġplatform . posix . exit Ċ import Ġplatform . posix . f gets Ċ import Ġplatform . posix . pc lose Ċ import Ġplatform . posix . p open Ċ import Ġplatform . posix . printf Ċ import Ġservices . api . client . errors . C and ilib re Client Bad Token Exception Ċ import Ġservices . user . UserService Ċ Ċ internal Ġactual Ġclass ĠHttpClient ( ĊĠĠĠ Ġprivate Ġval Ġscheme : ĠString , ĊĠĠĠ Ġprivate Ġval Ġapp Host : ĠString , ĊĠĠĠ Ġprivate Ġval Ġapi Path : ĠString , ĊĠĠĠ Ġprivate Ġval Ġapp JWT Token : ĠString Ċ ) Ġ{ ĊĠĠĠ Ġactual Ġsuspend Ġinline Ġfun Ġ< re ified ĠExpected Response > Ġget ( ĊĠĠĠĠĠĠĠ Ġendpoint : ĠString , ĊĠĠĠĠĠĠĠ Ġvar arg Ġurl Params : ĠPair < String , ĠString > ĊĠĠĠ Ġ): ĠExpected Response Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget From K tor < Expected Response >( endpoint , Ġ* url Params ). also Ġ{ Ġprintln (" API ĠCALL ĠSUCCESS Ġon Ġ$ endpoint Ġ: Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" API ĠCALL ĠERROR Ġon Ġ$ endpoint Ġ: Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġsuspend Ġinline Ġfun Ġ< re ified ĠExpected Response , Ġre ified ĠBody Ġ: ĠAny > Ġpatch ( ĊĠĠĠĠĠĠĠ Ġendpoint : ĠString , ĊĠĠĠĠĠĠĠ Ġrequest Body : ĠBody ĊĠĠĠ Ġ): ĠExpected Response Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatch From K tor < Expected Response , ĠBody >( endpoint , Ġrequest Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġprintln (" API ĠCALL ĠSUCCESS Ġon Ġ$ endpoint Ġ: Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" API ĠCALL ĠERROR Ġon Ġ$ endpoint Ġ: Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġinline Ġfun Ġ< re ified ĠExpected Response > Ġget From K tor ( ĊĠĠĠĠĠĠĠ Ġendpoint : ĠString , ĊĠĠĠĠĠĠĠ Ġvar arg Ġurl Params : ĠPair < String , ĠString > ĊĠĠĠ Ġ): ĠExpected Response Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġurl Params . join ToString ("& ") Ġ{ Ġ"${ it . first } =${ it . second }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"$ scheme :// $ app Host /$ api Path /$ endpoint ?$ params " ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġ" curl Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- X ĠGET Ġ\"$ url \" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- H Ġ\" accept : Ġapplication / json \" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- H Ġ\" Authorization : ĠBearer Ġ$ app JWT Token \" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- H Ġ\" X - USER - ID : Ġ${ UserService . getUserId ( app JWT Token )}\ "" ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexecute Command ( command ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdecode Response ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġinline Ġfun Ġ< re ified ĠExpected Response , Ġre ified ĠBody Ġ: ĠAny > Ġpatch From K tor ( ĊĠĠĠĠĠĠĠ Ġendpoint : ĠString , ĊĠĠĠĠĠĠĠ Ġrequest Body : ĠBody ĊĠĠĠ Ġ): ĠExpected Response Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"$ scheme :// $ app Host /$ api Path /$ endpoint " ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠJson . encode ToString ( request Body ). replace (" \"", Ġ"\\ \" ") ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġ" curl Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- X ĠP ATCH Ġ\"$ url \" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- H Ġ\" accept : Ġapplication / json \" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- H Ġ\" Authorization : ĠBearer Ġ$ app JWT Token \" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- H Ġ\" Content - Type : Ġapplication / json \" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- H Ġ\" X - USER - ID : Ġ${ UserService . getUserId ( app JWT Token )} \" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- d Ġ\"$ body \"" ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexecute Command ( command ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Response ( result ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ERROR Ġwhile Ġdecoding Ġjson Ġ$ result ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠExpected Response > Ġdecode Response ( response : ĠString ): ĠExpected Response Ġ{ ĊĠĠĠĠĠĠĠ ĠJson Ġ{ Ġignore Unknown Keys Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Catch ing Ġ{ Ġdecode FromString < Bad Token Response >( response ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġif Ġ(! it . is Token Valid ) Ġthrow ĠC and ilib re Client Bad Token Exception ( app JWT Token ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠJson Ġ{ Ġignore Unknown Keys Ġ= Ġtrue Ġ}. decode FromString ( response ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġexecute Command ( command : ĠString ): ĠString Ġ= Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfp : ĠC Pointer < FILE >? Ġ= Ġp open ( command , Ġ" r ") ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 4 0 9 6 ) ĊĠĠĠĠĠĠĠ Ġval Ġreturn String Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġ/* ĠOpen Ġthe Ġcommand Ġfor Ġreading . Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( fp Ġ== ĠNULL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintf (" Failed Ġto Ġrun Ġcommand \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĠRead Ġthe Ġoutput Ġa Ġline Ġat Ġa Ġtime Ġ- Ġoutput Ġit . Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġscan Ġ= Ġf gets ( buffer . ref To ( 0 ), Ġbuffer . size , Ġfp ) ĊĠĠĠĠĠĠĠ Ġif Ġ( scan Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( scan Ġ!= ĠNULL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn String . append ( scan !!. to K String ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Ġ= Ġf gets ( buffer . ref To ( 0 ), Ġbuffer . size , Ġfp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* Ġclose Ġ*/ ĊĠĠĠĠĠĠĠ Ġp close ( fp ) ĊĠĠĠĠĠĠĠ Ġreturn String . trim (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġprivate Ġdata Ġclass ĠBad Token Response ( val Ġis Token Valid : ĠBoolean ) Ċ }