package Ġcom . poly ak ov work box . task tracker . repo . post gre Ċ Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . models . general . ApiError Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . models . general . Equality Mode Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . models . task . Task Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . models . task . TaskId Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . models . task . TaskId Reference Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . repositories . IT ask Repo Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . repositories . Task Filter Request Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . repositories . TaskId Request Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . repositories . Task Model Request Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . repositories . Task Repo Response Ċ import Ġcom . poly ak ov work box . task tracker . backend . common . repositories . Tasks Repo Response Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ import Ġorg . jetbrains . ex posed . sql . statements . Update Builder Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġjava . sql . SQLException Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Zone Id Ċ import Ġjava . util .* Ċ import Ġkotlin . NoSuch ElementException ĊĊ Ċ class ĠTask Repo Sql ( ĊĠĠĠ Ġurl : ĠString Ġ= Ġ" jdbc : postgresql :// localhost : 5 4 3 2 / task tracker dev db ", ĊĠĠĠ Ġuser : ĠString Ġ= Ġ" postgres ", ĊĠĠĠ Ġpassword : ĠString Ġ= Ġ" task tracker - pass ", ĊĠĠĠ Ġschema : ĠString Ġ= Ġ" task tracker ", ĊĠĠĠ Ġprivate Ġval Ġinit Objects : ĠList < Task > Ġ= ĠlistOf () Ċ ) Ġ: ĠI Task Repo Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdb Ġby Ġlazy Ġ{ ĠSql Connector ( url , Ġuser , Ġpassword , Ġschema ). connect ( Tasks Table ) Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Objects . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsafe Transaction ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTasks Table . delete Where Ġ{ ĠTasks Table . id Ġeq Ġit . id . as UUID () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Repo Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" cannot Ġinit ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsave ( req : ĠTask ): ĠTask Repo Response Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsafe Transaction ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠTasks Table . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap ToTable Unit ( it , Ġreq ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Repo Response ( Tasks Table . from ( res ), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Repo Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġlocalized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcreate ( req : ĠTask Model Request ): ĠTask Repo Response Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsave ( req . task ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġread ( req : ĠTask Id Request ): ĠTask Repo Response Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsafe Transaction ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠTasks Table . select Ġ{ ĠTasks Table . id . eq ( req . as UUID ()) Ġ}. single () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Repo Response ( Tasks Table . from ( result ), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerr Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNoSuch ElementException Ġ-> ĠApi Error ( field Ġ= Ġ" id ", Ġmessage Ġ= Ġ" Not ĠFound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIllegalArgumentException Ġ-> ĠApi Error ( message Ġ= Ġ" More Ġthan Ġone Ġelement Ġwith Ġthe Ġsame Ġid ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠApi Error ( message Ġ= Ġlocalized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Repo Response ( result Ġ= Ġnull , Ġis Success Ġ= Ġfalse , Ġerrors Ġ= ĠlistOf ( err )) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate ( req : ĠTask Model Request ): ĠTask Repo Response Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġreq . task ĊĠĠĠĠĠĠĠ Ġreturn Ġsafe Transaction ({ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTasks Table . update ({ ĠTasks Table . id . eq ( task . id . as UUID ()) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap ToTable Unit ( it , Ġtask ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠTasks Table . select Ġ{ ĠTasks Table . id . eq ( task . id . as UUID ()) Ġ}. single () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Repo Response ( result Ġ= ĠTasks Table . from ( result ), Ġis Success Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Repo Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors Ġ= ĠlistOf ( ApiError ( field Ġ= Ġ" id ", Ġmessage Ġ= Ġ" Not ĠFound ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete ( req : ĠTask Id Request ): ĠTask Repo Response Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsafe Transaction ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠTasks Table . select Ġ{ ĠTasks Table . id . eq ( req . as UUID ()) Ġ}. single () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTasks Table . delete Where Ġ{ ĠTasks Table . id Ġeq Ġreq . as UUID () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Repo Response ( result Ġ= ĠTasks Table . from ( result ), Ġis Success Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Repo Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors Ġ= ĠlistOf ( ApiError ( field Ġ= Ġ" id ", Ġmessage Ġ= Ġ" Not ĠFound ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsearch ( req : ĠTask Filter Request ): ĠTasks Repo Response Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsafe Transaction ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSelect Ġonly Ġif Ġoptions Ġare Ġprovided ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġ( Tasks Table ). select Ġ{ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if ( req . owner Id ?. isBlank () Ġ!= Ġfalse ) ĠOp . TRUE Ġelse ĠTasks Table . owner Id Ġeq Ġ( req . owner Id Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). and ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if ( req . name Filter ?. isBlank () Ġ!= Ġfalse ) ĠOp . TRUE Ġelse ĠTasks Table . name Ġeq Ġ( req . name Filter Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). and ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if ( req . description Filter ?. isBlank () Ġ!= Ġfalse ) ĠOp . TRUE Ġelse ĠTasks Table . description Ġeq Ġ( req . description Filter Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). and ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if ( req . att ain ability Description Filter ?. isBlank () Ġ!= Ġfalse ) ĠOp . TRUE Ġelse ĠTasks Table . att ain ability Description Ġeq Ġ( req . att ain ability Description Filter Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). and ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if ( req . re levance Description Filter ?. isBlank () Ġ!= Ġfalse ) ĠOp . TRUE Ġelse ĠTasks Table . re levance Description Ġeq Ġ( req . re levance Description Filter Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). and ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if ( req . meas ur ability Description Filter ?. isBlank () Ġ!= Ġfalse ) ĠOp . TRUE Ġelse ĠTasks Table . meas ur ability Description Ġeq Ġ( req . meas ur ability Description Filter Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). and ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if ( req . progress Mark Filter Ġ== Ġnull ) ĠOp . TRUE Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( req . progress Mark Filter Equality ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE quality Mode . NONE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE quality Mode . EQUAL S Ġ-> ĠTasks Table . progress Ġeq Ġ( req . progress Mark Filter Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE quality Mode . LESS _ THAN Ġ-> ĠTasks Table . progress Ġless Ġ( req . progress Mark Filter Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE quality Mode . MORE _ THAN Ġ-> ĠTasks Table . progress Ġgreater Ġ( req . progress Mark Filter Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). and ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if ( req . due Time Filter Ġ== Ġnull ) ĠOp . TRUE Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( req . due Time Filter Equality ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE quality Mode . NONE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE quality Mode . EQUAL S Ġ-> ĠTasks Table . due Time Ġeq Ġ( LocalDateTime . of Instant ( req . due Time Filter , ĠZone Id . of (" UTC + 0 3 : 0 0 "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE quality Mode . LESS _ THAN Ġ-> ĠTasks Table . due Time Ġless Ġ( LocalDateTime . of Instant ( req . due Time Filter , ĠZone Id . of (" UTC + 0 3 : 0 0 "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE quality Mode . MORE _ THAN Ġ-> ĠTasks Table . due Time Ġgreater Ġ( LocalDateTime . of Instant ( req . due Time Filter , ĠZone Id . of (" UTC + 0 3 : 0 0 "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). and ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if ( req . parentId Filter ?. isBlank () Ġ!= Ġfalse ) ĠOp . TRUE Ġelse ĠTasks Table . parent Ġeq Ġ( UUID . fromString ( req . parentId Filter ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). and ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if ( req . child Id Filter ?. isBlank () Ġ!= Ġfalse ) ĠOp . TRUE Ġelse ĠTasks Table . children Ġeq Ġ( UUID . fromString ( req . child Id Filter ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTasks Repo Response ( result Ġ= Ġresults . map Ġ{ ĠTasks Table . from ( it ) Ġ}, Ġis Success Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTasks Repo Response ( result Ġ= Ġempty List (), Ġis Success Ġ= Ġfalse , ĠlistOf ( ApiError ( message Ġ= Ġlocalized Message ))) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTasks Table . map ToTable Unit ( ĊĠĠĠĠĠĠĠ Ġit : ĠUpdate Builder < Int >, ĊĠĠĠĠĠĠĠ Ġreq : ĠTask ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( req . id Ġ!= ĠTask Id . NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ id ] Ġ= Ġreq . id . as UUID () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġit [ owner Id ] Ġ= Ġreq . owner Id . id ĊĠĠĠĠĠĠĠ Ġit [ name ] Ġ= Ġreq . name . name ĊĠĠĠĠĠĠĠ Ġit [ description ] Ġ= Ġreq . description . description ĊĠĠĠĠĠĠĠ Ġit [ att ain ability Description ] Ġ= Ġreq . att ain ability Description . description ĊĠĠĠĠĠĠĠ Ġit [ re levance Description ] Ġ= Ġreq . re levance Description . description ĊĠĠĠĠĠĠĠ Ġit [ meas ur ability Description ] Ġ= Ġreq . meas ur ability . description . description ĊĠĠĠĠĠĠĠ Ġit [ progress ] Ġ= Ġreq . meas ur ability . progress . percent ĊĠĠĠĠĠĠĠ Ġit [ due Time ] Ġ= ĠLocalDateTime . of Instant ( req . due Time . due Time , ĠZone Id . of (" UTC + 0 3 : 0 0 ")) ĊĠĠĠĠĠĠĠ Ġit [ parent ] Ġ= Ġreq . parent . as UUID () ĊĠĠĠĠĠĠĠ Ġit [ children ] Ġ= Ġreq . children . single OrNull ()?. as UUID () Ġ?: ĠTask Id Reference . NONE . as UUID () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTransaction Ġwrapper Ġto Ġsafely Ġhandle Ġcaught Ġexception Ġand Ġthrow Ġall Ġsql - like Ġexceptions . ĠAlso Ġremove Ġlot 's Ġof Ġduplication Ġcode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġsafe Transaction ( statement : ĠTransaction . () Ġ-> ĠT , Ġhandle Exception : ĠThrowable . () Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction ( db , Ġstatement ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandle Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }