From de24af159cc81903f51538fc193c2e3e0b235e42 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Mon, 27 Mar 2023 18:54:08 +0300 Subject: [PATCH] Device activity notification rule; fix default notification configs --- ...va => DeviceActivityTriggerProcessor.java} | 20 +++++++---- .../trigger/EntityActionTriggerProcessor.java | 4 ++- .../data/notification/NotificationType.java | 2 +- ...va => DeviceActivityNotificationInfo.java} | 4 ++- ...ctivityNotificationRuleTriggerConfig.java} | 14 +++++--- ...tyActionNotificationRuleTriggerConfig.java | 4 ++- .../NotificationRuleTriggerConfig.java | 2 +- .../trigger/NotificationRuleTriggerType.java | 2 +- .../DefaultNotificationSettingsService.java | 34 ++++++++++--------- .../service/BaseAdminSettingsServiceTest.java | 3 +- ...evice_inactivity.md => device_activity.md} | 4 +-- 11 files changed, 57 insertions(+), 36 deletions(-) rename application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/{DeviceInactivityTriggerProcessor.java => DeviceActivityTriggerProcessor.java} (75%) rename common/data/src/main/java/org/thingsboard/server/common/data/notification/info/{DeviceInactivityNotificationInfo.java => DeviceActivityNotificationInfo.java} (91%) rename common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/{DeviceInactivityNotificationRuleTriggerConfig.java => DeviceActivityNotificationRuleTriggerConfig.java} (68%) rename ui-ngx/src/assets/help/en_US/notification/{device_inactivity.md => device_activity.md} (91%) diff --git a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceInactivityTriggerProcessor.java b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceActivityTriggerProcessor.java similarity index 75% rename from application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceInactivityTriggerProcessor.java rename to application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceActivityTriggerProcessor.java index 5bb1416d9a..ae14ffffbf 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceInactivityTriggerProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceActivityTriggerProcessor.java @@ -22,9 +22,10 @@ import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.notification.info.DeviceInactivityNotificationInfo; +import org.thingsboard.server.common.data.notification.info.DeviceActivityNotificationInfo; import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotificationInfo; -import org.thingsboard.server.common.data.notification.rule.trigger.DeviceInactivityNotificationRuleTriggerConfig; +import org.thingsboard.server.common.data.notification.rule.trigger.DeviceActivityNotificationRuleTriggerConfig; +import org.thingsboard.server.common.data.notification.rule.trigger.DeviceActivityNotificationRuleTriggerConfig.DeviceEvent; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.dao.notification.trigger.RuleEngineMsgTrigger; @@ -34,12 +35,16 @@ import java.util.Set; @Service @RequiredArgsConstructor -public class DeviceInactivityTriggerProcessor implements RuleEngineMsgNotificationRuleTriggerProcessor { +public class DeviceActivityTriggerProcessor implements RuleEngineMsgNotificationRuleTriggerProcessor { private final TbDeviceProfileCache deviceProfileCache; @Override - public boolean matchesFilter(RuleEngineMsgTrigger trigger, DeviceInactivityNotificationRuleTriggerConfig triggerConfig) { + public boolean matchesFilter(RuleEngineMsgTrigger trigger, DeviceActivityNotificationRuleTriggerConfig triggerConfig) { + DeviceEvent event = trigger.getMsg().getType().equals(DataConstants.ACTIVITY_EVENT) ? DeviceEvent.ACTIVE : DeviceEvent.INACTIVE; + if (!triggerConfig.getNotifyOn().contains(event)) { + return false; + } DeviceId deviceId = (DeviceId) trigger.getMsg().getOriginator(); if (CollectionUtils.isNotEmpty(triggerConfig.getDevices())) { return triggerConfig.getDevices().contains(deviceId.getId()); @@ -54,7 +59,8 @@ public class DeviceInactivityTriggerProcessor implements RuleEngineMsgNotificati @Override public RuleOriginatedNotificationInfo constructNotificationInfo(RuleEngineMsgTrigger trigger) { TbMsg msg = trigger.getMsg(); - return DeviceInactivityNotificationInfo.builder() + return DeviceActivityNotificationInfo.builder() + .eventType(trigger.getMsg().getType().equals(DataConstants.ACTIVITY_EVENT) ? "active" : "inactive") .deviceId(msg.getOriginator().getId()) .deviceName(msg.getMetaData().getValue("deviceName")) .deviceType(msg.getMetaData().getValue("deviceType")) @@ -65,12 +71,12 @@ public class DeviceInactivityTriggerProcessor implements RuleEngineMsgNotificati @Override public NotificationRuleTriggerType getTriggerType() { - return NotificationRuleTriggerType.DEVICE_INACTIVITY; + return NotificationRuleTriggerType.DEVICE_ACTIVITY; } @Override public Set getSupportedMsgTypes() { - return Set.of(DataConstants.INACTIVITY_EVENT); + return Set.of(DataConstants.ACTIVITY_EVENT, DataConstants.INACTIVITY_EVENT); } } diff --git a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/EntityActionTriggerProcessor.java b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/EntityActionTriggerProcessor.java index 49e3c07f9d..8fd80d65b6 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/EntityActionTriggerProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/EntityActionTriggerProcessor.java @@ -30,6 +30,8 @@ import java.util.Optional; import java.util.Set; import java.util.UUID; +import static org.apache.commons.collections.CollectionUtils.isEmpty; + @Service public class EntityActionTriggerProcessor implements RuleEngineMsgNotificationRuleTriggerProcessor { @@ -51,7 +53,7 @@ public class EntityActionTriggerProcessor implements RuleEngineMsgNotificationRu } else { return false; } - return triggerConfig.getEntityType() == null || getEntityType(trigger.getMsg()) == triggerConfig.getEntityType(); + return isEmpty(triggerConfig.getEntityTypes()) || triggerConfig.getEntityTypes().contains(getEntityType(trigger.getMsg())); } @Override diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationType.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationType.java index 05df8702a3..f0f0f6e7ea 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationType.java @@ -19,7 +19,7 @@ public enum NotificationType { GENERAL, ALARM, - DEVICE_INACTIVITY, + DEVICE_ACTIVITY, ENTITY_ACTION, ALARM_COMMENT, RULE_ENGINE_COMPONENT_LIFECYCLE_EVENT, diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/DeviceInactivityNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/DeviceActivityNotificationInfo.java similarity index 91% rename from common/data/src/main/java/org/thingsboard/server/common/data/notification/info/DeviceInactivityNotificationInfo.java rename to common/data/src/main/java/org/thingsboard/server/common/data/notification/info/DeviceActivityNotificationInfo.java index 82a225bddc..bc1a55666f 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/DeviceInactivityNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/DeviceActivityNotificationInfo.java @@ -32,8 +32,9 @@ import static org.thingsboard.server.common.data.util.CollectionsUtil.mapOf; @NoArgsConstructor @AllArgsConstructor @Builder -public class DeviceInactivityNotificationInfo implements RuleOriginatedNotificationInfo { +public class DeviceActivityNotificationInfo implements RuleOriginatedNotificationInfo { + private String eventType; private UUID deviceId; private String deviceName; private String deviceLabel; @@ -43,6 +44,7 @@ public class DeviceInactivityNotificationInfo implements RuleOriginatedNotificat @Override public Map getTemplateData() { return mapOf( + "eventType", eventType, "deviceId", deviceId.toString(), "deviceName", deviceName, "deviceLabel", deviceLabel, diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/DeviceInactivityNotificationRuleTriggerConfig.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/DeviceActivityNotificationRuleTriggerConfig.java similarity index 68% rename from common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/DeviceInactivityNotificationRuleTriggerConfig.java rename to common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/DeviceActivityNotificationRuleTriggerConfig.java index 868a9eb322..c55ebc2f6e 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/DeviceInactivityNotificationRuleTriggerConfig.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/DeviceActivityNotificationRuleTriggerConfig.java @@ -17,19 +17,25 @@ package org.thingsboard.server.common.data.notification.rule.trigger; import lombok.Data; +import javax.validation.constraints.NotEmpty; import java.util.Set; import java.util.UUID; @Data -public class DeviceInactivityNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig { +public class DeviceActivityNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig { private Set devices; - private Set deviceProfiles; - // set either devices or profiles + private Set deviceProfiles; // set either devices or profiles + @NotEmpty + private Set notifyOn; @Override public NotificationRuleTriggerType getTriggerType() { - return NotificationRuleTriggerType.DEVICE_INACTIVITY; + return NotificationRuleTriggerType.DEVICE_ACTIVITY; + } + + public enum DeviceEvent { + ACTIVE, INACTIVE } } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/EntityActionNotificationRuleTriggerConfig.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/EntityActionNotificationRuleTriggerConfig.java index 34d61da35a..e597d390b8 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/EntityActionNotificationRuleTriggerConfig.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/EntityActionNotificationRuleTriggerConfig.java @@ -18,10 +18,12 @@ package org.thingsboard.server.common.data.notification.rule.trigger; import lombok.Data; import org.thingsboard.server.common.data.EntityType; +import java.util.Set; + @Data public class EntityActionNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig { - private EntityType entityType; // maybe add name filter ? + private Set entityTypes; // maybe add name filter ? private boolean created; private boolean updated; private boolean deleted; diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTriggerConfig.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTriggerConfig.java index f67a144bed..2c19803f5f 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTriggerConfig.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTriggerConfig.java @@ -26,7 +26,7 @@ import java.io.Serializable; @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "triggerType") @JsonSubTypes({ @Type(value = AlarmNotificationRuleTriggerConfig.class, name = "ALARM"), - @Type(value = DeviceInactivityNotificationRuleTriggerConfig.class, name = "DEVICE_INACTIVITY"), + @Type(value = DeviceActivityNotificationRuleTriggerConfig.class, name = "DEVICE_INACTIVITY"), @Type(value = EntityActionNotificationRuleTriggerConfig.class, name = "ENTITY_ACTION"), @Type(value = AlarmCommentNotificationRuleTriggerConfig.class, name = "ALARM_COMMENT"), @Type(value = RuleEngineComponentLifecycleEventNotificationRuleTriggerConfig.class, name = "RULE_ENGINE_COMPONENT_LIFECYCLE_EVENT"), diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTriggerType.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTriggerType.java index d6de7b4514..f094179ec0 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTriggerType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTriggerType.java @@ -22,7 +22,7 @@ public enum NotificationRuleTriggerType { ALARM, ALARM_COMMENT, - DEVICE_INACTIVITY, + DEVICE_ACTIVITY, ENTITY_ACTION, RULE_ENGINE_COMPONENT_LIFECYCLE_EVENT, ALARM_ASSIGNMENT, diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationSettingsService.java b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationSettingsService.java index afcebaf6e9..3bcc07af43 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationSettingsService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationSettingsService.java @@ -40,7 +40,8 @@ import org.thingsboard.server.common.data.notification.rule.trigger.AlarmAssignm import org.thingsboard.server.common.data.notification.rule.trigger.AlarmCommentNotificationRuleTriggerConfig; import org.thingsboard.server.common.data.notification.rule.trigger.AlarmNotificationRuleTriggerConfig; import org.thingsboard.server.common.data.notification.rule.trigger.AlarmNotificationRuleTriggerConfig.AlarmAction; -import org.thingsboard.server.common.data.notification.rule.trigger.DeviceInactivityNotificationRuleTriggerConfig; +import org.thingsboard.server.common.data.notification.rule.trigger.DeviceActivityNotificationRuleTriggerConfig; +import org.thingsboard.server.common.data.notification.rule.trigger.DeviceActivityNotificationRuleTriggerConfig.DeviceEvent; import org.thingsboard.server.common.data.notification.rule.trigger.EntitiesLimitNotificationRuleTriggerConfig; import org.thingsboard.server.common.data.notification.rule.trigger.EntityActionNotificationRuleTriggerConfig; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerConfig; @@ -155,26 +156,27 @@ public class DefaultNotificationSettingsService implements NotificationSettingsS NotificationTemplate deviceActionNotificationTemplate = createTemplate(tenantId, "Device action notification", NotificationType.ENTITY_ACTION, "${entityType} was ${actionType}", "${entityType} '${entityName}' was ${actionType} by user ${userEmail}", - "info", "Go to Device", "/devices/${entityId}"); + "info", "Go to device", "/devices/${entityId}"); EntityActionNotificationRuleTriggerConfig deviceActionRuleTriggerConfig = new EntityActionNotificationRuleTriggerConfig(); - deviceActionRuleTriggerConfig.setEntityType(EntityType.DEVICE); + deviceActionRuleTriggerConfig.setEntityTypes(Set.of(EntityType.DEVICE)); deviceActionRuleTriggerConfig.setCreated(true); deviceActionRuleTriggerConfig.setUpdated(false); - deviceActionRuleTriggerConfig.setDeleted(true); - createRule(tenantId, "Device created or deleted", deviceActionNotificationTemplate.getId(), deviceActionRuleTriggerConfig, + deviceActionRuleTriggerConfig.setDeleted(false); + createRule(tenantId, "Device created", deviceActionNotificationTemplate.getId(), deviceActionRuleTriggerConfig, List.of(originatorEntityOwnerUsers.getId()), "Send notification to tenant admins or customer users " + - "when device is created or deleted"); + "when device is created"); - NotificationTemplate deviceInactivityNotificationTemplate = createTemplate(tenantId, "Device inactivity notification", NotificationType.DEVICE_INACTIVITY, - "Device '${deviceName}' inactive", - "Device '${deviceName}' with type '${deviceType}' became inactive", - "info", "Go to Device", "/devices/${deviceId}"); - DeviceInactivityNotificationRuleTriggerConfig deviceInactivityRuleTriggerConfig = new DeviceInactivityNotificationRuleTriggerConfig(); - deviceInactivityRuleTriggerConfig.setDevices(null); - deviceInactivityRuleTriggerConfig.setDeviceProfiles(null); - createRule(tenantId, "Device became inactive", deviceInactivityNotificationTemplate.getId(), deviceInactivityRuleTriggerConfig, + NotificationTemplate deviceActivityNotificationTemplate = createTemplate(tenantId, "Device activity notification", NotificationType.DEVICE_ACTIVITY, + "Device '${deviceName}' became ${eventType}", + "Device '${deviceName}' of type '${deviceType}' is now ${eventType}", + "info", "Go to device", "/devices/${deviceId}"); + DeviceActivityNotificationRuleTriggerConfig deviceActivityRuleTriggerConfig = new DeviceActivityNotificationRuleTriggerConfig(); + deviceActivityRuleTriggerConfig.setDevices(null); + deviceActivityRuleTriggerConfig.setDeviceProfiles(null); + deviceActivityRuleTriggerConfig.setNotifyOn(Set.of(DeviceEvent.ACTIVE, DeviceEvent.INACTIVE)); + createRule(tenantId, "Device activity status change", deviceActivityNotificationTemplate.getId(), deviceActivityRuleTriggerConfig, List.of(originatorEntityOwnerUsers.getId()), "Send notification to tenant admins or customer users " + - "when any device became inactive"); + "when any device changes its activity state"); NotificationTemplate alarmCommentNotificationTemplate = createTemplate(tenantId, "Alarm comment notification", NotificationType.ALARM_COMMENT, "Comment on '${alarmType}' alarm", @@ -205,7 +207,7 @@ public class DefaultNotificationSettingsService implements NotificationSettingsS NotificationTemplate ruleEngineComponentLifecycleFailureNotificationTemplate = createTemplate(tenantId, "Rule chain/node lifecycle failure notification", NotificationType.RULE_ENGINE_COMPONENT_LIFECYCLE_EVENT, "${componentType} '${componentName}' failed to ${action}", "Rule chain '${ruleChainName}' - ${action} failure:
${error}", - "warning", "Go to Rule chain", "/ruleChains/${ruleChainId}"); + "warning", "Go to rule chain", "/ruleChains/${ruleChainId}"); RuleEngineComponentLifecycleEventNotificationRuleTriggerConfig ruleEngineComponentLifecycleEventRuleTriggerConfig = new RuleEngineComponentLifecycleEventNotificationRuleTriggerConfig(); ruleEngineComponentLifecycleEventRuleTriggerConfig.setRuleChains(null); ruleEngineComponentLifecycleEventRuleTriggerConfig.setRuleChainEvents(Set.of(ComponentLifecycleEvent.STARTED, ComponentLifecycleEvent.UPDATED, ComponentLifecycleEvent.STOPPED)); diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAdminSettingsServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAdminSettingsServiceTest.java index f27e712db8..772644bab8 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAdminSettingsServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAdminSettingsServiceTest.java @@ -21,6 +21,7 @@ import org.junit.Assert; import org.junit.Test; import org.junit.jupiter.api.Assertions; import org.springframework.beans.factory.annotation.Autowired; +import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.id.TenantId; @@ -85,7 +86,7 @@ public abstract class BaseAdminSettingsServiceTest extends AbstractServiceTest { @Test public void whenSavingAdminSettingsWithAlreadyExistingKey_thenReturnError() { - String key = "mySettings"; + String key = RandomStringUtils.randomAlphanumeric(15); ObjectNode value = JacksonUtil.newObjectNode().put("test", "test"); AdminSettings systemSettings = new AdminSettings(); diff --git a/ui-ngx/src/assets/help/en_US/notification/device_inactivity.md b/ui-ngx/src/assets/help/en_US/notification/device_activity.md similarity index 91% rename from ui-ngx/src/assets/help/en_US/notification/device_inactivity.md rename to ui-ngx/src/assets/help/en_US/notification/device_activity.md index 24b7510366..5e69a0c634 100644 --- a/ui-ngx/src/assets/help/en_US/notification/device_inactivity.md +++ b/ui-ngx/src/assets/help/en_US/notification/device_activity.md @@ -15,7 +15,7 @@ Available template parameters: * *deviceName* - the device name; * *deviceLabel* - the device label; * *deviceType* - the device type; - * *actionType* - one of: 'inactive', 'active'; // TODO: fix and rename the type + * *eventType* - one of: 'inactive', 'active'; Parameter names must be wrapped using `${...}`. For example: `${recipientFirstName}`. You may also modify the value of the parameter with one of the suffixes: @@ -50,7 +50,7 @@ Device 'Sensor T1' inactive The following template: ```text -${deviceType:capitalize} '${deviceName}' became inactive +${deviceType:capitalize} '${deviceName}' became ${eventType} {:copy-code} ```