package Ġio . github . b hu wan up ad hy ay . example Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġio . github . b hu wan up ad hy ay . example . query by example . Order Example Query Ċ import Ġorg . hibernate . SessionFactory Ċ import Ġorg . hibernate . query . criteria . Hibernate Criteria Builder Ċ import Ġorg . hibernate . query . criteria . internal . Criteria Builder Impl Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . context . annotation . Bean Ċ import Ġorg . springframework . context . annotation . Configuration Ċ import Ġorg . springframework . data . domain . Example Ċ import Ġorg . springframework . data . jpa . convert . Query By Example Predicate Builder Ċ import Ġorg . springframework . data . jpa . repository . Jpa Repository Ċ import Ġorg . springframework . data . jpa . repository . Jpa Specification Executor Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . MediaType . APPLICATION _ JSON Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġorg . springframework . web . reactive . function . Body Extract ors Ċ import Ġorg . springframework . web . reactive . function . Body Inser ters Ċ import Ġorg . springframework . web . reactive . function . server . Server Request Ċ import Ġorg . springframework . web . reactive . function . server . Server Response Ċ import Ġorg . springframework . web . reactive . function . server . Server Response .* Ċ import Ġorg . springframework . web . reactive . function . server . router Ċ import Ġreactor . core . publisher . Mono Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . util .* Ċ import Ġjavax . persistence . Entity Ċ import Ġjavax . persistence . GeneratedValue Ċ import Ġjavax . persistence . Generation Type Ċ import Ġjavax . persistence . Id Ċ import Ġjavax . persistence . criteria . Root Ċ Ċ @ Entity Ċ data Ġclass ĠOrder Entity (@ Id Ġ@ GeneratedValue ( strategy Ġ= ĠGeneration Type . IDENTITY ) Ġvar Ġid : ĠLong ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitem : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġquantity : ĠInt ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcreated Date : ĠLocalDateTime ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstatus : ĠString ? Ċ ) Ċ Ċ interface ĠOrder Repository Ġ: ĠJ pa Repository < Order Entity , ĠLong >, ĠJ pa Specification Executor < Order Entity > Ċ Ċ class ĠDomain Exception ( override Ġval Ġmessage : ĠString , Ġval Ġex : ĠThrowable ?) Ġ: ĠRuntimeException ( message , Ġex ) Ċ Ċ data Ġclass ĠOrder Request ( var Ġitem : ĠString , Ġvar Ġquantity : ĠInt ) Ċ Ċ data Ġclass ĠOrder Query Request ( var Ġid : ĠLong ?, Ġvar Ġitem : ĠString ?, Ġvar Ġquantity : ĠInt ?, Ġvar Ġcreated Date : ĠString ?, Ġvar Ġstatus : ĠString ?) Ċ Ċ @ Component Ċ class ĠOrder Handler ( private Ġval Ġrepository : ĠOrder Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmapper : ĠObjectMapper , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġsession Factory : ĠSession Factory ) Ġ{ ĊĊ ĉ fun ĠfindAll ( req : ĠServer Request ) Ġ= Ġok (). body ( Body Inser ters . from Value ( repository . findAll ())) ĊĊ ĉ fun ĠfindAll Query By Example ( req : ĠServer Request ): ĠMono < Server Response > Ġ{ Ċĉ ĉ val Ġquery Json Ġ= Ġread ( mapper , Ġreq . query Param (" query Json "), ĠOrder Query Request :: class . java ) Ċĉ ĉ return Ġquery Json . map Ġ{ Ċĉĉ ĉ val Ġentity Query Ġ= ĠOrder Example Query ( it ) Ċĉĉ ĉ val Ġexample Ġ= ĠExample . of ( entity Query . example , Ġentity Query . matcher ) Ċĉĉ ĉ Criteria Builder Impl ( session Factory ) Ċĉĉ ĉ Query By Example Predicate Builder . get Predicate ( Root < Order Entity >() Ġexample ) Ċĉĉ ĉ repository . find Ċĉĉ ĉ ok (). body Value ( repository . findAll ( example )) Ċĉ ĉ }. orElse Get Ġ{ Ġbad Request (). build () Ġ} Ċ ĉ } ĊĊ ĉ fun Ġfind One ( req : ĠServer Request ): ĠMono < Server Response > Ġ{ Ċĉ ĉ return Ġrepository . findById ( eval Id ( req )). map Ġ{ Ġok (). body Value ( it ) Ġ}. orElse Get Ġ{ Ġnot Found (). build () Ġ} Ċ ĉ } ĊĊ ĉ fun Ġsave ( req : ĠServer Request ): ĠMono < Server Response > Ġ{ Ċĉ ĉ val Ġpayload Ġ= Ġreq . body ( Body Extract ors . to Mono ( Order Request :: class . java )) Ċĉ ĉ return Ġpayload . flatMap Ġ{ Ġstatus ( HttpStatus . CREATED ). body ( Body Inser ters . from Value ( repository . save ( Order Entity ( null , Ġit . item , Ġit . quantity , ĠLocalDateTime . now (), Ġ" CREATED ")) )) Ġ}. switch If Empty ( bad Request (). build ()) Ċ ĉ } ĊĊ ĉ fun Ġupdate ( req : ĠServer Request ): ĠMono < Server Response > Ġ{ Ċĉ ĉ val Ġid Ġ= Ġeval Id ( req ) Ċĉ ĉ return Ġrepository . findById ( id ) Ċĉĉĉ ĉ . map Ġ{ Ġentity Ġ-> Ċĉĉĉĉ ĉ val Ġpayload Ġ= Ġreq . body ( Body Extract ors . to Mono ( Order Request :: class . java )) Ċĉĉĉĉ ĉ payload . map Ġ{ Ġrequest Ġ-> Ċĉĉĉĉĉ ĉ entity . item Ġ= Ġrequest . item Ċĉĉĉĉĉ ĉ entity . quantity Ġ= Ġrequest . quantity Ċĉĉĉĉĉ ĉ entity . status Ġ= Ġ" READY " Ċĉĉĉĉĉ ĉ entity Ċĉĉĉĉ ĉ }. flatMap Ġ{ Ġok (). body Value ( repository . save ( it )) Ġ}. switch If Empty ( bad Request (). build ()) Ċĉĉĉ ĉ }. orElse Get Ġ{ Ġnot Found (). build () Ġ} Ċ ĉ } ĊĊ ĉ private Ġfun Ġeval Id ( req : ĠServer Request ): ĠLong Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ return ĠOptional . of Nullable ( req . path Variable (" id "). to Long ()). filter Ġ{ Ġit Ġ> Ġ 0 Ġ}. orElse Throw Ġ{ Ġthrow ĠDomain Exception ( message Ġ= Ġ" Id Ġshould Ġbe Ġpositive Ġnumber .", Ġex Ġ= Ġnull ) Ġ} Ċĉ ĉ } Ġcatch Ġ( ex : ĠNumber FormatException ) Ġ{ Ċĉĉ ĉ throw ĠDomain Exception ( message Ġ= Ġ" Id Ġshould Ġbe Ġpositive Ġnumber .", Ġex Ġ= Ġex ) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ private Ġfun Ġ< T > Ġread ( mapper : ĠObjectMapper , Ġparam : ĠOptional < String >, Ġjava : ĠClass < T >): ĠOptional < T > Ġ{ Ċ ĉ return Ġparam . map Ġ{ Ġmapper . readValue ( it , Ġjava ) Ġ} Ċ } Ċ Ċ @ Configuration Ċ class ĠOrder Routes ( private Ġval Ġhandler : ĠOrder Handler ) Ġ{ ĊĊ ĉ private Ġval Ġlog : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Order Routes :: class . java ) ĊĊ ĉ @ Bean Ċ ĉ fun Ġrouter () Ġ= Ġrouter Ġ{ Ċĉ ĉ accept ( APPLICATION _ JSON ). nest Ġ{ Ċĉĉ ĉ POST ("/ orders ", Ġhandler :: save ) Ċĉĉ ĉ GET ("/ orders ", Ġhandler :: findAll ) Ċĉĉ ĉ GET ("/ orders /{ id }", Ġhandler :: findOne ) Ċĉĉ ĉ PUT ("/ orders /{ id }", Ġhandler :: update ) Ċĉĉ ĉ GET ("/ query - by - example ", Ġhandler :: findAll Query By Example ) Ċĉ ĉ } Ċ ĉ }. filter Ġ{ Ġrequest , Ġnext Ġ-> Ċĉ ĉ try Ġ{ Ċĉĉ ĉ next . handle ( request ) Ċĉ ĉ } Ġcatch Ġ( ex : ĠException ) Ġ{ Ċĉĉ ĉ log . error (" Error Ġon Ġrest Ġinterface .", Ġex ) Ċĉĉ ĉ when Ġ( ex ) Ġ{ Ċĉĉĉ ĉ is ĠDomain Exception Ġ-> Ġbad Request (). build () Ċĉĉĉ ĉ else Ġ-> Ġstatus ( HttpStatus . INTERNAL _ SERVER _ ERROR ). build () Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ } Ċ