/** Ċ # ĠCopyright ĠR akes h ĠSh rest ha Ġ( r akes h . sh rest ha @ gmail . com ) Ċ # ĠAll Ġrights Ġreserved . Ċ # Ċ # ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ # Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ċ # Ġmet : Ċ # Ċ # ĠRedistributions Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice . Ċ Ġ*/ Ċ Ċ package Ġapp . domain . factories Ċ Ċ import Ġio . jav al in . http . NotFound Response Ċ Ċ import Ġapp . domain . User Ċ Ċ import Ġorg . jetbrains . ex posed . dao . Long Id Table Ċ import Ġorg . jetbrains . ex posed . sql . Column Ċ import Ġorg . jetbrains . ex posed . sql . Database Ċ import Ġorg . jetbrains . ex posed . sql . Join Type Ċ import Ġorg . jetbrains . ex posed . sql . Result Row Ċ import Ġorg . jetbrains . ex posed . sql . Schema Utils Ċ import Ġorg . jetbrains . ex posed . sql . Table Ċ import Ġorg . jetbrains . ex posed . sql . and Ċ import Ġorg . jetbrains . ex posed . sql . delete Where Ċ import Ġorg . jetbrains . ex posed . sql . insert Ċ import Ġorg . jetbrains . ex posed . sql . insert AndGet Id Ċ import Ġorg . jetbrains . ex posed . sql . select Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . jetbrains . ex posed . sql . update Ċ Ċ import Ġorg . joda . time . DateTime Ċ import Ġjavax . sql . DataSource Ċ Ċ internal Ġobject ĠUsers Ġ: ĠLong Id Table () Ġ{ Ċ ĉ val Ġemail : ĠColumn < String > Ġ= Ġvarchar (" email ", Ġ 2 0 0 ). unique Index () Ċ ĉ val Ġusername : ĠColumn < String > Ġ= Ġvarchar (" username ", Ġ 1 0 0 ). index () Ċ ĉ val Ġpassword : ĠColumn < String > Ġ= Ġvarchar (" password ", Ġ 1 5 0 ) ĊĊ ĉ val Ġfirst name : ĠColumn < String ?> Ġ= Ġvarchar (" firstname ", Ġ 2 5 5 ). nullable () Ċ ĉ val Ġlastname : ĠColumn < String ?> Ġ= Ġvarchar (" lastname ", Ġ 2 5 5 ). nullable () Ċ ĉ val Ġcontact mobile : ĠColumn < String ?> Ġ= Ġvarchar (" contact mobile ", Ġ 2 5 5 ). nullable () ĊĊ ĉ val Ġcountry : ĠColumn < String ?> Ġ= Ġvarchar (" country ", Ġ 2 5 5 ). nullable () Ċ ĉ val Ġperms : ĠColumn < String ?> Ġ= Ġvarchar (" perms ", Ġ 2 5 5 ). nullable () Ċ ĉ val Ġstatus : ĠColumn < String ?> Ġ= Ġvarchar (" status ", Ġ 2 5 5 ). nullable () Ċ ĉ val Ġre marks : ĠColumn < String ?> Ġ= Ġvarchar (" remarks ", Ġ 1 0 0 0 ). nullable () Ċ ĉ val Ġi pre gister ed : ĠColumn < String ?> Ġ= Ġvarchar (" ip registered ", Ġ 5 0 ). nullable () ĊĉĊ ĉ val Ġbio : ĠColumn < String ?> Ġ= Ġvarchar (" bio ", Ġ 1 0 0 0 ). nullable () Ċ ĉ val Ġimage : ĠColumn < String ?> Ġ= Ġvarchar (" image ", Ġ 2 5 5 ). nullable () ĊĉĊĠĠĠ Ġval ĠcreatedAt : ĠColumn < DateTime > Ġ= Ġdate (" created _ at ") ĊĠĠĠ Ġval ĠupdatedAt : ĠColumn < DateTime > Ġ= Ġdate (" updated _ at ") ĊĊ ĉ fun Ġto Domain ( row : ĠResult Row ): ĠUser Ġ{ Ċĉ ĉ return ĠUser ( Ċĉĉ ĉ id Ġ= Ġrow [ Users . id ]. value , Ċĉĉ ĉ email Ġ= Ġrow [ Users . email ], Ċĉĉ ĉ username Ġ= Ġrow [ Users . username ], Ċĉĉ ĉ password Ġ= Ġrow [ Users . password ], ĊĊĉĉ ĉ firstname Ġ= Ġrow [ Users . firstname ], Ċĉĉ ĉ lastname Ġ= Ġrow [ Users . lastname ], Ċĉĉ ĉ contact mobile Ġ= Ġrow [ Users . contact mobile ], ĊĉĉĉĉĊĉĉ ĉ country Ġ= Ġrow [ Users . country ], Ċĉĉ ĉ perms Ġ= Ġrow [ Users . perms ], Ċĉĉ ĉ status Ġ= Ġrow [ Users . status ], Ċĉĉ ĉ remarks Ġ= Ġrow [ Users . remarks ], Ċĉĉ ĉ ip registered Ġ= Ġrow [ Users . ip registered ], ĊĉĉĉĉĊĉĉ ĉ bio Ġ= Ġrow [ Users . bio ], Ċĉĉ ĉ image Ġ= Ġrow [ Users . image ], ĊĉĉĉĉĊĉĉ ĉ createdAt Ġ= Ġrow [ createdAt ]. toDate (), Ċĉĉ ĉ updatedAt Ġ= Ġrow [ updatedAt ]. toDate () ĉĉĉĉ Ċĉ ĉ ) Ċ ĉ } Ċ } Ċ Ċ internal Ġobject ĠFollow s Ġ: ĠTable () Ġ{ Ċ ĉ val Ġuser : ĠColumn < Long > Ġ= Ġlong (" user "). primaryKey () Ċ ĉ val Ġfollow er : ĠColumn < Long > Ġ= Ġlong (" user _ follow er "). primaryKey () Ċ } Ċ Ċ class ĠUser Factory ( private Ġval ĠdataSource : ĠDataSource ) Ġ{ ĊĉĊ ĉ init Ġ{ Ċĉ ĉ transaction ( Database . connect ( dataSource )) Ġ{ Ċĉĉ ĉ Schema Utils . create ( Users ) Ċĉĉ ĉ Schema Utils . create ( Follow s ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun ĠfindBy Email ( email : ĠString ): ĠUser ? Ġ{ Ċĉ ĉ return Ġtransaction ( Database . connect ( dataSource )) Ġ{ Ċĉĉ ĉ Users . select Ġ{ ĠUsers . email Ġeq Ġemail Ġ} Ċĉĉ ĉ . map Ġ{ ĠUsers . to Domain ( it ) Ġ} Ċĉĉ ĉ . first OrNull () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun ĠfindBy Username ( username : ĠString ): ĠUser ? Ġ{ Ċĉ ĉ return Ġtransaction ( Database . connect ( dataSource )) Ġ{ Ċĉĉ ĉ Users . select Ġ{ ĠUsers . username Ġeq Ġusername Ġ} Ċĉĉ ĉ . map Ġ{ ĠUsers . to Domain ( it ) Ġ} Ċĉĉ ĉ . first OrNull () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġcreate ( user : ĠUser ): ĠLong ? Ġ{ Ċĉ ĉ return Ġtransaction ( Database . connect ( dataSource )) Ġ{ Ċĉĉ ĉ Users . insert AndGet Id Ġ{ Ġrow Ġ-> Ċĉĉĉ ĉ row [ Users . email ] Ġ= Ġuser . email Ċĉĉĉ ĉ row [ Users . username ] Ġ= Ġuser . username !! Ċĉĉĉ ĉ row [ Users . password ] Ġ= Ġuser . password !! ĊĊĉĉĉ ĉ row [ Users . firstname ] Ġ= Ġuser . firstname Ċĉĉĉ ĉ row [ Users . lastname ] Ġ= Ġuser . lastname Ċĉĉĉ ĉ row [ Users . contact mobile ] Ġ= Ġuser . contact mobile Ċĉĉĉĉĉĉĉĉ Ċĉĉĉ ĉ row [ Users . country ] Ġ= Ġuser . country Ċĉĉĉ ĉ row [ Users . perms ] Ġ= Ġuser . perms Ċĉĉĉ ĉ row [ Users . status ] Ġ= Ġ" Y " Ċĉĉĉ ĉ row [ Users . remarks ] Ġ= Ġuser . remarks Ċĉĉĉ ĉ row [ Users . ip registered ] Ġ= Ġuser . ip registered ĊĉĉĉĉĊĉĉĉ ĉ row [ Users . bio ] Ġ= Ġuser . bio Ċĉĉĉ ĉ row [ Users . image ] Ġ= Ġuser . image Ċĉĉĉĉ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ createdAt ] Ġ= ĠDateTime () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ updatedAt ] Ġ= ĠDateTime () ĉĉĉĉ Ċĉĉ ĉ }. value Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġupdate ( email : ĠString , Ġuser : ĠUser ): ĠUser ? Ġ{ Ċĉ ĉ transaction ( Database . connect ( dataSource )) Ġ{ Ċĉĉ ĉ Users . update ({ ĠUsers . email Ġeq Ġemail Ġ}) Ġ{ Ġrow Ġ-> Ċĉĉĉ ĉ row [ Users . email ] Ġ= Ġuser . email Ċĉĉĉ ĉ if Ġ( user . username Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . username ] Ġ= Ġuser . username Ċĉĉĉ ĉ if Ġ( user . password Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . password ] Ġ= Ġuser . password ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( user . firstname Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . firstname ] Ġ= Ġuser . firstname Ċĉĉĉ ĉ if Ġ( user . lastname Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . lastname ] Ġ= Ġuser . lastname Ċĉĉĉ ĉ if Ġ( user . contact mobile Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . contact mobile ] Ġ= Ġuser . contact mobile ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( user . country Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . country ] Ġ= Ġuser . country Ċĉĉĉ ĉ if Ġ( user . perms Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . perms ] Ġ= Ġuser . perms Ċĉĉĉ ĉ if Ġ( user . status Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . status ] Ġ= Ġuser . status Ċĉĉĉ ĉ if Ġ( user . remarks Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . remarks ] Ġ= Ġuser . remarks Ċĉĉĉ ĉ if Ġ( user . ip registered Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . ip registered ] Ġ= Ġuser . ip registered ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( user . bio Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . bio ] Ġ= Ġuser . bio Ċĉĉĉ ĉ if Ġ( user . image Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . image ] Ġ= Ġuser . image Ċĉĉĉ ĉ if Ġ( user . createdAt Ġ!= Ġnull ) Ċĉĉĉĉ ĉ row [ Users . createdAt ] Ġ= ĠDateTime ( user . createdAt ) Ċĉĉĉĉ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ updatedAt ] Ġ= ĠDateTime () ĊĉĉĉĉĊĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return ĠfindBy Email ( user . email ) Ċ ĉ } ĊĊ ĉ fun Ġfind Is Follow User ( email : ĠString , ĠuserId To Follow : ĠLong ): ĠBoolean Ġ{ Ċĉ ĉ return Ġtransaction ( Database . connect ( dataSource )) Ġ{ Ċĉĉ ĉ Users . join ( Ċĉĉĉ ĉ Follow s , ĠJoin Type . INNER , Ċĉĉĉ ĉ additional Constraint Ġ= Ġ{ Ċĉĉĉĉ ĉ Follow s . user Ġeq ĠUsers . id Ġand Ġ( Follow s . follow er Ġeq ĠuserId To Follow ) Ċĉĉĉ ĉ } Ċĉĉ ĉ ) Ċĉĉ ĉ . select Ġ{ Ċĉĉĉ ĉ Users . email Ġeq Ġemail Ċĉĉ ĉ } Ċĉĉ ĉ . count () Ġ> Ġ 0 Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġfollow ( email : ĠString , Ġusername To Follow : ĠString ): ĠUser Ġ{ Ċĉ ĉ val Ġuser Ġ= ĠfindBy Email ( email ) Ġ?: Ġthrow ĠNotFound Response () Ċĉ ĉ val Ġuser To Follow Ġ= ĠfindBy Username ( username To Follow ) Ġ?: Ġthrow ĠNotFound Response () Ċĉ ĉ transaction ( Database . connect ( dataSource )) Ġ{ Ċĉĉ ĉ Follow s . insert Ġ{ Ġrow Ġ-> Ċĉĉĉ ĉ row [ Follow s . user ] Ġ= Ġuser To Follow . id !! Ċĉĉĉ ĉ row [ Follow s . follow er ] Ġ= Ġuser . id !! Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġuser To Follow Ċ ĉ } ĊĊ ĉ fun Ġun follow ( email : ĠString , Ġusername To Un Follow : ĠString ): ĠUser Ġ{ Ċĉ ĉ val Ġuser Ġ= ĠfindBy Email ( email ) Ġ?: Ġthrow ĠNotFound Response () Ċĉ ĉ val Ġuser To Un follow Ġ= ĠfindBy Username ( username To Un Follow ) Ġ?: Ġthrow ĠNotFound Response () Ċĉ ĉ transaction ( Database . connect ( dataSource )) Ġ{ Ċĉĉ ĉ Follow s . delete Where Ġ{ Ċĉĉĉ ĉ Follow s . user Ġeq Ġuser . id !! Ġand Ġ( Follow s . follow er Ġeq Ġuser To Un follow . id !! ) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġuser To Un follow Ċ ĉ } Ċĉ Ċ }