2727import reactor .core .publisher .Mono ;
2828
2929import jakarta .validation .ValidationException ;
30+
3031import java .util .Objects ;
3132
3233
@@ -59,14 +60,14 @@ public Mono<UserEntity> newUserInstance() {
5960 @ Transactional (rollbackFor = Exception .class , transactionManager = TransactionManagers .reactiveTransactionManager )
6061 public Mono <Boolean > saveUser (Mono <UserEntity > request ) {
6162 return request
62- .flatMap (userEntity -> {
63- if (ObjectUtils .isEmpty (userEntity .getId ())) {
64- return doAdd (userEntity );
65- }
66- return findById (userEntity .getId ())
67- .flatMap (old -> doUpdate (old , userEntity ))
68- .switchIfEmpty (doAdd (userEntity ));
69- }).thenReturn (true );
63+ .flatMap (userEntity -> {
64+ if (ObjectUtils .isEmpty (userEntity .getId ())) {
65+ return doAdd (userEntity );
66+ }
67+ return findById (userEntity .getId ())
68+ .flatMap (old -> doUpdate (old , userEntity ))
69+ .switchIfEmpty (doAdd (userEntity ));
70+ }).thenReturn (true );
7071 }
7172
7273 @ Override
@@ -75,15 +76,17 @@ public Mono<UserEntity> addUser(UserEntity userEntity) {
7576 }
7677
7778 protected Mono <UserEntity > doAdd (UserEntity userEntity ) {
78-
79- return Mono
80- .defer (() -> {
81- usernameValidator .validate (userEntity .getUsername ());
82- passwordValidator .validate (userEntity .getPassword ());
83- userEntity .generateId ();
84- userEntity .setSalt (IDGenerator .RANDOM .generate ());
85- userEntity .setPassword (passwordEncoder .encode (userEntity .getPassword (), userEntity .getSalt ()));
86- return this
79+ return new UserBeforeCreateEvent (userEntity )
80+ .publish (eventPublisher )
81+ .then (
82+ Mono
83+ .defer (() -> {
84+ usernameValidator .validate (userEntity .getUsername ());
85+ passwordValidator .validate (userEntity .getPassword ());
86+ userEntity .generateId ();
87+ userEntity .setSalt (IDGenerator .RANDOM .generate ());
88+ userEntity .setPassword (passwordEncoder .encode (userEntity .getPassword (), userEntity .getSalt ()));
89+ return this
8790 .createQuery ()
8891 .where (userEntity ::getUsername )
8992 .fetch ()
@@ -98,43 +101,43 @@ protected Mono<UserEntity> doAdd(UserEntity userEntity) {
98101 .thenReturn (userEntity )
99102 .flatMap (user -> new UserCreatedEvent (user ).publish (eventPublisher ))
100103 .thenReturn (userEntity );
101- } );
104+ }) );
102105
103106 }
104107
105108
106109 protected Mono <UserEntity > doUpdate (UserEntity old , UserEntity newer ) {
107110 return Mono
108- .defer (() -> {
109- boolean updatePassword = StringUtils .hasText (newer .getPassword ());
110-
111- boolean passwordChanged = updatePassword &&
112- !Objects .equals (
113- passwordEncoder .encode (newer .getPassword (), old .getSalt ()),
114- old .getPassword ()
115- );
116-
117- String newPassword = passwordChanged ? newer .getPassword () : null ;
118- if (updatePassword ) {
119- newer .setSalt (IDGenerator .RANDOM .generate ());
120- passwordValidator .validate (newer .getPassword ());
121- newer .setPassword (passwordEncoder .encode (newer .getPassword (), newer .getSalt ()));
122- }
123- UserEntity copyEntity = old .copyTo (new UserEntity ());
124- UserEntity newEntity = newer .copyTo (copyEntity );
125- return getRepository ()
126- .createUpdate ()
127- .set (newer )
128- .where (newer ::getId )
129- .execute ()
130- .flatMap (__ -> new UserModifiedEvent (old , newEntity , passwordChanged , newPassword )
131- .publish (eventPublisher )
132- .thenReturn (newEntity ))
133- .flatMap (e -> ClearUserAuthorizationCacheEvent
134- .of (e .getId ())
135- .publish (eventPublisher )
136- .thenReturn (e ));
137- });
111+ .defer (() -> {
112+ boolean updatePassword = StringUtils .hasText (newer .getPassword ());
113+
114+ boolean passwordChanged = updatePassword &&
115+ !Objects .equals (
116+ passwordEncoder .encode (newer .getPassword (), old .getSalt ()),
117+ old .getPassword ()
118+ );
119+
120+ String newPassword = passwordChanged ? newer .getPassword () : null ;
121+ if (updatePassword ) {
122+ newer .setSalt (IDGenerator .RANDOM .generate ());
123+ passwordValidator .validate (newer .getPassword ());
124+ newer .setPassword (passwordEncoder .encode (newer .getPassword (), newer .getSalt ()));
125+ }
126+ UserEntity copyEntity = old .copyTo (new UserEntity ());
127+ UserEntity newEntity = newer .copyTo (copyEntity );
128+ return getRepository ()
129+ .createUpdate ()
130+ .set (newer )
131+ .where (newer ::getId )
132+ .execute ()
133+ .flatMap (__ -> new UserModifiedEvent (old , newEntity , passwordChanged , newPassword )
134+ .publish (eventPublisher )
135+ .thenReturn (newEntity ))
136+ .flatMap (e -> ClearUserAuthorizationCacheEvent
137+ .of (e .getId ())
138+ .publish (eventPublisher )
139+ .thenReturn (e ));
140+ });
138141
139142 }
140143
@@ -149,22 +152,22 @@ public Mono<UserEntity> findById(String id) {
149152 public Mono <UserEntity > findByUsername (String username ) {
150153 return Mono .justOrEmpty (username )
151154 .flatMap (_name -> repository
152- .createQuery ()
153- .where (UserEntity ::getUsername , _name )
154- .fetchOne ());
155+ .createQuery ()
156+ .where (UserEntity ::getUsername , _name )
157+ .fetchOne ());
155158 }
156159
157160 @ Override
158161 @ Transactional (readOnly = true , transactionManager = TransactionManagers .reactiveTransactionManager )
159162 public Mono <UserEntity > findByUsernameAndPassword (String username , String plainPassword ) {
160163 return Mono .justOrEmpty (username )
161164 .flatMap (_name -> repository
162- .createQuery ()
163- .where (UserEntity ::getUsername , _name )
164- .fetchOne ())
165+ .createQuery ()
166+ .where (UserEntity ::getUsername , _name )
167+ .fetchOne ())
165168 .filter (user -> passwordEncoder
166- .encode (plainPassword , user .getSalt ())
167- .equals (user .getPassword ()));
169+ .encode (plainPassword , user .getSalt ())
170+ .equals (user .getPassword ()));
168171 }
169172
170173 @ Override
@@ -174,16 +177,16 @@ public Mono<Integer> changeState(Publisher<String> userId, byte state) {
174177 .collectList ()
175178 .filter (CollectionUtils ::isNotEmpty )
176179 .flatMap (list -> repository
177- .createUpdate ()
178- .set (UserEntity ::getStatus , state )
179- .where ()
180- .in (UserEntity ::getId , list )
181- .execute ()
182- .flatMap (i -> UserStateChangedEvent
183- .of (list , state )
184- .publish (eventPublisher )
185- .thenReturn (i )
186- )
180+ .createUpdate ()
181+ .set (UserEntity ::getStatus , state )
182+ .where ()
183+ .in (UserEntity ::getId , list )
184+ .execute ()
185+ .flatMap (i -> UserStateChangedEvent
186+ .of (list , state )
187+ .publish (eventPublisher )
188+ .thenReturn (i )
189+ )
187190 )
188191 .defaultIfEmpty (0 );
189192 }
@@ -193,54 +196,54 @@ public Mono<Integer> changeState(Publisher<String> userId, byte state) {
193196 public Mono <Boolean > changePassword (String userId , String oldPassword , String newPassword ) {
194197 passwordValidator .validate (newPassword );
195198 return findById (userId )
196- .switchIfEmpty (Mono .error (NotFoundException .NoStackTrace ::new ))
197- .filter (user -> passwordEncoder .encode (oldPassword , user .getSalt ()).equals (user .getPassword ()))
198- .switchIfEmpty (Mono .error (() -> new ValidationException ("error.illegal_user_password" )))
199- .flatMap (old -> {
200- String encodePwd = passwordEncoder .encode (newPassword , old .getSalt ());
201-
202- boolean passwordChanged = !Objects .equals (encodePwd , old .getPassword ());
203- UserEntity newer = old .copyTo (new UserEntity ());
204- newer .setPassword (encodePwd );
205- return repository
206- .createUpdate ()
207- .set (newer ::getPassword )
208- .where (newer ::getId )
209- .execute ()
210- .flatMap (e -> new UserModifiedEvent (old , newer , passwordChanged , newPassword )
211- .publish (eventPublisher )
212- .thenReturn (e ));
213- })
214- .map (i -> i > 0 );
199+ .switchIfEmpty (Mono .error (NotFoundException .NoStackTrace ::new ))
200+ .filter (user -> passwordEncoder .encode (oldPassword , user .getSalt ()).equals (user .getPassword ()))
201+ .switchIfEmpty (Mono .error (() -> new ValidationException ("error.illegal_user_password" )))
202+ .flatMap (old -> {
203+ String encodePwd = passwordEncoder .encode (newPassword , old .getSalt ());
204+
205+ boolean passwordChanged = !Objects .equals (encodePwd , old .getPassword ());
206+ UserEntity newer = old .copyTo (new UserEntity ());
207+ newer .setPassword (encodePwd );
208+ return repository
209+ .createUpdate ()
210+ .set (newer ::getPassword )
211+ .where (newer ::getId )
212+ .execute ()
213+ .flatMap (e -> new UserModifiedEvent (old , newer , passwordChanged , newPassword )
214+ .publish (eventPublisher )
215+ .thenReturn (e ));
216+ })
217+ .map (i -> i > 0 );
215218 }
216219
217220 @ Override
218221 @ Transactional (readOnly = true , transactionManager = TransactionManagers .reactiveTransactionManager )
219222 public Flux <UserEntity > findUser (QueryParam queryParam ) {
220223 return repository
221- .createQuery ()
222- .setParam (queryParam )
223- .fetch ();
224+ .createQuery ()
225+ .setParam (queryParam )
226+ .fetch ();
224227 }
225228
226229 @ Override
227230 @ Transactional (readOnly = true , transactionManager = TransactionManagers .reactiveTransactionManager )
228231 public Mono <Integer > countUser (QueryParam queryParam ) {
229232 return repository
230- .createQuery ()
231- .setParam (queryParam )
232- .count ();
233+ .createQuery ()
234+ .setParam (queryParam )
235+ .count ();
233236 }
234237
235238 @ Override
236239 @ Transactional (transactionManager = TransactionManagers .reactiveTransactionManager )
237240 public Mono <Boolean > deleteUser (String userId ) {
238241 return this
239- .findById (userId )
240- .flatMap (user -> this
241- .deleteById (Mono .just (userId ))
242- .flatMap (i -> new UserDeletedEvent (user ).publish (eventPublisher ))
243- .thenReturn (true ));
242+ .findById (userId )
243+ .flatMap (user -> this
244+ .deleteById (Mono .just (userId ))
245+ .flatMap (i -> new UserDeletedEvent (user ).publish (eventPublisher ))
246+ .thenReturn (true ));
244247 }
245248
246249 @ Override
0 commit comments