package Ġkr asi lov . dim a . model Ċ Ċ import Ġkotlinx . datetime . to Kotlin LocalDateTime Ċ import Ġkr asi lov . dim a . web .* Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ import Ġjava . time . LocalDateTime Ċ Ċ interface ĠDAO Ġ{ ĊĠĠĠ Ġfun ĠgetAll Devices (): ĠList < DeviceInfo > ĊĠĠĠ Ġfun Ġfind Device ( id : ĠInt ): ĠDevice Info ? ĊĠĠĠ Ġfun Ġbook Device ( userId : ĠInt , ĠdeviceId : ĠInt ) ĊĠĠĠ Ġfun Ġreturn Device ( booking Id : ĠInt , Ġreturn Date : ĠLocalDateTime ) ĊĠĠĠ Ġfun ĠgetAll Book ings (): ĠList < Booking History Record > Ċ } Ċ Ċ object ĠD sl DAO Ġ: ĠDAO Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetAll Devices (): ĠList < DeviceInfo > Ġ= ĊĠĠĠĠĠĠĠ ĠDevices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Table Ġ= ĠBook ings . inner Join ( Users ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoin Type Ġ= ĠJoin Type . LEFT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Column Ġ= ĠDevices . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Column Ġ= ĠBook ings . deviceId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Constraint Ġ= Ġ{ ĠBook ings . returned At . isNull () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġto Device ( it ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Device ( id : ĠInt ): ĠDevice Info ? Ġ= ĠDevices ĊĠĠĠĠĠĠĠ Ġ. join ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Table Ġ= ĠBook ings . inner Join ( Users ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoin Type Ġ= ĠJoin Type . LEFT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Column Ġ= ĠDevices . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Column Ġ= ĠBook ings . deviceId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Constraint Ġ= Ġ{ ĠBook ings . returned At . isNull () Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. select Ġ{ ĠDevices . id Ġeq Ġid Ġ} ĊĠĠĠĠĠĠĠ Ġ. limit ( 1 ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġto Device ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĊĠĠĠ Ġoverride Ġfun Ġbook Device ( userId : ĠInt , ĠdeviceId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBook ings . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ book ed At ] Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ Book ings . userId ] Ġ= ĠuserId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ Book ings . deviceId ] Ġ= ĠdeviceId ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreturn Device ( booking Id : ĠInt , Ġreturn Date : ĠLocalDateTime ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBook ings . update ({ ĠBook ings . id Ġeq Ġbooking Id Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ returned At ] Ġ= Ġreturn Date ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Book ings (): ĠList < Booking History Record > Ġ= ĊĠĠĠĠĠĠĠ ĠBook ings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inner Join ( Devices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inner Join ( Users ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBook ing History Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġrow [ Book ings . id ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Ġ= ĠDevice ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġrow [ Devices . id ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġrow [ Devices . name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ= ĠUser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġrow [ Users . id ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġrow [ Users . name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook ed At Ġ= Ġrow [ Book ings . book ed At ]. to Kotlin LocalDateTime (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturned At Ġ= Ġrow [ Book ings . returned At ]?. to Kotlin LocalDateTime () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Device ( result Row : ĠResult Row ): ĠDevice Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevice Name Ġ= Ġresult Row [ Devices . name ] ĊĊĠĠĠĠĠĠĠ Ġval Ġavailable Ġ= Ġresult Row . get OrNull ( Book ings . userId )?. value Ġ== Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġbooking Ġ= Ġif Ġ(! available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDevice Booking ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġresult Row [ Book ings . id ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ= ĠUser ( result Row [ Users . id ]. value , Ġresult Row [ Users . name ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook ed At Ġ= Ġresult Row [ Book ings . book ed At ]. to Kotlin LocalDateTime (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturned At Ġ= Ġresult Row [ Book ings . returned At ]?. to Kotlin LocalDateTime () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠDevice Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġresult Row [ Devices . id ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġdevice Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Ġ= Ġavailable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooking Ġ= Ġbooking ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }