package Ġno . nav . dag p enger . mot tak . be h ov . person Ċ Ċ import Ġcom . fasterxml . jackson . core . Json Parser Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Context Ċ import Ġcom . fasterxml . jackson . databind . Json Deserializer Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . annotation . Json Deserialize Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . nat pr y ce . kon fig . Configuration Ċ import Ġio . ktor . client . HttpClient Ċ import Ġio . ktor . client . features . Default Request Ċ import Ġio . ktor . client . request . accept Ċ import Ġio . ktor . client . request . header Ċ import Ġio . ktor . client . request . request Ċ import Ġio . ktor . client . request . url Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . http . HttpHeaders Ċ import Ġio . ktor . http . HttpMethod Ċ import Ġmu . Kotlin Logging Ċ import Ġno . nav . dag p enger . mot tak . Config . p dl Api Token Provider Ċ import Ġno . nav . dag p enger . mot tak . Config . p dl Api Url Ċ import Ġno . nav . dag p enger . mot tak . be h ov . Graph ql Query Ċ import Ġno . nav . dag p enger . mot tak . be h ov . Json Mapper . jackson Json Adapter Ċ Ċ private Ġval Ġs ik ker Log g Ġ= ĠKotlin Logging . logger (" t jen est ek all ") Ċ Ċ internal Ġclass ĠP dl Person data Opp sl ag ( config : ĠConfiguration ) Ġ: ĠPerson Opp sl ag Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtoken Provider Ġ= Ġconfig . p dl Api Token Provider ĊĠĠĠ Ġprivate Ġval Ġp dl Client Ġ= ĠHttpClient () Ġ{ ĊĠĠĠĠĠĠĠ Ġinstall ( Default Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . url ("${ config . p dl Api Url () }/ graphql ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ= ĠHttpMethod . Post ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader (" Content - Type ", Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader (" TE MA ", Ġ" DAG ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( ContentType . Application . Json ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġh ent Person ( id : ĠString ): ĠP dl . Person ? Ġ= Ġp dl Client . request < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . Authorization , Ġ" Bearer Ġ${ token Provider . get AccessToken () }") ĊĠĠĠĠĠĠĠ Ġbody Ġ= ĠPerson Query ( id ). toJson (). also Ġ{ Ġs ik ker Log g . info Ġ{ Ġ" For s Ã¸ ker ĠÃ¥ Ġh ente Ġperson Ġmed Ġid Ġ$ id Ġf ra ĠP DL " Ġ} Ġ} ĊĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Error ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs ik ker Log g . error Ġ{ Ġ" Fe il Ġi Ġperson Ġopp sl ag Ġfor Ġperson Ġmed Ġid Ġ$ id : Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠP dl Person data Opp sl ag Exception ( it ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP dl . Person . from Graph Ql Json ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠP dl Person data Opp sl ag Exception ( s : ĠString ) Ġ: ĠRuntimeException ( s ) Ċ Ċ internal Ġfun ĠhasError ( json : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġjson Ġ= Ġj ack son ObjectMapper (). read Tree ( json ) ĊĠĠĠ Ġreturn Ġ( har Graph ql Errors ( json ) Ġ&& Ġ! uk j ent Person Ident ( json )) Ċ } Ċ Ċ private Ġfun Ġhar Graph ql Errors ( json : ĠJsonNode ) Ġ= ĊĠĠĠ Ġjson [" errors "] Ġ!= Ġnull Ġ&& Ġ! json [" errors "]. isEmpty Ċ Ċ private Ġfun Ġuk j ent Person Ident ( node : ĠJsonNode ) Ġ= ĊĠĠĠ Ġnode [" errors "]. any Ġ{ Ġit [" message "]. as Text () Ġ== Ġ" F ant Ġik ke Ġperson " Ġ} Ċ Ċ internal Ġdata Ġclass ĠPerson Query ( val Ġid : ĠString ) Ġ: ĠGraph ql Query ( ĊĠĠĠ Ġ// language = Graph ql ĊĠĠĠ Ġquery Ġ= ĊĠĠĠ Ġ""" query ($ {' $ '} ident : ĠID !) Ġ{ ĊĠĠĠ Ġh ent Person ( ident : Ġ${ '$ '} ident ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnav n Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor nav n , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmel lom nav n , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġet tern av n ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġad resse bes ky tt else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgr ader ing ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġh ent Geo graf isk T ilk ny t ning ( ident : Ġ${ '$ '} ident ){ ĊĠĠĠĠĠĠĠ Ġgt Land ĊĠĠĠ Ġ} ĊĠĠĠ Ġh ent Id enter ( ident : Ġ${ '$ '} ident , Ġgr upper : Ġ[ AK TOR ID , FOL KER EG ISTER IDENT ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġid enter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġident , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrup pe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ċ } ĊĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠ Ġvariables Ġ= Ġmap Of (" ident " Ġto Ġid ) Ċ ) Ċ Ċ internal Ġclass ĠP dl Ġ{ ĊĊĠĠĠ Ġ@ Json Deserialize ( using Ġ= ĠPerson Deserializer :: class ) ĊĠĠĠ Ġdata Ġclass ĠPerson ( ĊĠĠĠĠĠĠĠ Ġval Ġnav n : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġakt Ã¸ r Id : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġf Ã¸ d se ls nummer : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġn ors k T ilk ny t ning : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġdisk res jon sk ode : ĠString ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom Graph Ql Json ( json : ĠString ): ĠPerson ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ack son Json Adapter . readValue ( json , ĠPerson :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠPerson Deserializer Ġ: ĠJson Deserializer < Person >() Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠJsonNode . akt Ã¸ r Id () Ġ= Ġthis . ident (" AK TOR ID ") ĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠJsonNode . f Ã¸ d se ls nummer () Ġ= Ġthis . ident (" FOL KER EG ISTER IDENT ") ĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠJsonNode . n ors k T ilk ny ting (): ĠBoolean Ġ= Ġfind Value (" gt Land ") ?. isNull Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠJsonNode . disk res j ons K ode (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Value (" ad resse bes ky tt else "). first OrNull ()?. path (" grader ing ") ?. as Text ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠJsonNode . person Nav n (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Value (" nav n "). first (). let Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfor nav n Ġ= Ġnode . path (" for nav n "). as Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmel lom nav n Ġ= Ġnode . path (" mel lom nav n "). as Text ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġet tern av n Ġ= Ġnode . path (" et tern av n "). as Text () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( mel lom nav n . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ"$ for nav n Ġ$ et tern av n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"$ for nav n Ġ$ mel lom nav n Ġ$ et tern av n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠJsonNode . ident ( type : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Value (" id enter "). first Ġ{ Ġit . path (" grup pe "). as Text () Ġ== Ġtype Ġ}. get (" ident "). as Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ?): ĠPerson ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode : ĠJsonNode Ġ= Ġp . readValue As Tree () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPerson ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav n Ġ= Ġnode . person Nav n (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġakt Ã¸ r Id Ġ= Ġnode . akt Ã¸ r Id (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Ã¸ d se ls nummer Ġ= Ġnode . f Ã¸ d se ls nummer (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ors k T ilk ny t ning Ġ= Ġnode . n ors k T ilk ny ting (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk res jon sk ode Ġ= Ġnode . disk res j ons K ode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uk j ent Person Ident ( node )) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ik ker Log g . info ( node . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ