Selaa lähdekoodia

优化用户相关事件

zhou-hao 4 vuotta sitten
vanhempi
commit
4e520b8965

+ 2 - 1
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/event/UserCreatedEvent.java

@@ -2,6 +2,7 @@ package org.hswebframework.web.system.authorization.api.event;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
+import org.hswebframework.web.event.DefaultAsyncEvent;
 import org.hswebframework.web.system.authorization.api.entity.UserEntity;
 
 /**
@@ -10,6 +11,6 @@ import org.hswebframework.web.system.authorization.api.entity.UserEntity;
  */
 @Getter
 @AllArgsConstructor
-public class UserCreatedEvent {
+public class UserCreatedEvent extends DefaultAsyncEvent {
     UserEntity userEntity;
 }

+ 2 - 1
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/event/UserDeletedEvent.java

@@ -4,13 +4,14 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import org.hswebframework.web.event.DefaultAsyncEvent;
 import org.hswebframework.web.system.authorization.api.entity.UserEntity;
 
 @Getter
 @Setter
 @AllArgsConstructor
 @NoArgsConstructor
-public class UserDeletedEvent {
+public class UserDeletedEvent extends DefaultAsyncEvent {
 
     private UserEntity user;
 

+ 2 - 1
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/event/UserModifiedEvent.java

@@ -2,6 +2,7 @@ package org.hswebframework.web.system.authorization.api.event;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
+import org.hswebframework.web.event.DefaultAsyncEvent;
 import org.hswebframework.web.system.authorization.api.entity.UserEntity;
 
 /**
@@ -14,7 +15,7 @@ import org.hswebframework.web.system.authorization.api.entity.UserEntity;
  */
 @AllArgsConstructor
 @Getter
-public class UserModifiedEvent {
+public class UserModifiedEvent extends DefaultAsyncEvent {
     private UserEntity userEntity;
 
     private boolean passwordModified;

+ 5 - 4
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultDimensionUserService.java

@@ -28,10 +28,11 @@ public class DefaultDimensionUserService extends GenericReactiveCrudService<Dime
 
     @EventListener
     public void handleUserDeleteEntity(UserDeletedEvent event) {
-        createDelete()
-                .where(DimensionUserEntity::getUserId, event.getUser().getId())
-                .execute()
-                .subscribe(i -> log.debug("user deleted,clear user dimension!"));
+        event.async(this.createDelete()
+                        .where(DimensionUserEntity::getUserId, event.getUser().getId())
+                        .execute()
+                        .doOnSuccess(i -> log.debug("user deleted,clear user dimension!"))
+        );
     }
 
     @Override

+ 60 - 51
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultReactiveUserService.java

@@ -69,41 +69,45 @@ public class DefaultReactiveUserService extends GenericReactiveCrudService<UserE
 
     protected Mono<UserEntity> doAdd(UserEntity userEntity) {
 
-        return Mono.defer(() -> {
-            userEntity.setSalt(IDGenerator.RANDOM.generate());
-            usernameValidator.validate(userEntity.getUsername());
-            passwordValidator.validate(userEntity.getPassword());
-            userEntity.setPassword(passwordEncoder.encode(userEntity.getPassword(), userEntity.getSalt()));
-            return Mono.just(userEntity)
-                    .doOnNext(e -> e.tryValidate(CreateGroup.class))
-                    .filterWhen(e -> createQuery()
-                            .where(userEntity::getUsername)
-                            .count().map(i -> i == 0))
-                    .switchIfEmpty(Mono.error(() -> new ValidationException("用户名已存在")))
-                    .as(getRepository()::insert)
-                    .thenReturn(userEntity)
-                    .doOnSuccess(e -> eventPublisher.publishEvent(new UserCreatedEvent(e)));
-        });
+        return Mono
+                .defer(() -> {
+                    userEntity.setSalt(IDGenerator.RANDOM.generate());
+                    usernameValidator.validate(userEntity.getUsername());
+                    passwordValidator.validate(userEntity.getPassword());
+                    userEntity.setPassword(passwordEncoder.encode(userEntity.getPassword(), userEntity.getSalt()));
+                    return Mono.just(userEntity)
+                               .doOnNext(e -> e.tryValidate(CreateGroup.class))
+                               .filterWhen(e -> createQuery()
+                                       .where(userEntity::getUsername)
+                                       .count().map(i -> i == 0))
+                               .switchIfEmpty(Mono.error(() -> new ValidationException("用户名已存在")))
+                               .as(getRepository()::insert)
+                               .thenReturn(userEntity)
+                               .flatMap(user -> new UserCreatedEvent(user)
+                                       .publish(eventPublisher)
+                                       .thenReturn(user));
+                });
 
     }
 
 
     protected Mono<UserEntity> doUpdate(UserEntity userEntity) {
-        return Mono.defer(() -> {
-            boolean passwordChanged = StringUtils.hasText(userEntity.getPassword());
-            if (passwordChanged) {
-                userEntity.setSalt(IDGenerator.RANDOM.generate());
-                passwordValidator.validate(userEntity.getPassword());
-                userEntity.setPassword(passwordEncoder.encode(userEntity.getPassword(), userEntity.getSalt()));
-            }
-            return getRepository()
-                    .createUpdate()
-                    .set(userEntity)
-                    .where(userEntity::getId)
-                    .execute()
-                    .doOnSuccess(__ -> eventPublisher.publishEvent(new UserModifiedEvent(userEntity, passwordChanged)))
-                    .thenReturn(userEntity);
-        });
+        return Mono
+                .defer(() -> {
+                    boolean passwordChanged = StringUtils.hasText(userEntity.getPassword());
+                    if (passwordChanged) {
+                        userEntity.setSalt(IDGenerator.RANDOM.generate());
+                        passwordValidator.validate(userEntity.getPassword());
+                        userEntity.setPassword(passwordEncoder.encode(userEntity.getPassword(), userEntity.getSalt()));
+                    }
+                    return getRepository()
+                            .createUpdate()
+                            .set(userEntity)
+                            .where(userEntity::getId)
+                            .execute()
+                            .flatMap(__ -> new UserModifiedEvent(userEntity, passwordChanged).publish(eventPublisher))
+                            .thenReturn(userEntity);
+                });
 
     }
 
@@ -117,36 +121,38 @@ public class DefaultReactiveUserService extends GenericReactiveCrudService<UserE
     @Transactional(readOnly = true, transactionManager = TransactionManagers.r2dbcTransactionManager)
     public Mono<UserEntity> findByUsername(String username) {
         return Mono.justOrEmpty(username)
-                .flatMap(_name -> repository.createQuery()
-                        .where(UserEntity::getUsername, _name)
-                        .fetchOne());
+                   .flatMap(_name -> repository
+                           .createQuery()
+                           .where(UserEntity::getUsername, _name)
+                           .fetchOne());
     }
 
     @Override
     @Transactional(readOnly = true, transactionManager = TransactionManagers.r2dbcTransactionManager)
     public Mono<UserEntity> findByUsernameAndPassword(String username, String plainPassword) {
         return Mono.justOrEmpty(username)
-                .flatMap(_name -> repository
-                        .createQuery()
-                        .where(UserEntity::getUsername, _name)
-                        .fetchOne())
-                .filter(user -> passwordEncoder.encode(plainPassword, user.getSalt())
-                        .equals(user.getPassword()));
+                   .flatMap(_name -> repository
+                           .createQuery()
+                           .where(UserEntity::getUsername, _name)
+                           .fetchOne())
+                   .filter(user -> passwordEncoder
+                           .encode(plainPassword, user.getSalt())
+                           .equals(user.getPassword()));
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class, transactionManager = TransactionManagers.r2dbcTransactionManager)
     public Mono<Integer> changeState(Publisher<String> userId, byte state) {
         return Flux.from(userId)
-                .collectList()
-                .filter(CollectionUtils::isNotEmpty)
-                .flatMap(list -> repository
-                        .createUpdate()
-                        .set(UserEntity::getStatus, state)
-                        .where()
-                        .in(UserEntity::getId, list)
-                        .execute())
-                .defaultIfEmpty(0);
+                   .collectList()
+                   .filter(CollectionUtils::isNotEmpty)
+                   .flatMap(list -> repository
+                           .createUpdate()
+                           .set(UserEntity::getStatus, state)
+                           .where()
+                           .in(UserEntity::getId, list)
+                           .execute())
+                   .defaultIfEmpty(0);
     }
 
     @Override
@@ -157,7 +163,8 @@ public class DefaultReactiveUserService extends GenericReactiveCrudService<UserE
                 .switchIfEmpty(Mono.error(NotFoundException::new))
                 .filter(user -> passwordEncoder.encode(oldPassword, user.getSalt()).equals(user.getPassword()))
                 .switchIfEmpty(Mono.error(() -> new ValidationException("密码错误")))
-                .flatMap(user -> repository.createUpdate()
+                .flatMap(user -> repository
+                        .createUpdate()
                         .set(UserEntity::getPassword, passwordEncoder.encode(newPassword, user.getSalt()))
                         .where(user::getId)
                         .execute())
@@ -183,11 +190,13 @@ public class DefaultReactiveUserService extends GenericReactiveCrudService<UserE
     }
 
     @Override
+    @Transactional(readOnly = true, transactionManager = TransactionManagers.r2dbcTransactionManager)
     public Mono<Boolean> deleteUser(String userId) {
-        return this.findById(userId)
+        return this
+                .findById(userId)
                 .flatMap(user -> this
                         .deleteById(Mono.just(userId))
-                        .doOnNext(i -> eventPublisher.publishEvent(new UserDeletedEvent(user)))
+                        .flatMap(i -> new UserDeletedEvent(user).publish(eventPublisher))
                         .thenReturn(true));
     }
 }