Refactored DefaultTbAlarmService, added improvements for alarm unassignment on user removing, updated namings and tests.
This commit is contained in:
		
							parent
							
								
									6ae894702a
								
							
						
					
					
						commit
						c4d12c6ba9
					
				@ -15,6 +15,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.service.entitiy.alarm;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.databind.node.ObjectNode;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
@ -38,6 +39,9 @@ import org.thingsboard.server.common.data.id.AlarmId;
 | 
			
		||||
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.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
import org.thingsboard.server.common.data.page.SortOrder;
 | 
			
		||||
import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent;
 | 
			
		||||
import org.thingsboard.server.dao.housekeeper.HouseKeeperService;
 | 
			
		||||
import org.thingsboard.server.service.entitiy.AbstractTbEntityService;
 | 
			
		||||
@ -108,19 +112,9 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb
 | 
			
		||||
        }
 | 
			
		||||
        AlarmInfo alarmInfo = result.getAlarm();
 | 
			
		||||
        if (result.isModified()) {
 | 
			
		||||
            AlarmComment alarmComment = AlarmComment.builder()
 | 
			
		||||
                    .alarmId(alarm.getId())
 | 
			
		||||
                    .type(AlarmCommentType.SYSTEM)
 | 
			
		||||
                    .comment(JacksonUtil.newObjectNode().put("text", String.format("Alarm was acknowledged by user %s",
 | 
			
		||||
                                    (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName()))
 | 
			
		||||
                            .put("userId", user.getId().toString())
 | 
			
		||||
                            .put("subtype", "ACK"))
 | 
			
		||||
                    .build();
 | 
			
		||||
            try {
 | 
			
		||||
                alarmCommentService.saveAlarmComment(alarm, alarmComment, user);
 | 
			
		||||
            } catch (ThingsboardException e) {
 | 
			
		||||
                log.error("Failed to save alarm comment", e);
 | 
			
		||||
            }
 | 
			
		||||
            String systemComment = String.format("Alarm was acknowledged by user %s",
 | 
			
		||||
                    (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName());
 | 
			
		||||
            addSystemAlarmComment(alarmInfo, user, "ACK", systemComment);
 | 
			
		||||
            notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), alarmInfo,
 | 
			
		||||
                    alarmInfo.getCustomerId(), ActionType.ALARM_ACK, user);
 | 
			
		||||
        } else {
 | 
			
		||||
@ -142,19 +136,9 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb
 | 
			
		||||
        }
 | 
			
		||||
        AlarmInfo alarmInfo = result.getAlarm();
 | 
			
		||||
        if (result.isCleared()) {
 | 
			
		||||
            AlarmComment alarmComment = AlarmComment.builder()
 | 
			
		||||
                    .alarmId(alarm.getId())
 | 
			
		||||
                    .type(AlarmCommentType.SYSTEM)
 | 
			
		||||
                    .comment(JacksonUtil.newObjectNode().put("text", String.format("Alarm was cleared by user %s",
 | 
			
		||||
                                    (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName()))
 | 
			
		||||
                            .put("userId", user.getId().toString())
 | 
			
		||||
                            .put("subtype", "CLEAR"))
 | 
			
		||||
                    .build();
 | 
			
		||||
            try {
 | 
			
		||||
                alarmCommentService.saveAlarmComment(alarm, alarmComment, user);
 | 
			
		||||
            } catch (ThingsboardException e) {
 | 
			
		||||
                log.error("Failed to save alarm comment", e);
 | 
			
		||||
            }
 | 
			
		||||
            String systemComment = String.format("Alarm was cleared by user %s",
 | 
			
		||||
                    (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName());
 | 
			
		||||
            addSystemAlarmComment(alarmInfo, user, "CLEAR", systemComment);
 | 
			
		||||
            notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), alarmInfo,
 | 
			
		||||
                    alarmInfo.getCustomerId(), ActionType.ALARM_CLEAR, user);
 | 
			
		||||
        } else {
 | 
			
		||||
@ -172,21 +156,10 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb
 | 
			
		||||
        AlarmInfo alarmInfo = result.getAlarm();
 | 
			
		||||
        if (result.isModified()) {
 | 
			
		||||
            AlarmAssignee assignee = alarmInfo.getAssignee();
 | 
			
		||||
            AlarmComment alarmComment = AlarmComment.builder()
 | 
			
		||||
                    .alarmId(alarm.getId())
 | 
			
		||||
                    .type(AlarmCommentType.SYSTEM)
 | 
			
		||||
                    .comment(JacksonUtil.newObjectNode().put("text", String.format("Alarm was assigned by user %s to user %s",
 | 
			
		||||
                                    (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName(),
 | 
			
		||||
                                    (assignee.getFirstName() == null || assignee.getLastName() == null) ? assignee.getEmail() : assignee.getFirstName() + " " + assignee.getLastName()))
 | 
			
		||||
                            .put("userId", user.getId().toString())
 | 
			
		||||
                            .put("assigneeId", assignee.getId().toString())
 | 
			
		||||
                            .put("subtype", "ASSIGN"))
 | 
			
		||||
                    .build();
 | 
			
		||||
            try {
 | 
			
		||||
                alarmCommentService.saveAlarmComment(alarm, alarmComment, user);
 | 
			
		||||
            } catch (ThingsboardException e) {
 | 
			
		||||
                log.error("Failed to save alarm comment", e);
 | 
			
		||||
            }
 | 
			
		||||
            String systemComment = String.format("Alarm was assigned by user %s to user %s",
 | 
			
		||||
                    (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName(),
 | 
			
		||||
                    (assignee.getFirstName() == null || assignee.getLastName() == null) ? assignee.getEmail() : assignee.getFirstName() + " " + assignee.getLastName());
 | 
			
		||||
            addSystemAlarmComment(alarmInfo, user, "ASSIGN", systemComment, assignee.getId());
 | 
			
		||||
            notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), alarmInfo,
 | 
			
		||||
                    alarmInfo.getCustomerId(), ActionType.ALARM_ASSIGNED, user);
 | 
			
		||||
        } else {
 | 
			
		||||
@ -203,19 +176,9 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb
 | 
			
		||||
        }
 | 
			
		||||
        AlarmInfo alarmInfo = result.getAlarm();
 | 
			
		||||
        if (result.isModified()) {
 | 
			
		||||
            AlarmComment alarmComment = AlarmComment.builder()
 | 
			
		||||
                    .alarmId(alarm.getId())
 | 
			
		||||
                    .type(AlarmCommentType.SYSTEM)
 | 
			
		||||
                    .comment(JacksonUtil.newObjectNode().put("text", String.format("Alarm was unassigned by user %s",
 | 
			
		||||
                                    (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName()))
 | 
			
		||||
                            .put("userId", user.getId().toString())
 | 
			
		||||
                            .put("subtype", "ASSIGN"))
 | 
			
		||||
                    .build();
 | 
			
		||||
            try {
 | 
			
		||||
                alarmCommentService.saveAlarmComment(alarm, alarmComment, user);
 | 
			
		||||
            } catch (ThingsboardException e) {
 | 
			
		||||
                log.error("Failed to save alarm comment", e);
 | 
			
		||||
            }
 | 
			
		||||
            String systemComment = String.format("Alarm was unassigned by user %s",
 | 
			
		||||
                    (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName());
 | 
			
		||||
            addSystemAlarmComment(alarmInfo, user, "ASSIGN", systemComment);
 | 
			
		||||
            notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), alarmInfo,
 | 
			
		||||
                    alarmInfo.getCustomerId(), ActionType.ALARM_UNASSIGNED, user);
 | 
			
		||||
        } else {
 | 
			
		||||
@ -227,39 +190,17 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<AlarmId> unassignDeletedUserAlarms(TenantId tenantId, User user, long unassignTs) {
 | 
			
		||||
        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, unassignTs);
 | 
			
		||||
                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);
 | 
			
		||||
                    }
 | 
			
		||||
                    notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), result.getAlarm(),
 | 
			
		||||
                            alarm.getCustomerId(), ActionType.ALARM_UNASSIGNED, null);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                totalAlarmIds.addAll(alarmIds);
 | 
			
		||||
        PageLink pageLink = new PageLink(100, 0, null, new SortOrder("id", SortOrder.Direction.ASC));
 | 
			
		||||
        while (true) {
 | 
			
		||||
            PageData<AlarmId> pageData = alarmService.findAlarmIdsByAssigneeId(user.getTenantId(), user.getId(), pageLink);
 | 
			
		||||
            List<AlarmId> alarmIds = pageData.getData();
 | 
			
		||||
            if (alarmIds.isEmpty()) {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            processAlarmsUnassignment(tenantId, user, alarmIds, unassignTs);
 | 
			
		||||
            totalAlarmIds.addAll(alarmIds);
 | 
			
		||||
            pageLink = pageLink.nextPageLink();
 | 
			
		||||
        }
 | 
			
		||||
        while (!alarmIds.isEmpty());
 | 
			
		||||
        return totalAlarmIds;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -283,4 +224,47 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb
 | 
			
		||||
    private static long getOrDefault(long ts) {
 | 
			
		||||
        return ts > 0 ? ts : System.currentTimeMillis();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void processAlarmsUnassignment(TenantId tenantId, User user, List<AlarmId> alarmIds, long unassignTs) {
 | 
			
		||||
        for (AlarmId alarmId : alarmIds) {
 | 
			
		||||
            log.trace("[{}] Unassigning alarm {} userId {}", tenantId, alarmId, user.getId());
 | 
			
		||||
            AlarmApiCallResult result = alarmSubscriptionService.unassignAlarm(user.getTenantId(), alarmId, unassignTs);
 | 
			
		||||
            if (!result.isSuccessful()) {
 | 
			
		||||
                log.error("[{}] Cannot unassign alarm {} userId {}", tenantId, alarmId, user.getId());
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (result.isModified()) {
 | 
			
		||||
                String comment = String.format("Alarm was unassigned because user %s - was deleted",
 | 
			
		||||
                        (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName());
 | 
			
		||||
                addSystemAlarmComment(result.getAlarm(), null, "ASSIGN", comment);
 | 
			
		||||
                notificationEntityService.logEntityAction(result.getAlarm().getTenantId(), result.getAlarm().getOriginator(), result.getAlarm(), result.getAlarm().getCustomerId(), ActionType.ALARM_UNASSIGNED, null);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void addSystemAlarmComment(Alarm alarm, User user, String subType, String commentText) {
 | 
			
		||||
        addSystemAlarmComment(alarm, user, subType, commentText, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void addSystemAlarmComment(Alarm alarm, User user, String subType, String commentText, UserId assigneeId) {
 | 
			
		||||
        ObjectNode commentNode = JacksonUtil.newObjectNode();
 | 
			
		||||
        commentNode.put("text", commentText)
 | 
			
		||||
                .put("subtype", subType);
 | 
			
		||||
        if (user != null) {
 | 
			
		||||
            commentNode.put("userId", user.getId().getId().toString());
 | 
			
		||||
        }
 | 
			
		||||
        if (assigneeId != null) {
 | 
			
		||||
            commentNode.put("assigneeId", assigneeId.getId().toString());
 | 
			
		||||
        }
 | 
			
		||||
        AlarmComment alarmComment = AlarmComment.builder()
 | 
			
		||||
                .alarmId(alarm.getId())
 | 
			
		||||
                .type(AlarmCommentType.SYSTEM)
 | 
			
		||||
                .comment(JacksonUtil.newObjectNode())
 | 
			
		||||
                .build();
 | 
			
		||||
        try {
 | 
			
		||||
            alarmCommentService.saveAlarmComment(alarm, alarmComment, user);
 | 
			
		||||
        } catch (ThingsboardException e) {
 | 
			
		||||
            log.error("Failed to save alarm comment", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,6 @@ import org.thingsboard.server.common.data.security.UserCredentials;
 | 
			
		||||
import org.thingsboard.server.dao.user.UserService;
 | 
			
		||||
import org.thingsboard.server.queue.util.TbCoreComponent;
 | 
			
		||||
import org.thingsboard.server.service.entitiy.AbstractTbEntityService;
 | 
			
		||||
import org.thingsboard.server.service.entitiy.alarm.TbAlarmService;
 | 
			
		||||
import org.thingsboard.server.service.security.system.SystemSecurityService;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
@ -44,7 +43,6 @@ import static org.thingsboard.server.controller.UserController.ACTIVATE_URL_PATT
 | 
			
		||||
public class DefaultUserService extends AbstractTbEntityService implements TbUserService {
 | 
			
		||||
 | 
			
		||||
    private final UserService userService;
 | 
			
		||||
    private final TbAlarmService tbAlarmService;
 | 
			
		||||
    private final MailService mailService;
 | 
			
		||||
    private final SystemSecurityService systemSecurityService;
 | 
			
		||||
 | 
			
		||||
@ -77,16 +75,16 @@ public class DefaultUserService extends AbstractTbEntityService implements TbUse
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void delete(TenantId tenantId, CustomerId customerId, User tbUser, User user) throws ThingsboardException {
 | 
			
		||||
    public void delete(TenantId tenantId, CustomerId customerId, User user, User responsibleUser) throws ThingsboardException {
 | 
			
		||||
        ActionType actionType = ActionType.DELETED;
 | 
			
		||||
        UserId userId = tbUser.getId();
 | 
			
		||||
        UserId userId = user.getId();
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            userService.deleteUser(tenantId, tbUser);
 | 
			
		||||
            notificationEntityService.logEntityAction(tenantId, userId, tbUser, customerId, actionType, user, customerId.toString());
 | 
			
		||||
            userService.deleteUser(tenantId, user);
 | 
			
		||||
            notificationEntityService.logEntityAction(tenantId, userId, user, customerId, actionType, responsibleUser, customerId.toString());
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            notificationEntityService.logEntityAction(tenantId, emptyId(EntityType.USER),
 | 
			
		||||
                    actionType, user, e, userId.toString());
 | 
			
		||||
                    actionType, responsibleUser, e, userId.toString());
 | 
			
		||||
            throw e;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -25,5 +25,5 @@ import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
public interface TbUserService {
 | 
			
		||||
    User save(TenantId tenantId, CustomerId customerId, User tbUser, boolean sendActivationMail, HttpServletRequest request, User user) throws ThingsboardException;
 | 
			
		||||
 | 
			
		||||
    void delete(TenantId tenantId, CustomerId customerId, User tbUser, User user) throws ThingsboardException;
 | 
			
		||||
    void delete(TenantId tenantId, CustomerId customerId, User user, User responsibleUser) throws ThingsboardException;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -47,6 +47,7 @@ import org.thingsboard.server.dao.service.DaoSqlTest;
 | 
			
		||||
 | 
			
		||||
import java.util.LinkedList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
import static org.hamcrest.Matchers.containsString;
 | 
			
		||||
@ -565,37 +566,31 @@ public class AlarmControllerTest extends AbstractControllerTest {
 | 
			
		||||
 | 
			
		||||
        alarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class);
 | 
			
		||||
        Assert.assertNotNull(alarm);
 | 
			
		||||
        AlarmId alarmId = alarm.getId();
 | 
			
		||||
 | 
			
		||||
        Mockito.reset(tbClusterService, auditLogService);
 | 
			
		||||
        long beforeAssignmentTs = System.currentTimeMillis();
 | 
			
		||||
 | 
			
		||||
        doPost("/api/alarm/" + alarm.getId() + "/assign/" + savedUser.getId().getId()).andExpect(status().isOk());
 | 
			
		||||
        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);
 | 
			
		||||
        doPost("/api/alarm/" + alarmId.getId() + "/assign/" + savedUser.getId().getId()).andExpect(status().isOk());
 | 
			
		||||
        Alarm foundAlarm = doGet("/api/alarm/info/" + alarmId.getId(), AlarmInfo.class);
 | 
			
		||||
 | 
			
		||||
        Assert.assertNotNull(foundAlarm);
 | 
			
		||||
        Assert.assertEquals(savedUser.getId(), foundAlarm.getAssigneeId());
 | 
			
		||||
        Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs);
 | 
			
		||||
 | 
			
		||||
        beforeAssignmentTs = System.currentTimeMillis();
 | 
			
		||||
 | 
			
		||||
        Mockito.reset(tbClusterService, auditLogService);
 | 
			
		||||
 | 
			
		||||
        loginSysAdmin();
 | 
			
		||||
 | 
			
		||||
        doDelete("/api/user/" + savedUser.getId().getId()).andExpect(status().isOk());
 | 
			
		||||
 | 
			
		||||
        loginDifferentTenant();
 | 
			
		||||
 | 
			
		||||
        Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> {
 | 
			
		||||
            alarmObj.foundAlarm = doGet("/api/alarm/info/" + finalAlarm.getId(), AlarmInfo.class);
 | 
			
		||||
            return alarmObj.foundAlarm.getAssigneeId() == null;
 | 
			
		||||
        });
 | 
			
		||||
        foundAlarm = Awaitility.await().atMost(TIMEOUT, TimeUnit.SECONDS)
 | 
			
		||||
                .until(() -> doGet("/api/alarm/info/" + alarmId.getId(), AlarmInfo.class), Objects::nonNull);
 | 
			
		||||
 | 
			
		||||
        Assert.assertNotNull(alarmObj.foundAlarm);
 | 
			
		||||
        Assert.assertNull(alarmObj.foundAlarm.getAssigneeId());
 | 
			
		||||
        Assert.assertTrue(alarmObj.foundAlarm.getAssignTs() >= beforeAssignmentTs);
 | 
			
		||||
        Assert.assertNotNull(foundAlarm);
 | 
			
		||||
        Assert.assertNull(foundAlarm.getAssigneeId());
 | 
			
		||||
        Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
@ -618,36 +613,27 @@ public class AlarmControllerTest extends AbstractControllerTest {
 | 
			
		||||
                .build();
 | 
			
		||||
        alarm = doPost("/api/alarm", alarm, Alarm.class);
 | 
			
		||||
        Assert.assertNotNull(alarm);
 | 
			
		||||
 | 
			
		||||
        alarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class);
 | 
			
		||||
        AlarmId alarmId = alarm.getId();
 | 
			
		||||
        alarm = doGet("/api/alarm/info/" + alarmId.getId(), AlarmInfo.class);
 | 
			
		||||
        Assert.assertNotNull(alarm);
 | 
			
		||||
 | 
			
		||||
        Mockito.reset(tbClusterService, auditLogService);
 | 
			
		||||
        long beforeAssignmentTs = System.currentTimeMillis();
 | 
			
		||||
 | 
			
		||||
        doPost("/api/alarm/" + alarm.getId() + "/assign/" + savedUser.getId().getId()).andExpect(status().isOk());
 | 
			
		||||
        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);
 | 
			
		||||
        doPost("/api/alarm/" + alarmId.getId() + "/assign/" + savedUser.getId().getId()).andExpect(status().isOk());
 | 
			
		||||
        AlarmInfo foundAlarm = doGet("/api/alarm/info/" + alarmId.getId(), AlarmInfo.class);
 | 
			
		||||
        Assert.assertNotNull(foundAlarm);
 | 
			
		||||
        Assert.assertEquals(savedUser.getId(), foundAlarm.getAssigneeId());
 | 
			
		||||
        Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs);
 | 
			
		||||
 | 
			
		||||
        beforeAssignmentTs = System.currentTimeMillis();
 | 
			
		||||
 | 
			
		||||
        Mockito.reset(tbClusterService, auditLogService);
 | 
			
		||||
 | 
			
		||||
        doDelete("/api/user/" + savedUser.getId().getId()).andExpect(status().isOk());
 | 
			
		||||
 | 
			
		||||
        Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> {
 | 
			
		||||
            alarmObj.foundAlarm = doGet("/api/alarm/info/" + finalAlarm.getId(), AlarmInfo.class);
 | 
			
		||||
            return alarmObj.foundAlarm.getAssigneeId() == null;
 | 
			
		||||
        });
 | 
			
		||||
        foundAlarm = Awaitility.await().atMost(TIMEOUT, TimeUnit.SECONDS)
 | 
			
		||||
                .until(() -> doGet("/api/alarm/info/" + alarmId.getId(), AlarmInfo.class), Objects::nonNull);
 | 
			
		||||
 | 
			
		||||
        Assert.assertNotNull(alarmObj.foundAlarm);
 | 
			
		||||
        Assert.assertNull(alarmObj.foundAlarm.getAssigneeId());
 | 
			
		||||
        Assert.assertTrue(alarmObj.foundAlarm.getAssignTs() >= beforeAssignmentTs);
 | 
			
		||||
        Assert.assertNotNull(foundAlarm);
 | 
			
		||||
        Assert.assertNull(foundAlarm.getAssigneeId());
 | 
			
		||||
        Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
@ -677,21 +663,19 @@ public class AlarmControllerTest extends AbstractControllerTest {
 | 
			
		||||
                .build();
 | 
			
		||||
        alarm = doPost("/api/alarm", alarm, Alarm.class);
 | 
			
		||||
        Assert.assertNotNull(alarm);
 | 
			
		||||
        AlarmId alarmId = alarm.getId();
 | 
			
		||||
 | 
			
		||||
        alarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class);
 | 
			
		||||
        alarm = doGet("/api/alarm/info/" + alarmId.getId(), AlarmInfo.class);
 | 
			
		||||
        Assert.assertNotNull(alarm);
 | 
			
		||||
 | 
			
		||||
        Mockito.reset(tbClusterService, auditLogService);
 | 
			
		||||
        long beforeAssignmentTs = System.currentTimeMillis();
 | 
			
		||||
 | 
			
		||||
        doPost("/api/alarm/" + alarm.getId() + "/assign/" + savedUser.getId().getId()).andExpect(status().isOk());
 | 
			
		||||
        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);
 | 
			
		||||
        doPost("/api/alarm/" + alarmId.getId() + "/assign/" + savedUser.getId().getId()).andExpect(status().isOk());
 | 
			
		||||
        AlarmInfo foundAlarm = doGet("/api/alarm/info/" + alarmId.getId(), AlarmInfo.class);
 | 
			
		||||
        Assert.assertNotNull(foundAlarm);
 | 
			
		||||
        Assert.assertEquals(savedUser.getId(), foundAlarm.getAssigneeId());
 | 
			
		||||
        Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs);
 | 
			
		||||
 | 
			
		||||
        beforeAssignmentTs = System.currentTimeMillis();
 | 
			
		||||
 | 
			
		||||
@ -699,14 +683,12 @@ public class AlarmControllerTest extends AbstractControllerTest {
 | 
			
		||||
 | 
			
		||||
        doDelete("/api/customer/" + differentTenantCustomerId.getId()).andExpect(status().isOk());
 | 
			
		||||
 | 
			
		||||
        Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> {
 | 
			
		||||
            alarmObj.foundAlarm = doGet("/api/alarm/info/" + finalAlarm.getId(), AlarmInfo.class);
 | 
			
		||||
            return alarmObj.foundAlarm.getAssigneeId() == null;
 | 
			
		||||
        });
 | 
			
		||||
        foundAlarm = Awaitility.await().atMost(TIMEOUT, TimeUnit.SECONDS)
 | 
			
		||||
                .until(() -> doGet("/api/alarm/info/" + alarmId.getId(), AlarmInfo.class), Objects::nonNull);
 | 
			
		||||
 | 
			
		||||
        Assert.assertNotNull(alarmObj.foundAlarm);
 | 
			
		||||
        Assert.assertNull(alarmObj.foundAlarm.getAssigneeId());
 | 
			
		||||
        Assert.assertTrue(alarmObj.foundAlarm.getAssignTs() >= beforeAssignmentTs);
 | 
			
		||||
        Assert.assertNotNull(foundAlarm);
 | 
			
		||||
        Assert.assertNull(foundAlarm.getAssigneeId());
 | 
			
		||||
        Assert.assertTrue(foundAlarm.getAssignTs() >= beforeAssignmentTs);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
 | 
			
		||||
@ -33,13 +33,13 @@ 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.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmCountQuery;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmData;
 | 
			
		||||
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 {
 | 
			
		||||
@ -119,7 +119,7 @@ public interface AlarmService extends EntityDaoService {
 | 
			
		||||
    PageData<AlarmData> findAlarmDataByQueryForEntities(TenantId tenantId,
 | 
			
		||||
                                                        AlarmDataQuery query, Collection<EntityId> orderedEntityIds);
 | 
			
		||||
 | 
			
		||||
    List<AlarmId> findAlarmIdsByAssigneeId(TenantId tenantId, UserId userId, int limit);
 | 
			
		||||
    PageData<AlarmId> findAlarmIdsByAssigneeId(TenantId tenantId, UserId userId, PageLink pageLink);
 | 
			
		||||
 | 
			
		||||
    void deleteEntityAlarmRelations(TenantId tenantId, EntityId entityId);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -77,7 +77,7 @@ public interface AlarmDao extends Dao<Alarm> {
 | 
			
		||||
 | 
			
		||||
    PageData<AlarmId> findAlarmsIdsByEndTsBeforeAndTenantId(Long time, TenantId tenantId, PageLink pageLink);
 | 
			
		||||
 | 
			
		||||
    List<AlarmId> findAlarmIdsByAssigneeId(TenantId tenantId, UUID userId, int limit);
 | 
			
		||||
    PageData<AlarmId> findAlarmIdsByAssigneeId(TenantId tenantId, UUID userId, PageLink pageLink);
 | 
			
		||||
 | 
			
		||||
    void createEntityAlarmRecord(EntityAlarm entityAlarm);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -48,6 +48,7 @@ import org.thingsboard.server.common.data.id.HasId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmCountQuery;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmData;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmDataQuery;
 | 
			
		||||
@ -385,10 +386,10 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<AlarmId> findAlarmIdsByAssigneeId(TenantId tenantId, UserId userId, int limit) {
 | 
			
		||||
        log.trace("Executing findAlarmIdsByAssigneeId [{}]", userId);
 | 
			
		||||
    public PageData<AlarmId> findAlarmIdsByAssigneeId(TenantId tenantId, UserId userId, PageLink pageLink) {
 | 
			
		||||
        log.trace("[{}] Executing findAlarmIdsByAssigneeId [{}]", tenantId, userId);
 | 
			
		||||
        validateId(userId, "Incorrect userId " + userId);
 | 
			
		||||
        return alarmDao.findAlarmIdsByAssigneeId(tenantId, userId.getId(), limit);
 | 
			
		||||
        return alarmDao.findAlarmIdsByAssigneeId(tenantId, userId.getId(), pageLink);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
 | 
			
		||||
import org.springframework.data.jpa.repository.Query;
 | 
			
		||||
import org.springframework.data.repository.query.Param;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.dao.model.sql.AlarmEntity;
 | 
			
		||||
import org.thingsboard.server.dao.model.sql.AlarmInfoEntity;
 | 
			
		||||
 | 
			
		||||
@ -315,8 +316,8 @@ public interface AlarmRepository extends JpaRepository<AlarmEntity, UUID> {
 | 
			
		||||
    @Query(value = "SELECT a FROM AlarmInfoEntity a WHERE a.tenantId = :tenantId AND a.id = :alarmId")
 | 
			
		||||
    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, Pageable pageable);
 | 
			
		||||
    @Query("SELECT a.id FROM AlarmEntity a WHERE a.tenantId = :tenantId AND a.assigneeId = :assigneeId")
 | 
			
		||||
    Page<UUID> findAlarmIdsByAssigneeId(@Param("tenantId") UUID tenantId, @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, " +
 | 
			
		||||
 | 
			
		||||
@ -286,10 +286,9 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    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);
 | 
			
		||||
    public PageData<AlarmId> findAlarmIdsByAssigneeId(TenantId tenantId, UUID userId, PageLink pageLink) {
 | 
			
		||||
        return DaoUtil.pageToPageData(alarmRepository.findAlarmIdsByAssigneeId(tenantId.getId(), userId, DaoUtil.toPageable(pageLink)))
 | 
			
		||||
                .mapData(AlarmId::new);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 | 
			
		||||
@ -55,6 +55,7 @@ import org.thingsboard.server.dao.service.PaginatedRemover;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
import static org.thingsboard.server.common.data.StringUtils.generateSafeToken;
 | 
			
		||||
@ -247,8 +248,9 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional
 | 
			
		||||
    public void deleteUser(TenantId tenantId, User user) {
 | 
			
		||||
        Objects.requireNonNull(user, "User is null");
 | 
			
		||||
        UserId userId = user.getId();
 | 
			
		||||
        log.trace("Executing deleteUser [{}]", userId);
 | 
			
		||||
        log.trace("[{}] Executing deleteUser [{}]", tenantId, userId);
 | 
			
		||||
        validateId(userId, INCORRECT_USER_ID + userId);
 | 
			
		||||
        UserCredentials userCredentials = userCredentialsDao.findByUserId(tenantId, userId.getId());
 | 
			
		||||
        userCredentialsDao.removeById(tenantId, userCredentials.getUuidId());
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user