package Ġbet man . controller Ċ Ċ import Ġbet man . db . UserRepository Ċ import Ġbet man . po jos . User Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Maybe Ċ import Ġio . reactivex . Single Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . MediaType Ċ import Ġorg . springframework . web . bind . annotation .* Ċ import Ġjava . security . Principal ĊĊ Ċ @ RestController Ċ @ RequestMapping ("/ api / users ") Ċ class ĠUser Controller Ġ@ Autowired Ġconstructor ( private Ġval Ġuser Repository : ĠUser Repository ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġ@ PostMapping ("/ register ") ĊĠĠĠ Ġ@ ResponseStatus ( value Ġ= ĠHttpStatus . OK ) ĊĠĠĠ Ġfun Ġregister (@ RequestBody Ġuser : ĠUser ): ĠSingle < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Register ing Ġuser Ġ${ user . name }") ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Repository . register ( user ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ GetMapping ("/ status ", Ġproduces Ġ= Ġ[ MediaType . APPLICATION _ JSON _ UTF 8 _ VALUE ]) ĊĠĠĠ Ġfun Ġstatus ( user : ĠPrincipal ): ĠMaybe < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Repository . get ( user . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ PostMapping ("/ update ") ĊĠĠĠ Ġfun Ġupdate (@ RequestBody Ġuser : ĠUser , Ġprincipal : ĠPrincipal ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Repository . get ( principal . name ). map { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . admin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . update ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= ĠUser ( name = principal . name , Ġpassword Ġ= Ġuser . password ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . update ( update ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. flatMap Comp letable Ġ{ Ġuser Repository . update ( user ) Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }