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 45c600edcc..acce2d04bf 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 @@ -71,4 +71,6 @@ public interface AlarmDao extends Dao { List findEntityAlarmRecords(TenantId tenantId, AlarmId id); void deleteEntityAlarmRecords(TenantId tenantId, EntityId entityId); + + AlarmInfo acknowledgeAlarm(TenantId tenantId, AlarmId id); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmInfoEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmInfoEntity.java index 69824e6384..8dc86d14e4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmInfoEntity.java +++ b/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 { @Column(name = ALARM_ORIGINATOR_NAME_PROPERTY) 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 e52496641a..ff7370671f 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 @@ -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 { @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); } 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 bfb3477340..eeb5c98957 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 @@ -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 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; diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index 2284c68903..c752d35005 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/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; \ No newline at end of file +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; +$$; diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java index 63bc053403..f0fb9cd97d 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java +++ b/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); } + }