package Ġservices Ċ Ċ import Ġdb . Movie Act ors Ċ import Ġdb . Movie Categories Ċ import Ġdb . Movie Table Ċ import Ġio . ktor . application . call Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . response . respond Ċ import Ġio . ktor . routing . Route Ċ import Ġio . ktor . routing . delete Ċ import Ġio . ktor . routing . get Ċ import Ġmodel . Movie Po jo Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġutils . Cache Ċ import Ġutils . run Command Ċ import Ġjava . io . File Ċ Ċ fun ĠRoute . movie Service () Ġ{ ĊĠ Ġget ("/ movie / play /{ id }") Ġ{ ĊĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠ ĠMovie Table . select Ġ{ ĠMovie Table . id Ġeq Ġcall . parameters [" id "] Ġ}. limit ( 1 ). first OrNull (). also Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ"${ Cache . movie Player } Ġ\" ${ it [ Movie Table . path ] }\ "" . run Command ( File ( it [ Movie Table . path ]). parent File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcall . respond ( HttpStatusCode . OK ) ĊĠ Ġ} ĊĠ Ġget ("/ movie /{ from }/{ count }") Ġ{ ĊĠĠĠ Ġcall . respond ( transaction Ġ{ ĊĠĠĠĠĠ Ġval Ġcategories Ġ= Ġcall . request . query Parameters [" category "] ĊĠĠĠĠĠ Ġval Ġactors Ġ= Ġcall . request . query Parameters [" actor "] ĊĊĠĠĠĠĠ Ġvar Ġcolumn Category : ĠColumn < *> Ġ= ĠMovie Table . id ĊĠĠĠĠĠ Ġval Ġvia Category Ġ= Ġwhen Ġ( categories ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull , Ġ" null " Ġ-> ĠMovie Table . slice ( Movie Table . id ). selectAll () ĊĠĠĠĠĠĠĠ Ġ" 0 " Ġ-> ĠMovie Table ĊĠĠĠĠĠĠĠĠĠ Ġ. join ( Movie Categories , ĠJoin Type . LEFT , ĠMovie Table . id , ĠMovie Categories . movie ) ĊĠĠĠĠĠĠĠĠĠ Ġ. slice ( Movie Table . id ) ĊĠĠĠĠĠĠĠĠĠ Ġ. select Ġ{ ĠMovie Categories . category . isNull () Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcategories . split ("," ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcolumn Category Ġ= ĠMovie Categories . movie ĊĠĠĠĠĠĠĠĠĠ ĠMovie Categories ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. slice ( Movie Categories . movie ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. select Ġ{ ĠMovie Categories . category Ġin List Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy ( Movie Categories . movie ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. having Ġ{ ĠMovie Categories . movie . count () Ġeq Ġit . size Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. alias (" q 1 ") ĊĊĠĠĠĠĠ Ġvar Ġcolumn Actor : ĠColumn < *> Ġ= ĠMovie Table . id ĊĠĠĠĠĠ Ġval Ġvia Actor Ġ= Ġwhen Ġ( actors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull , Ġ" null " Ġ-> ĠMovie Table . slice ( Movie Table . id ). selectAll () ĊĠĠĠĠĠĠĠ Ġ" 0 " Ġ-> ĠMovie Table ĊĠĠĠĠĠĠĠĠĠ Ġ. join ( Movie Act ors , ĠJoin Type . LEFT , ĠMovie Table . id , ĠMovie Act ors . movie ) ĊĠĠĠĠĠĠĠĠĠ Ġ. slice ( Movie Table . id ) ĊĠĠĠĠĠĠĠĠĠ Ġ. select Ġ{ ĠMovie Act ors . actor . isNull () Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġactors . split ("," ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcolumn Actor Ġ= ĠMovie Act ors . movie ĊĠĠĠĠĠĠĠĠĠ ĠMovie Act ors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. slice ( Movie Act ors . movie ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. select Ġ{ ĠMovie Act ors . actor Ġin List Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy ( Movie Act ors . movie ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. having Ġ{ ĠMovie Act ors . movie . count () Ġeq Ġit . size Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. alias (" q 2 ") ĊĊĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ" movies " Ġto ĠJoin ( Movie Table ) ĊĠĠĠĠĠĠĠĠĠ Ġ. join ( via Actor , ĠJoin Type . LEFT , ĠMovie Table . id , Ġvia Actor [ column Actor ]) ĊĠĠĠĠĠĠĠĠĠ Ġ. join ( via Category , ĠJoin Type . LEFT , ĠMovie Table . id , Ġvia Category [ column Category ]) ĊĠĠĠĠĠĠĠĠĠ Ġ. select Ġ{ Ġvia Actor [ column Actor ]. isNotNull () Ġand Ġvia Category [ column Category ]. isNotNull () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. groupBy ( Movie Table . id ) ĊĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( call . request . query Parameters [" filter "] ?. toInt OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠorderBy ( Movie Table . duration , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠorderBy ( Movie Table . id , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. limit ( call . parameters [" count "] !!. toInt (), Ġcall . parameters [" from "] !!. toInt ()) ĊĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠMovie Po jo ( it [ Movie Table . id ]. value , Ġit [ Movie Table . name ], Ġit [ Movie Table . duration ]) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" count " Ġto ĠJoin ( Movie Table ) ĊĠĠĠĠĠĠĠĠĠ Ġ. join ( via Actor , ĠJoin Type . LEFT , ĠMovie Table . id , Ġvia Actor [ column Actor ]) ĊĠĠĠĠĠĠĠĠĠ Ġ. join ( via Category , ĠJoin Type . LEFT , ĠMovie Table . id , Ġvia Category [ column Category ]) ĊĠĠĠĠĠĠĠĠĠ Ġ. select Ġ{ Ġvia Actor [ column Actor ]. isNotNull () Ġand Ġvia Category [ column Category ]. isNotNull () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. groupBy ( Movie Table . id ) ĊĠĠĠĠĠĠĠĠĠ Ġ. orderBy ( Movie Table . id , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠ Ġ. count () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĠ Ġget ("/ movie /{ id }") Ġ{ ĊĠĠĠ Ġcall . respond ( transaction Ġ{ ĊĠĠĠĠĠ Ġmap Of < String , ĠAny >( ĊĠĠĠĠĠĠĠ Ġ" categories " Ġto ĠMovie Categories . select Ġ{ ĠMovie Categories . movie Ġeq Ġcall . parameters [" id "] ?. toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit [ Movie Categories . category ]. toString () Ġ}, ĊĠĠĠĠĠĠĠ Ġ" actors " Ġto ĠMovie Act ors . select Ġ{ ĠMovie Act ors . movie Ġeq Ġcall . parameters [" id "] ?. toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit [ Movie Act ors . actor ]. toString () Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĠ Ġdelete ("/ movie /{ id }") Ġ{ ĊĠĠĠ Ġcall . parameters [" id "] ?. toInt OrNull ()?. also Ġ{ Ġid Ġ-> ĊĠĠĠĠĠ Ġval Ġpath Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠMovie Table . select Ġ{ ĠMovie Table . id Ġeq Ġid Ġ}. first ()[ Movie Table . path ] ĊĠĠĠĠĠĠĠ ĠMovie Table . delete Where Ġ{ ĠMovie Table . id Ġeq Ġid Ġ} ĊĠĠĠĠĠĠĠ ĠMovie Act ors . delete Where Ġ{ ĠMovie Act ors . movie Ġeq Ġid Ġ} ĊĠĠĠĠĠĠĠ ĠMovie Categories . delete Where Ġ{ ĠMovie Categories . movie Ġeq Ġid Ġ} ĊĠĠĠĠĠĠĠ Ġret ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠFile ( path ). delete () ĊĠĠĠĠĠ Ġcall . respond ("{} ") ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }