package Ġk ate . tutorial . kotlin . plugins Ċ Ċ import Ġcom . google . auth . oauth 2 . Google Credentials Ċ import Ġcom . google . firebase . Firebase App Ċ import Ġcom . google . firebase . Firebase Options Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . auth . Firebase Token Ċ import Ġcom . google . firebase . messaging . Firebase Messaging Ċ import Ġcom . google . firebase . messaging . Message Ċ import Ġcom . google . firebase . messaging . Notification Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . features .* Ċ import Ġio . ktor . gson .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . http . c io . websocket .* Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . routing .* Ċ import Ġio . ktor . util . Attribute Key Ċ import Ġio . ktor . websocket .* Ċ import Ġk ate . tutorial . kotlin . exceptions . Bad Param Exception Ċ import Ġk ate . tutorial . kotlin . exceptions . Illegal P uzzle Id Exception Ċ import Ġk ate . tutorial . kotlin . exceptions . P uzzle NotFoundException Ċ import Ġk ate . tutorial . kotlin . pu zzle .* Ċ import Ġk ate . tutorial . kotlin . user . User Ċ import Ġorg . jetbrains . ex posed . dao . with Ċ import Ġorg . jetbrains . ex posed . sql . Database Ċ import Ġorg . jetbrains . ex posed . sql . Schema Utils Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġjava . time . Duration Ċ import Ġjava . util .* Ċ Ċ fun ĠApplication . configure Routing () Ġ{ ĊĠĠĠ Ġ// ĠStarting Ġpoint Ġfor Ġa ĠK tor Ġapp : ĊĠĠĠ Ġinstall ( Content Neg otiation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgson Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġinstall ( Status Pages ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexception < Bad Param Exception > Ġ{ Ġcause Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . BadRequest , Ġmap Of (" message " Ġto Ġcause . message )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexception < P uzzle NotFoundException > Ġ{ Ġcause Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . NotFound , Ġmap Of (" message " Ġto Ġcause . message )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinstall ( WebSocket s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġping Period Ġ= ĠDuration . of Seconds ( 6 0 ) Ġ// ĠDisabled Ġ( null ) Ġby Ġdefault ĊĠĠĠĠĠĠĠ Ġtimeout Ġ= ĠDuration . of Seconds ( 1 5 ) ĊĠĠĠĠĠĠĠ Ġmax Frame Size Ġ= ĠLong . MAX _ VALUE Ġ// ĠDisabled Ġ( max Ġvalue ). ĠThe Ġconnection Ġwill Ġbe Ġclosed Ġif Ġsur passed Ġthis Ġlength . ĊĠĠĠĠĠĠĠ Ġmask ing Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠDatabase . connect (" jdbc : h 2 : mem : default ; DB _ CLOSE _ DELAY =- 1 ", Ġdriver Ġ= Ġ" org . h 2 . Driver ") ĊĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ ĠSchema Utils . create ( P uzz les ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser . new Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" K ate " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Ġ= Ġ" https :// imgur . com / l 0 sw FL 1 . jpg " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP uzzle . new Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" å¾ ŀ åīį å¾ ŀ åīį æľī ç¢ Ĺ " Ġ+ ĠlistOf (" æµ· é¾ ľ æ¹ ¯ ", Ġ" åŃ Ł å© Ĩ æ¹ ¯ ", Ġ" çİ ī ç±³ æ¹ ¯ ", Ġ" åįĹ çĵ ľ æ¹ ¯ "). random () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" ä¸ĸçķĮ .... ..\ n éľĢè¦ģ æĽ´å¤ļ åĬĽ éĩı ...... " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= ĠlistOf (" åİŁ åī µ ", Ġ" åĭķ æ¼ « å°ı èª ª æĪ ² åĬ ĩ è¡ į çĶŁ ", Ġ" é© ļ æĤ ļ ", Ġ" çĶŁæ´» "). random () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġservice Account Ġ= ĠApplication :: class . java . getResource AsStream ("/ Your - firebase - admin sdk - xxx . json ") ĊĠĠĠ Ġval Ġoptions Ġ= ĠFirebase Options . builder () ĊĠĠĠĠĠĠĠ Ġ. set Credentials ( Google Credentials . from Stream ( service Account )) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ ĠFirebase App . initialize App ( options ) ĊĊĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠ Ġget ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( map Of (" message " Ġto Ġ" HEL LO ĠW ORLD ! ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġauthentication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ api / pu zz les ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP uzzle . all (). with ( P uzzle :: author ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP uzzle Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġit . id . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġit . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Ġ= Ġit . author . avatar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatt endance Ġ= Ġ( 0 .. 1 0 ). random (). toString () Ġ+ Ġ" äºº ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġit . tags ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/ api / pu zz les ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcall . receive < P uzzle Request >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpuzzle Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP uzzle . new Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= ĠUser . all (). first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġrequest . title Ġ?: Ġthrow ĠBad Param Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġrequest . description Ġ?: Ġthrow ĠBad Param Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġrequest . tags Ġ?: Ġthrow ĠBad Param Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP uzzle Detail Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġtitle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Ġ= Ġauthor . avatar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġauthor . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġtags ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( pu zzle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ api / pu zz les /{ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpuzzle Id Ġ= Ġtry Ġ{ ĠUUID . fromString ( call . parameters [" id "]) Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġthrow ĠIllegal P uzzle Id Exception () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpuzzle Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP uzzle . findById ( pu zzle Id )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP uzzle Detail Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġpuzzle Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġtitle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Ġ= Ġauthor . avatar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġauthor . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġtags ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠP uzzle NotFoundException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( pu zzle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ("/ api / pu zz les /{ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpuzzle Id Ġ= Ġtry Ġ{ ĠUUID . fromString ( call . parameters [" id "]) Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġthrow ĠIllegal P uzzle Id Exception () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP uzzle . findById ( pu zzle Id )?. delete () Ġ?: Ġthrow ĠP uzzle NotFoundException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . No Content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġget ("/ api / messages ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage : ĠMessage Ġ= ĠMessage . builder () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Notification ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification . builder () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" F CM ĠMessage ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body (" ä¸ĸçķĮ æŃ£ éĹ ľ æ³¨ èĳĹ ä½ł ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Topic (" P uzzle ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Messaging . getInstance (). send ( message ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . OK ) Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġweb Socket ("/ chat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( frame Ġin Ġincoming ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( frame Ġis ĠFrame . Text ) Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġframe . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutgoing . send ( Frame . Text ("[ user ]: Ġ$ text ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . equals (" bye ", Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose ( Close Reason ( Close Reason . Codes . NORMAL , Ġ" Client Ġsaid ĠBY E ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ val ĠUser Attribute Key Ġ= ĠAttribute Key < Firebase Token >(" User Attribute Key ") Ċ inline Ġfun ĠRoute . authentication ( callback : ĠRoute . () Ġ-> ĠUnit ): ĠRoute Ġ{ ĊĠĠĠ Ġ// ĠWith Ġcreate Child , Ġwe Ġcreate Ġa Ġchild Ġnode Ġfor Ġthis Ġreceived ĠRoute ĊĠĠĠ Ġval Ġroute Authentication Ġ= Ġthis . create Child ( object Ġ: ĠRoute Selector () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġevaluate ( context : ĠRouting Resolve Context , Ġsegment Index : ĠInt ): ĠRoute Selector Evaluation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoute Selector Evaluation . Constant ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġ// ĠInter cept s Ġcalls Ġfrom Ġthis Ġroute Ġat Ġthe Ġfeatures Ġstep ĊĠĠĠ Ġroute Authentication . intercept ( Application Call Pipeline . Features ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . request . headers [" Authorization "] ?. replace (" Bearer Ġ", Ġ"") ?. let Ġ{ Ġid Token Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Auth . getInstance (). verify Id Token ( id Token ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ authentication . attributes . put ( User Attribute Key , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Unauthorized ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ intercept Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠConfigure Ġthis Ġroute Ġwith Ġthe Ġblock Ġprovided Ġby Ġthe Ġuser ĊĠĠĠ Ġcallback ( route Authentication ) ĊĊĠĠĠ Ġreturn Ġroute Authentication Ċ } Ċ