package Ġde . al x gr k Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonInclude Ċ import Ġcom . fasterxml . jackson . annotation . JsonInclude . Include Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Feature Ċ import Ġcom . fasterxml . jackson . databind . Serialization Feature Ċ import Ġio . in bot . es kotlin wrapper . Index Repository Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . features .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . jackson .* Ċ import Ġio . ktor . locations .* Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . routing .* Ċ import Ġorg . apache . http . Http Host Ċ import Ġorg . elasticsearch . client .* Ċ import Ġorg . elasticsearch . client . indices . Get Index Request Ċ import Ġorg . slf 4 j . event . Level Ċ import Ġsoftware . amazon . aw ssdk . auth . credentials . Default Credentials Provider Ċ import Ġsoftware . amazon . aw ssdk . auth . signer . Aws 4 Signer Ċ import Ġsoftware . amazon . aw ssdk . regions . Region ĊĊ Ċ fun Ġmain ( args : ĠArray < String >): ĠUnit Ġ= Ġio . ktor . server . c io . Engine Main . main ( args ) Ċ Ċ @ Suppress (" unused ") Ġ// ĠRefer enced Ġin Ġapplication . conf Ċ @ kotlin . jvm . Jvm Over loads Ċ fun ĠApplication . module ( testing : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġval Ġevent Repo Ġ= Ġif Ġ(! testing ) Ġinitialize () Ġelse Ġnull ĊĊĠĠĠ Ġinstall ( Locations ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinstall ( Auto Head Response ) ĊĊĠĠĠ Ġinstall ( Call Logging ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠLevel . INFO ĊĠĠĠĠĠĠĠ Ġfilter Ġ{ Ġcall Ġ-> Ġcall . request . path (). startsWith ("/") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinstall ( C ORS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Options ) ĊĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Post ) ĊĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . ContentType ) ĊĠĠĠĠĠĠĠ Ġany Host () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinstall ( Default Headers ) Ġ{ ĊĠĠĠĠĠĠĠ Ġheader (" X - Engine ", Ġ" K tor ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinstall ( Content Neg otiation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġj ack son Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable ( Serialization Feature . IND ENT _ OUTPUT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisable ( Deserialization Feature . FAIL _ ON _ UNKNOWN _ PROPERTIES ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrouting Ġ{ ĊĊĠĠĠĠĠĠĠ Ġpost (" events ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġcall . receive < Event >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info ( event . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Repo ?. index ( event . userId Ġ+ Ġevent . timestamp , Ġevent , Ġcreate Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Created , Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoptions (" events ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . OK , Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠApplication . initialize (): ĠIndex Repository < Event > Ġ{ ĊĠĠĠ Ġval Ġhost Ġ= ĠSystem . getenv (" EL AST IC SEARCH _ URL ") Ġ?: Ġ" localhost " ĊĠĠĠ Ġlog . info (" Trying Ġto Ġconnect Ġto ĠElasticsearch Ġat Ġ$ host ") ĊĊĠĠĠ Ġval Ġprod Ġ= Ġhost Ġ!= Ġ" localhost " ĊĠĠĠ Ġval Ġrest Client Builder Ġ= ĊĠĠĠĠĠĠĠ ĠRest Client . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Host ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prod ) Ġ 4 4 3 Ġelse Ġ 9 2 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prod ) Ġ" https " Ġelse Ġ" http " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġif Ġ( prod ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrest Client Builder . set HttpClient Config Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaws Request Signing Interceptor Ġ= ĠAws Request Signing Interceptor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRegion . EU _ C ENTR AL _ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" es ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAws 4 Signer . create (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Credentials Provider . create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Interceptor Last ( aws Request Signing Interceptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġes Client Ġ= ĠRest High Level Client ( rest Client Builder ) ĊĠĠĠ Ġval Ġrepo Ġ= Ġes Client . index Repository < Event >( ĊĠĠĠĠĠĠĠ Ġindex Ġ= Ġ" events " ĊĠĠĠ Ġ) ĊĠĠĠ Ġif Ġ(! es Client . indices (). exists ( Get Index Request ( repo . index Name ), ĠRequest Options . DEFAULT )) ĊĠĠĠĠĠĠĠ Ġrepo . create Index Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplicas Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsh ards Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmappings Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword (" event _ type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword (" user _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword (" action ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield (" timestamp ", Ġ" date ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword (" target ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext (" selector ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword (" original ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber < Int >(" scroll _ position ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber < Int >(" estimated _ tweets _ sc rolled ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġrepo Ċ } Ċ Ċ @ JsonInclude ( Include . NON _ NULL ) Ċ data Ġclass ĠEvent ( ĊĠĠĠ Ġval ĠeventType : ĠEventType , ĊĠĠĠ Ġval ĠuserId : ĠString , ĊĠĠĠ Ġval Ġaction : ĠString , ĊĠĠĠ Ġval Ġtimestamp : ĠString , ĊĠĠĠ Ġval Ġtarget : ĠString ?, ĊĠĠĠ Ġval Ġselector : ĠString ?, ĊĠĠĠ Ġval Ġscroll Position : ĠInt ?, ĊĠĠĠ Ġval Ġestimated T weets Sc rolled : ĠInt ? Ċ ) Ġ{ ĊĠĠĠ Ġenum Ġclass ĠEventType Ġ{ ĊĠĠĠĠĠĠĠ ĠB ROW SER , ĊĠĠĠĠĠĠĠ ĠAND ROID ĊĠĠĠ Ġ} Ċ } ĊĊ