package Ġru . ot us . ot us kotlin . vd . rent al property . be . repository . cassandra . directory Ċ Ċ import Ġcom . data st ax . oss . driver . api . core . C ql Session Ċ import Ġcom . data st ax . oss . driver . api . core . metadata . schema . Cluster ing Order Ċ import Ġcom . data st ax . oss . driver . api . core . type . DataTypes Ċ import Ġcom . data st ax . oss . driver . api . query builder . Schema Builder Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . toList Ċ import Ġkotlinx . coroutines . gu ava . await Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Timeout Ċ import Ġru . ot us . ot us kotlin . vd . rent al property . be . common . context . Be Context Ċ import Ġru . ot us . ot us kotlin . vd . rent al property . be . common . exceptions . Repo Index Exception Ċ import Ġru . ot us . ot us kotlin . vd . rent al property . be . common . exceptions . Repo Modify Exception Ċ import Ġru . ot us . ot us kotlin . vd . rent al property . be . common . exceptions . Repo NotFoundException Ċ import Ġru . ot us . ot us kotlin . vd . rent al property . be . common . exceptions . Repo Wrong Id Exception Ċ import Ġru . ot us . ot us kotlin . vd . rent al property . be . common . repositories . ID irectory Repository Ċ import Ġru . ot us . ot us kotlin . vd . rent al property . be . directory . model . Directory ItemId Model Ċ import Ġru . ot us . ot us kotlin . vd . rent al property . be . directory . model . ID irectory Item Model Ċ import Ġru . ot us . ot us kotlin . vd . rent al property . be . repository . cassandra . common . Repository C assandra Ċ import Ġjava . time . Duration Ċ import Ġjava . util .* Ċ Ċ class ĠDirectory Repository C assandra ( ĊĠ Ġoverride Ġval Ġkey space Name : ĠString , ĊĠ Ġoverride Ġval Ġhosts : ĠString Ġ= Ġ"", ĊĠ Ġoverride Ġval Ġport : ĠInt Ġ= Ġ 9 0 4 2 , ĊĠ Ġoverride Ġval Ġuser : ĠString Ġ= Ġ" cassandra ", ĊĠ Ġoverride Ġval Ġpass : ĠString Ġ= Ġ" cassandra ", ĊĠ Ġoverride Ġval Ġreplication Factor : ĠInt Ġ= Ġ 1 , ĊĠ Ġoverride Ġval Ġtesting : ĠBoolean Ġ= Ġfalse , ĊĠ Ġprivate Ġval Ġtimeout : ĠDuration Ġ= ĠDuration . of Seconds ( 3 0 ), ĊĠ Ġinit Objects : ĠCollection < ID irectory Item Model > Ġ= Ġempty List (), Ċ ) Ġ: ĠID irectory Repository , ĠRepository C assandra ( key space Name , Ġhosts , Ġport , Ġuser , Ġpass , Ġreplication Factor ) Ġ{ ĊĊĠ Ġprivate Ġval Ġmapper Ġby Ġlazy Ġ{ ĊĠĠĠ ĠDirectory C assandra Mapper Builder ( session ). build () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ ĠDAO ĠÐ´Ð»Ñı ĠÐ¾Ð¿ ÐµÑĢ Ð°ÑĨÐ¸ Ð¹ ĠÐ¿Ð¾ Ġid ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġdao ById Ġby Ġlazy Ġ{ ĊĠĠĠ Ġmapper . directory ById Dao ( key space Name , ĠDirectory ById C assandra Dto . TABLE _ NAME ). apply Ġ{ ĊĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Objects . map Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġwith Timeout ( timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Async ( Directory ById C assandra Dto . of ( model )). await () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ ĠDAO ĠÐ´Ð»Ñı ĠÐ¾Ð¿ ÐµÑĢ Ð°ÑĨÐ¸ Ð¹ ĠÑģ ĠÐ½Ð°Ð· Ð² Ð°Ð½Ð¸Ñı Ð¼Ð¸ ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġdao ByType Ġby Ġlazy Ġ{ ĊĠĠĠ Ġmapper . directory ByType Dao ( key space Name , ĠDirectory ByType C assandra Dto . TABLE _ NAME ). apply Ġ{ ĊĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Objects . map Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġwith Timeout ( timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Async ( Directory ByType C assandra Dto . of ( model )). await () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġread ( context : ĠBe Context ): ĠID irectory Item Model Ġ{ ĊĠĠĠ Ġval Ġid Ġ= Ġcontext . request Directory ItemId ĊĠĠĠ Ġif Ġ( id Ġ== ĠDirectory ItemId Model . NONE ) Ġthrow ĠRepo Wrong Id Exception ( id . id ) ĊĠĠĠ Ġreturn Ġwith Timeout ( timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġmodel Ġ= Ġdao ById . read Async ( id . id ). await ()?. to Model () Ġ?: Ġthrow ĠRepo NotFoundException ( id . id ) ĊĠĠĠĠĠ Ġcontext . response Directory Item Ġ= Ġmodel ĊĠĠĠĠĠ Ġmodel ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠÐĹ Ð°Ð¿ Ð¸Ñģ ÑĮ ĠÐ¿ÑĢÐ¾ Ð¸Ñģ ÑħÐ¾Ð´ Ð¸ÑĤ ĠÐ² Ð¾ ĠÐ²ÑģÐµ ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ Ñĭ ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġsuspend Ġfun Ġcreate ( context : ĠBe Context ): ĠID irectory Item Model Ġ{ ĊĠĠĠ Ġval Ġid Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠ Ġval Ġdto ById Ġ= ĠDirectory ById C assandra Dto . of ( context . request Directory Item , Ġid ) ĊĠĠĠ Ġreturn Ġwith Timeout ( timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠ Ġdao ById . create Async ( dto ById ). await () ĊĠĠĠĠĠ Ġval Ġmodel Ġ= Ġdao ById . read Async ( id ). await ()?. to Model () Ġ?: Ġthrow ĠRepo NotFoundException ( id ) ĊĠĠĠĠĠ Ġcontext . response Directory Item Ġ= Ġmodel ĊĠĠĠĠĠ Ġmodel ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ ĠÐĺ ÑģÐ¿ Ð¾Ð»ÑĮÐ·Ð¾Ð² Ð°Ð½Ð¸Ðµ ĠOptim istic ĠLock ĠÐ´Ð»Ñı ĠÐ¿ÑĢ Ð¸Ð¼ÐµÑĢ Ð° , ĠÐ² ĠÐ´Ð°Ð½ Ð½Ð¾Ð¼ ĠÑģÐ» ÑĥÑĩ Ð° Ðµ Ġupdate ĠÐ° Ð½ Ð°Ð» Ð¾Ð³ Ð¸Ñĩ ÐµÐ½ Ġcreate ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġsuspend Ġfun Ġupdate ( context : ĠBe Context ): ĠID irectory Item Model Ġ{ ĊĠĠĠ Ġval Ġid Ġ= Ġcontext . request Directory Item . id ĊĠĠĠ Ġif Ġ( id Ġ== ĠDirectory ItemId Model . NONE ) Ġthrow ĠRepo Wrong Id Exception ( id . id ) ĊĠĠĠ Ġreturn Ġwith Timeout ( timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġlock Key Ġ= Ġdao ById . read Async ( id . id ). await ()?. lock Version Ġ?: Ġthrow ĠRepo NotFoundException ( id . id ) ĊĠĠĠĠĠ Ġval Ġdto ById Ġ= ĠDirectory ById C assandra Dto . of ( context . request Directory Item ) ĊĠĠĠĠĠ Ġval Ġdto ByType Ġ= ĠDirectory ByType C assandra Dto . of ( context . request Directory Item ) ĊĠĠĠĠĠ Ġval Ġis Updated Ġ= Ġdao ById . update Async ( dto ById , Ġlock Key ). await () ĊĠĠĠĠĠ Ġif Ġ(! is Updated ) Ġthrow ĠRepo Modify Exception ( id . id ) ĊĠĠĠĠĠ Ġif Ġ( dto ByType . type Ġ!= Ġnull ) Ġdao ByType . create Async ( dto ByType ). await () ĊĠĠĠĠĠ Ġval Ġmodel Ġ= Ġdao ById . read Async ( id . id ). await ()?. to Model () Ġ?: Ġthrow ĠRepo NotFoundException ( id . id ) ĊĠĠĠĠĠ Ġcontext . response Directory Item Ġ= Ġmodel ĊĠĠĠĠĠ Ġmodel ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠÐ£ Ð´Ð°Ð» ÐµÐ½Ð¸Ðµ ĠÐ·Ð°Ð¿Ð¸Ñģ Ð¸ ĠÐ¸Ð· ĠÐ²ÑģÐµ Ñħ ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġsuspend Ġfun Ġdelete ( context : ĠBe Context ): ĠID irectory Item Model Ġ{ ĊĠĠĠ Ġval Ġid Ġ= Ġcontext . request Directory ItemId ĊĠĠĠ Ġif Ġ( id Ġ== ĠDirectory ItemId Model . NONE ) Ġthrow ĠRepo Wrong Id Exception ( id . id ) ĊĠĠĠ Ġreturn Ġwith Timeout ( timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġmodel Ġ= Ġdao ById . read Async ( id . id ). await ()?. to Model () Ġ?: Ġthrow ĠRepo NotFoundException ( id . id ) ĊĠĠĠĠĠ Ġdao ById . delete Async ( id . id ). await () ĊĠĠĠĠĠ Ġdao ByType . delete Async ( Directory ByType C assandra Dto . of ( model )). await () ĊĠĠĠĠĠ Ġcontext . response Directory Item Ġ= Ġmodel ĊĠĠĠĠĠ Ġmodel ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġlist ( context : ĠBe Context ): ĠCollection < ID irectory Item Model > Ġ{ ĊĠĠĠ Ġval Ġfilter Ġ= Ġcontext . directory Filter ĊĠĠĠ Ġvar Ġlast Index Ġ= Ġfilter . offset Ġ+ Ġfilter . count ĊĠĠĠ Ġif Ġ( filter . text . length Ġ< Ġ 3 ) Ġthrow ĠRepo Index Exception ( filter . text ) ĊĠĠĠ Ġreturn Ġwith Timeout ( timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġrecords Ġ= Ġdao ByType . filter ByType Async ("% ${ filter . text }% "). await (). toList () ĊĠĠĠĠĠĠĠ Ġ. sorted By Descending Ġ{ Ġit . timestamp Ġ} ĊĠĠĠĠĠ Ġval Ġrecords Count Ġ= Ġrecords . count () ĊĠĠĠĠĠ Ġif Ġ( records Count Ġ< Ġlast Index ) Ġlast Index Ġ= Ġrecords Count ĊĠĠĠĠĠ Ġval Ġlist Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( pos Ġin Ġfilter . offset Ġuntil Ġlast Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrecords [ pos ]. id ?. let Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( dao ById . read Async ( id ). await ()?. to Model () Ġ?: Ġthrow ĠRepo NotFoundException ( id )) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠ Ġcontext . response Directory Items Ġ= Ġlist . to Mutable List () ĊĠĠĠĠĠ Ġcontext . page Count Ġ= Ġlist . count (). take If Ġ{ Ġit Ġ!= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġ( records Count . toDouble () Ġ/ Ġit Ġ+ Ġ 0 . 5 ). toInt () Ġ} ĊĠĠĠĠĠĠĠ Ġ?: ĠInt . MIN _ VALUE ĊĠĠĠĠĠ Ġlist ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠC ql Session . create Tables () Ġ{ ĊĠĠĠ Ġexecute ( ĊĠĠĠĠĠ ĠSchema Builder . createTable ( Directory ByType C assandra Dto . TABLE _ NAME ) ĊĠĠĠĠĠĠĠ Ġ. if Not Exists () ĊĠĠĠĠĠĠĠ Ġ. with Partition Key ( Directory ByType C assandra Dto . TYPE , ĠDataTypes . TEXT ) ĊĠĠĠĠĠĠĠ Ġ. with Cluster ing Column ( Directory ByType C assandra Dto . TIMESTAMP , ĠDataTypes . TIMESTAMP ) ĊĠĠĠĠĠĠĠ Ġ. with Cluster ing Column ( Directory ByType C assandra Dto . ID , ĠDataTypes . TEXT ) ĊĠĠĠĠĠĠĠ Ġ. with Cluster ing Column ( Directory ByType C assandra Dto . TYPE _ INDEX , ĠDataTypes . TEXT ) ĊĠĠĠĠĠĠĠ Ġ. with Cluster ing Order ( Directory ByType C assandra Dto . TIMESTAMP , ĠCluster ing Order . DESC ) ĊĠĠĠĠĠĠĠ Ġ. with Cluster ing Order ( Directory ByType C assandra Dto . ID , ĠCluster ing Order . ASC ) ĊĠĠĠĠĠĠĠ Ġ. with Cluster ing Order ( Directory ByType C assandra Dto . TYPE _ INDEX , ĠCluster ing Order . ASC ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ) ĊĠĠĠ Ġexecute ( ĊĠĠĠĠĠ ĠSchema Builder . createTable ( Directory ById C assandra Dto . TABLE _ NAME ) ĊĠĠĠĠĠĠĠ Ġ. if Not Exists () ĊĠĠĠĠĠĠĠ Ġ. with Partition Key ( Directory ById C assandra Dto . ID , ĠDataTypes . TEXT ) ĊĠĠĠĠĠĠĠ Ġ. with Column ( Directory ById C assandra Dto . NAME , ĠDataTypes . TEXT ) ĊĠĠĠĠĠĠĠ Ġ. with Column ( Directory ById C assandra Dto . TYPE , ĠDataTypes . TEXT ) ĊĠĠĠĠĠĠĠ Ġ. with Column ( Directory ById C assandra Dto . LOCK _ VERSION , ĠDataTypes . TEXT ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠC ql Session . create Indexes () Ġ{ ĊĠĠĠ Ġexecute ( ĊĠĠĠĠĠ ĠSchema Builder . create Index () ĊĠĠĠĠĠĠĠ Ġ. if Not Exists () ĊĠĠĠĠĠĠĠ Ġ. using S ASI () ĊĠĠĠĠĠĠĠ Ġ. on Table ( Directory ByType C assandra Dto . TABLE _ NAME ) ĊĠĠĠĠĠĠĠ Ġ. and Column ( Directory ByType C assandra Dto . TYPE _ INDEX ) ĊĠĠĠĠĠĠĠ Ġ. with S ASI Options ( map Of (" mode " Ġto Ġ" CONTAIN S ", Ġ" token ization _ locale " Ġto Ġ" en ")) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġinit () Ġ= Ġapply Ġ{ ĊĠĠĠ Ġval Ġdao 1 Ġ= Ġdao ById ĊĠĠĠ Ġval Ġdao 2 Ġ= Ġdao ByType ĊĠ Ġ} Ċ } Ċ