From 789120e2c9bc116ab419f8e92e6dc3b251ef8af3 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Tue, 31 Jan 2023 13:12:14 +0200 Subject: [PATCH] Notification rules: more tests, additionalConfig with description; refactor NotificationSettings --- .../main/data/upgrade/3.4.3/schema_update.sql | 1 + .../DefaultNotificationCenter.java | 6 +- ...aultNotificationRuleProcessingService.java | 2 +- ...ivityNotificationRuleTriggerProcessor.java | 4 +- .../notification/NotificationApiTest.java | 8 +- .../notification/NotificationRuleApiTest.java | 80 ++++++++++++------- .../NotificationDeliveryMethod.java | 15 +++- .../notification/NotificationRequest.java | 5 ++ .../notification/rule/NotificationRule.java | 3 + .../rule/NotificationRuleConfig.java | 25 ++++++ ...activityNotificationRuleTriggerConfig.java | 7 +- .../NotificationDeliveryMethodConfig.java | 17 ++-- ...SlackNotificationDeliveryMethodConfig.java | 13 ++- .../server/dao/model/ModelConstants.java | 1 + .../dao/model/sql/NotificationRuleEntity.java | 8 ++ .../main/resources/sql/schema-entities.sql | 1 + 16 files changed, 132 insertions(+), 64 deletions(-) create mode 100644 common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/NotificationRuleConfig.java diff --git a/application/src/main/data/upgrade/3.4.3/schema_update.sql b/application/src/main/data/upgrade/3.4.3/schema_update.sql index 2cfe5980cf..6c1f4e1dfd 100644 --- a/application/src/main/data/upgrade/3.4.3/schema_update.sql +++ b/application/src/main/data/upgrade/3.4.3/schema_update.sql @@ -45,6 +45,7 @@ CREATE TABLE IF NOT EXISTS notification_rule ( trigger_type VARCHAR(50) NOT NULL, trigger_config VARCHAR(1000) NOT NULL, recipients_config VARCHAR(10000) NOT NULL, + additional_config VARCHAR(255), CONSTRAINT uq_notification_rule_name UNIQUE (tenant_id, name) ); CREATE INDEX IF NOT EXISTS idx_notification_rule_tenant_id_created_time ON notification_rule(tenant_id, created_time DESC); diff --git a/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java b/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java index 276ae4643d..9886d303af 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java @@ -113,17 +113,13 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple notificationTemplate.getConfiguration().getDeliveryMethodsTemplates().forEach((deliveryMethod, template) -> { if (!template.isEnabled()) return; - if (settings.getDeliveryMethodsConfigs().containsKey(deliveryMethod) && - !settings.getDeliveryMethodsConfigs().get(deliveryMethod).isEnabled()) { - throw new IllegalArgumentException("Delivery method " + deliveryMethod + " is disabled"); - } if (deliveryMethod == NotificationDeliveryMethod.SLACK) { if (!settings.getDeliveryMethodsConfigs().containsKey(deliveryMethod)) { throw new IllegalArgumentException("Slack must be configured in the settings"); } } if (targets.stream().noneMatch(target -> target.getType().getSupportedDeliveryMethods().contains(deliveryMethod))) { - throw new IllegalArgumentException("Target for " + deliveryMethod + " delivery method is missing"); + throw new IllegalArgumentException("Target for " + deliveryMethod.getName() + " delivery method is missing"); } }); diff --git a/application/src/main/java/org/thingsboard/server/service/notification/rule/DefaultNotificationRuleProcessingService.java b/application/src/main/java/org/thingsboard/server/service/notification/rule/DefaultNotificationRuleProcessingService.java index 9d46ddda16..a931440a3d 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/rule/DefaultNotificationRuleProcessingService.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/rule/DefaultNotificationRuleProcessingService.java @@ -151,7 +151,7 @@ public class DefaultNotificationRuleProcessingService implements NotificationRul rule.getRecipientsConfig().getTargetsTable().forEach((delay, targets) -> { notificationExecutor.submit(() -> { try { - log.debug("Submitting notification request for rule '{}' with delay of {} ms to targets {}", rule.getName(), delay, targets); + log.debug("Submitting notification request for rule '{}' with delay of {} sec to targets {}", rule.getName(), delay, targets); submitNotificationRequest(targets, rule, originatorEntityId, notificationInfo, delay); } catch (Exception e) { log.error("Failed to submit notification request for rule {}", rule.getId(), e); diff --git a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceInactivityNotificationRuleTriggerProcessor.java b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceInactivityNotificationRuleTriggerProcessor.java index 2e389f2b67..3df8bb8fe2 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceInactivityNotificationRuleTriggerProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceInactivityNotificationRuleTriggerProcessor.java @@ -38,10 +38,10 @@ public class DeviceInactivityNotificationRuleTriggerProcessor implements Notific public boolean matchesFilter(TbMsg ruleEngineMsg, DeviceInactivityNotificationRuleTriggerConfig triggerConfig) { DeviceId deviceId = (DeviceId) ruleEngineMsg.getOriginator(); if (CollectionUtils.isNotEmpty(triggerConfig.getDevices())) { - return triggerConfig.getDevices().contains(deviceId); + return triggerConfig.getDevices().contains(deviceId.getId()); } else if (CollectionUtils.isNotEmpty(triggerConfig.getDeviceProfiles())) { DeviceProfile deviceProfile = deviceProfileCache.get(TenantId.SYS_TENANT_ID, deviceId); - return deviceProfile != null && triggerConfig.getDeviceProfiles().contains(deviceProfile.getId()); + return deviceProfile != null && triggerConfig.getDeviceProfiles().contains(deviceProfile.getUuidId()); } else { return true; } diff --git a/application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java index 2ce562f4a4..3c8021dd2b 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java @@ -58,11 +58,9 @@ import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.notification.NotificationDao; import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.service.executors.DbCallbackExecutorService; -import org.thingsboard.server.service.ws.notification.cmd.UnreadNotificationsCountUpdate; import org.thingsboard.server.service.ws.notification.cmd.UnreadNotificationsUpdate; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -107,8 +105,8 @@ public class NotificationApiTest extends AbstractNotificationApiTest { wsClient.subscribeForUnreadNotificationsCount(); wsClient.waitForReply(true); - UnreadNotificationsCountUpdate update = wsClient.getLastCountUpdate(); - assertThat(update.getTotalUnreadCount()).isEqualTo(2); + await().atMost(2, TimeUnit.SECONDS) + .until(() -> wsClient.getLastCountUpdate().getTotalUnreadCount() == 2); } @Test @@ -567,8 +565,6 @@ public class NotificationApiTest extends AbstractNotificationApiTest { public void testSlackNotifications() throws Exception { NotificationSettings settings = new NotificationSettings(); SlackNotificationDeliveryMethodConfig slackConfig = new SlackNotificationDeliveryMethodConfig(); - slackConfig.setMethod(NotificationDeliveryMethod.SLACK); - slackConfig.setEnabled(true); String slackToken = "xoxb-123123123"; slackConfig.setBotToken(slackToken); settings.setDeliveryMethodsConfigs(Map.of( diff --git a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java index da9acc9a1e..81e592126d 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.BooleanNode; import org.junit.Before; import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.data.util.Pair; import org.thingsboard.common.util.JacksonUtil; @@ -41,6 +42,7 @@ import org.thingsboard.server.common.data.device.profile.SimpleAlarmConditionSpe import org.thingsboard.server.common.data.id.NotificationRuleId; import org.thingsboard.server.common.data.notification.Notification; import org.thingsboard.server.common.data.notification.NotificationDeliveryMethod; +import org.thingsboard.server.common.data.notification.NotificationRequest; import org.thingsboard.server.common.data.notification.NotificationRequestInfo; import org.thingsboard.server.common.data.notification.NotificationType; import org.thingsboard.server.common.data.notification.info.AlarmNotificationInfo; @@ -60,6 +62,7 @@ import org.thingsboard.server.common.data.query.EntityKeyValueType; import org.thingsboard.server.common.data.query.FilterPredicateValue; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.dao.alarm.AlarmService; +import org.thingsboard.server.dao.notification.NotificationRequestService; import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.service.telemetry.AlarmSubscriptionService; @@ -67,16 +70,15 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.offset; +import static org.assertj.core.api.InstanceOfAssertFactories.type; import static org.awaitility.Awaitility.await; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verify; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @DaoSqlTest @@ -84,6 +86,8 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { @SpyBean private AlarmSubscriptionService alarmSubscriptionService; + @Autowired + private NotificationRequestService notificationRequestService; @SpyBean private AlarmService alarmService; @@ -234,15 +238,13 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { wsClient.close(); }); - // TODO: test clear rule + alarm not escalated // TODO: test severity changes } @Test public void testNotificationRuleProcessing_alarmTrigger_clearRule() throws Exception { -/* - String notificationSubject = "New alarm '${alarmType}'"; - String notificationText = "Status: ${alarmStatus}, severity: ${alarmSeverity}"; + String notificationSubject = "${alarmSeverity} alarm '${alarmType}' is ${alarmStatus}"; + String notificationText = "${alarmId}"; NotificationTemplate notificationTemplate = createNotificationTemplate(NotificationType.ALARM, notificationSubject, notificationText, NotificationDeliveryMethod.PUSH); NotificationRule notificationRule = new NotificationRule(); @@ -250,42 +252,59 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { notificationRule.setTemplateId(notificationTemplate.getId()); notificationRule.setTriggerType(NotificationRuleTriggerType.ALARM); + String alarmType = "myBoolIsTrue"; + DeviceProfile deviceProfile = createDeviceProfileWithAlarmRules(notificationRule.getId(), alarmType); + Device device = createDevice("Device 1", deviceProfile.getName(), "1234"); + AlarmNotificationRuleTriggerConfig triggerConfig = new AlarmNotificationRuleTriggerConfig(); - triggerConfig.setAlarmTypes(null); + triggerConfig.setAlarmTypes(Set.of(alarmType)); triggerConfig.setAlarmSeverities(null); + + AlarmNotificationRuleTriggerConfig.ClearRule clearRule = new AlarmNotificationRuleTriggerConfig.ClearRule(); + clearRule.setAlarmStatus(AlarmStatus.CLEARED_UNACK); + triggerConfig.setClearRule(clearRule); notificationRule.setTriggerConfig(triggerConfig); EscalatedNotificationRuleRecipientsConfig recipientsConfig = new EscalatedNotificationRuleRecipientsConfig(); recipientsConfig.setTriggerType(NotificationRuleTriggerType.ALARM); Map> escalationTable = new HashMap<>(); recipientsConfig.setEscalationTable(escalationTable); - Map clients = new HashMap<>(); - for (int delay = 0; delay <= 5; delay++) { - Pair userAndClient = createUserAndConnectWsClient(Authority.TENANT_ADMIN); - NotificationTarget notificationTarget = createNotificationTarget(userAndClient.getFirst().getId()); - escalationTable.put(delay, List.of(notificationTarget.getUuidId())); - clients.put(delay, userAndClient.getSecond()); - } - notificationRule.setRecipientsConfig(recipientsConfig); - notificationRule = saveNotificationRule(notificationRule); + escalationTable.put(0, List.of(createNotificationTarget(tenantAdminUserId).getUuidId())); + escalationTable.put(1000, List.of(createNotificationTarget(customerUserId).getUuidId())); - String alarmType = "myBoolIsTrue"; - DeviceProfile deviceProfile = createDeviceProfileWithAlarmRules(notificationRule.getId(), alarmType); - Device device = createDevice("Device 1", deviceProfile.getName(), "1234"); - - clients.values().forEach(wsClient -> { - wsClient.subscribeForUnreadNotifications(10).waitForReply(true); - wsClient.registerWaitForUpdate(); - }); + notificationRule.setRecipientsConfig(recipientsConfig); + notificationRule = saveNotificationRule(notificationRule); + getWsClient().subscribeForUnreadNotifications(10).waitForReply(true); + getWsClient().registerWaitForUpdate(); JsonNode attr = JacksonUtil.newObjectNode() .set("bool", BooleanNode.TRUE); doPost("/api/plugins/telemetry/" + device.getId() + "/" + DataConstants.SHARED_SCOPE, attr); - verify(alarmSubscriptionService, timeout(2000)).createOrUpdateAlarm(argThat(alarm -> alarm.getType().equals(alarmType))); - Alarm alarm = alarmSubscri -*/ + await().atMost(2, TimeUnit.SECONDS) + .until(() -> alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType).get() != null); + Alarm alarm = alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType).get(); + getWsClient().waitForUpdate(true); + + Notification notification = getWsClient().getLastDataUpdate().getUpdate(); + assertThat(notification.getSubject()).isEqualTo("CRITICAL alarm '" + alarmType + "' is ACTIVE_UNACK"); + assertThat(notification.getInfo()).asInstanceOf(type(AlarmNotificationInfo.class)) + .extracting(AlarmNotificationInfo::getAlarmId).isEqualTo(alarm.getUuidId()); + + await().atMost(2, TimeUnit.SECONDS).until(() -> findNotificationRequests(EntityType.ALARM).getTotalElements() == escalationTable.size()); + NotificationRequestInfo scheduledNotificationRequest = findNotificationRequests(EntityType.ALARM).getData().stream() + .filter(NotificationRequest::isScheduled) + .findFirst().orElse(null); + assertThat(scheduledNotificationRequest).extracting(NotificationRequest::getInfo).isEqualTo(notification.getInfo()); + + getWsClient().registerWaitForUpdate(); + alarmSubscriptionService.clearAlarm(tenantId, alarm.getId(), null, System.currentTimeMillis()); + getWsClient().waitForUpdate(true); + notification = getWsClient().getLastDataUpdate().getNotifications().iterator().next(); + assertThat(notification.getSubject()).isEqualTo("CRITICAL alarm '" + alarmType + "' is CLEARED_UNACK"); + + assertThat(findNotificationRequests(EntityType.ALARM).getData()).filteredOn(NotificationRequest::isScheduled).isEmpty(); } @Test @@ -357,4 +376,9 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { PageLink pageLink = new PageLink(10); return doGetTypedWithPageLink("/api/notification/rules?", new TypeReference>() {}, pageLink); } + + private PageData findNotificationRequests(EntityType originatorType) { + return notificationRequestService.findNotificationRequestsInfosByTenantIdAndOriginatorType(tenantId, originatorType, new PageLink(100)); + } + } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationDeliveryMethod.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationDeliveryMethod.java index 59a0c05aab..951199c9fc 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationDeliveryMethod.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationDeliveryMethod.java @@ -15,11 +15,18 @@ */ package org.thingsboard.server.common.data.notification; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor public enum NotificationDeliveryMethod { - PUSH, - EMAIL, - SMS, - SLACK + PUSH("push-notification"), + EMAIL("email"), + SMS("SMS"), + SLACK("Slack"); + + @Getter + private final String name; } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationRequest.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationRequest.java index 68be39f93e..e69d7aa2b0 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationRequest.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationRequest.java @@ -92,4 +92,9 @@ public class NotificationRequest extends BaseData impleme return status == NotificationRequestStatus.SENT; } + @JsonIgnore + public boolean isScheduled() { + return status == NotificationRequestStatus.SCHEDULED; + } + } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/NotificationRule.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/NotificationRule.java index e6e096454b..1b031803f4 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/NotificationRule.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/NotificationRule.java @@ -52,6 +52,8 @@ public class NotificationRule extends BaseData implements Ha @Valid private NotificationRuleRecipientsConfig recipientsConfig; // todo: add pg_tgrm index (but index is 2.5x size of the column) + private NotificationRuleConfig additionalConfig; + public NotificationRule(NotificationRule other) { super(other); this.tenantId = other.tenantId; @@ -60,6 +62,7 @@ public class NotificationRule extends BaseData implements Ha this.triggerType = other.triggerType; this.triggerConfig = other.triggerConfig; this.recipientsConfig = other.recipientsConfig; + this.additionalConfig = other.additionalConfig; } @JsonIgnore diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/NotificationRuleConfig.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/NotificationRuleConfig.java new file mode 100644 index 0000000000..666371a485 --- /dev/null +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/NotificationRuleConfig.java @@ -0,0 +1,25 @@ +/** + * Copyright © 2016-2022 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.common.data.notification.rule; + +import lombok.Data; + +@Data +public class NotificationRuleConfig { + + private String description; + +} 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/DeviceInactivityNotificationRuleTriggerConfig.java index 99fd06d7ec..742df97d74 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/DeviceInactivityNotificationRuleTriggerConfig.java @@ -16,16 +16,15 @@ package org.thingsboard.server.common.data.notification.rule.trigger; import lombok.Data; -import org.thingsboard.server.common.data.id.DeviceId; -import org.thingsboard.server.common.data.id.DeviceProfileId; import java.util.Set; +import java.util.UUID; @Data public class DeviceInactivityNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig { - private Set devices; - private Set deviceProfiles; + private Set devices; + private Set deviceProfiles; // set either devices or profiles @Override diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/NotificationDeliveryMethodConfig.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/NotificationDeliveryMethodConfig.java index 8cc68c2767..a5f6726770 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/NotificationDeliveryMethodConfig.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/NotificationDeliveryMethodConfig.java @@ -15,26 +15,21 @@ */ package org.thingsboard.server.common.data.notification.settings; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import lombok.Data; import org.thingsboard.server.common.data.notification.NotificationDeliveryMethod; -import javax.validation.constraints.NotNull; - @JsonIgnoreProperties(ignoreUnknown = true) -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "method", include = JsonTypeInfo.As.EXISTING_PROPERTY, - visible = true, defaultImpl = NotificationDeliveryMethodConfig.class) +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "method") @JsonSubTypes({ - @Type(name = "SLACK", value = SlackNotificationDeliveryMethodConfig.class), + @Type(name = "SLACK", value = SlackNotificationDeliveryMethodConfig.class) }) -@Data -public class NotificationDeliveryMethodConfig { +public interface NotificationDeliveryMethodConfig { - private boolean enabled; - @NotNull - private NotificationDeliveryMethod method; + @JsonIgnore + NotificationDeliveryMethod getMethod(); } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/SlackNotificationDeliveryMethodConfig.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/SlackNotificationDeliveryMethodConfig.java index 9c0e5a7c78..61aae6bfab 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/SlackNotificationDeliveryMethodConfig.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/SlackNotificationDeliveryMethodConfig.java @@ -16,12 +16,19 @@ package org.thingsboard.server.common.data.notification.settings; import lombok.Data; -import lombok.EqualsAndHashCode; +import org.thingsboard.server.common.data.notification.NotificationDeliveryMethod; + +import javax.validation.constraints.NotEmpty; @Data -@EqualsAndHashCode(callSuper = true) -public class SlackNotificationDeliveryMethodConfig extends NotificationDeliveryMethodConfig { +public class SlackNotificationDeliveryMethodConfig implements NotificationDeliveryMethodConfig { + @NotEmpty private String botToken; + @Override + public NotificationDeliveryMethod getMethod() { + return NotificationDeliveryMethod.SLACK; + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java index bb01f53727..36055bf159 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java @@ -678,6 +678,7 @@ public class ModelConstants { public static final String NOTIFICATION_RULE_TRIGGER_TYPE_PROPERTY = "trigger_type"; public static final String NOTIFICATION_RULE_TRIGGER_CONFIG_PROPERTY = "trigger_config"; public static final String NOTIFICATION_RULE_RECIPIENTS_CONFIG_PROPERTY = "recipients_config"; + public static final String NOTIFICATION_RULE_ADDITIONAL_CONFIG_PROPERTY = "additional_config"; public static final String NOTIFICATION_TEMPLATE_TABLE_NAME = "notification_template"; public static final String NOTIFICATION_TEMPLATE_NOTIFICATION_TYPE_PROPERTY = "notification_type"; diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationRuleEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationRuleEntity.java index a012fcf49d..8dd918db51 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationRuleEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationRuleEntity.java @@ -23,6 +23,7 @@ import org.hibernate.annotations.TypeDef; import org.thingsboard.server.common.data.id.NotificationRuleId; import org.thingsboard.server.common.data.id.NotificationTemplateId; import org.thingsboard.server.common.data.notification.rule.NotificationRule; +import org.thingsboard.server.common.data.notification.rule.NotificationRuleConfig; import org.thingsboard.server.common.data.notification.rule.NotificationRuleRecipientsConfig; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerConfig; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; @@ -64,6 +65,10 @@ public class NotificationRuleEntity extends BaseSqlEntity { @Column(name = ModelConstants.NOTIFICATION_RULE_RECIPIENTS_CONFIG_PROPERTY, nullable = false) private JsonNode recipientsConfig; + @Type(type = "json") + @Column(name = ModelConstants.NOTIFICATION_RULE_ADDITIONAL_CONFIG_PROPERTY) + private JsonNode additionalConfig; + public NotificationRuleEntity() {} public NotificationRuleEntity(NotificationRule notificationRule) { @@ -75,6 +80,7 @@ public class NotificationRuleEntity extends BaseSqlEntity { setTriggerType(notificationRule.getTriggerType()); setTriggerConfig(toJson(notificationRule.getTriggerConfig())); setRecipientsConfig(toJson(notificationRule.getRecipientsConfig())); + setAdditionalConfig(toJson(notificationRule.getAdditionalConfig())); } public NotificationRuleEntity(NotificationRuleEntity other) { @@ -86,6 +92,7 @@ public class NotificationRuleEntity extends BaseSqlEntity { this.triggerType = other.triggerType; this.triggerConfig = other.triggerConfig; this.recipientsConfig = other.recipientsConfig; + this.additionalConfig = other.additionalConfig; } @Override @@ -99,6 +106,7 @@ public class NotificationRuleEntity extends BaseSqlEntity { notificationRule.setTriggerType(triggerType); notificationRule.setTriggerConfig(fromJson(triggerConfig, NotificationRuleTriggerConfig.class)); notificationRule.setRecipientsConfig(fromJson(recipientsConfig, NotificationRuleRecipientsConfig.class)); + notificationRule.setAdditionalConfig(fromJson(additionalConfig, NotificationRuleConfig.class)); return notificationRule; } diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index e541047fd6..9521ee20a0 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/dao/src/main/resources/sql/schema-entities.sql @@ -808,6 +808,7 @@ CREATE TABLE IF NOT EXISTS notification_rule ( trigger_type VARCHAR(50) NOT NULL, trigger_config VARCHAR(1000) NOT NULL, recipients_config VARCHAR(10000) NOT NULL, + additional_config VARCHAR(255), CONSTRAINT uq_notification_rule_name UNIQUE (tenant_id, name) );