package Ġio . github . recipe store . service Ċ Ċ import Ġio . github . recipe store . domain . Roles Ċ import Ġio . github . recipe store . domain . User Ċ import Ġio . github . recipe store . dto . request . Login Request Ċ import Ġio . github . recipe store . dto . request . User Roles Add Request Ċ import Ġio . github . recipe store . mapper . User Add Roles Ċ import Ġio . github . recipe store . repository . UserRepository Ċ import Ġio . github . recipe store . service . security . Jwt Service Ċ import Ġorg . springframework . security . crypto . password . Password Encoder Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġreactor . core . publisher . Flux Ċ import Ġreactor . core . publisher . Mono Ċ Ċ @ Service Ċ class ĠUserService ( ĊĠĠĠ Ġprivate Ġval Ġencoder : ĠPassword Encoder , ĊĠĠĠ Ġprivate Ġval Ġuser Repository : ĠUser Repository , ĊĠĠĠ Ġprivate Ġval Ġjwt Service : ĠJwt Service , ĊĠĠĠ Ġprivate Ġval Ġuser Role Service : ĠUser Role Service , ĊĠĠĠ Ġprivate Ġval Ġuser Add Roles : ĠUser Add Roles Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġlogin ( request : ĠLogin Request ): ĠMono < String > Ġ= Ġuser Repository ĊĠĠĠĠĠĠĠ Ġ. find ByName ( request . userName ) ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġencoder . matches ( request . password , Ġit . password ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġuser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMono . just ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. zip With ( user Role Service . getUser Roles ( user . id !! ). collect List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġtuple Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtuple . t 1 . roles Ġ= Ġtuple . t 2 . toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjwt Service . generate Token ( tuple . t 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetAll Users (): ĠFlux < User > Ġ= Ġuser Repository ĊĠĠĠĠĠĠĠ Ġ. findAll () ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Add Roles . merge ( Mono . just ( it ), Ġuser Role Service . getUser Roles ( it . id !! )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetUser ( userId : ĠLong ): ĠMono < User > Ġ= Ġuser Repository ĊĠĠĠĠĠĠĠ Ġ. findById ( userId ) ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Add Roles . merge ( Mono . just ( it ), Ġuser Role Service . getUser Roles ( it . id !! )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd User ( request : ĠLogin Request ): ĠMono < Void > Ġ= ĠMono . just ( request ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠUser ( null , Ġit . userName , Ġencoder . encode ( it . password )) Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap ( user Repository :: save ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Role Service . add Roles To User ( it , Ġset Of ( Roles . USER )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠMono . empty () Ġ} ĊĊĠĠĠ Ġfun Ġadd User Roles ( userId : ĠLong , Ġrequest : ĠUser Roles Add Request ): ĠMono < User > Ġ= ĠMono . just ( request ) ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Role Service . add Roles To User ( User ( userId , Ġ"", Ġ""), Ġit . roles ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetUser ( userId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate User ( userId : ĠLong , Ġrequest : ĠLogin Request ): ĠMono < User > Ġ= Ġuser Repository . findById ( userId ) ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . update User ( userId , Ġrequest . userName , Ġencoder . encode ( request . password )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetUser ( userId ) ĊĠĠĠĠĠĠĠ Ġ} Ċ }