/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠFr akt al io ĠD . O . O . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . fr akt al io . f model . example . events ourced system . command . adapter . web Ċ Ċ import Ġcom . fr akt al io . f model . application . publish To Ċ import Ġcom . fr akt al io . f model . example . domain .* Ċ import Ġcom . fr akt al io . f model . example . events ourced system . command . application . Order Restaurant Aggregate Ċ import Ġkotlinx . collections . immutable . persistent ListOf Ċ import Ġkotlinx . collections . immutable . to ImmutableList Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . ax on framework . command handling . gateway . Command Gateway Ċ import Ġorg . springframework . web . bind . annotation . GetMapping Ċ import Ġorg . springframework . web . bind . annotation . PathVariable Ċ import Ġorg . springframework . web . bind . annotation . RestController Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠRest Ġcontroller Ġ- ĠVery Ġsimple Ġcontroller Ċ Ġ* Ċ Ġ* Ġ@ property Ġaggregate ĠA ĠState ĠStored ĠAggregate Ġ- ĠAll Ġthings Ġat ĠRest aurant : ĠRest aurant Ġmanagement , ĠOrder Ġmanagement Ċ Ġ* Ġ@ property Ġcommand Gateway ĠAx on Ġcommand Ġgateway / bus Ċ Ġ* Ġ@ constructor ĠCreates ĠRest Ġcontroller Ċ Ġ*/ Ċ @ RestController Ċ internal Ġclass ĠCommand RestController ( ĊĠĠĠ Ġprivate Ġval Ġaggregate : ĠOrder Restaurant Aggregate , ĊĠĠĠ Ġprivate Ġval Ġcommand Gateway : ĠCommand Gateway Ċ ) Ġ{ ĊĠĠĠ Ġ@ Opt In ( Experimental Cor outines Api :: class ) ĊĠĠĠ Ġprivate Ġval Ġax on Server Bus ses Ġ= ĠDispatch ers . IO . limited Parallel ism ( 1 0 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġrestaurant ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġendpoint Ġis Ġsending Ġa Ġmessage / command Ġdirectly Ġto Ġthe ĠAggregate , Ġso Ġit Ġdepends Ġon Ġit . ĠThis Ġis Ġnot Ġlocation Ġtransparent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWe Ġmade Ġit Ġa ĠGET , Ġbut Ġit Ġshould Ġbe ĠPOST Ġ;) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġ@ PostMapping ("/ restaurant ") ĊĠĠĠ Ġ@ GetMapping ("/ example / restaurant / create ") ĊĠĠĠ Ġsuspend Ġfun Ġcreate Restaurant () Ġ= ĊĠĠĠĠĠĠĠ ĠCreate Restaurant Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. convertTo Command () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. publish To ( aggregate ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġrestaurant Ġvia Ġax on Ġcommand Ġbus ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġendpoint Ġis Ġsending Ġa Ġmessage / command Ġvia ĠAx on ĠCommand ĠBus / Gateway Ġto Ġthe ĠAggregate . ĠThis Ġis Ġlocation Ġtransparent ! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ ĠWe Ġmade Ġit Ġa ĠGET , Ġbut Ġit Ġshould Ġbe ĠPOST Ġ;) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġ@ PostMapping ("/ bus / restaurant ") ĊĠĠĠ Ġ@ GetMapping ("/ example / bus / restaurant / create ") ĊĠĠĠ Ġsuspend Ġfun Ġcreate Restaurant Via Bus () Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( ax on Server Bus ses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Gateway . send Command < Command , ĠAny >( Create Restaurant Request (). convertTo Command ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠActivate Ġrestaurant Ġmenu Ġvia Ġax on Ġcommand Ġbus ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġendpoint Ġis Ġsending Ġa Ġmessage / command Ġvia ĠAx on ĠCommand ĠBus / Gateway Ġto Ġthe ĠAggregate . ĠThis Ġis Ġlocation Ġtransparent ! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWe Ġmade Ġit Ġa ĠGET , Ġbut Ġit Ġshould Ġbe ĠPOST / PUT Ġ;) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrestaurant Id ĊĠĠĠĠ Ġ* Ġ@ param Ġmenu Id ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġ@ PostMapping ("/ bus / restaurant /{ restaurant Id }/ activate /{ menu Id }") ĊĠĠĠ Ġ@ GetMapping ("/ example / bus / restaurant /{ restaurant Id }/ activate /{ menu Id }") ĊĠĠĠ Ġsuspend Ġfun Ġactivate Restaurant Menu Via Bus (@ PathVariable Ġrestaurant Id : ĠUUID , Ġ@ PathVariable Ġmenu Id : ĠUUID ) Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( ax on Server Bus ses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Gateway . send Command < Command , ĠAny >( Activate Restaurant Menu Command ( Restaurant Id ( restaurant Id ), Ġmenu Id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPass ivate Ġrestaurant Ġmenu Ġvia Ġax on Ġcommand Ġbus ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġendpoint Ġis Ġsending Ġa Ġmessage / command Ġvia ĠAx on ĠCommand ĠBus / Gateway Ġto Ġthe ĠAggregate . ĠThis Ġis Ġlocation Ġtransparent ! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWe Ġmade Ġit Ġa ĠGET , Ġbut Ġit Ġshould Ġbe ĠPOST / PUT Ġ;) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrestaurant Id ĊĠĠĠĠ Ġ* Ġ@ param Ġmenu Id ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġ@ PostMapping ("/ bus / restaurant /{ restaurant Id }/ pass ivate /{ menu Id }") ĊĠĠĠ Ġ@ GetMapping ("/ example / bus / restaurant /{ restaurant Id }/ pass ivate /{ menu Id }") ĊĠĠĠ Ġsuspend Ġfun Ġpass ivate Restaurant Menu Via Bus (@ PathVariable Ġrestaurant Id : ĠUUID , Ġ@ PathVariable Ġmenu Id : ĠUUID ) Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( ax on Server Bus ses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Gateway . send Command < Command , ĠAny >( Pass ivate Restaurant Menu Command ( Restaurant Id ( restaurant Id ), Ġmenu Id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPlace Ġrestaurant Ġorder Ġvia Ġax on Ġcommand Ġbus ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġendpoint Ġis Ġsending Ġa Ġmessage / command Ġvia ĠAx on ĠCommand ĠBus / Gateway Ġto Ġthe ĠAggregate . ĠThis Ġis Ġlocation Ġtransparent ! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWe Ġmade Ġit Ġa ĠGET , Ġbut Ġit Ġshould Ġbe ĠPOST / PUT Ġ;) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrestaurant Id ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ GetMapping ("/ example / bus / restaurant /{ restaurant Id }/ order ") ĊĠĠĠ Ġsuspend Ġfun Ġplace Restaurant Order Via Bus (@ PathVariable Ġrestaurant Id : ĠUUID ) Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( ax on Server Bus ses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Gateway . send Command < Command , ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Restaurant Order Command ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRest aurant Id ( restaurant Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRest aurant OrderId (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpersistent ListOf ( Restaurant Order Line Item (" 1 ", Ġ 1 , Ġ" 1 ", Ġ" S arma ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* Ġ` Convert ` Ġextension Ġof Ġ` Create Restaurant Request ` Ċ Ġ* Ċ Ġ*/ Ċ private Ġfun ĠCreate Restaurant Request . convertTo Command () Ġ= ĊĠĠĠ ĠCreate Restaurant Command ( ĊĠĠĠĠĠĠĠ ĠRest aurant Id (), ĊĠĠĠĠĠĠĠ Ġthis . name , ĊĠĠĠĠĠĠĠ ĠRest aurant Menu VO ( this . menu Items . map Ġ{ ĠMenuItem VO ( it . id , Ġit . id , Ġit . name , ĠMoney ( it . price )) Ġ}. to ImmutableList ()) ĊĠĠĠ Ġ) ĊĊ Ċ /** Ċ Ġ* ĠA Ġrequest Ġfor Ġcreating Ġa ĠRest aurant Ċ Ġ*/ Ċ data Ġclass ĠCreate Restaurant Request ( ĊĠĠĠ Ġvar Ġname : ĠString Ġ= Ġ" ser b ian Ġrestaurant ", ĊĠĠĠ Ġvar Ġmenu Items : ĠMutable List < MenuItem Request > Ġ= Ġarray ListOf ( ĊĠĠĠĠĠĠĠ ĠMenuItem Request (" 1 ", Ġ" S arma ", ĠBigDecimal . TEN ), ĊĠĠĠĠĠĠĠ ĠMenuItem Request (" 2 ", Ġ" K ise lo Ġm le ko ", ĠBigDecimal . valueOf ( 2 )), ĊĠĠĠĠĠĠĠ ĠMenuItem Request (" 3 ", Ġ" Sr ps ka Ġsal ata ", ĠBigDecimal . valueOf ( 3 )) ĊĠĠĠ Ġ) Ċ ) Ċ Ċ /** Ċ Ġ* ĠA ĠMenu Ġitem Ġrequest Ċ Ġ*/ Ċ data Ġclass ĠMenuItem Request ( var Ġid : ĠString , Ġvar Ġname : ĠString , Ġvar Ġprice : ĠBigDecimal ) Ċ