package Ġcom . graphql . ze gn us . graphql application Ċ Ċ import Ġandroid . support . annotation . Worker Thread Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . Kotlin Module Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . graphql . ze gn us . graphql application . api . ApiResponse Ċ import Ġcom . graphql . ze gn us . graphql application . api . Book Ċ import Ġkotlinx . coroutines .* Ċ import Ġokhttp 3 .* Ċ import Ġjava . io . IOException Ċ Ċ class ĠBook ViewModel Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġok HttpClient Ġ= ĠOk HttpClient . Builder (). build () ĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġui Scope : ĠCor outine Scope ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠCor outine Scope ( Dispatch ers . Main Ġ+ Ġjob ) ĊĊĠĠĠ Ġfun Ġrequest Book Id ( id : ĠString , Ġcallback : Ġ( Feedback ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( Feedback . Loading ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Request Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ Ġrequest ( id ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( book Request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġfun Ġrequest ( id : ĠString ): ĠFeedback Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠMediaType . parse (" application / json ; Ġcharset = utf - 8 ") ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{" query ":" { Ġbook ( id : Ġ\"$ id \") Ġ{ Ġid , Ġname , Ġgenre Ġ} Ġ} "} ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠRequest Body . create ( json , Ġquery ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url (" http :// 1 0 . 0 . 2 . 2 : 4 0 0 0 / graphql /") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġok HttpClient . new Call ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Response ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFeedback . Error ( response . message ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeedback . Error ( exception . localized Message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Response ( response : ĠResponse ): ĠFeedback Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body () Ġ?: Ġreturn ĠFeedback . Error (" body Ġis Ġnull ") ĊĊĠĠĠĠĠĠĠ Ġval Ġstring Json Ġ= Ġbody . string () ĊĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠObjectMapper (). register Module ( Kotlin Module ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Data Ġ= Ġmapper . readValue < ApiResponse >( string Json ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeedback . Loaded ( api Data . data . book ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeedback . Error (" error Ġparsing Ġresponse Ġ-> Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsealed Ġclass ĠFeedback Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠLoading Ġ: ĠFeedback () ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠError ( val Ġmessage : ĠString ) Ġ: ĠFeedback () ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠLoaded ( val Ġbook : ĠBook ) Ġ: ĠFeedback () ĊĠĠĠ Ġ} Ċ } Ċ