/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠExp edia , ĠInc Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . exp edi ag roup . graphql . spring Ċ Ċ import Ġcom . exp edi ag roup . graphql . extensions . print Ċ import Ġcom . exp edi ag roup . graphql . spring . execution . Query Handler Ċ import Ġcom . exp edi ag roup . graphql . spring . model . GraphQL Request Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . databind . type . Map Type Ċ import Ġcom . fasterxml . jackson . databind . type . Type Factory Ċ import Ġgraphql . schema . GraphQL Schema Ċ import Ġorg . springframework . boot . autoconfigure . condition . Conditional On Property Ċ import Ġorg . springframework . context . annotation . Bean Ċ import Ġorg . springframework . context . annotation . Configuration Ċ import Ġorg . springframework . http . HttpMethod Ċ import Ġorg . springframework . http . MediaType Ċ import Ġorg . springframework . web . reactive . function . server . Server Request Ċ import Ġorg . springframework . web . reactive . function . server . await Body Ċ import Ġorg . springframework . web . reactive . function . server . body Value And Await Ċ import Ġorg . springframework . web . reactive . function . server . build And Await Ċ import Ġorg . springframework . web . reactive . function . server . co Router Ċ import Ġorg . springframework . web . reactive . function . server . json Ċ Ċ /** Ċ Ġ* ĠDefault Ġroute Ġconfiguration Ġfor ĠGraphQL Ġservice Ġand ĠSDL Ġservice Ġendpoints . Ċ Ġ*/ Ċ @ Configuration Ċ class ĠRoutes Configuration ( ĊĠĠĠ Ġprivate Ġval Ġconfig : ĠGraphQL Configuration Properties , ĊĠĠĠ Ġprivate Ġval Ġschema : ĠGraphQL Schema , ĊĠĠĠ Ġprivate Ġval Ġquery Handler : ĠQuery Handler , ĊĠĠĠ Ġprivate Ġval ĠobjectMapper : ĠObjectMapper Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġgraph QL MediaType : ĠMediaType Ġ= ĠMediaType (" application ", Ġ" graphql ") ĊĠĠĠ Ġprivate Ġval Ġmap Type Reference : ĠMap Type Ġ= ĠType Factory . default Instance (). construct Map Type ( HashMap :: class . java , ĠString :: class . java , ĠAny :: class . java ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġgraph QL Routes () Ġ= Ġco Router Ġ{ ĊĠĠĠĠĠĠĠ Ġ( POST ( config . endpoint ) Ġor ĠGET ( config . endpoint )). invoke Ġ{ Ġserver Request Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph QL Request Ġ= Ġcreate GraphQL Request ( server Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( graph QL Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph QL Result Ġ= Ġquery Handler . executeQuery ( graph QL Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (). json (). body Value And Await ( graph QL Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbad Request (). build And Await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġ@ Conditional On Property ( value Ġ= Ġ[" graphql . sdl . enabled "], Ġhaving Value Ġ= Ġ" true ", Ġmatch If Missing Ġ= Ġtrue ) ĊĠĠĠ Ġfun Ġs dl Route () Ġ= Ġco Router Ġ{ ĊĠĠĠĠĠĠĠ ĠGET ( config . sdl . endpoint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġok (). contentType ( MediaType . TEXT _ PLAIN ). body Value And Await ( schema . print ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġhttps :// github . com / F aster XML / jackson - module - kotlin / issues / 2 2 1 ĊĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate GraphQL Request ( server Request : ĠServer Request ): ĠGraphQL Request ? Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġserver Request . query Param (" query "). isPresent Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġserver Request . query Param (" query "). get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Name : ĠString ? Ġ= Ġserver Request . query Param (" operation Name "). orElse Get Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariables : ĠString ? Ġ= Ġserver Request . query Param (" variables "). orElse Get Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph QL Variables : ĠMap < String , ĠAny >? Ġ= Ġvariables ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . readValue ( it , Ġmap Type Reference ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGraphQL Request ( query Ġ= Ġquery , Ġoperation Name Ġ= Ġoperation Name , Ġvariables Ġ= Ġgraph QL Variables ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġserver Request . method () Ġ== ĠHttpMethod . POST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġserver Request . headers (). contentType (). orElse ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType . includes ( MediaType . APPLICATION _ JSON ) Ġ-> Ġserver Request . await Body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType . includes ( graph QL MediaType ) Ġ-> ĠGraphQL Request ( query Ġ= Ġserver Request . await Body ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} Ċ } Ċ