package Ġcom . example . internal . db Storage Ċ Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ import Ġcom . example . User Storage Ċ import Ġcom . example . models . User Object Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ class ĠDB User Storage ( val Ġconnection : ĠDatabase ): ĠUser Storage Ġ{ ĊĊĠ Ġprivate Ġvar Ġnext Id Ġ= Ġ 1 ĊĊĠ Ġobject ĠUser Table Ġ: ĠTable () Ġ{ ĊĠĠĠ Ġval Ġid Ġ= Ġinteger (" id "). primaryKey (). auto Increment () ĊĠĠĠ Ġval Ġusername Ġ= Ġvarchar (" username ", Ġlength = 1 0 0 ) ĊĠĠĠ Ġval ĠdisplayName Ġ= Ġvarchar (" display _ name ", Ġlength = 1 0 0 ) ĊĠĠĠ Ġval Ġphoto Ids Ġ= Ġvarchar (" photoUrl ", Ġlength = 1 0 0 ). nullable () ĊĠĠĠ Ġval Ġan ecd ote Ġ= Ġtext (" an ecd ote ") ĊĠĠĠ Ġval Ġlik edBy Ġ= Ġinteger (" lik ed _ by "). default ( 0 ) ĊĠĠĠ Ġval Ġdis lik edBy Ġ= Ġinteger (" dis lik ed _ by "). default ( 0 ) ĊĠ Ġ} ĊĊĠ Ġobject ĠRe actions : ĠTable () Ġ{ ĊĠĠĠ Ġval Ġactive Id Ġ= Ġ Ġinteger (" active Id "). primaryKey () ĊĠĠĠ Ġval Ġpassive Id Ġ= Ġinteger (" passive Id "). primaryKey () ĊĠĠĠ Ġval Ġis Like Ġ= Ġbool (" is Like ") ĊĠ Ġ} ĊĊĊĠ Ġobject ĠMat ches : ĠTable () Ġ{ ĊĠĠĠ Ġval Ġfirst Id Ġ= Ġ Ġinteger (" first Id "). primaryKey () ĊĠĠĠ Ġval Ġsecond Id Ġ= Ġinteger (" second Id "). primaryKey () ĊĠ Ġ} ĊĊĠ Ġfun Ġinit () Ġ{ ĊĠĠĠ Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠ ĠSchema Utils . create ( User Table ) ĊĠĠĠĠĠ ĠSchema Utils . create ( Re actions ) ĊĠĠĠĠĠ ĠSchema Utils . create ( Matches ) ĊĠĠĠĠĠ Ġnext Id Ġ= ĠUser Table . selectAll (). toList (). size Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetUser Count (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ transaction ĠUser Table . selectAll (). count () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget UserId ( username : ĠString ): ĠInt ? Ġ{ ĊĠĠĠ Ġreturn Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠ ĠUser Table . select Ġ{ ĠUser Table . username Ġeq Ġusername Ġ}. single OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ transaction Ġit [ User Table . id ] ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn @ transaction Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġupdate User ( id : ĠInt , Ġuser : ĠUser Object ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠ ĠUser Table . update ({ ĠUser Table . id Ġeq Ġid Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ username ] Ġ= Ġuser . username ĊĠĠĠĠĠĠĠ Ġit [ displayName ] Ġ= Ġuser . displayName ĊĠĠĠĠĠĠĠ Ġit [ photo Ids ] Ġ= Ġuser . photo Ids . join ToString ( separator Ġ= Ġ" Ġ") ĊĠĠĠĠĠĠĠ Ġit [ an ecd ote ] Ġ= Ġuser . an ecd ote ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn @ transaction Ġtrue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġput User ( username : ĠString , Ġuser : ĠUser Object ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠ ĠUser Table . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ User Table . username ] Ġ= Ġusername ĊĠĠĠĠĠĠĠ Ġit [ displayName ] Ġ= Ġuser . displayName ĊĠĠĠĠĠĠĠ Ġit [ photo Ids ] Ġ= Ġuser . photo Ids . join ToString ( separator Ġ= Ġ" Ġ") ĊĠĠĠĠĠĠĠ Ġit [ an ecd ote ] Ġ= Ġuser . an ecd ote ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn @ transaction Ġnext Id Ġ- Ġ 1 ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetUser ById ( id : ĠInt ): ĠUser Object ? Ġ{ ĊĠĠĠ Ġreturn Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠ ĠUser Table . select Ġ{ ĠUser Table . id Ġeq Ġid Ġ}. single OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ transaction ĠUser Object ( ĊĠĠĠĠĠĠĠĠĠ Ġit [ User Table . username ], ĊĠĠĠĠĠĠĠĠĠ Ġit [ User Table . displayName ], ĊĠĠĠĠĠĠĠĠĠ Ġ( it [ User Table . photo Ids ] Ġ?: Ġ""). split (" Ġ"). map NotNull Ġ{ Ġid Ġ-> Ġid . toInt OrNull () Ġ}, ĊĠĠĠĠĠĠĠĠĠ Ġit [ User Table . an ecd ote ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn @ transaction Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetNext Match ( id : ĠInt ): ĠUser Object ? Ġ{ ĊĠĠĠ Ġreturn Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠ Ġval Ġall Re actions Ġ= ĠRe actions . select Ġ{ ĠRe actions . active Id Ġeq Ġid Ġ}. map Ġ{ Ġit [ Re actions . passive Id ] Ġ}. toList () ĊĠĠĠĠĠ ĠUser Table . selectAll () ĊĠĠĠĠĠĠĠ Ġ. sorted By Descending Ġ{ Ġ( it [ User Table . lik edBy ] Ġ+ Ġ 1 ) Ġ/ Ġ( it [ User Table . lik edBy ] Ġ+ Ġit [ User Table . dis lik edBy ] Ġ+ Ġ 2 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit [ User Table . id ] Ġ!= Ġid Ġ&& Ġ! all Re actions . contains ( it [ User Table . id ]) Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ transaction ĠUser Object ( ĊĠĠĠĠĠĠĠĠĠ Ġit [ User Table . username ], ĊĠĠĠĠĠĠĠĠĠ Ġit [ User Table . displayName ], ĊĠĠĠĠĠĠĠĠĠ Ġ( it [ User Table . photo Ids ] Ġ?: Ġ""). split (" Ġ"). map NotNull Ġ{ Ġid Ġ-> Ġid . toInt OrNull () Ġ}, ĊĠĠĠĠĠĠĠĠĠ Ġit [ User Table . an ecd ote ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn @ transaction Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġadd Match ( user 1 : ĠInt , Ġuser 2 : ĠInt ) Ġ{ ĊĠĠĠ Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠ ĠMat ches . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ first Id ] Ġ= Ġmin ( user 1 , Ġuser 2 ) ĊĠĠĠĠĠĠĠ Ġit [ second Id ] Ġ= Ġmax ( user 1 , Ġuser 2 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġadd Un like ( user 1 : ĠInt , Ġuser 2 : ĠInt ) Ġ{ ĊĠĠĠ Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠ ĠRe actions . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ active Id ] Ġ= Ġuser 1 ĊĠĠĠĠĠĠĠ Ġit [ passive Id ] Ġ= Ġuser 2 ĊĠĠĠĠĠĠĠ Ġit [ is Like ] Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠUser Table . update ({ ĠUser Table . id Ġeq Ġuser 2 Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( Sql Expression Builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . update ( dis lik edBy , Ġdis lik edBy Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġadd Like ( user 1 : ĠInt , Ġuser 2 : ĠInt ) Ġ{ ĊĠĠĠ Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠ ĠRe actions . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ active Id ] Ġ= Ġuser 1 ĊĠĠĠĠĠĠĠ Ġit [ passive Id ] Ġ= Ġuser 2 ĊĠĠĠĠĠĠĠ Ġit [ is Like ] Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠUser Table . update ({ ĠUser Table . id Ġeq Ġuser 2 Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( Sql Expression Builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . update ( lik edBy , Ġlik edBy Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠRe actions . select Ġ{ ĊĠĠĠĠĠĠĠ Ġ( Re actions . passive Id Ġeq Ġuser 1 ) Ġand Ġ( Re actions . active Id Ġeq Ġuser 1 ) Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe actions . is Like ĊĠĠĠĠĠ Ġ}. single OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Match ( user 1 , Ġuser 2 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Chat Ids ( id : ĠInt ): ĠList < Int > Ġ{ ĊĠĠĠ Ġreturn Ġtransaction ( connection ) Ġ{ ĊĠĠĠĠĠ Ġval Ġactive Lik es Ġ= ĊĠĠĠĠĠĠĠ ĠRe actions . select Ġ{ ĠRe actions . active Id Ġeq Ġid Ġ}. filter Ġ{ Ġit [ Re actions . is Like ] Ġ}. map Ġ{ Ġit [ Re actions . passive Id ] Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠ Ġval Ġpassive Lik es Ġ= ĊĠĠĠĠĠĠĠ ĠRe actions . select Ġ{ ĠRe actions . passive Id Ġeq Ġid Ġ}. filter Ġ{ Ġit [ Re actions . is Like ] Ġ}. map Ġ{ Ġit [ Re actions . active Id ] Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠ Ġreturn @ transaction Ġ( active Lik es Ġintersect Ġpassive Lik es ). sorted () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }