package Ġorg . si rix . rest . crud Ċ Ċ import Ġio . netty . handler . codec . http . HttpResponse Status Ċ import Ġio . vertx . ext . auth . User Ċ import Ġio . vertx . ext . auth . authorization . Authorization Provider Ċ import Ġio . vertx . ext . auth . authorization . Permission Based Authorization Ċ import Ġio . vertx . ext . auth . authorization . Role Based Authorization Ċ import Ġio . vertx . ext . auth . oauth 2 . OAuth 2 Auth Ċ import Ġio . vertx . kotlin . coroutines . await Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . br ack it . x query . ErrorCode Ċ import Ġorg . br ack it . x query . Query Context Ċ import Ġorg . br ack it . x query . Query Exception Ċ import Ġorg . br ack it . x query . compiler . Compile Chain Ċ import Ġorg . br ack it . x query . module . Module Ċ import Ġorg . br ack it . x query . operator . Tuple Impl Ċ import Ġorg . br ack it . x query . util . Cfg Ċ import Ġorg . br ack it . x query . util . serialize . Serializer Ċ import Ġorg . br ack it . x query . util . serialize . String Serializer Ċ import Ġorg . br ack it . x query . xd m . Item Ċ import Ġorg . br ack it . x query . xd m . Sequence Ċ import Ġorg . si rix . rest . Auth Role Ċ import Ġjava . io . Print Stream Ċ import Ġjava . io . PrintWriter Ċ Ċ /** Ċ Ġ* Ġ@ author ĠJ oh ann es ĠL icht en ber ger Ċ Ġ*/ Ċ class ĠPermission Checking X Query Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmodule : ĠModule ĊĠĠĠ Ġprivate Ġvar Ġis Pretty Print : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġrole : ĠAuth Role ĊĠĠĠ Ġval Ġkey cloak : ĠOAuth 2 Auth ĊĠĠĠ Ġval Ġuser : ĠUser ĊĠĠĠ Ġval Ġauth z : ĠAuthorization Provider ĊĊĠĠĠ Ġconstructor ( module : ĠModule , Ġrole : ĠAuth Role , Ġkey cloak : ĠOAuth 2 Auth , Ġuser : ĠUser , Ġauth z : ĠAuthorization Provider ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . module Ġ= Ġmodule ĊĠĠĠĠĠĠĠ Ġthis . role Ġ= Ġrole ĊĠĠĠĠĠĠĠ Ġthis . keycloak Ġ= Ġkey cloak ĊĠĠĠĠĠĠĠ Ġthis . user Ġ= Ġuser ĊĠĠĠĠĠĠĠ Ġthis . auth z Ġ= Ġauth z ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( query : ĠString , Ġrole : ĠAuth Role , Ġkey cloak : ĠOAuth 2 Auth , Ġuser : ĠUser , Ġauth z : ĠAuthorization Provider ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . module Ġ= ĠCompile Chain (). compile ( query ) ĊĠĠĠĠĠĠĠ Ġthis . role Ġ= Ġrole ĊĠĠĠĠĠĠĠ Ġthis . keycloak Ġ= Ġkey cloak ĊĠĠĠĠĠĠĠ Ġthis . user Ġ= Ġuser ĊĠĠĠĠĠĠĠ Ġthis . auth z Ġ= Ġauth z ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( chain : ĠCompile Chain , Ġquery : ĠString , Ġrole : ĠAuth Role , Ġkey cloak : ĠOAuth 2 Auth , Ġuser : ĠUser , Ġauth z : ĠAuthorization Provider ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . module Ġ= Ġchain . compile ( query ) ĊĠĠĠĠĠĠĠ Ġthis . role Ġ= Ġrole ĊĠĠĠĠĠĠĠ Ġthis . keycloak Ġ= Ġkey cloak ĊĠĠĠĠĠĠĠ Ġthis . user Ġ= Ġuser ĊĠĠĠĠĠĠĠ Ġthis . auth z Ġ= Ġauth z ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexecute ( ctx : ĠQuery Context ): ĠSequence ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun ( ctx , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġevaluate ( ctx : ĠQuery Context ): ĠSequence ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun ( ctx , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun ( ctx : ĠQuery Context , Ġlazy : ĠBoolean ): ĠSequence ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġmodule . body ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠQuery Exception ( ErrorCode . BIT _ DY N _ INT _ ERROR , Ġ" Module Ġdoes Ġnot Ġcontain Ġa Ġquery Ġbody .") ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġbody . evaluate ( ctx , ĠTuple Impl ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( body . is Updating ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġis Authorized Ġ= Ġuser . is Authorized Await ( role . database Role ( name )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME : ĠBetter Ġway ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth z . get Author izations ( user ). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( Role Based Authorization . create ( role . keycloak Role ()). match ( user )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ("${ HttpResponse Status . UN AUTHORIZ ED . code ()} : ĠUser Ġis Ġnot Ġallowed Ġto Ġmodify Ġthe Ġdatabase ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! lazy Ġ|| Ġbody . is Updating ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġiterate Ġpossibly Ġlazy Ġresult Ġsequence Ġto Ġ" pull - in " Ġall Ġpending Ġupdates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull Ġ&& Ġresult Ġ! is ĠItem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . iterate (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . next () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . apply Updates () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġserialize ( ctx : ĠQuery Context , Ġout : ĠPrint Stream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġserialize ( ctx , ĠPrintWriter ( out )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġserialize ( ctx : ĠQuery Context , Ġout : ĠPrintWriter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠSequence ? Ġ= Ġrun ( ctx , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠString Serializer ( out ). use Ġ{ Ġserializer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer . is Format Ġ= Ġis Pretty Print ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserializer . serialize ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġserialize ( ctx : ĠQuery Context , Ġserializer : ĠSerializer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠSequence ? Ġ= Ġrun ( ctx , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġserializer . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer . serialize ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpretty Print (): ĠPermission Checking X Query Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is Pretty Print Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEBUG _ CFG Ġ= Ġ" org . br ack it . x query . debug " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEBUG _ DIR _ CFG Ġ= Ġ" org . br ack it . x query . debug Dir " ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠDEBUG Ġ= ĠC fg . as Bool ( DEBUG _ CFG , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠDEBUG _ DIR Ġ= ĠC fg . asString ( DEBUG _ DIR _ CFG , Ġ" debug /") ĊĠĠĠ Ġ} Ċ }