From 4b8db9f37d182849de729cd5fb2c710ca9c6f181 Mon Sep 17 00:00:00 2001 From: imbeacon Date: Wed, 16 Aug 2023 09:09:40 +0300 Subject: [PATCH] Refactored repository method for getting assigned alarms, added limitations, logs and adopted tests for event based model alarms unassigning on user removing --- .../entitiy/alarm/DefaultTbAlarmService.java | 64 +++++++++-------- .../service/entitiy/alarm/TbAlarmService.java | 3 +- .../InMemoryHouseKeeperServiceService.java | 34 +++++++-- .../controller/AlarmControllerTest.java | 71 ++++++++++++------- .../server/dao/alarm/AlarmService.java | 2 +- .../dao/housekeeper/HouseKeeperService.java | 4 +- .../server/dao/user/UserService.java | 20 +++--- .../server/dao/alarm/AlarmDao.java | 2 +- .../server/dao/alarm/BaseAlarmService.java | 6 +- .../server/dao/sql/alarm/AlarmRepository.java | 2 +- .../server/dao/sql/alarm/JpaAlarmDao.java | 6 +- 11 files changed, 134 insertions(+), 80 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 48e496c05b..65302222fc 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 @@ -42,6 +42,7 @@ import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; import org.thingsboard.server.dao.housekeeper.HouseKeeperService; import org.thingsboard.server.service.entitiy.AbstractTbEntityService; +import java.util.ArrayList; import java.util.List; @Service @@ -224,43 +225,50 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb } @Override - public List unassignDeletedUserAlarms(User user) { - List alarmIds = alarmService.findAlarmIdsByAssigneeId(user.getId()); - for (AlarmId alarmId : alarmIds) { - log.trace("[{}] Unassigning alarm {} userId {}", user.getTenantId().getId(), alarmId.getId(), user.getId().getId()); - AlarmApiCallResult result = alarmSubscriptionService.unassignAlarm(user.getTenantId(), alarmId, System.currentTimeMillis()); - Alarm alarm = result.getAlarm(); - if (!result.isSuccessful()) { - continue; - } - if (result.isModified()) { - try { - AlarmComment alarmComment = AlarmComment.builder() - .alarmId(alarmId) - .type(AlarmCommentType.SYSTEM) - .comment(JacksonUtil.newObjectNode() - .put("text", String.format("Alarm was unassigned because user with id %s - was deleted", - (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName())) - .put("userId", user.getId().toString()) - .put("subtype", "ASSIGN")) - .build(); - alarmCommentService.saveAlarmComment(alarm, alarmComment, null); - } catch (ThingsboardException e) { - log.error("Failed to save alarm comment", e); + public List unassignDeletedUserAlarms(TenantId tenantId, User user) { + List totalAlarmIds = new ArrayList<>(); + List alarmIds; + do { + alarmIds = alarmService.findAlarmIdsByAssigneeId(tenantId, user.getId(), 100); + for (AlarmId alarmId : alarmIds) { + log.trace("[{}] Unassigning alarm {} userId {}", tenantId, alarmId.getId(), user.getId().getId()); + AlarmApiCallResult result = alarmSubscriptionService.unassignAlarm(user.getTenantId(), alarmId, System.currentTimeMillis()); + Alarm alarm = result.getAlarm(); + if (!result.isSuccessful()) { + continue; } - notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), result.getAlarm(), - alarm.getCustomerId(), ActionType.ALARM_UNASSIGNED, null); + if (result.isModified()) { + try { + AlarmComment alarmComment = AlarmComment.builder() + .alarmId(alarmId) + .type(AlarmCommentType.SYSTEM) + .comment(JacksonUtil.newObjectNode() + .put("text", String.format("Alarm was unassigned because user with id %s - was deleted", + (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName())) + .put("userId", user.getId().toString()) + .put("subtype", "ASSIGN")) + .build(); + 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); + } + + totalAlarmIds.addAll(alarmIds); } } - return alarmIds; + while (!alarmIds.isEmpty()); + return totalAlarmIds; } @TransactionalEventListener(fallbackExecution = true) public void handleEvent(DeleteEntityEvent event) { - log.trace("[{}] DeleteEntityEvent called: {}", event.getTenantId(), event); + log.trace("[{}] DeleteEntityEvent handler: {}", event.getTenantId(), event); EntityId entityId = event.getEntityId(); if (EntityType.USER.equals(entityId.getEntityType())) { - housekeeper.unassignDeletedUserAlarms((User) event.getEntity()); + housekeeper.unassignDeletedUserAlarms(event.getTenantId(), (User) event.getEntity()); } } diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/TbAlarmService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/TbAlarmService.java index c531c20c53..c5eb6714ef 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/TbAlarmService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/TbAlarmService.java @@ -20,6 +20,7 @@ import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.AlarmId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; import java.util.List; @@ -40,7 +41,7 @@ public interface TbAlarmService { AlarmInfo unassign(Alarm alarm, long unassignTs, User user) throws ThingsboardException; - List unassignDeletedUserAlarms(User user); + List unassignDeletedUserAlarms(TenantId tenantId, User user); Boolean delete(Alarm alarm, User user); } diff --git a/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java b/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java index 2e62a68333..ad3bff921e 100644 --- a/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java +++ b/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java @@ -15,16 +15,20 @@ */ package org.thingsboard.server.service.housekeeper; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.id.AlarmId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.housekeeper.HouseKeeperService; import org.thingsboard.server.service.entitiy.alarm.TbAlarmService; @@ -45,27 +49,43 @@ public class InMemoryHouseKeeperServiceService implements HouseKeeperService { ListeningExecutorService executor; AtomicInteger queueSize = new AtomicInteger(); + AtomicInteger totalProcessedCounter = new AtomicInteger(); @PostConstruct public void init() { - executor = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("housekeeper"))); + log.debug("Starting HouseKeeper service"); + executor = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("housekeeper"))); } @PreDestroy public void destroy() { if (executor != null) { + log.debug("Stopping HouseKeeper service"); executor.shutdown(); } } @Override - public ListenableFuture> unassignDeletedUserAlarms(User user) { - log.debug("[{}][{}] unassignDeletedUserAlarms submitting, pending queue size: {} ", user.getTenantId().getId(), user.getId().getId(), queueSize.get()); + public ListenableFuture> unassignDeletedUserAlarms(TenantId tenantId, User user) { + log.debug("[{}][{}] unassignDeletedUserAlarms submitting, pending queue size: {} ", tenantId, user.getId().getId(), queueSize.get()); queueSize.incrementAndGet(); - ListenableFuture> future = executor.submit(() -> alarmService.unassignDeletedUserAlarms(user)); - future.addListener(() -> { - queueSize.decrementAndGet(); - log.debug("[{}][{}] unassignDeletedUserAlarms finished, pending queue size: {} ", user.getTenantId().getId(), user.getId().getId(), queueSize.get()); + ListenableFuture> future = executor.submit(() -> alarmService.unassignDeletedUserAlarms(tenantId, user)); + Futures.addCallback(future, new FutureCallback<>() { + @Override + public void onSuccess(List alarmIds) { + queueSize.decrementAndGet(); + totalProcessedCounter.incrementAndGet(); + log.debug("[{}][{}] unassignDeletedUserAlarms finished, pending queue size: {}, total processed count: {} ", + tenantId, user.getId().getId(), queueSize.get(), totalProcessedCounter.get()); + } + + @Override + public void onFailure(@NotNull Throwable throwable) { + queueSize.decrementAndGet(); + totalProcessedCounter.incrementAndGet(); + log.error("[{}][{}] unassignDeletedUserAlarms failed, pending queue size: {}, total processed count: {}", + tenantId, user.getId().getId(), queueSize.get(), totalProcessedCounter.get(), throwable); + } }, MoreExecutors.directExecutor()); return future; } diff --git a/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java index 7cf8e05503..ea66bcfcc2 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java @@ -29,6 +29,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.test.context.ContextConfiguration; +import org.testcontainers.shaded.org.awaitility.Awaitility; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EntityType; @@ -46,6 +47,7 @@ import org.thingsboard.server.dao.service.DaoSqlTest; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.TimeUnit; import static org.hamcrest.Matchers.containsString; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -568,10 +570,13 @@ public class AlarmControllerTest extends AbstractControllerTest { long beforeAssignmentTs = System.currentTimeMillis(); doPost("/api/alarm/" + alarm.getId() + "/assign/" + savedUser.getId().getId()).andExpect(status().isOk()); - AlarmInfo foundAlarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class); - Assert.assertNotNull(foundAlarm); - Assert.assertEquals(savedUser.getId(), foundAlarm.getAssigneeId()); - Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs); + Alarm finalAlarm = alarm; + var alarmObj = new Object() { + AlarmInfo foundAlarm = doGet("/api/alarm/info/" + finalAlarm.getId(), AlarmInfo.class); + }; + Assert.assertNotNull(alarmObj.foundAlarm); + Assert.assertEquals(savedUser.getId(), alarmObj.foundAlarm.getAssigneeId()); + Assert.assertTrue(alarmObj.foundAlarm.getAssignTs() >= beforeAssignmentTs); beforeAssignmentTs = System.currentTimeMillis(); @@ -583,10 +588,14 @@ public class AlarmControllerTest extends AbstractControllerTest { loginDifferentTenant(); - foundAlarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class); - Assert.assertNotNull(foundAlarm); - Assert.assertNull(foundAlarm.getAssigneeId()); - Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs); + Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> { + alarmObj.foundAlarm = doGet("/api/alarm/info/" + finalAlarm.getId(), AlarmInfo.class); + return alarmObj.foundAlarm.getAssigneeId() == null; + }); + + Assert.assertNotNull(alarmObj.foundAlarm); + Assert.assertNull(alarmObj.foundAlarm.getAssigneeId()); + Assert.assertTrue(alarmObj.foundAlarm.getAssignTs() >= beforeAssignmentTs); } @Test @@ -617,10 +626,13 @@ public class AlarmControllerTest extends AbstractControllerTest { long beforeAssignmentTs = System.currentTimeMillis(); doPost("/api/alarm/" + alarm.getId() + "/assign/" + savedUser.getId().getId()).andExpect(status().isOk()); - AlarmInfo foundAlarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class); - Assert.assertNotNull(foundAlarm); - Assert.assertEquals(savedUser.getId(), foundAlarm.getAssigneeId()); - Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs); + Alarm finalAlarm = alarm; + var alarmObj = new Object() { + AlarmInfo foundAlarm = doGet("/api/alarm/info/" + finalAlarm.getId(), AlarmInfo.class); + }; + Assert.assertNotNull(alarmObj.foundAlarm); + Assert.assertEquals(savedUser.getId(), alarmObj.foundAlarm.getAssigneeId()); + Assert.assertTrue(alarmObj.foundAlarm.getAssignTs() >= beforeAssignmentTs); beforeAssignmentTs = System.currentTimeMillis(); @@ -628,10 +640,14 @@ public class AlarmControllerTest extends AbstractControllerTest { doDelete("/api/user/" + savedUser.getId().getId()).andExpect(status().isOk()); - foundAlarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class); - Assert.assertNotNull(foundAlarm); - Assert.assertNull(foundAlarm.getAssigneeId()); - Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs); + Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> { + alarmObj.foundAlarm = doGet("/api/alarm/info/" + finalAlarm.getId(), AlarmInfo.class); + return alarmObj.foundAlarm.getAssigneeId() == null; + }); + + Assert.assertNotNull(alarmObj.foundAlarm); + Assert.assertNull(alarmObj.foundAlarm.getAssigneeId()); + Assert.assertTrue(alarmObj.foundAlarm.getAssignTs() >= beforeAssignmentTs); } @Test @@ -669,10 +685,13 @@ public class AlarmControllerTest extends AbstractControllerTest { long beforeAssignmentTs = System.currentTimeMillis(); doPost("/api/alarm/" + alarm.getId() + "/assign/" + savedUser.getId().getId()).andExpect(status().isOk()); - AlarmInfo foundAlarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class); - Assert.assertNotNull(foundAlarm); - Assert.assertEquals(savedUser.getId(), foundAlarm.getAssigneeId()); - Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs); + Alarm finalAlarm = alarm; + var alarmObj = new Object() { + AlarmInfo foundAlarm = doGet("/api/alarm/info/" + finalAlarm.getId(), AlarmInfo.class); + }; + Assert.assertNotNull(alarmObj.foundAlarm); + Assert.assertEquals(savedUser.getId(), alarmObj.foundAlarm.getAssigneeId()); + Assert.assertTrue(alarmObj.foundAlarm.getAssignTs() >= beforeAssignmentTs); beforeAssignmentTs = System.currentTimeMillis(); @@ -680,10 +699,14 @@ public class AlarmControllerTest extends AbstractControllerTest { doDelete("/api/customer/" + differentTenantCustomerId.getId()).andExpect(status().isOk()); - foundAlarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class); - Assert.assertNotNull(foundAlarm); - Assert.assertNull(foundAlarm.getAssigneeId()); - Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs); + Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> { + alarmObj.foundAlarm = doGet("/api/alarm/info/" + finalAlarm.getId(), AlarmInfo.class); + return alarmObj.foundAlarm.getAssigneeId() == null; + }); + + Assert.assertNotNull(alarmObj.foundAlarm); + Assert.assertNull(alarmObj.foundAlarm.getAssigneeId()); + Assert.assertTrue(alarmObj.foundAlarm.getAssignTs() >= beforeAssignmentTs); } @Test 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 7bfdeaa523..95e46d66ff 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 @@ -119,7 +119,7 @@ public interface AlarmService extends EntityDaoService { PageData findAlarmDataByQueryForEntities(TenantId tenantId, AlarmDataQuery query, Collection orderedEntityIds); - List findAlarmIdsByAssigneeId(UserId userId); + List findAlarmIdsByAssigneeId(TenantId tenantId, UserId userId, int limit); void deleteEntityAlarmRelations(TenantId tenantId, EntityId entityId); diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/housekeeper/HouseKeeperService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/housekeeper/HouseKeeperService.java index 3ffd309ca5..41f6136c90 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/housekeeper/HouseKeeperService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/housekeeper/HouseKeeperService.java @@ -18,10 +18,12 @@ package org.thingsboard.server.dao.housekeeper; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.id.AlarmId; +import org.thingsboard.server.common.data.id.TenantId; import java.util.List; public interface HouseKeeperService { - ListenableFuture> unassignDeletedUserAlarms(User user); + + ListenableFuture> unassignDeletedUserAlarms(TenantId tenantId, User user); } 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 3ef93dc2f7..b874e038d2 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 @@ -31,27 +31,27 @@ import java.util.List; public interface UserService extends EntityDaoService { - User findUserById(TenantId tenantId, UserId userId); + User findUserById(TenantId tenantId, UserId userId); - ListenableFuture findUserByIdAsync(TenantId tenantId, UserId userId); + ListenableFuture findUserByIdAsync(TenantId tenantId, UserId userId); - User findUserByEmail(TenantId tenantId, String email); + User findUserByEmail(TenantId tenantId, String email); User findUserByTenantIdAndEmail(TenantId tenantId, String email); - User saveUser(TenantId tenantId, User user); + User saveUser(TenantId tenantId, User user); - UserCredentials findUserCredentialsByUserId(TenantId tenantId, UserId userId); + UserCredentials findUserCredentialsByUserId(TenantId tenantId, UserId userId); - UserCredentials findUserCredentialsByActivateToken(TenantId tenantId, String activateToken); + UserCredentials findUserCredentialsByActivateToken(TenantId tenantId, String activateToken); - UserCredentials findUserCredentialsByResetToken(TenantId tenantId, String resetToken); + UserCredentials findUserCredentialsByResetToken(TenantId tenantId, String resetToken); - UserCredentials saveUserCredentials(TenantId tenantId, UserCredentials userCredentials); + UserCredentials saveUserCredentials(TenantId tenantId, UserCredentials userCredentials); - UserCredentials activateUserCredentials(TenantId tenantId, String activateToken, String password); + UserCredentials activateUserCredentials(TenantId tenantId, String activateToken, String password); - UserCredentials requestPasswordReset(TenantId tenantId, String email); + UserCredentials requestPasswordReset(TenantId tenantId, String email); UserCredentials requestExpiredPasswordReset(TenantId tenantId, UserCredentialsId userCredentialsId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java index 2e8844701c..f05e7a1453 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java @@ -77,7 +77,7 @@ public interface AlarmDao extends Dao { PageData findAlarmsIdsByEndTsBeforeAndTenantId(Long time, TenantId tenantId, PageLink pageLink); - List findAlarmIdsByAssigneeId(UUID key); + List findAlarmIdsByAssigneeId(TenantId tenantId, UUID userId, int limit); void createEntityAlarmRecord(EntityAlarm entityAlarm); 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 f36b56ca7a..542b11494a 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 @@ -385,10 +385,10 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ } @Override - public List findAlarmIdsByAssigneeId(UserId userId) { + public List findAlarmIdsByAssigneeId(TenantId tenantId, UserId userId, int limit) { log.trace("Executing findAlarmIdsByAssigneeId [{}]", userId); - validateId(userId, "Incorrect alarmId " + userId); - return alarmDao.findAlarmIdsByAssigneeId(userId.getId()); + validateId(userId, "Incorrect userId " + userId); + return alarmDao.findAlarmIdsByAssigneeId(tenantId, userId.getId(), limit); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java index b35ca52e79..1afc7a96be 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java @@ -316,7 +316,7 @@ public interface AlarmRepository extends JpaRepository { AlarmInfoEntity findAlarmInfoById(@Param("tenantId") UUID tenantId, @Param("alarmId") UUID alarmId); @Query("SELECT a.id FROM AlarmEntity a WHERE a.assigneeId = :assigneeId") - List findAlarmIdsByAssigneeId(@Param("assigneeId") UUID assigneeId); + List findAlarmIdsByAssigneeId(@Param("assigneeId") UUID assigneeId, Pageable pageable); @Query(value = "SELECT create_or_update_active_alarm(:t_id, :c_id, :a_id, :a_created_ts, :a_o_id, :a_o_type, :a_type, :a_severity, " + ":a_start_ts, :a_end_ts, :a_details, :a_propagate, :a_propagate_to_owner, " + diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java index ed25595442..0a7de4c5e8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java @@ -66,7 +66,6 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; /** * Created by Valerii Sosliuk on 5/19/2017. @@ -287,8 +286,9 @@ public class JpaAlarmDao extends JpaAbstractDao implements A } @Override - public List findAlarmIdsByAssigneeId(UUID key) { - List assignedAlarmIds = alarmRepository.findAlarmIdsByAssigneeId(key); + public List findAlarmIdsByAssigneeId(TenantId tenantId, UUID userId, int limit) { + log.debug("[{}] findAlarmIdsByAssigneeId [{}] limit {}", tenantId, userId, limit); + List assignedAlarmIds = alarmRepository.findAlarmIdsByAssigneeId(userId, PageRequest.of(0, limit)); return DaoUtil.fromUUIDs(assignedAlarmIds, AlarmId::new); }