package Ġsw ali Ċ Ċ import Ġcom . amazonaws . services . lambda . runtime . events . API Gateway Proxy Request Event Ċ import Ġcom . amazonaws . services . lambda . runtime . events . API Gateway Proxy Response Event Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . URL ĊĊ Ċ class ĠHttp Api ( val Ġlinter : ĠL inter ) Ġ{ ĊĠĠĠ Ġfun Ġroute ( request : ĠAPI Gateway Proxy Request Event ?, Ġlog : Ġ( String ) Ġ-> ĠUnit ): ĠAPI Gateway Proxy Response Event Ġ{ ĊĠĠĠĠĠĠĠ Ġlog (" received : Ġ$ request ") ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( request ?. path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ vi olations " Ġ-> Ġserve Vi olations ( request , Ġlinter , Ġlog ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ supported - rules " Ġ-> Ġserve Supported Rules ( linter . rules ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ api . yaml " Ġ-> Ġserve Api Def () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠAPI Gateway Proxy Response Event (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= Ġ 4 0 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Ġ= Ġmap Of (" Content - Type " Ġto Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġmapper . writeValue AsString ( map Of (" status " Ġto Ġ 4 0 0 , Ġ" title " Ġto Ġ" Path Ġ${ request ?. path } Ġnot Ġfound ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserve Vi olations ( ĊĠĠĠĠĠĠĠ Ġrequest : ĠAPI Gateway Proxy Request Event ?, ĊĠĠĠĠĠĠĠ Ġlinter : ĠL inter , ĊĠĠĠĠĠĠĠ Ġlog : Ġ( String ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠAPI Gateway Proxy Response Event Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlint ing Request Ġ= Ġread Body ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Definition Ġ= Ġget Api Definition ( lint ing Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġignore Rules Ġ= Ġlint ing Request . ignore Rules . or Empty (). toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġlinter . do Lint ( api Definition , Ġignore Rules ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAPI Gateway Proxy Response Event (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Content - Type " Ġto Ġ" application / json ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Access - Control - Allow - Origin " Ġto Ġ"*", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cache - Control " Ġto Ġ" no - cache " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġmapper . writeValue AsString ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" WARN : Ġbad Ġrequest Ġ${ request ?. body } Ġ| Ġexception : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( code , Ġmessage ) Ġ= Ġif Ġ( e Ġis ĠBadRequest Exception ) Ġ 4 0 0 Ġto Ġe . message Ġelse Ġ 5 0 0 Ġto Ġ" internal Ġserver Ġerror " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAPI Gateway Proxy Response Event (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Ġ= Ġmap Of (" Content - Type " Ġto Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġmapper . writeValue AsString ( map Of (" status " Ġto Ġ 4 0 0 , Ġ" title " Ġto Ġmessage )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Api Definition ( req : ĠL int ing Request ) Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreq . api Definition Ġ!= Ġnull Ġ-> Ġreq . api Definition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreq . api Definition Url Ġ!= Ġnull Ġ-> Ġdownload File ( URL ( req . api Definition Url )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠBadRequest Exception (" Both Ġapi _ definition Ġand Ġapi _ definition _ url Ġare Ġabsent ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Body ( request : ĠAPI Gateway Proxy Request Event ?): ĠL int ing Request Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . readValue ( request ?. body . or Empty ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception (" Can 't Ġparse Ġrequest Ġbody ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġdownload File ( url : ĠURL ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconn Ġ= Ġurl . open Connection () Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . request Method Ġ= Ġ" GET " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( conn . response Code Ġ!= Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . inputStream . buffered Reader (). read Text () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception (" Failed Ġto Ġdownload ĠAPI Ġdefinition Ġfrom Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġserve Supported Rules ( rules : ĠList < Rule >): ĠAPI Gateway Proxy Response Event Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrules Dto Ġ= Ġrules . map Ġ{ ĠRule Dto ( it . title , Ġit . id , Ġit . violation Type , Ġrule Link ( it . id )) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠAPI Gateway Proxy Response Event (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Ġ= Ġmap Of (" Content - Type " Ġto Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġmapper . writeValue AsString ( map Of (" supported _ rules " Ġto Ġrules Dto )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserve Api Def (): ĠAPI Gateway Proxy Response Event Ġ= ĊĠĠĠĠĠĠĠ ĠAPI Gateway Proxy Response Event (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Ġ= Ġmap Of (" Content - Type " Ġto Ġ" text / yaml ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠApp Config :: class . java . getResource AsStream (" api . yaml "). buffered Reader (). read Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBadRequest Exception ( message : ĠString ) Ġ: ĠRuntimeException ( message ) Ċ }