package Ġcom . edd . meme grid . util Ċ Ċ import Ġorg . json . JSONObject Ċ import Ġspark . Request Ċ import Ġspark . Response Ċ import Ġspark . Route Ċ import Ġspark . Spark . delete Ċ import Ġspark . Spark . exception Ċ import Ġspark . Spark . get Ċ import Ġspark . Spark . post Ċ import Ġkotlin . reflect . K Class Ċ Ċ const Ġval ĠHEADER _ USER _ AGENT Ġ= Ġ" User - Agent " Ċ const Ġval ĠHEADER _ ACCEPT Ġ= Ġ" Accept " Ċ Ċ const Ġval ĠMED IA _ TYPE _ JSON Ġ= Ġ" application / json " Ċ const Ġval ĠMED IA _ TYPE _ HTML Ġ= Ġ" text / html " Ċ const Ġval ĠMED IA _ TYPE _ ANY Ġ= Ġ"* /* " Ċ Ċ const Ġval ĠSTATUS _ CODE _ UNSUPPORTED _ MEDIA _ TYPE Ġ= Ġ 4 1 5 Ċ const Ġval ĠSTATUS _ CODE _ SERVER _ ERROR Ġ= Ġ 5 0 0 Ċ const Ġval ĠSTATUS _ CODE _ BAD _ REQUEST Ġ= Ġ 4 0 0 Ċ const Ġval ĠSTATUS _ CODE _ NOT _ FOUND Ġ= Ġ 4 0 4 Ċ const Ġval ĠSTATUS _ CODE _ CREATED Ġ= Ġ 2 0 1 Ċ Ċ /** Ċ Ġ* Ġ@ return Ġaccept Ġheader Ġvalue . Ċ Ġ*/ Ċ val ĠRequest . accept : ĠString ĊĠĠĠ Ġget () Ġ= Ġheaders ( HEADER _ ACCEPT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toLowerCase () Ċ Ċ /** Ċ Ġ* Ġ@ return Ġtrue Ġif Ġthis Ġrequest Ġcontains Ġjson Ġcontent Ġor Ġfalse Ġotherwise . Ċ Ġ*/ Ċ val ĠRequest . json : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġaccept . let Ġ{ Ġaccept Ġ-> ĊĠĠĠĠĠĠĠ Ġaccept . contains ( MEDIA _ TYPE _ JSON ) Ġ|| Ġaccept . contains ( MEDIA _ TYPE _ ANY ) ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* Ġ@ return Ġtrue Ġif Ġthis Ġrequest Ġcontains Ġhtml Ġcontent Ġor Ġfalse Ġotherwise . Ċ Ġ*/ Ċ val ĠRequest . html : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġaccept . let Ġ{ Ġaccept Ġ-> ĊĠĠĠĠĠĠĠ Ġaccept . contains ( MEDIA _ TYPE _ HTML ) Ġ|| Ġaccept . contains ( MEDIA _ TYPE _ ANY ) ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* Ġ@ return Ġparsed Ġjson Ġobject Ġfrom Ġrequest . Ċ Ġ*/ Ċ val ĠRequest . json Body ĊĠĠĠ Ġget () Ġ= ĠJSONObject ( body ()) Ċ Ċ /** Ċ Ġ* Ġ@ return Ġparameter Ġas Ġa ĠLong Ġnumber . Ċ Ġ*/ Ċ infix Ġfun ĠRequest . long Param ( name : ĠString ): ĠLong Ġ= Ġparams ( name ) ĊĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠĠĠ Ġ. to Long OrNull () ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠBad Me me Exception (" Parameter Ġ$ name , Ġmust Ġbe Ġa Ġnumber ") Ċ Ċ /** Ċ Ġ* Ġ@ return Ġproperty Ġfrom Ġjson Ġobject Ġas Ġstring . Ċ Ġ* Ġ@ throws ĠBad Me me Exception Ġif Ġproperty Ġis Ġmissing Ġor Ġblank . Ċ Ġ*/ Ċ infix Ġfun ĠJSONObject . string ( name : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġif Ġ( isNull ( name )) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠBad Me me Exception ("$ name Ġmust Ġbe Ġpresent ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġvalue Ġ= Ġget ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠBad Me me Exception ("$ name Ġmust Ġbe Ġa Ġstring ") ĊĊĠĠĠ Ġif Ġ( value . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠBad Me me Exception ("$ name Ġmust Ġnot Ġbe Ġblank ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġvalue Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ return Ġjson Ġerror Ġresponse Ġfrom Ġprovided Ġmessage . Ċ Ġ*/ Ċ fun Ġjson Error ( message : ĠString ) Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠ Ġ. put (" error ", Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ. toString () Ċ Ċ /** Ċ Ġ* ĠCreate Ġa ĠGET Ġjson Ġroute . Ċ Ġ*/ Ċ fun Ġget Json ( path : ĠString , Ġbody : Ġ( Request , ĠResponse ) Ġ-> ĠAny ) Ġ{ ĊĠĠĠ Ġget ( path , Ġjson Route ( body )) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa ĠPOST Ġjson Ġroute . Ċ Ġ*/ Ċ fun Ġpost Json ( path : ĠString , Ġbody : Ġ( Request , ĠResponse ) Ġ-> ĠAny ) Ġ{ ĊĠĠĠ Ġpost ( path , Ġjson Route ( body )) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa ĠDELETE Ġjson Ġroute . Ċ Ġ*/ Ċ fun Ġdelete Json ( path : ĠString , Ġbody : Ġ( Request , ĠResponse ) Ġ-> ĠAny ) Ġ{ ĊĠĠĠ Ġdelete ( path , Ġjson Route ( body )) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa Ġgeneric Ġjson Ġroute Ġwith Ġmedia Ġtype Ġhandling . Ċ Ġ*/ Ċ fun Ġjson Route ( body : Ġ( Request , ĠResponse ) Ġ-> ĠAny ) Ġ= ĠRoute Ġ{ Ġreq , Ġres Ġ-> ĊĠĠĠ Ġres . type ( MEDIA _ TYPE _ JSON ) ĊĊĠĠĠ Ġif Ġ( req . json ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbody ( req , Ġres ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġres . status ( STATUS _ CODE _ UNSUPPORTED _ MEDIA _ TYPE ) ĊĠĠĠĠĠĠĠ Ġjson Error (" Unsupported Ġmedia Ġtype : Ġ${ req . accept }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRegister Ġan Ġerror Ġhandler Ġwhich Ġwill Ġreturn Ġa ĠJson Ġresponse Ġto Ġthe Ġclient . Ċ Ġ*/ Ċ inline Ġin fix Ġfun Ġ< re ified ĠT Ġ: ĠException > ĠK Class < T >. json Exception ( status : ĠInt ) Ġ{ ĊĠĠĠ Ġexception ( T :: class . java ) Ġ{ Ġe , Ġ_, Ġres Ġ-> ĊĠĠĠĠĠĠĠ Ġres . type ( MEDIA _ TYPE _ JSON ) ĊĠĠĠĠĠĠĠ Ġres . status ( status ) ĊĠĠĠĠĠĠĠ Ġres . body ( json Error ( e . message Ġ?: Ġ" Error ")) ĊĠĠĠ Ġ} Ċ } Ċ