From 97d8171f0760a53139d0568f4546cc11ce6d5d77 Mon Sep 17 00:00:00 2001 From: imbeacon Date: Wed, 9 Aug 2023 14:49:53 +0300 Subject: [PATCH] Refactored to use events --- .../entitiy/alarm/DefaultTbAlarmService.java | 74 +++++++++++-------- .../server/dao/alarm/AlarmService.java | 3 +- .../server/dao/alarm/BaseAlarmService.java | 41 ++-------- .../server/dao/user/UserServiceImpl.java | 1 - 4 files changed, 53 insertions(+), 66 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmService.java index 9d6d36cfc9..c241fc3317 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmService.java @@ -19,6 +19,7 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.event.TransactionalEventListener; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.User; @@ -33,9 +34,11 @@ import org.thingsboard.server.common.data.alarm.AlarmUpdateRequest; import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; import org.thingsboard.server.common.data.exception.ThingsboardException; -import org.thingsboard.server.common.data.id.EdgeId; +import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; +import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; +import org.thingsboard.server.dao.user.UserService; import org.thingsboard.server.service.entitiy.AbstractTbEntityService; import java.util.List; @@ -48,6 +51,9 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb @Autowired protected TbAlarmCommentService alarmCommentService; + @Autowired + protected UserService userService; + @Override public Alarm save(Alarm alarm, User user) throws ThingsboardException { ActionType actionType = alarm.getId() == null ? ActionType.ADDED : ActionType.UPDATED; @@ -217,45 +223,53 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb } @Override - public void unassignUserAlarms(TenantId tenantId, User user, long unassignTs) { - AlarmQueryV2 alarmQuery = AlarmQueryV2.builder().assigneeId(user.getId()).pageLink(new TimePageLink(Integer.MAX_VALUE)).build(); - try { - List alarms = alarmService.findAlarmsV2(tenantId, alarmQuery).get(30, TimeUnit.SECONDS).getData(); - for (AlarmInfo alarm : alarms) { - AlarmApiCallResult result = alarmSubscriptionService.unassignAlarm(tenantId, alarm.getId(), getOrDefault(unassignTs)); - if (!result.isSuccessful()) { - continue; - } - if (result.isModified()) { + public Boolean delete(Alarm alarm, User user) { + TenantId tenantId = alarm.getTenantId(); + notificationEntityService.logEntityAction(tenantId, alarm.getOriginator(), alarm, alarm.getCustomerId(), + ActionType.DELETED, user); + return alarmSubscriptionService.deleteAlarm(tenantId, alarm.getId()); + } + + @TransactionalEventListener + public void unassignDeletedUserAlarms(UserId userId) { + List alarms = alarmService.findAlarmsByAssigneeId(userId); + for (Alarm alarm : alarms) { + AlarmApiCallResult result = alarmSubscriptionService.unassignAlarm(alarm.getTenantId(), alarm.getId(), System.currentTimeMillis()); + if (!result.isSuccessful()) { + continue; + } + if (result.isModified()) { + try { AlarmComment alarmComment = AlarmComment.builder() .alarmId(alarm.getId()) .type(AlarmCommentType.SYSTEM) - .comment(JacksonUtil.newObjectNode().put("text", String.format("Alarm was unassigned because user %s - was deleted", - (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName())) - .put("userId", user.getId().toString()) + .comment(JacksonUtil.newObjectNode() + .put("text", String.format("Alarm was unassigned because user with id %s - was deleted", + userId.toString())) + .put("userId", userId.toString()) .put("subtype", "ASSIGN")) .build(); - try { - alarmCommentService.saveAlarmComment(alarm, alarmComment, user); - } catch (ThingsboardException e) { - log.error("Failed to save alarm comment", e); - } - notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), result.getAlarm(), - alarm.getCustomerId(), ActionType.ALARM_UNASSIGNED, user); + alarmCommentService.saveAlarmComment(alarm, alarmComment, null); + } catch (ThingsboardException e) { + log.error("Failed to save alarm comment", e); } + notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), result.getAlarm(), + alarm.getCustomerId(), ActionType.ALARM_UNASSIGNED, null); } - - } catch (InterruptedException | ExecutionException | TimeoutException e) { - throw new RuntimeException(e); } } - @Override - public Boolean delete(Alarm alarm, User user) { - TenantId tenantId = alarm.getTenantId(); - notificationEntityService.logEntityAction(tenantId, alarm.getOriginator(), alarm, alarm.getCustomerId(), - ActionType.DELETED, user); - return alarmSubscriptionService.deleteAlarm(tenantId, alarm.getId()); + @TransactionalEventListener(fallbackExecution = true) + public void handleEvent(DeleteEntityEvent event) { + try { + log.trace("[{}] DeleteEntityEvent called: {}", event.getTenantId(), event); + EntityId entityId = event.getEntityId(); + if (EntityType.USER.equals(entityId.getEntityType())) { + unassignDeletedUserAlarms((UserId) entityId); + } + } catch (Exception e) { + log.error("[{}] failed to process DeleteEntityEvent: {}", event.getTenantId(), event); + } } private static long getOrDefault(long ts) { diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java index 93904582b2..212f544d29 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java @@ -39,6 +39,7 @@ import org.thingsboard.server.common.data.query.AlarmDataQuery; import org.thingsboard.server.dao.entity.EntityDaoService; import java.util.Collection; +import java.util.List; public interface AlarmService extends EntityDaoService { @@ -118,7 +119,7 @@ public interface AlarmService extends EntityDaoService { PageData findAlarmDataByQueryForEntities(TenantId tenantId, AlarmDataQuery query, Collection orderedEntityIds); - void unassignUserAlarms(TenantId tenantId, UserId userId, long unassignTs); + List findAlarmsByAssigneeId(UserId userId); void deleteEntityAlarmRelations(TenantId tenantId, EntityId entityId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index edd7295613..b7bdaa3078 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -25,12 +25,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmApiCallResult; -import org.thingsboard.server.common.data.alarm.AlarmComment; -import org.thingsboard.server.common.data.alarm.AlarmCommentType; import org.thingsboard.server.common.data.alarm.AlarmCreateOrUpdateActiveRequest; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.alarm.AlarmModificationRequest; @@ -347,30 +344,6 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ return result; } - @Override - public void unassignUserAlarms(TenantId tenantId, UserId userId, long unassignTs) { - List alarms = findAlarmsByAssigneeId(userId); - for (Alarm alarm : alarms) { - AlarmApiCallResult result = unassignAlarm(alarm.getTenantId(), alarm.getId(), unassignTs); - if (!result.isSuccessful()) { - continue; - } - if (result.isModified()) { - try { - AlarmComment alarmComment = AlarmComment.builder() - .alarmId(alarm.getId()) - .type(AlarmCommentType.SYSTEM) - .comment(JacksonUtil.newObjectNode() - .put("text", "Alarm was unassigned because assigned user was deleted!") - .put("userId", userId.toString()) - .put("subtype", "ASSIGN")) - .build(); - alarmCommentDao.save(tenantId, alarmComment); - } catch (Exception ignored) {} - } - } - } - @Override public Alarm findAlarmById(TenantId tenantId, AlarmId alarmId) { log.trace("Executing findAlarmById [{}]", alarmId); @@ -412,6 +385,13 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ return Futures.immediateFuture(alarmDao.findCustomerAlarmsV2(tenantId, customerId, query)); } + @Override + public List findAlarmsByAssigneeId(UserId userId) { + log.trace("Executing findAlarmsByAssigneeId [{}]", userId); + validateId(userId, "Incorrect alarmId " + userId); + return alarmDao.findAlarmByAssigneeId(userId.getId()); + } + @Override public AlarmSeverity findHighestAlarmSeverity(TenantId tenantId, EntityId entityId, AlarmSearchStatus alarmSearchStatus, AlarmStatus alarmStatus, String assigneeId) { @@ -550,11 +530,4 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ request.setEndTs(request.getStartTs()); } } - - private List findAlarmsByAssigneeId(UserId userId) { - log.trace("Executing findAlarmsByAssigneeId [{}]", userId); - validateId(userId, "Incorrect alarmId " + userId); - return alarmDao.findAlarmByAssigneeId(userId.getId()); - } - } 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 5f1bc605bc..5afcc49def 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 @@ -249,7 +249,6 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic public void deleteUser(TenantId tenantId, UserId userId) { log.trace("Executing deleteUser [{}]", userId); validateId(userId, INCORRECT_USER_ID + userId); - alarmService.unassignUserAlarms(tenantId, userId, System.currentTimeMillis()); UserCredentials userCredentials = userCredentialsDao.findByUserId(tenantId, userId.getId()); userCredentialsDao.removeById(tenantId, userCredentials.getUuidId()); userAuthSettingsDao.removeByUserId(userId);