package Ġi an m organ . graph store . controller Ċ Ċ import Ġgraphql . validation . ValidationError Ċ import Ġgro ovy . lang . Binding Ċ import Ġgro ovy . lang . Gro ovy Shell Ċ import Ġio . jav al in . Context Ċ import Ġio . jav al in . translator . json . J aval in Jack son Plugin Ċ import Ġjava . io . FileInputStream Ċ Ċ class ĠC tx Helper Ġconstructor ( context Ġ: ĠContext ){ ĊĠĠĠ Ġval Ġctx Ġ= Ġcontext ; ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġpayload Ġcan Ġeither Ġbe Ġpassed Ġas Ġthe Ġbody Ġto Ġthe Ġrequest Ġ( typ ical ĊĠĠĠĠ Ġ* Ġfor ĠREST Ġclients Ġand Ġwhen Ġusing Ġtools Ġsuch Ġas Ġa Ġcurl Ġor Ġas Ġa Ġform Ġparam Ġ( typ ical ĊĠĠĠĠ Ġ* Ġfor Ġsimple ĠU Is ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġextract Payload ( form Fields : ĠList < String > Ġ= ĠlistOf (" payload ")) : ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġform Fields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ctx . form Param Map (). containsKey ( field )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġctx . form Param ( field ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġctx . body () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTry Ġthe Ġ 2 Ġpossible Ġways Ġof Ġpassing Ġa Ġparam , Ġquery Ġparam Ġand Ġform Ġparam ĊĠĠĠĠ Ġ* Ġin Ġorder Ġor Ġreturn Ġthe Ġsupplied Ġdefault . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAllows Ġfor Ġflexible Ġuse Ġby Ġclients Ġdepending Ġon Ġtheir Ġdesign . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġextract Param ( param Name : ĠString ) Ġ: ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġparam Ġ= Ġctx . query Param ( param Name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( param Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Ġ= Ġctx . form Param ( param Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġparam ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġis HTML Response Expected () Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġexplicit Ġwith Ġquery Ġparam ĊĠĠĠĠĠĠĠ Ġif Ġ(" html ". equals ( ctx . query Param (" response Type "))) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ(" json ". equals ( ctx . query Param (" response Type "))) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġaccept Ġheader ĊĠĠĠĠĠĠĠ Ġval Ġaccept Ġ= Ġctx . request (). getHeader (" accept ") ĊĠĠĠĠĠĠĠ Ġif Ġ( accept Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccept Types Ġ= Ġaccept . split (",") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcan Ġnever Ġbe ĠHTML Ġif ĠJSON Ġspecified Ġas Ġan Ġaccept Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin Ġaccept Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== Ġ" application / json ") Ġreturn Ġfalse ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhave Ġexplicitly Ġasked Ġfor ĠHTML Ġencoding ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin Ġaccept Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== Ġ" html / text ") Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġfinal Ġtest Ġ- Ġwas Ġthe Ġoriginal Ġrequest Ġfrom Ġa Ġform Ġsubmission Ġ? ĊĠĠĠĠĠĠĠ Ġif Ġ(" application / x - www - form - urlencoded " Ġ== Ġctx . request (). getHeader (" content - type ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" html ". equals ( ctx . form Param (" response Type "))) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" json ". equals ( ctx . form Param (" response Type "))) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdefaults Ġto ĠHTML Ġfor Ġ< FORM > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġis Ġto Ġreturn ĠJSON ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠR enders Ġerrors Ġnicely Ġin Ġeither ĠHTML Ġor ĠJSON Ġformat ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrender Error Page ( data Ġ: ĠMap < String , Any >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Helper . build ( ctx ). is HTML Response Expected ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresent able Errors Ġ= ĠArrayList < Map < String , Any >>() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Errors Ġ= Ġdata . get (" errors ") Ġas ĠList < Any > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( raw Error Ġin Ġraw Errors ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresent able Error Ġ= ĠHashMap < String , Any >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Error Ġis ĠValidationError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent able Error [" message "] Ġ= Ġraw Error . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Error . locations . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent able Error [" has Locations "] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent able Error [" locations "] Ġ= Ġraw Error . locations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Error Ġis ĠMap < *, *> ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent able Error [" message "] Ġ= Ġraw Error [" message "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Error . containsKey (" stack Trace ")){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent able Error [" has StackTrace "] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent able Error [" stack Trace "] Ġ= Ġraw Error [" stack Trace "] Ġas ĠAny ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent able Errors . add ( present able Error ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . render Must ache ("/ errorPage . html ", Ġmap Of (" errors " Ġto Ġ Ġpresent able Errors )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . json ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender Results Page ( data Ġ: ĠMap < String , Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Helper . build ( ctx ). is HTML Response Expected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJ aval in Jack son Plugin . toJson ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . render Must ache ("/ results Page . html ", Ġmap Of (" json " Ġto Ġ Ġjson )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . json ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ object ĠHelper { ĊĊĠĠĠ Ġfun Ġbuild ( ctx Ġ: ĠContext ) Ġ: ĠC tx Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠC tx Helper ( ctx ) ĊĠĠĠ Ġ} Ċ Ċ }