From 7fb7e3f24c1a08c750ce7c4c82932286d0d4feb6 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 25 Nov 2025 16:53:39 +0200 Subject: [PATCH] Refactoring - revert replaceUserCredentials. Added removeUserCredentials and use it instead --- .../rpc/processor/user/BaseUserProcessor.java | 35 +++--------- .../server/dao/user/UserService.java | 3 +- .../server/dao/user/UserServiceImpl.java | 56 +++++++------------ 3 files changed, 30 insertions(+), 64 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/BaseUserProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/BaseUserProcessor.java index 0da0e4aade..fe640505b1 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/BaseUserProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/BaseUserProcessor.java @@ -23,7 +23,6 @@ import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.id.UserCredentialsId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.dao.service.DataValidator; @@ -90,40 +89,24 @@ public abstract class BaseUserProcessor extends BaseEdgeProcessor { } protected void updateUserCredentials(TenantId tenantId, UserCredentialsUpdateMsg updateMsg) { - UserCredentials userCredentialsFromUpdateMsg = JacksonUtil.fromString(updateMsg.getEntity(), UserCredentials.class, true); - if (userCredentialsFromUpdateMsg == null) { + UserCredentials userCredentials = JacksonUtil.fromString(updateMsg.getEntity(), UserCredentials.class, true); + if (userCredentials == null) { throw new IllegalArgumentException(String.format("[%s] Failed to parse UserCredentials from updateMsg: %s", tenantId, updateMsg)); } - - User user = edgeCtx.getUserService().findUserById(tenantId, userCredentialsFromUpdateMsg.getUserId()); + User user = edgeCtx.getUserService().findUserById(tenantId, userCredentials.getUserId()); if (user == null) { log.warn("[{}] Can't find user by id [{}] skipping credentials update. UserCredentialsUpdateMsg [{}]", - tenantId, userCredentialsFromUpdateMsg.getUserId(), updateMsg); + tenantId, userCredentials.getUserId(), updateMsg); return; } - log.debug("[{}] Updating user credentials for user [{}]. New credentials Id [{}], enabled [{}]", - tenantId, user.getName(), userCredentialsFromUpdateMsg.getId(), userCredentialsFromUpdateMsg.isEnabled()); - + tenantId, user.getName(), userCredentials.getId(), userCredentials.isEnabled()); try { - UserCredentials existing = edgeCtx.getUserService().findUserCredentialsByUserId(tenantId, user.getId()); - boolean created = existing == null; - UserCredentialsId oldCredentialsId = created ? null : existing.getId(); - - UserCredentials updated = created ? new UserCredentials() : existing; - updated.setId(userCredentialsFromUpdateMsg.getId()); - updated.setUserId(user.getId()); - updated.setEnabled(userCredentialsFromUpdateMsg.isEnabled()); - updated.setActivateToken(userCredentialsFromUpdateMsg.getActivateToken()); - updated.setAdditionalInfo(userCredentialsFromUpdateMsg.getAdditionalInfo()); - updated.setPassword(userCredentialsFromUpdateMsg.getPassword()); - updated.setResetToken(userCredentialsFromUpdateMsg.getResetToken()); - - if (created) { - edgeCtx.getUserService().saveUserCredentials(tenantId, updated, false); - } else { - edgeCtx.getUserService().replaceUserCredentials(tenantId, updated, oldCredentialsId, false); + UserCredentials userCredentialsByUserId = edgeCtx.getUserService().findUserCredentialsByUserId(tenantId, user.getId()); + if (userCredentialsByUserId != null && !userCredentialsByUserId.getId().equals(userCredentials.getId())) { + edgeCtx.getUserService().deleteUserCredentials(tenantId, userCredentialsByUserId); } + edgeCtx.getUserService().saveUserCredentials(tenantId, userCredentials, false); } catch (Exception e) { log.error("[{}] Can't update user credentials for user [{}], userCredentialsUpdateMsg [{}]", tenantId, user.getName(), updateMsg, e); diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java index c3f7b72ed3..1062982885 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java @@ -74,8 +74,7 @@ public interface UserService extends EntityDaoService { UserCredentials replaceUserCredentials(TenantId tenantId, UserCredentials userCredentials); - UserCredentials replaceUserCredentials(TenantId tenantId, UserCredentials userCredentials, - UserCredentialsId oldUserCredentialsId, boolean doValidate); + void deleteUserCredentials(TenantId tenantId, UserCredentials userCredentials); void deleteUser(TenantId tenantId, User user); diff --git a/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java index bdcac80d4a..e10d87e760 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java @@ -79,7 +79,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -99,6 +98,7 @@ public class UserServiceImpl extends AbstractCachedEntityService tenantId); + userCredentialsDao.removeById(tenantId, userCredentials.getUuidId()); + userCredentials.setId(null); + if (userCredentials.getPassword() != null) { + updatePasswordHistory(userCredentials); + } + UserCredentials result = userCredentialsDao.save(tenantId, userCredentials); + eventPublisher.publishEvent(ActionEntityEvent.builder() + .tenantId(tenantId) + .entityId(userCredentials.getUserId()) + .actionType(ActionType.CREDENTIALS_UPDATED).build()); + return result; } @Override - public UserCredentials replaceUserCredentials(TenantId tenantId, UserCredentials userCredentials, - UserCredentialsId oldUserCredentialsId, boolean doValidate) { - return replaceUserCredentialsInternal(tenantId, userCredentials, oldUserCredentialsId.getId(), doValidate); - } - - private UserCredentials replaceUserCredentialsInternal(TenantId tenantId, UserCredentials userCredentials, - UUID oldCredentialsUuid, boolean doValidate) { - log.trace("[{}] Replacing user credentials for user [{}], old credentials ID [{}]", - tenantId, userCredentials.getUserId(), oldCredentialsUuid); - - if (doValidate) { - userCredentialsValidator.validate(userCredentials, data -> tenantId); - } - - try { - userCredentialsDao.removeById(tenantId, oldCredentialsUuid); - userCredentials.setId(null); - if (userCredentials.getPassword() != null) { - updatePasswordHistory(userCredentials); - } - - UserCredentials savedCredentials = userCredentialsDao.save(tenantId, userCredentials); - - eventPublisher.publishEvent(ActionEntityEvent.builder() - .tenantId(tenantId) - .entityId(userCredentials.getUserId()) - .actionType(ActionType.CREDENTIALS_UPDATED) - .build()); - - return savedCredentials; - } catch (Exception e) { - log.error("[{}] Failed to replace user credentials for user [{}]", tenantId, userCredentials.getUserId(), e); - throw new RuntimeException("Failed to replace user credentials", e); - } + public void deleteUserCredentials(TenantId tenantId, UserCredentials userCredentials) { + Objects.requireNonNull(userCredentials, "UserCredentials is null"); + UserCredentialsId userCredentialsId = userCredentials.getId(); + log.trace("[{}] Executing deleteUserCredentials [{}]", tenantId, userCredentialsId); + validateId(userCredentialsId, id -> INCORRECT_USER_CREDENTIALS_ID + id); + userCredentialsDao.removeById(tenantId, userCredentialsId.getId()); } @Override