package Ġcom . example Ċ Ċ import Ġcom . example . ui . books . books Ċ import Ġcom . example . ui . cart . cart Ċ import Ġcom . example . ui . checkout . receipt Ċ import Ġcom . example . ui . login . Session Ċ import Ġcom . example . ui . login . login View Ċ import Ġio . ktor . application . Application Ċ import Ġio . ktor . application . call Ċ import Ġio . ktor . application . install Ċ import Ġio . ktor . auth .* Ċ import Ġio . ktor . client . HttpClient Ċ import Ġio . ktor . client . engine . apache . Apache Ċ import Ġio . ktor . features . Call Logging Ċ import Ġio . ktor . features . Content Neg otiation Ċ import Ġio . ktor . features . Status Pages Ċ import Ġio . ktor . gson . gson Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . locations . Locations Ċ import Ġio . ktor . request . path Ċ import Ġio . ktor . response . respond Ċ import Ġio . ktor . response . respond Text Ċ import Ġio . ktor . routing . get Ċ import Ġio . ktor . routing . routing Ċ import Ġio . ktor . sessions . Sessions Ċ import Ġio . ktor . sessions . cookie Ċ import Ġorg . slf 4 j . event . Level Ċ Ċ fun Ġmain ( args : ĠArray < String >): ĠUnit Ġ= Ġio . ktor . server . netty . Engine Main . main ( args ) Ċ Ċ @ Suppress (" unused ") Ġ// ĠRefer enced Ġin Ġapplication . conf Ċ @ kotlin . jvm . Jvm Over loads Ċ fun ĠApplication . module ( testing : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġinstall ( Sessions ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcookie < Session >( Constants . COOKIE _ NAME . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinstall ( Status Pages ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexception < Throwable > Ġ{ Ġcause Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . InternalServerError ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġcause ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinstall ( Locations ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinstall ( Call Logging ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠLevel . INFO ĊĠĠĠĠĠĠĠ Ġfilter Ġ{ Ġcall Ġ-> Ġcall . request . path (). startsWith ("/") Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġusers Ġ= ĠlistOf < String >(" shop per 1 ", Ġ" shop per 2 ", Ġ" shop per 3 ") ĊĠĠĠ Ġval Ġadmins Ġ= ĠlistOf < String >(" admin ") ĊĠĠĠ Ġinstall ( Authentication ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbasic (" book Store Auth ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrealm Ġ= Ġ" Book Ġstore " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( users . contains ( it . name ) Ġ|| Ġadmins . contains ( it . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġit . password Ġ== Ġ" password " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠUserId Principal ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinstall ( Content Neg otiation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgson Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Pretty Print ing () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġclient Ġ= ĠHttpClient ( Apache ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠ Ġbooks () ĊĠĠĠĠĠĠĠ Ġcart () ĊĠĠĠĠĠĠĠ Ġreceipt () ĊĠĠĠĠĠĠĠ Ġlogin View () ĊĠĠĠĠĠĠĠ Ġget ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text (" HEL LO ĠW ORLD !", ĠcontentType Ġ= ĠContentType . Text . Plain ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠĠĠĠĠ Ġauthenticate (" book Store Auth ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ api / try auth ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprincipal Ġ= Ġcall . principal < UserId Principal >() !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text (" Hello Ġ${ principal . name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } ĊĊĊ