package Ġcn . hess ian . xiao ai . controller Ċ Ċ import Ġcn . hess ian . xiao ai . domain . Domain Ċ import Ġcn . hess ian . xiao ai . exception . Auth Error Ċ import Ġcn . hess ian . xiao ai . exception . Business Exception Ċ import Ġcn . hess ian . xiao ai . exception . Generic Error Ċ import Ġcn . hess ian . xiao ai . repository . Repository Ċ import Ġio . vertx . core . Vert x Ċ import Ġio . vertx . core . json . Json Ċ import Ġio . vertx . ext . web . Route Ċ import Ġio . vertx . ext . web . Router Ċ import Ġio . vertx . ext . web . Routing Context Ċ import Ġio . vertx . ext . web . handler . Session Handler Ċ import Ġio . vertx . kotlin . coroutines . dispatcher Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ abstract Ġclass ĠCur d Controller ( val Ġvert x : ĠVert x , Ġval Ġrepository : ĠRepository < Domain >) Ġ: ĠCor outine Scope Ġ{ ĊĊĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( this :: class . java ) ĊĊĠ Ġabstract Ġval Ġprefix Ġ: ĠString ĊĊĠ Ġval Ġvalid Page Range Ġ= Ġ 0 Ġ.. ĠInt . MAX _ VALUE ĊĠ Ġval Ġvalid PageSize Range Ġ= Ġ 1 Ġ.. Ġ 1 0 0 0 ĊĊĠ Ġval Ġrouter Ġ= ĠRouter . router ( vertx ) ĊĊĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠ Ġget () Ġ= Ġvert x . dispatcher () ĊĊĠ Ġprotected Ġfun ĠRoute . api Handler ( fn : Ġsuspend Ġ( Routing Context ) Ġ-> ĠAny ?): ĠRoute ? Ġ{ ĊĠĠĠ Ġreturn Ġhandler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠ Ġlaunch ( ctx . vertx (). dispatcher ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġctx . response () ĊĠĠĠĠĠĠĠĠĠ Ġ. put Header (" Content - Type ", Ġ" application / json ") ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġresponse Ġ: ĠApiResponse ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= ĠApiResponse . success ( fn ( ctx )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠBusiness Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= ĠApiResponse . fail ( e . message , Ġe . code ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlog . error ( e . message , Ġe ) ĊĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= ĠApiResponse . fail ( Generic Error . ERROR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġctx . response (). end ( Json . encode ( response )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĊĠ Ġopen Ġfun Ġbind Router ( root Router : ĠRouter , Ġsession Handler : ĠSession Handler ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġrouter . apply Ġ{ ĊĠĠĠĠĠ Ġif Ġ( session Handler Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroute (). handler ( session Handler ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġroute () ĊĠĠĠĠĠĠĠ Ġ. handler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( ctx . user () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . response (). put Header (" Content - Type ", Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠApiResponse . fail ( Auth Error . USER _ NOT _ LOG GED _ IN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . response (). end ( Json . encode ( response )) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . next () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġget (). api Handler (:: detail ) ĊĠĠĠĠĠ Ġpost (). api Handler (:: create ) ĊĠĠĠĠĠ Ġdelete (). api Handler (:: delete ) ĊĠĠĠĠĠ Ġget ("/ search "). api Handler (:: search ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġroot Router . mount Sub Router ( prefix , Ġrouter ) ĊĠ Ġ} ĊĊĠ Ġopen Ġsuspend Ġfun Ġcreate ( routing Context : ĠRouting Context ) Ġ{ ĊĠĠĠ Ġval Ġobj Ġ= Ġrouting Context . body As Json . map To ( repository . entity Class . java ) ĊĠĠĠ Ġrepository . insert ( obj ) ĊĠ Ġ} ĊĊĠ Ġopen Ġsuspend Ġfun Ġupdate ( routing Context : ĠRouting Context ) Ġ{ ĊĠĠĠ Ġval Ġobj Ġ= Ġrouting Context . body As Json . map To ( repository . entity Class . java ) ĊĠĠĠ Ġrepository . update ( obj ) ĊĠ Ġ} ĊĊĠ Ġopen Ġsuspend Ġfun Ġdetail ( routing Context : ĠRouting Context ): ĠDomain Ġ{ ĊĠĠĠ Ġreturn Ġrepository . getById ( routing Context . request (). getParam (" id "). toInt ()) Ġ?: Ġthrow ĠGeneric Error . RESOURCE _ NOT _ FOUND . throwable ĊĠ Ġ} ĊĊĠ Ġopen Ġsuspend Ġfun Ġdelete ( routing Context : ĠRouting Context ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġrepository . delete ( routing Context . request (). getParam (" id "). toInt ()) ĊĠ Ġ} ĊĊĠ Ġopen Ġsuspend Ġfun Ġsearch ( routing Context : ĠRouting Context ): ĠList < Domain > Ġ{ ĊĠĠĠ Ġval Ġwhere Ġ= Ġrouting Context . request (). getParam (" where ") ĊĠĠĠ Ġval Ġorder Ġ= Ġrouting Context . request (). getParam (" order ") ĊĠĠĠ Ġval Ġpage Ġ= Ġrouting Context . request (). getParam (" page ") ?. toInt () Ġ?: Ġ 0 ĊĠĠĠ Ġval ĠpageSize Ġ= Ġrouting Context . request (). getParam (" pageSize ") ?. toInt () Ġ?: Ġ 2 0 ĊĊĠĠĠ Ġif Ġ(! valid Page Range . contains ( page ) Ġ|| Ġ! valid PageSize Range . contains ( pageSize )) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠGeneric Error . IL LEG AL _ ARGUMENT . throwable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġoffset Ġ= Ġpage Ġ* ĠpageSize ĊĠĠĠ Ġreturn Ġrepository . findBy Where ( where , Ġorder , Ġoffset , ĠpageSize ) ĊĠ Ġ} Ċ } Ċ