package Ġno . nav . btn chat . common . infrastructure Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġio . ktor . application . Application Ċ import Ġio . ktor . application . install Ċ import Ġio . ktor . auth . Authentication Ċ import Ġio . ktor . features . C ORS Ċ import Ġio . ktor . features . Call Logging Ċ import Ġio . ktor . features . Content Neg otiation Ċ import Ġio . ktor . features . Status Pages Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . http . HttpMethod Ċ import Ġio . ktor . jackson . Jack son Converter Ċ import Ġio . ktor . metrics . drop wizard . Drop wizard Metrics Ċ import Ġio . ktor . request . path Ċ import Ġio . ktor . routing . route Ċ import Ġio . ktor . routing . routing Ċ import Ġio . ktor . server . engine . Application Engine Ċ import Ġio . ktor . server . engine . add Shutdown Hook Ċ import Ġio . ktor . server . engine . embedded Server Ċ import Ġio . ktor . server . netty . Net ty Ċ import Ġio . prometheus . client . drop wizard . Drop wizard Exports Ċ import Ġno . nav . btn chat . common . utils . Jack son Utils Ċ import Ġorg . slf 4 j . event . Level Ċ Ċ data Ġclass ĠApplication State ( val Ġapp name : ĠString , Ġval Ġport : ĠInt , Ġvar Ġrunning : ĠBoolean Ġ= Ġtrue , Ġvar Ġinitialized : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialized Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialized Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠHttp Server Ġ{ ĊĠĠĠ Ġfun Ġcreate ( app name : ĠString , Ġport : ĠInt , Ġconfig : ĠApplication .( state : ĠApplication State ) Ġ-> ĠUnit ): ĠApplication Engine Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapplication State Ġ= ĠApplication State ( app name , Ġport ) ĊĊĠĠĠĠĠĠĠ Ġval Ġapplication Server Ġ= Ġembedded Server ( Net ty , Ġport ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig ( this , Ġapplication State ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication State . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġapplication Server . add Shutdown Hook Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Shutdown Ġhook Ġcalled , Ġshut ting Ġdown Ġgrace fully ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication State . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Server . stop ( 5 0 0 0 , Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġapplication Server ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠApplication . na is Application ( application State : ĠApplication State ) Ġ{ ĊĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠ Ġroute ( application State . app name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġna is Routes ( read iness Check Ġ= Ġ{ Ġapplication State . initialized Ġ}, Ġli ven ess Check Ġ= Ġ{ Ġapplication State . running Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠApplication . status Pages () Ġ{ ĊĠĠĠ Ġinstall ( Status Pages ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnot Found Handler () ĊĠĠĠĠĠĠĠ Ġexception Handler () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠApplication . cors ( hosts : ĠList < String > Ġ= ĠlistOf ("* "), Ġ Ġmethods : ĠList < HttpMethod > Ġ= ĠlistOf ( HttpMethod . Post , ĠHttpMethod . Put , ĠHttpMethod . Delete )) Ġ{ ĊĠĠĠ Ġinstall ( C ORS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġallow Credentials Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġhosts . forEach Ġ{ Ġhost ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġmethods . forEach Ġ{ Ġmethod ( it ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠAuth Config Ġ{ ĊĠĠĠ Ġclass ĠUse Mock ( val Ġident : ĠString ) Ġ: ĠAuth Config () ĊĠĠĠ Ġclass ĠJ w ks Url ( val Ġurl : ĠString ) Ġ: ĠAuth Config () Ċ } Ċ fun ĠApplication . authentication ( config : ĠAuth Config ) Ġ{ ĊĠĠĠ Ġinstall ( Authentication ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( config ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAuth Config . Use Mock Ġ-> Ġsetup Mock ( Subject Principal ( config . ident )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAuth Config . Jw ks Url Ġ-> Ġsetup JWT ( config . url ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠApplication . json Support ( object Mapper : ĠObjectMapper ) Ġ{ ĊĠĠĠ Ġinstall ( Content Neg otiation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister ( ContentType . Application . Json , ĠJack son Converter ( object Mapper )) ĊĠĠĠ Ġ} Ċ } Ċ fun ĠApplication . call Logging ( app name : ĠString ) Ġ{ ĊĠĠĠ Ġinstall ( Call Logging ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠLevel . INFO ĊĠĠĠĠĠĠĠ Ġfilter Ġ{ Ġcall Ġ-> Ġcall . request . path (). startsWith ("/ $ app name / api ") Ġ} ĊĠĠĠĠĠĠĠ Ġm dc (" userId ", ĠSecurity :: get Subject ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠApplication . metrics () Ġ{ ĊĠĠĠ Ġinstall ( Drop wizard Metrics ) Ġ{ ĊĠĠĠĠĠĠĠ Ġio . prometheus . client . Collector Registry . default Registry . register ( Drop wizard Exports ( registry )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠApplication . standard App Setup ( application State : ĠApplication State , Ġauth Config : ĠAuth Config ) Ġ{ ĊĠĠĠ Ġna is Application ( application State ) ĊĠĠĠ Ġstatus Pages () ĊĠĠĠ Ġcors () ĊĠĠĠ Ġauthentication ( auth Config ) ĊĠĠĠ Ġjson Support ( Jack son Utils . object Mapper ) ĊĠĠĠ Ġcall Logging ( application State . app name ) ĊĠĠĠ Ġmetrics () Ċ } ĊĊ