package Ġorg . si rix . rest . crud . json čĊč Ċ import Ġio . vertx . core . Context č Ċ import Ġio . vertx . core . Promise č Ċ import Ġio . vertx . ext . web . Route č Ċ import Ġio . vertx . ext . web . Routing Context č Ċ import Ġio . vertx . kotlin . core . execute Blocking Await č Ċ import Ġio . vertx . kotlin . core . file . readFile Await č Ċ import Ġio . vertx . kotlin . coroutines . dispatcher č Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher č Ċ import Ġkotlinx . coroutines . with Context č Ċ import Ġorg . si rix . access . Database Configuration č Ċ import Ġorg . si rix . access . Databases č Ċ import Ġorg . si rix . access . Resource Configuration č Ċ import Ġorg . si rix . api . Database č Ċ import Ġorg . si rix . api . json . Json ResourceManager č Ċ import Ġorg . si rix . rest . crud . Si rix DB User č Ċ import Ġorg . si rix . service . json . serialize . Json Serializer č Ċ import Ġorg . si rix . service . json . sh red der . Json Sh red der č Ċ import Ġjava . io . String Writer č Ċ import Ġjava . nio . charset . StandardCharsets č Ċ import Ġjava . nio . file . Files č Ċ import Ġjava . nio . file . Path čĊč Ċ class ĠJson Create ( private Ġval Ġlocation : ĠPath , Ġprivate Ġval Ġcreate Multiple Resources : ĠBoolean Ġ= Ġfalse ) Ġ{ čĊĠĠĠ Ġsuspend Ġfun Ġhandle ( ctx : ĠRouting Context ): ĠRoute Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġdatabase Name Ġ= Ġctx . path Param (" database ") čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( create Multiple Resources ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Multiple Resources ( database Name , Ġctx ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . response (). set StatusCode ( 2 0 1 ). end () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġctx . current Route () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġresource Ġ= Ġctx . path Param (" resource ") čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( resource Ġ== Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb File Ġ= Ġlocation . resolve ( database Name ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvert x Context Ġ= Ġctx . vertx (). or Create Context čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Database IfNot Exists ( db File , Ġvert x Context ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . response (). set StatusCode ( 2 0 1 ). end () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġctx . current Route () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġres To Store Ġ= Ġctx . body AsString čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( database Name Ġ== Ġnull Ġ|| Ġres To Store Ġ== Ġnull Ġ|| Ġres To Store . isBlank ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . fail ( IllegalArgumentException (" Database Ġname Ġand Ġresource Ġdata Ġto Ġstore Ġnot Ġgiven .")) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġsh red der ( database Name , Ġresource , Ġres To Store , Ġctx ) čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġctx . current Route () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate Multiple Resources ( database Name : ĠString ?, Ġctx : ĠRouting Context ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġdb File Ġ= Ġlocation . resolve ( database Name ) čĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġctx . vertx (). or Create Context čĊĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= Ġctx . vertx (). dispatcher () čĊĠĠĠĠĠĠĠ Ġcreate Database IfNot Exists ( db File , Ġcontext ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġsi rix DB User Ġ= ĠSi rix DB User . create ( ctx ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= ĠDatabase s . open Json Database ( db File , Ġsi rix DB User ) čĊčĊĠĠĠĠĠĠĠ Ġdatabase . use Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . file Upload s (). forEach Ġ{ Ġfile Upload Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġfile Upload . fileName () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Config Ġ= ĠResource Configuration . Builder ( fileName ). build () čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Or Remove And Create Resource ( database , Ġres Config , ĠfileName , Ġdispatcher ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġdatabase . open ResourceManager ( fileName ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . use Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġctx . vertx (). file System (). readFile Await ( file Upload . uploaded FileName ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Json Sub tree As First Child ( manager , Ġbuffer . toString ( StandardCharsets . UTF _ 8 ), Ġcontext ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsh red der ( čĊĠĠĠĠĠĠĠ Ġdb Path Name : ĠString , Ġres Path Name : ĠString Ġ= Ġdb Path Name , Ġres File To Store : ĠString , čĊĠĠĠĠĠĠĠ Ġctx : ĠRouting Context čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġdb File Ġ= Ġlocation . resolve ( db Path Name ) čĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġctx . vertx (). or Create Context čĊĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= Ġctx . vertx (). dispatcher () čĊĠĠĠĠĠĠĠ Ġcreate Database IfNot Exists ( db File , Ġcontext ) čĊčĊĠĠĠĠĠĠĠ Ġinsert Resource ( db File , Ġres Path Name , Ġdispatcher , Ġres File To Store , Ġcontext , Ġctx ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinsert Resource ( čĊĠĠĠĠĠĠĠ Ġdb File : ĠPath ?, Ġres Path Name : ĠString , čĊĠĠĠĠĠĠĠ Ġdispatcher : ĠCor outine Dispatcher , čĊĠĠĠĠĠĠĠ Ġres File To Store : ĠString , čĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , čĊĠĠĠĠĠĠĠ Ġctx : ĠRouting Context čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= ĠDatabase s . open Json Database ( db File ) čĊčĊĠĠĠĠĠĠĠ Ġdatabase . use Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Config Ġ= ĠResource Configuration . Builder ( res Path Name ). build () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Or Remove And Create Resource ( database , Ġres Config , Ġres Path Name , Ġdispatcher ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġdatabase . open ResourceManager ( res Path Name ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . use Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Json Sub tree As First Child ( manager , Ġres File To Store , Ġcontext ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserialize Json ( manager , Ġcontext , Ġctx ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġserialize Json ( manager : ĠJson ResourceManager , Ġvert x Context : ĠContext , Ġrouting Ctx : ĠRouting Context ) Ġ{ čĊĠĠĠĠĠĠĠ Ġvert x Context . execute Blocking Await Ġ{ Ġpromise : ĠPromise < Unit > Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠString Writer () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserializer Builder Ġ= ĠJsonSerializer . newBuilder ( manager , Ġout ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserializer Ġ= Ġserializer Builder . build () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Serialize Helper (). serialize ( serializer , Ġout , Ġrouting Ctx , Ġmanager , Ġnull ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . complete ( null ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate Database IfNot Exists ( čĊĠĠĠĠĠĠĠ Ġdb File : ĠPath , čĊĠĠĠĠĠĠĠ Ġcontext : ĠContext čĊĠĠĠ Ġ): ĠDatabase Configuration ? Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . execute Blocking Await Ġ{ Ġpromise : ĠPromise < Database Configuration > Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Exists Ġ= ĠFiles . exists ( db File ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! db Exists ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Directories ( db File . parent ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Config Ġ= ĠDatabase Configuration ( db File ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Databases . exists Database ( db File )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase s . create Json Database ( db Config ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . complete ( db Config ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate Or Remove And Create Resource ( čĊĠĠĠĠĠĠĠ Ġdatabase : ĠDatabase < Json ResourceManager >, čĊĠĠĠĠĠĠĠ Ġres Config : ĠResource Configuration ?, čĊĠĠĠĠĠĠĠ Ġres Path Name : ĠString , Ġdispatcher : ĠCor outine Dispatcher čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġwith Context ( dispatcher ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! database . create Resource ( res Config )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . remove Resource ( res Path Name ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . create Resource ( res Config ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinsert Json Sub tree As First Child ( čĊĠĠĠĠĠĠĠ Ġmanager : ĠJson ResourceManager , čĊĠĠĠĠĠĠĠ Ġres File To Store : ĠString , čĊĠĠĠĠĠĠĠ Ġcontext : ĠContext čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġcontext . execute Blocking Await Ġ{ Ġpromise : ĠPromise < Unit > Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw tx Ġ= Ġmanager . begin Node Tr x () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġw tx . use Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw tx . insert Sub tree As First Child ( Json Sh red der . create String Reader ( res File To Store )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . complete ( null ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } čĊ