Refactored repository method for getting assigned alarms, added limitations, logs and adopted tests for event based model alarms unassigning on user removing
This commit is contained in:
		
							parent
							
								
									19c5e50884
								
							
						
					
					
						commit
						4b8db9f37d
					
				@ -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<AlarmId> unassignDeletedUserAlarms(User user) {
 | 
			
		||||
        List<AlarmId> 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<AlarmId> unassignDeletedUserAlarms(TenantId tenantId, User user) {
 | 
			
		||||
        List<AlarmId> totalAlarmIds = new ArrayList<>();
 | 
			
		||||
        List<AlarmId> 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());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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<AlarmId> unassignDeletedUserAlarms(User user);
 | 
			
		||||
    List<AlarmId> unassignDeletedUserAlarms(TenantId tenantId, User user);
 | 
			
		||||
 | 
			
		||||
    Boolean delete(Alarm alarm, User user);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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<List<AlarmId>> unassignDeletedUserAlarms(User user) {
 | 
			
		||||
        log.debug("[{}][{}] unassignDeletedUserAlarms submitting, pending queue size: {} ", user.getTenantId().getId(), user.getId().getId(), queueSize.get());
 | 
			
		||||
    public ListenableFuture<List<AlarmId>> unassignDeletedUserAlarms(TenantId tenantId, User user) {
 | 
			
		||||
        log.debug("[{}][{}] unassignDeletedUserAlarms submitting, pending queue size: {} ", tenantId, user.getId().getId(), queueSize.get());
 | 
			
		||||
        queueSize.incrementAndGet();
 | 
			
		||||
        ListenableFuture<List<AlarmId>> 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<List<AlarmId>> future = executor.submit(() -> alarmService.unassignDeletedUserAlarms(tenantId, user));
 | 
			
		||||
        Futures.addCallback(future, new FutureCallback<>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onSuccess(List<AlarmId> 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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -119,7 +119,7 @@ public interface AlarmService extends EntityDaoService {
 | 
			
		||||
    PageData<AlarmData> findAlarmDataByQueryForEntities(TenantId tenantId,
 | 
			
		||||
                                                        AlarmDataQuery query, Collection<EntityId> orderedEntityIds);
 | 
			
		||||
 | 
			
		||||
    List<AlarmId> findAlarmIdsByAssigneeId(UserId userId);
 | 
			
		||||
    List<AlarmId> findAlarmIdsByAssigneeId(TenantId tenantId, UserId userId, int limit);
 | 
			
		||||
 | 
			
		||||
    void deleteEntityAlarmRelations(TenantId tenantId, EntityId entityId);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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<List<AlarmId>> unassignDeletedUserAlarms(User user);
 | 
			
		||||
 | 
			
		||||
    ListenableFuture<List<AlarmId>> unassignDeletedUserAlarms(TenantId tenantId, User user);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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<User> findUserByIdAsync(TenantId tenantId, UserId userId);
 | 
			
		||||
    ListenableFuture<User> 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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -77,7 +77,7 @@ public interface AlarmDao extends Dao<Alarm> {
 | 
			
		||||
 | 
			
		||||
    PageData<AlarmId> findAlarmsIdsByEndTsBeforeAndTenantId(Long time, TenantId tenantId, PageLink pageLink);
 | 
			
		||||
 | 
			
		||||
    List<AlarmId> findAlarmIdsByAssigneeId(UUID key);
 | 
			
		||||
    List<AlarmId> findAlarmIdsByAssigneeId(TenantId tenantId, UUID userId, int limit);
 | 
			
		||||
 | 
			
		||||
    void createEntityAlarmRecord(EntityAlarm entityAlarm);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -385,10 +385,10 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<AlarmId> findAlarmIdsByAssigneeId(UserId userId) {
 | 
			
		||||
    public List<AlarmId> 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
 | 
			
		||||
 | 
			
		||||
@ -316,7 +316,7 @@ public interface AlarmRepository extends JpaRepository<AlarmEntity, UUID> {
 | 
			
		||||
    AlarmInfoEntity findAlarmInfoById(@Param("tenantId") UUID tenantId, @Param("alarmId") UUID alarmId);
 | 
			
		||||
 | 
			
		||||
    @Query("SELECT a.id FROM AlarmEntity a WHERE a.assigneeId = :assigneeId")
 | 
			
		||||
    List<UUID> findAlarmIdsByAssigneeId(@Param("assigneeId") UUID assigneeId);
 | 
			
		||||
    List<UUID> 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, " +
 | 
			
		||||
 | 
			
		||||
@ -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<AlarmEntity, Alarm> implements A
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<AlarmId> findAlarmIdsByAssigneeId(UUID key) {
 | 
			
		||||
        List<UUID> assignedAlarmIds = alarmRepository.findAlarmIdsByAssigneeId(key);
 | 
			
		||||
    public List<AlarmId> findAlarmIdsByAssigneeId(TenantId tenantId, UUID userId, int limit) {
 | 
			
		||||
        log.debug("[{}] findAlarmIdsByAssigneeId [{}] limit {}", tenantId, userId, limit);
 | 
			
		||||
        List<UUID> assignedAlarmIds = alarmRepository.findAlarmIdsByAssigneeId(userId, PageRequest.of(0, limit));
 | 
			
		||||
        return DaoUtil.fromUUIDs(assignedAlarmIds, AlarmId::new);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user