package Ġcom . test . cor out in ew eb server Ċ Ċ import Ġcom . couch base . client . java . Reactive Collection Ċ import Ġkotlinx . coroutines . reactive . await First Ċ import Ġkotlinx . coroutines . reactive . await First OrNull Ċ import Ġorg . springframework . boot . autoconfigure . SpringBoot Application Ċ import Ġorg . springframework . boot . run Application Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . web . bind . annotation . GetMapping Ċ import Ġorg . springframework . web . bind . annotation . PathVariable Ċ import Ġorg . springframework . web . bind . annotation . RestController Ċ import Ġreactor . core . publisher . Mono Ċ Ċ @ SpringBoot Application Ċ class ĠCor outine WebServer Application Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġrun Application < Coroutine WebServer Application >(* args ) Ċ } Ċ Ċ @ RestController Ċ class ĠUser Controller ( private Ġval ĠuserService : ĠUserService ) Ġ{ ĊĠĠĠ Ġ@ GetMapping (" users /{ id }") ĊĠĠĠ Ġsuspend Ġfun ĠgetUser (@ PathVariable Ġid : ĠString ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠuserService . getUser ( id ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Service Ċ class ĠUserService ( private Ġval Ġuser Repository : ĠUser Repository , Ġprivate Ġval Ġaddress Repository : ĠAddress Repository ) Ġ{ ĊĠĠĠ Ġsuspend Ġfun ĠgetUser ( id : ĠString ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Repository . getUser ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun ĠgetUser With Address ( id : ĠString ): ĠUser With Address Dto Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġuser Repository . getUser ( id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( user . has Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġaddress Repository . getAddress Of User ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUser With Address Dto ( user . firstName , Ġaddress . address ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠUser With Address Dto ( user . firstName , Ġ" No ĠAddress ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Component Ċ class ĠUser Repository ( private Ġval Ġreactive Collection : ĠReactive Collection ) Ġ{ ĊĠĠĠ Ġsuspend Ġfun ĠgetUser ( id : ĠString ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreactive Collection . get ( id ). map Ġ{ Ġit . content As ( User :: class . java ) Ġ}. await First OrNull () Ġ?: Ġthrow ĠException (" user . not . found ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Component Ċ class ĠAddress Repository ( private Ġval Ġreactive Collection : ĠReactive Collection ) Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġget Address Of User ( userId : ĠString ): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreactive Collection . get ( userId ). await First (). content As ( Address :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // region ĠModels Ċ data Ġclass ĠUser ( ĊĠĠĠ Ġval Ġid : ĠString , ĊĠĠĠ Ġval ĠfirstName : ĠString , ĊĠĠĠ Ġval ĠlastName : ĠString , ĊĠĠĠ Ġval Ġemail : ĠString , ĊĠĠĠ Ġval Ġhas Address : ĠBoolean Ċ ) Ċ Ċ data Ġclass ĠAddress ( ĊĠĠĠ Ġval ĠuserId : ĠString , ĊĠĠĠ Ġval Ġaddress : ĠString Ċ ) Ċ Ċ data Ġclass ĠUser With Address Dto ( ĊĠĠĠ Ġval ĠuserName : ĠString , ĊĠĠĠ Ġval Ġaddress : ĠString Ċ ) Ċ // endregion