Browse Source

Separate function to acknowledge alarm in one API call

pull/7942/head
Andrii Shvaika 4 years ago
parent
commit
1906dd44a3
  1. 2
      dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java
  2. 17
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmInfoEntity.java
  3. 6
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java
  4. 7
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java
  5. 12
      dao/src/main/resources/sql/schema-entities.sql
  6. 17
      dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java

2
dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java

@ -71,4 +71,6 @@ public interface AlarmDao extends Dao<Alarm> {
List<EntityAlarm> findEntityAlarmRecords(TenantId tenantId, AlarmId id);
void deleteEntityAlarmRecords(TenantId tenantId, EntityId entityId);
AlarmInfo acknowledgeAlarm(TenantId tenantId, AlarmId id);
}

17
dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmInfoEntity.java

@ -17,14 +17,24 @@ package org.thingsboard.server.dao.model.sql;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.TypeDef;
import org.thingsboard.server.common.data.alarm.AlarmAssignee;
import org.thingsboard.server.common.data.alarm.AlarmInfo;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.dao.model.sqlts.latest.TsKvLatestEntity;
import org.thingsboard.server.dao.sqlts.latest.SearchTsKvLatestRepository;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.StoredProcedureParameter;
import javax.persistence.Table;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ASSIGNEE_EMAIL_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ASSIGNEE_FIRST_NAME_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ASSIGNEE_LAST_NAME_PROPERTY;
@ -37,6 +47,13 @@ import static org.thingsboard.server.dao.model.ModelConstants.ALARM_VIEW_NAME;
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = ALARM_VIEW_NAME)
@NamedNativeQueries({
@NamedNativeQuery(
name = "AlarmEntity.acknowledgeAlarm",
query = "SELECT * FROM acknowledge_alarm(:t_id, :a_id, :a_ts)",
resultClass = AlarmInfoEntity.class
)
})
public class AlarmInfoEntity extends AbstractAlarmEntity<AlarmInfo> {
@Column(name = ALARM_ORIGINATOR_NAME_PROPERTY)

6
dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java

@ -19,6 +19,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import org.thingsboard.server.common.data.alarm.AlarmStatus;
@ -177,4 +178,9 @@ 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);
// See named native query for definition
AlarmInfoEntity acknowledgeAlarm(@Param("t_id") UUID tenantId,
@Param("a_id") UUID alarmId,
@Param("a_ts") long ts);
}

7
dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java

@ -48,6 +48,8 @@ import org.thingsboard.server.dao.sql.JpaAbstractDao;
import org.thingsboard.server.dao.sql.query.AlarmQueryRepository;
import org.thingsboard.server.dao.util.SqlDao;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@ -219,6 +221,11 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
entityAlarmRepository.deleteByEntityId(entityId.getId());
}
@Override
public AlarmInfo acknowledgeAlarm(TenantId tenantId, AlarmId id) {
return DaoUtil.getData(alarmRepository.acknowledgeAlarm(tenantId.getId(), id.getId(), System.currentTimeMillis()));
}
@Override
public EntityType getEntityType() {
return EntityType.ALARM;

12
dao/src/main/resources/sql/schema-entities.sql

@ -831,4 +831,14 @@ COALESCE(CASE WHEN a.originator_type = 0 THEN (select title from tenant where id
, 'Deleted') as originator_label,
u.first_name as assignee_first_name, u.last_name as assignee_last_name, u.email as assignee_email
FROM alarm a
LEFT JOIN tb_user u ON u.id = a.assignee_id;
LEFT JOIN tb_user u ON u.id = a.assignee_id;
DROP FUNCTION IF EXISTS acknowledge_alarm;
CREATE OR REPLACE FUNCTION acknowledge_alarm(t_id uuid, a_id uuid, a_ts bigint)
RETURNS alarm_info LANGUAGE plpgsql
AS $$
BEGIN
UPDATE alarm a SET acknowledged = true, ack_ts = a_ts WHERE a.id = a_id AND a.tenant_id = t_id and a.acknowledged = false;
RETURN (SELECT a FROM alarm_info a WHERE a.tenant_id = t_id AND id = a_id);
END;
$$;

17
dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java

@ -20,8 +20,8 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.alarm.AlarmInfo;
import org.thingsboard.server.common.data.id.AlarmId;
import org.thingsboard.server.common.data.alarm.AlarmStatus;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.AbstractJpaDaoTest;
@ -69,7 +69,17 @@ public class JpaAlarmDaoTest extends AbstractJpaDaoTest {
assertEquals(alarm2Id, alarm.getId().getId());
}
private void saveAlarm(UUID id, UUID tenantId, UUID deviceId, String type) {
@Test
public void testAckAlarmProcedure() {
UUID tenantId = UUID.fromString("d4b68f40-3e96-11e7-a884-898080180d6b");
UUID originator1Id = UUID.fromString("d4b68f41-3e96-11e7-a884-898080180d6b");
UUID alarm1Id = UUID.fromString("d4b68f43-3e96-11e7-a884-898080180d6b");
Alarm alarm = saveAlarm(alarm1Id, tenantId, originator1Id, "TEST_ALARM");
AlarmInfo alarmInfo = alarmDao.acknowledgeAlarm(alarm.getTenantId(), alarm.getId());
assertNotNull(alarmInfo);
}
private Alarm saveAlarm(UUID id, UUID tenantId, UUID deviceId, String type) {
Alarm alarm = new Alarm();
alarm.setId(new AlarmId(id));
alarm.setTenantId(TenantId.fromUUID(tenantId));
@ -80,6 +90,7 @@ public class JpaAlarmDaoTest extends AbstractJpaDaoTest {
alarm.setEndTs(System.currentTimeMillis());
alarm.setAcknowledged(false);
alarm.setCleared(false);
alarmDao.save(TenantId.fromUUID(tenantId), alarm);
return alarmDao.save(TenantId.fromUUID(tenantId), alarm);
}
}

Loading…
Cancel
Save