package Ġdev . q ix ils . yahoo . api . plugins Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġdev . q ix ils . yahoo . api .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . server . application .* Ċ import Ġio . ktor . server . response .* Ċ import Ġio . ktor . server . routing .* Ċ import Ġjava . io . File Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap Ċ import Ġkotlin . collections . HashSet Ċ import Ġkotlin . math . ceil Ċ import Ġkotlin . reflect . jvm . java Type Ċ import Ġkotlin . reflect . type Of Ċ Ċ val Ġgson : ĠGson Ġ= ĠGson Builder () ĊĠĠĠ Ġ. serialize Null s () ĊĠĠĠ Ġ. disable Html Esc aping () ĊĠĠĠ Ġ. create () Ċ val Ġmessages Ġ= ĠHashMap < Message Reference , ĠMessage ?> () Ċ val Ġusers Ġ= ĠHashMap < Int , ĠUser ?> () Ċ val Ġmessage Indices Ġ= ĠHashMap < String , ĠList < Int > ?> () Ċ val Ġall Groups Ġ= ĠHashSet < String >() Ċ const Ġval ĠMESS AGES _ PER _ PAGE Ġ= Ġ 5 0 Ċ Ċ fun ĠApplication . configure Routing () Ġ{ ĊĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠ Ġget ("/ v 1 / groups ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( map Of (" groups " Ġto Ġget Groups ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/ v 1 / user /{ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠInt ? Ġ= Ġcall . parameters [" id "] ?. toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . BadRequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" error " Ġto Ġ" The Ġargument Ġ' id ' Ġcould Ġnot Ġbe Ġparsed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! user Exists ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . NotFound , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" error " Ġto Ġ" A Ġuser Ġwith Ġthe ĠID Ġof Ġ'$ id ' Ġcould Ġnot Ġbe Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser : ĠUser Ġ= ĠgetUser ( id ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/ v 1 / message /{ group }/{ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup : ĠString Ġ= Ġcall . parameters [" group "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠInt ? Ġ= Ġcall . parameters [" id "] ?. toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isValid ( group )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . NotFound , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" error " Ġto Ġ" A Ġgroup Ġby Ġthe Ġname Ġof Ġ'$ group ' Ġcould Ġnot Ġbe Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . BadRequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" error " Ġto Ġ" The Ġargument Ġ' id ' Ġcould Ġnot Ġbe Ġparsed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Ġ= ĠMessage Reference ( group , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage : ĠMessage ? Ġ= Ġfetch Message ( reference ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . NotFound , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" error " Ġto Ġ" A Ġmessage Ġwith Ġthe Ġid Ġ$ id Ġin Ġthe Ġgroup Ġ'$ group ' Ġcould Ġnot Ġbe Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/ v 1 / messages /{ group }/ pages ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup : ĠString Ġ= Ġcall . parameters [" group "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpages : ĠInt Ġ= Ġif Ġ( isValid ( group )) Ġceil ( message Indices [ group ] !!. size Ġ/ Ġ 5 0 f ). toInt () Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( map Of (" pages " Ġto Ġpages )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/ v 1 / messages /{ group }/ page /{ page }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup : ĠString Ġ= Ġcall . parameters [" group "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage : ĠInt ? Ġ= Ġcall . parameters [" page "] ?. toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isValid ( group )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . NotFound , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" error " Ġto Ġ" A Ġgroup Ġby Ġthe Ġname Ġof Ġ'$ group ' Ġcould Ġnot Ġbe Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( page Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . BadRequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" error " Ġto Ġ" The Ġargument Ġ' page ' Ġcould Ġnot Ġbe Ġparsed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( page Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . BadRequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" error " Ġto Ġ" The Ġpage Ġ'$ page ' Ġis Ġout Ġof Ġbounds Ġ( must Ġbe Ġgreater Ġthan Ġzero )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= Ġget From Offset ( group , Ġpage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( messages . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . NotFound , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" error " Ġto Ġ" The Ġpage Ġ'$ page ' Ġis Ġout Ġof Ġbounds ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page Ġ> Ġ 1 ) Ġpage Ġ- Ġ 1 Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page Exists ( group , Ġpage Ġ+ Ġ 1 )) Ġpage Ġ+ Ġ 1 Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/ v 1 / messages /{ group }/ search ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup : ĠString Ġ= Ġcall . parameters [" group "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isValid ( group )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . NotFound , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" error " Ġto Ġ" A Ġgroup Ġby Ġthe Ġname Ġof Ġ'$ group ' Ġcould Ġnot Ġbe Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( search ( call , Ġgroup )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : Ġjava . lang . IllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . BadRequest , Ġmap Of (" error " Ġto Ġexc . message )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/ favicon .{ ext }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Redirect (" https :// i . q ix ils . dev / favicon ." Ġ+ Ġcall . parameters [" ext "], Ġpermanent Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Redirect (" https :// swagger . q ix ils . dev /", Ġpermanent Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/ { ... }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . NotFound , Ġmap Of (" error " Ġto Ġ" The Ġrequested ĠAPI Ġcould Ġnot Ġbe Ġfound ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġuser Exists ( id : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠgetUser ( id ) Ġ!= Ġnull Ċ } Ċ Ċ fun ĠgetUser ( id : ĠInt ): ĠUser ? Ġ{ ĊĠĠĠ Ġif Ġ( users . containsKey ( id )) Ġreturn Ġusers [ id ] ĊĠĠĠ Ġval Ġfile Ġ= ĠFile (" data / users /${ id }. json ") ĊĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġusers [ id ] Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġuser : ĠUser Ġ= Ġgson . fromJson ( File (" data / users /${ id }. json "). read Text (), ĠUser :: class . java ) ĊĠĠĠ Ġusers [ id ] Ġ= Ġuser ĊĠĠĠ Ġreturn Ġuser Ċ } Ċ Ċ fun Ġget Groups (): ĠSet < String > Ġ{ ĊĠĠĠ Ġif Ġ( all Groups . isNotEmpty ()) Ġreturn Ġall Groups ĊĠĠĠ Ġval Ġdirectory Ġ= ĠFile (" data / groups /") ĊĠĠĠ Ġfor Ġ( file Ġin Ġdirectory . list () !! ) ĊĠĠĠĠĠĠĠ Ġall Groups . add ( file ) ĊĠĠĠ Ġreturn Ġall Groups Ċ } Ċ Ċ fun ĠisValid ( group : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( message Indices . containsKey ( group )) Ġreturn Ġmessage Indices [ group ] Ġ!= Ġnull ĊĠĠĠ Ġval Ġdirectory Ġ= ĠFile (" data / groups /$ group /") ĊĠĠĠ Ġif Ġ(! directory . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Indices [ group ] Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfiles Ġ= Ġdirectory . list Ġ{ Ġ_: ĠFile , Ġfilename : ĠString Ġ-> Ġfilename . endsWith (". json ") Ġ} ĊĠĠĠ Ġif Ġ( files Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Indices [ group ] Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġindices Ġ= ĠArrayList < Int >() ĊĠĠĠ Ġfor Ġ( file Ġin Ġfiles ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex : ĠInt ? Ġ= Ġfile . substring Before Last (". json "). toInt OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindices . add ( index ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( indices . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Indices [ group ] Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġindices . sort () ĊĠĠĠ Ġmessage Indices [ group ] Ġ= Ġindices ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun Ġfetch Message ( reference : ĠMessage Reference ): ĠMessage ? Ġ{ ĊĠĠĠ Ġif Ġ( messages . containsKey ( reference )) Ġreturn Ġmessages [ reference ] ĊĊĠĠĠ Ġval Ġfile Ġ= ĠFile (" data / groups /${ reference . group }/${ reference . id }. json ") ĊĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessages [ reference ] Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtext : ĠString Ġ= Ġfile . read Text () ĊĠĠĠ Ġval Ġvalue : ĠMessage Ġ= Ġgson . fromJson ( text , ĠMessage :: class . java ) ĊĠĠĠ Ġmessages [ reference ] Ġ= Ġvalue ĊĠĠĠ Ġreturn Ġvalue Ċ } Ċ Ċ fun ĠgetMessage Id ( group : ĠString , Ġpage Offset : ĠInt ): ĠInt ? Ġ{ ĊĠĠĠ Ġassert ( page Offset Ġ>= Ġ 0 ) ĊĠĠĠ Ġassert ( isValid ( group )) ĊĠĠĠ Ġval Ġindices Ġ= Ġmessage Indices [ group ] !! ĊĠĠĠ Ġval Ġoffset Ġ= Ġ( page Offset Ġ- Ġ 1 ) Ġ* ĠMESS AGES _ PER _ PAGE ĊĠĠĠ Ġreturn Ġif Ġ( offset Ġ< Ġindices . size ) Ġindices [ offset ] Ġelse Ġnull Ċ } Ċ Ċ fun Ġpage Exists ( group : ĠString , Ġoffset : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ(! isValid ( group )) Ġreturn Ġfalse ĊĠĠĠ Ġreturn ĠgetMessage Id ( group , Ġoffset ) Ġ!= Ġnull Ċ } Ċ Ċ fun Ġget From Offset ( group : ĠString , Ġoffset : ĠInt ): ĠList < Message > Ġ{ ĊĠĠĠ Ġval Ġmessages Ġ= ĠArrayList < Message >() ĊĠĠĠ Ġvar Ġnext Id : ĠInt ? Ġ= ĠgetMessage Id ( group , Ġoffset ) ĊĠĠĠ Ġwhile Ġ( messages . size Ġ< ĠMESS AGES _ PER _ PAGE Ġ&& Ġnext Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġfetch Message ( Message Reference ( group , Ġnext Id )) Ġ?: Ġbreak ĊĠĠĠĠĠĠĠ Ġmessages . add ( message ) ĊĠĠĠĠĠĠĠ Ġnext Id Ġ= Ġmessage . next In Time ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmessages Ċ } Ċ Ċ fun Ġsearch ( call : ĠApplication Call , Ġgroup : ĠString ): ĠSearch Results Ġ{ ĊĠĠĠ Ġif Ġ(! isValid ( group )) ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Provided Ġgroup Ġis Ġnot Ġvalid ") ĊĠĠĠ Ġval Ġparams Ġ= Ġcall . request . query Parameters ĊĠĠĠ Ġif Ġ(" author Id " Ġin Ġparams Ġ&& Ġparams [" author Id "] ?. toInt OrNull () Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("' author Id ' Ġparameter Ġ'${ params [" author Id "] }' Ġcould Ġnot Ġbe Ġparsed Ġas Ġan Ġinteger ") ĊĠĠĠ Ġif Ġ(" offset " Ġin Ġparams Ġ&& Ġparams [" offset "] ?. toInt OrNull () Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("' offset ' Ġparameter Ġ'${ params [" offset "] }' Ġcould Ġnot Ġbe Ġparsed Ġas Ġan Ġinteger ") ĊĠĠĠ Ġif Ġ(" after " Ġin Ġparams Ġ&& Ġparams [" after "] ?. toInt OrNull () Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("' after ' Ġparameter Ġ'${ params [" after "] }' Ġcould Ġnot Ġbe Ġparsed Ġas Ġan Ġinteger ") ĊĠĠĠ Ġif Ġ(" before " Ġin Ġparams Ġ&& Ġparams [" before "] ?. toInt OrNull () Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("' before ' Ġparameter Ġ'${ params [" before "] }' Ġcould Ġnot Ġbe Ġparsed Ġas Ġan Ġinteger ") ĊĊĠĠĠ Ġval Ġoffset : ĠInt Ġ= Ġparams [" offset "] ?. toInt () Ġ?: Ġ 0 ĊĠĠĠ Ġval Ġauthor Id : ĠInt ? Ġ= Ġparams [" author Id "] ?. toInt () ĊĠĠĠ Ġval Ġafter : ĠInt ? Ġ= Ġparams [" after "] ?. toInt () ĊĠĠĠ Ġval Ġbefore : ĠInt ? Ġ= Ġparams [" before "] ?. toInt () ĊĊĠĠĠ Ġval Ġmessages Ġ= ĠArrayList < Message >() ĊĠĠĠ Ġvar Ġskipped Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġmeta Index Ġ= Ġ 0 ĊĠĠĠ Ġval Ġindices Ġ= Ġmessage Indices [ group ] !! ĊĠĠĠ Ġvar Ġmore Results Found Ġ= Ġfalse ĊĠĠĠ Ġwhile Ġ( meta Index Ġ< Ġindices . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage : ĠMessage Ġ= Ġfetch Message ( Message Reference ( group , Ġindices [ meta Index ])) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠ Ġmeta Index Ġ+= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ// Ġhandle Ġsearch Ġqueries ĊĠĠĠĠĠĠĠ Ġif Ġ( author Id Ġ!= Ġnull Ġ&& Ġauthor Id Ġ!= Ġmessage . author Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġif Ġ(" displayName " Ġin Ġparams Ġ&& Ġ! params [" displayName "]. equals ( message . alias , Ġignore Case Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġif Ġ(" userName " Ġin Ġparams Ġ&& Ġ! params [" userName "]. equals ( getUser ( message . author Id )?. userName , Ġignore Case Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġif Ġ( after Ġ!= Ġnull Ġ&& Ġmessage . post Date Ġ< Ġafter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġif Ġ( before Ġ!= Ġnull Ġ&& Ġmessage . post Date Ġ> Ġbefore ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠ Ġ// Ġfinal Ġhandling ĊĠĠĠĠĠĠĠ Ġif Ġ( skipped Ġ< Ġoffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskipped Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( messages . size Ġ== ĠMESS AGES _ PER _ PAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmore Results Found Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . add ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠSearch Results ( messages , Ġmessages . size Ġ< ĠMESS AGES _ PER _ PAGE Ġ|| Ġ! more Results Found ) Ċ } Ċ