From 68b0158f3e953ddd9606cd5971caa8819471bef1 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Tue, 31 Jan 2023 16:46:35 +0200 Subject: [PATCH] Remove duplicated type from NotificationTarget; new OriginatorEntityOwnerUsersFilter; refactoring --- .../main/data/upgrade/3.4.3/schema_update.sql | 1 - .../controller/NotificationController.java | 5 ++- .../service/action/EntityActionService.java | 1 + .../DefaultNotificationCenter.java | 8 ++-- ...AlarmNotificationRuleTriggerProcessor.java | 5 ++- ...ivityNotificationRuleTriggerProcessor.java | 1 + ...ctionNotificationRuleTriggerProcessor.java | 6 ++- .../AbstractNotificationApiTest.java | 3 -- .../notification/NotificationApiTest.java | 24 ++++------ .../notification/NotificationRuleApiTest.java | 2 +- .../NotificationTargetApiTest.java | 6 --- .../NotificationProcessingContext.java | 19 ++++---- .../info/AlarmNotificationInfo.java | 9 ++-- .../DeviceInactivityNotificationInfo.java | 9 ++-- .../info/EntityActionNotificationInfo.java | 19 ++++---- .../notification/info/NotificationInfo.java | 18 +------- .../RuleEngineOriginatedNotificationInfo.java | 6 --- .../info/RuleOriginatedNotificationInfo.java | 24 ++++++++++ .../info/UserOriginatedNotificationInfo.java | 6 --- .../targets/NotificationTarget.java | 2 - .../targets/platform/CustomerUsersFilter.java | 18 ++------ .../OriginatorEntityOwnerUsersFilter.java | 28 ++++++++++++ .../targets/platform/UsersFilter.java | 3 +- .../targets/platform/UsersFilterType.java | 3 +- .../model/sql/NotificationTargetEntity.java | 9 ---- .../DefaultNotificationTargetService.java | 21 +++++---- .../main/resources/sql/schema-entities.sql | 1 - .../target-notification-dialog.component.html | 6 +-- .../target-notification-dialog.componet.ts | 14 +----- ...emplate-notification-dialog.component.html | 2 +- .../app/shared/models/notification.models.ts | 45 +++++++++++-------- .../assets/locale/locale.constant-en_US.json | 16 +++++-- 32 files changed, 168 insertions(+), 172 deletions(-) create mode 100644 common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleOriginatedNotificationInfo.java create mode 100644 common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/OriginatorEntityOwnerUsersFilter.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 f7131564db..133d7ed0ee 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 @@ -31,7 +31,6 @@ CREATE TABLE IF NOT EXISTS notification_target ( created_time BIGINT NOT NULL, tenant_id UUID NULL CONSTRAINT fk_notification_target_tenant_id REFERENCES tenant(id) ON DELETE CASCADE, name VARCHAR(255) NOT NULL, - type VARCHAR(32) NOT NULL, configuration VARCHAR(10000) NOT NULL, CONSTRAINT uq_notification_target_name UNIQUE (tenant_id, name) ); diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationController.java index 759d4249a4..b0d91c39e5 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationController.java @@ -42,6 +42,7 @@ import org.thingsboard.server.common.data.notification.NotificationProcessingCon import org.thingsboard.server.common.data.notification.NotificationRequest; import org.thingsboard.server.common.data.notification.NotificationRequestInfo; import org.thingsboard.server.common.data.notification.NotificationRequestPreview; +import org.thingsboard.server.common.data.notification.info.UserOriginatedNotificationInfo; import org.thingsboard.server.common.data.notification.settings.NotificationSettings; import org.thingsboard.server.common.data.notification.targets.NotificationTarget; import org.thingsboard.server.common.data.notification.targets.NotificationTargetType; @@ -176,7 +177,7 @@ public class NotificationController extends BaseController { checkEntity(notificationRequest.getId(), notificationRequest, Resource.NOTIFICATION_REQUEST); notificationRequest.setOriginatorEntityId(user.getId()); - if (notificationRequest.getInfo() != null && notificationRequest.getInfo().getOriginatorType() != EntityType.USER) { + if (notificationRequest.getInfo() != null && !(notificationRequest.getInfo() instanceof UserOriginatedNotificationInfo)) { throw new IllegalArgumentException("Unsupported notification info type"); } notificationRequest.setRuleId(null); @@ -221,7 +222,7 @@ public class NotificationController extends BaseController { } int recipientsCount; - if (notificationTarget.getType() == NotificationTargetType.PLATFORM_USERS) { + if (notificationTarget.getConfiguration().getType() == NotificationTargetType.PLATFORM_USERS) { recipientsCount = notificationTargetService.countRecipientsForNotificationTargetConfig(user.getTenantId(), notificationTarget.getConfiguration()); } else { recipientsCount = 1; diff --git a/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java b/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java index 7057f903be..c2ddbd3001 100644 --- a/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java +++ b/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java @@ -170,6 +170,7 @@ public class EntityActionService { if (entityId.getEntityType() == EntityType.DASHBOARD) { entityNode.put("configuration", ""); } + metaData.putValue("entityName", entity.getName()); } else { entityNode = json.createObjectNode(); if (actionType == ActionType.ATTRIBUTES_UPDATED) { 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 4dbecec10d..db4a0d61cf 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 @@ -118,7 +118,7 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple throw new IllegalArgumentException("Slack must be configured in the settings"); } } - if (targets.stream().noneMatch(target -> target.getType().getSupportedDeliveryMethods().contains(deliveryMethod))) { + if (targets.stream().noneMatch(target -> target.getConfiguration().getType().getSupportedDeliveryMethods().contains(deliveryMethod))) { throw new IllegalArgumentException("Target for " + deliveryMethod.getName() + " delivery method is missing"); } }); @@ -182,7 +182,7 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple private List> processForTarget(NotificationTarget target, NotificationProcessingContext ctx) { Iterable recipients; - switch (target.getType()) { + switch (target.getConfiguration().getType()) { case PLATFORM_USERS: { recipients = new PageDataIterable<>(pageLink -> { return notificationTargetService.findRecipientsForNotificationTargetConfig(ctx.getTenantId(), ctx.getCustomerId(), target.getConfiguration(), pageLink); @@ -200,8 +200,8 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple } Set deliveryMethods = new HashSet<>(ctx.getDeliveryMethods()); - deliveryMethods.removeIf(deliveryMethod -> !target.getType().getSupportedDeliveryMethods().contains(deliveryMethod)); - log.debug("[{}] Processing notification request for {} target ({}) for delivery methods {}", ctx.getRequest().getId(), target.getType(), target.getId(), deliveryMethods); + deliveryMethods.removeIf(deliveryMethod -> !target.getConfiguration().getType().getSupportedDeliveryMethods().contains(deliveryMethod)); + log.debug("[{}] Processing notification request for {} target ({}) for delivery methods {}", ctx.getRequest().getId(), target.getConfiguration().getType(), target.getId(), deliveryMethods); List> results = new ArrayList<>(); for (NotificationRecipient recipient : recipients) { diff --git a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmNotificationRuleTriggerProcessor.java b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmNotificationRuleTriggerProcessor.java index f69e8c5b6b..ec6c414fc3 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmNotificationRuleTriggerProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmNotificationRuleTriggerProcessor.java @@ -21,6 +21,7 @@ import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.notification.info.AlarmNotificationInfo; import org.thingsboard.server.common.data.notification.info.NotificationInfo; import org.thingsboard.server.common.data.notification.rule.trigger.AlarmNotificationRuleTriggerConfig; +import org.thingsboard.server.common.data.notification.rule.trigger.AlarmNotificationRuleTriggerConfig.ClearRule; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; @Service @@ -34,7 +35,7 @@ public class AlarmNotificationRuleTriggerProcessor implements NotificationRuleTr @Override public boolean matchesClearRule(Alarm alarm, AlarmNotificationRuleTriggerConfig triggerConfig) { - AlarmNotificationRuleTriggerConfig.ClearRule clearRule = triggerConfig.getClearRule(); + ClearRule clearRule = triggerConfig.getClearRule(); if (clearRule != null) { if (clearRule.getAlarmStatus() != null) { return clearRule.getAlarmStatus().equals(alarm.getStatus()); @@ -51,7 +52,7 @@ public class AlarmNotificationRuleTriggerProcessor implements NotificationRuleTr .alarmOriginator(alarm.getOriginator()) .alarmSeverity(alarm.getSeverity()) .alarmStatus(alarm.getStatus()) - .customerId(alarm.getCustomerId()) + .alarmCustomerId(alarm.getCustomerId()) .build(); } 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 3df8bb8fe2..abbbbda58a 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 @@ -53,6 +53,7 @@ public class DeviceInactivityNotificationRuleTriggerProcessor implements Notific .deviceId(ruleEngineMsg.getOriginator().getId()) .deviceName(ruleEngineMsg.getMetaData().getValue("deviceName")) .deviceType(ruleEngineMsg.getMetaData().getValue("deviceType")) + .deviceCustomerId(ruleEngineMsg.getCustomerId()) .build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/EntityActionNotificationRuleTriggerProcessor.java b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/EntityActionNotificationRuleTriggerProcessor.java index 7429134faf..ea1c6da5ee 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/EntityActionNotificationRuleTriggerProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/EntityActionNotificationRuleTriggerProcessor.java @@ -61,9 +61,11 @@ public class EntityActionNotificationRuleTriggerProcessor implements Notificatio return EntityActionNotificationInfo.builder() .entityType(entityId.getEntityType()) .entityId(entityId.getId()) + .entityName(ruleEngineMsg.getMetaData().getValue("entityName")) .actionType(actionType) - .userId(UUID.fromString(ruleEngineMsg.getMetaData().getValue("userId"))) - .userName(ruleEngineMsg.getMetaData().getValue("userName")) + .originatorUserId(UUID.fromString(ruleEngineMsg.getMetaData().getValue("userId"))) + .originatorUserName(ruleEngineMsg.getMetaData().getValue("userName")) + .entityCustomerId(ruleEngineMsg.getCustomerId()) .build(); } diff --git a/application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java index c076c33827..ae3da0ea77 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java @@ -38,10 +38,8 @@ import org.thingsboard.server.common.data.notification.NotificationType; import org.thingsboard.server.common.data.notification.info.UserOriginatedNotificationInfo; import org.thingsboard.server.common.data.notification.settings.NotificationSettings; import org.thingsboard.server.common.data.notification.targets.NotificationTarget; -import org.thingsboard.server.common.data.notification.targets.NotificationTargetType; import org.thingsboard.server.common.data.notification.targets.platform.PlatformUsersNotificationTargetConfig; import org.thingsboard.server.common.data.notification.targets.platform.UserListFilter; -import org.thingsboard.server.common.data.notification.targets.slack.SlackNotificationTargetConfig; import org.thingsboard.server.common.data.notification.template.DeliveryMethodNotificationTemplate; import org.thingsboard.server.common.data.notification.template.EmailDeliveryMethodNotificationTemplate; import org.thingsboard.server.common.data.notification.template.NotificationTemplate; @@ -81,7 +79,6 @@ public abstract class AbstractNotificationApiTest extends AbstractControllerTest NotificationTarget notificationTarget = new NotificationTarget(); notificationTarget.setTenantId(tenantId); notificationTarget.setName("Users " + List.of(usersIds)); - notificationTarget.setType(NotificationTargetType.PLATFORM_USERS); PlatformUsersNotificationTargetConfig targetConfig = new PlatformUsersNotificationTargetConfig(); UserListFilter filter = new UserListFilter(); filter.setUsersIds(DaoUtil.toUUIDs(List.of(usersIds))); 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 5a02db80e8..1375046266 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 @@ -326,7 +326,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest { loginTenantAdmin(); sessions.forEach((user, wsClient) -> wsClient.registerWaitForUpdate(2)); - NotificationRequest notificationRequest = submitNotificationRequest(targets, "Hello, ${email}", 0, + NotificationRequest notificationRequest = submitNotificationRequest(targets, "Hello, ${recipientEmail}", 0, NotificationDeliveryMethod.PUSH); await().atMost(10, TimeUnit.SECONDS) .pollDelay(1, TimeUnit.SECONDS).pollInterval(500, TimeUnit.MILLISECONDS) @@ -370,7 +370,6 @@ public class NotificationApiTest extends AbstractNotificationApiTest { public void testNotificationRequestPreview() throws Exception { NotificationTarget target1 = new NotificationTarget(); target1.setName("Me"); - target1.setType(NotificationTargetType.PLATFORM_USERS); PlatformUsersNotificationTargetConfig target1Config = new PlatformUsersNotificationTargetConfig(); UserListFilter userListFilter = new UserListFilter(); userListFilter.setUsersIds(DaoUtil.toUUIDs(List.of(tenantAdminUserId))); @@ -391,11 +390,9 @@ public class NotificationApiTest extends AbstractNotificationApiTest { } NotificationTarget target2 = new NotificationTarget(); target2.setName("Other customer users"); - target2.setType(NotificationTargetType.PLATFORM_USERS); PlatformUsersNotificationTargetConfig target2Config = new PlatformUsersNotificationTargetConfig(); CustomerUsersFilter customerUsersFilter = new CustomerUsersFilter(); customerUsersFilter.setCustomerId(differentCustomerId.getId()); - customerUsersFilter.setGetCustomerIdFromOriginatorEntity(false); target2Config.setUsersFilter(customerUsersFilter); target2.setConfiguration(target2Config); target2 = saveNotificationTarget(target2); @@ -407,8 +404,8 @@ public class NotificationApiTest extends AbstractNotificationApiTest { String requestorEmail = TENANT_ADMIN_EMAIL; NotificationTemplateConfig templateConfig = new NotificationTemplateConfig(); - templateConfig.setDefaultTextTemplate("Default message for SMS and PUSH: ${email}"); - templateConfig.setNotificationSubject("Default subject for EMAIL: ${email}"); + templateConfig.setDefaultTextTemplate("Default message for SMS and PUSH: ${recipientEmail}"); + templateConfig.setNotificationSubject("Default subject for EMAIL: ${recipientEmail}"); HashMap templates = new HashMap<>(); templateConfig.setDeliveryMethodsTemplates(templates); notificationTemplate.setConfiguration(templateConfig); @@ -416,7 +413,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest { PushDeliveryMethodNotificationTemplate pushNotificationTemplate = new PushDeliveryMethodNotificationTemplate(); pushNotificationTemplate.setEnabled(true); // using default message for push - pushNotificationTemplate.setSubject("Subject for PUSH: ${email}"); + pushNotificationTemplate.setSubject("Subject for PUSH: ${recipientEmail}"); templates.put(NotificationDeliveryMethod.PUSH, pushNotificationTemplate); SmsDeliveryMethodNotificationTemplate smsNotificationTemplate = new SmsDeliveryMethodNotificationTemplate(); @@ -426,13 +423,13 @@ public class NotificationApiTest extends AbstractNotificationApiTest { EmailDeliveryMethodNotificationTemplate emailNotificationTemplate = new EmailDeliveryMethodNotificationTemplate(); emailNotificationTemplate.setEnabled(true); - emailNotificationTemplate.setBody("Message for EMAIL: ${email}"); + emailNotificationTemplate.setBody("Message for EMAIL: ${recipientEmail}"); // using default subject for email templates.put(NotificationDeliveryMethod.EMAIL, emailNotificationTemplate); SlackDeliveryMethodNotificationTemplate slackNotificationTemplate = new SlackDeliveryMethodNotificationTemplate(); slackNotificationTemplate.setEnabled(true); - slackNotificationTemplate.setBody("Message for SLACK: ${email}"); + slackNotificationTemplate.setBody("Message for SLACK: ${recipientEmail}"); templates.put(NotificationDeliveryMethod.SLACK, slackNotificationTemplate); notificationTemplate = saveNotificationTemplate(notificationTemplate); @@ -476,7 +473,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest { assertThat(processedTemplates.get(NotificationDeliveryMethod.SLACK)).asInstanceOf(type(SlackDeliveryMethodNotificationTemplate.class)) .satisfies(template -> { assertThat(template.getBody()) - .isEqualTo("Message for SLACK: ${email}"); // ${email} should not be processed + .isEqualTo("Message for SLACK: ${recipientEmail}"); // ${recipientEmail} should not be processed }); } @@ -510,7 +507,6 @@ public class NotificationApiTest extends AbstractNotificationApiTest { .until(() -> findNotificationRequest(notificationRequest.getId()).isSent()); NotificationRequestStats stats = getStats(notificationRequest.getId()); - System.err.println("STATS: " + stats); assertThat(stats.getSent().get(NotificationDeliveryMethod.PUSH)).hasValue(1); assertThat(stats.getSent().get(NotificationDeliveryMethod.EMAIL)).hasValue(1); assertThat(stats.getErrors().get(NotificationDeliveryMethod.SMS)).size().isOne(); @@ -533,7 +529,6 @@ public class NotificationApiTest extends AbstractNotificationApiTest { NotificationTarget notificationTarget = new NotificationTarget(); notificationTarget.setTenantId(tenantId); notificationTarget.setName("All my users"); - notificationTarget.setType(NotificationTargetType.PLATFORM_USERS); PlatformUsersNotificationTargetConfig config = new PlatformUsersNotificationTargetConfig(); AllUsersFilter filter = new AllUsersFilter(); config.setUsersFilter(filter); @@ -542,7 +537,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest { NotificationTargetId notificationTargetId = notificationTarget.getId(); ListenableFuture request = executor.submit(() -> { - return submitNotificationRequest(notificationTargetId, "Hello, ${email}", 0, NotificationDeliveryMethod.PUSH); + return submitNotificationRequest(notificationTargetId, "Hello, ${recipientEmail}", 0, NotificationDeliveryMethod.PUSH); }); await().atMost(10, TimeUnit.SECONDS).until(request::isDone); NotificationRequest notificationRequest = request.get(); @@ -577,7 +572,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest { notificationTemplate.setName("Slack notification template"); notificationTemplate.setNotificationType(NotificationType.GENERAL); NotificationTemplateConfig config = new NotificationTemplateConfig(); - config.setDefaultTextTemplate("To Slack :) ${email}"); + config.setDefaultTextTemplate("To Slack :) ${recipientEmail}"); SlackDeliveryMethodNotificationTemplate slackNotificationTemplate = new SlackDeliveryMethodNotificationTemplate(); slackNotificationTemplate.setEnabled(true); config.setDeliveryMethodsTemplates(Map.of( @@ -591,7 +586,6 @@ public class NotificationApiTest extends AbstractNotificationApiTest { NotificationTarget notificationTarget = new NotificationTarget(); notificationTarget.setTenantId(tenantId); notificationTarget.setName(conversationName + " in Slack"); - notificationTarget.setType(NotificationTargetType.SLACK); SlackNotificationTargetConfig targetConfig = new SlackNotificationTargetConfig(); targetConfig.setConversation(new SlackConversation(conversationId, conversationName)); notificationTarget.setConfiguration(targetConfig); 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 81e592126d..b61d87a0af 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 @@ -100,7 +100,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { @Test public void testNotificationRuleProcessing_entityActionTrigger() throws Exception { String notificationSubject = "${actionType}: ${entityType} [${entityId}]"; - String notificationText = "User: ${userName}"; + String notificationText = "User: ${originatorUserName}"; NotificationTemplate notificationTemplate = createNotificationTemplate(NotificationType.GENERAL, notificationSubject, notificationText, NotificationDeliveryMethod.PUSH); NotificationRule notificationRule = new NotificationRule(); diff --git a/application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java index fdc4fb8a6c..442e3a7618 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java @@ -24,7 +24,6 @@ import org.springframework.test.web.servlet.ResultMatcher; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.notification.targets.NotificationTarget; -import org.thingsboard.server.common.data.notification.targets.NotificationTargetType; import org.thingsboard.server.common.data.notification.targets.platform.AllUsersFilter; import org.thingsboard.server.common.data.notification.targets.platform.CustomerUsersFilter; import org.thingsboard.server.common.data.notification.targets.platform.PlatformUsersNotificationTargetConfig; @@ -56,13 +55,11 @@ public class NotificationTargetApiTest extends AbstractControllerTest { NotificationTarget target = new NotificationTarget(); target.setTenantId(null); target.setName(null); - target.setType(null); target.setConfiguration(null); String validationError = saveAndGetError(target, status().isBadRequest()); assertThat(validationError) .contains("name must not be") - .contains("type must not be") .contains("configuration must not be"); PlatformUsersNotificationTargetConfig targetConfig = new PlatformUsersNotificationTargetConfig(); @@ -82,7 +79,6 @@ public class NotificationTargetApiTest extends AbstractControllerTest { NotificationTarget notificationTarget = new NotificationTarget(); notificationTarget.setTenantId(differentTenantId); notificationTarget.setName("Target 1"); - notificationTarget.setType(NotificationTargetType.PLATFORM_USERS); PlatformUsersNotificationTargetConfig targetConfig = new PlatformUsersNotificationTargetConfig(); UserListFilter userListFilter = new UserListFilter(); @@ -102,7 +98,6 @@ public class NotificationTargetApiTest extends AbstractControllerTest { NotificationTarget notificationTarget = new NotificationTarget(); notificationTarget.setTenantId(tenantId); notificationTarget.setName("Test target"); - notificationTarget.setType(NotificationTargetType.PLATFORM_USERS); PlatformUsersNotificationTargetConfig targetConfig = new PlatformUsersNotificationTargetConfig(); CustomerUsersFilter customerUsersFilter = new CustomerUsersFilter(); @@ -141,7 +136,6 @@ public class NotificationTargetApiTest extends AbstractControllerTest { createDifferentTenant(); NotificationTarget notificationTarget = new NotificationTarget(); notificationTarget.setName("Test 1"); - notificationTarget.setType(NotificationTargetType.PLATFORM_USERS); notificationTarget.setTenantId(differentTenantId); PlatformUsersNotificationTargetConfig targetConfig = new PlatformUsersNotificationTargetConfig(); targetConfig.setUsersFilter(new AllUsersFilter()); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationProcessingContext.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationProcessingContext.java index 5177c32489..9cdda924d6 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationProcessingContext.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationProcessingContext.java @@ -24,6 +24,7 @@ import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.notification.info.AlarmNotificationInfo; import org.thingsboard.server.common.data.notification.info.NotificationInfo; +import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotificationInfo; import org.thingsboard.server.common.data.notification.settings.NotificationDeliveryMethodConfig; import org.thingsboard.server.common.data.notification.settings.NotificationSettings; import org.thingsboard.server.common.data.notification.template.DeliveryMethodNotificationTemplate; @@ -120,22 +121,18 @@ public class NotificationProcessingContext { public Map createTemplateContext(User recipient) { Map templateContext = new HashMap<>(); - templateContext.put("email", recipient.getEmail()); - templateContext.put("firstName", Strings.nullToEmpty(recipient.getFirstName())); - templateContext.put("lastName", Strings.nullToEmpty(recipient.getLastName())); + templateContext.put("recipientEmail", recipient.getEmail()); + templateContext.put("recipientFirstName", Strings.nullToEmpty(recipient.getFirstName())); + templateContext.put("recipientLastName", Strings.nullToEmpty(recipient.getLastName())); return templateContext; } public CustomerId getCustomerId() { - CustomerId customerId; - switch (request.getOriginatorEntityId().getEntityType()) { - case ALARM: - customerId = ((AlarmNotificationInfo) request.getInfo()).getCustomerId(); - break; - default: - customerId = null; + if (request.getInfo() instanceof RuleOriginatedNotificationInfo) { + return ((RuleOriginatedNotificationInfo) request.getInfo()).getOriginatorEntityCustomerId(); + } else { + return null; } - return customerId; } } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmNotificationInfo.java index b595b6dde6..183f8cc635 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmNotificationInfo.java @@ -19,7 +19,6 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmStatus; import org.thingsboard.server.common.data.id.CustomerId; @@ -32,18 +31,18 @@ import java.util.UUID; @NoArgsConstructor @AllArgsConstructor @Builder -public class AlarmNotificationInfo implements NotificationInfo { +public class AlarmNotificationInfo implements RuleOriginatedNotificationInfo { private String alarmType; private UUID alarmId; private EntityId alarmOriginator; private AlarmSeverity alarmSeverity; private AlarmStatus alarmStatus; - private CustomerId customerId; + private CustomerId alarmCustomerId; @Override - public EntityType getOriginatorType() { - return EntityType.ALARM; + public CustomerId getOriginatorEntityCustomerId() { + return alarmCustomerId; } @Override 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/DeviceInactivityNotificationInfo.java index dd5fc89b0a..bdc4230666 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/DeviceInactivityNotificationInfo.java @@ -19,7 +19,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.id.CustomerId; import java.util.Map; import java.util.UUID; @@ -28,15 +28,16 @@ import java.util.UUID; @NoArgsConstructor @AllArgsConstructor @Builder -public class DeviceInactivityNotificationInfo implements NotificationInfo { +public class DeviceInactivityNotificationInfo implements RuleOriginatedNotificationInfo { private UUID deviceId; private String deviceName; private String deviceType; + private CustomerId deviceCustomerId; @Override - public EntityType getOriginatorType() { - return EntityType.DEVICE; + public CustomerId getOriginatorEntityCustomerId() { + return deviceCustomerId; } @Override diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntityActionNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntityActionNotificationInfo.java index df4917f4a5..41b51450fc 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntityActionNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntityActionNotificationInfo.java @@ -21,6 +21,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.audit.ActionType; +import org.thingsboard.server.common.data.id.CustomerId; import java.util.Map; import java.util.UUID; @@ -29,18 +30,19 @@ import java.util.UUID; @NoArgsConstructor @AllArgsConstructor @Builder -public class EntityActionNotificationInfo implements NotificationInfo { +public class EntityActionNotificationInfo implements RuleOriginatedNotificationInfo { private EntityType entityType; private UUID entityId; + private String entityName; private ActionType actionType; - private UUID userId; - private String userName; - // maybe add entityName and other info (from TbMsg data) + private UUID originatorUserId; + private String originatorUserName; + private CustomerId entityCustomerId; @Override - public EntityType getOriginatorType() { - return EntityType.TENANT; + public CustomerId getOriginatorEntityCustomerId() { + return entityCustomerId; } @Override @@ -48,9 +50,10 @@ public class EntityActionNotificationInfo implements NotificationInfo { return Map.of( "entityType", entityType.name(), "entityId", entityId.toString(), + "entityName", entityName, "actionType", actionType.name(), - "userId", userId.toString(), - "userName", userName + "originatorUserId", originatorUserId.toString(), + "originatorUserName", originatorUserName ); } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/NotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/NotificationInfo.java index 56441da434..ef05e2baea 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/NotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/NotificationInfo.java @@ -17,30 +17,14 @@ package org.thingsboard.server.common.data.notification.info; 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 org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.id.UserId; -import java.util.Collections; -import java.util.List; import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "originatorType") -@JsonSubTypes({ - @Type(name = "USER", value = UserOriginatedNotificationInfo.class), - @Type(name = "ALARM", value = AlarmNotificationInfo.class), - @Type(name = "RULE_CHAIN", value = RuleEngineOriginatedNotificationInfo.class), - @Type(name = "DEVICE", value = DeviceInactivityNotificationInfo.class), - @Type(name = "TENANT", value = EntityActionNotificationInfo.class) -}) +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "type") public interface NotificationInfo { - @JsonIgnore - EntityType getOriginatorType(); // FIXME: originatorType is bad identifier, might have 2 types of info related to device - @JsonIgnore Map getTemplateData(); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleEngineOriginatedNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleEngineOriginatedNotificationInfo.java index 63456852e7..632a5bd8be 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleEngineOriginatedNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleEngineOriginatedNotificationInfo.java @@ -19,7 +19,6 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.EntityId; import java.util.HashMap; @@ -35,11 +34,6 @@ public class RuleEngineOriginatedNotificationInfo implements NotificationInfo { private String msgType; private Map msgMetadata; - @Override - public EntityType getOriginatorType() { - return EntityType.RULE_CHAIN; - } - @Override public Map getTemplateData() { Map templateData = new HashMap<>(msgMetadata); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleOriginatedNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleOriginatedNotificationInfo.java new file mode 100644 index 0000000000..79bdc12071 --- /dev/null +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleOriginatedNotificationInfo.java @@ -0,0 +1,24 @@ +/** + * 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.info; + +import org.thingsboard.server.common.data.id.CustomerId; + +public interface RuleOriginatedNotificationInfo extends NotificationInfo { + + CustomerId getOriginatorEntityCustomerId(); + +} diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/UserOriginatedNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/UserOriginatedNotificationInfo.java index 318bcf1c71..0d8e988d82 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/UserOriginatedNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/UserOriginatedNotificationInfo.java @@ -16,7 +16,6 @@ package org.thingsboard.server.common.data.notification.info; import lombok.Data; -import org.thingsboard.server.common.data.EntityType; import java.util.Collections; import java.util.Map; @@ -26,11 +25,6 @@ public class UserOriginatedNotificationInfo implements NotificationInfo { private String description; - @Override - public EntityType getOriginatorType() { - return EntityType.USER; - } - @Override public Map getTemplateData() { return Collections.emptyMap(); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTarget.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTarget.java index 9011a6e949..4513c0d18b 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTarget.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTarget.java @@ -37,8 +37,6 @@ public class NotificationTarget extends BaseData implement @NoXss private String name; @NotNull - private NotificationTargetType type; - @NotNull @Valid private NotificationTargetConfig configuration; diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/CustomerUsersFilter.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/CustomerUsersFilter.java index 18b0d5bc47..84a81ef495 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/CustomerUsersFilter.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/CustomerUsersFilter.java @@ -15,32 +15,20 @@ */ package org.thingsboard.server.common.data.notification.targets.platform; -import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; -import org.thingsboard.server.common.data.id.EntityId; -import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotNull; import java.util.UUID; @Data public class CustomerUsersFilter implements UsersFilter { - private UUID customerId; // might not be set if using with notification rule - private boolean getCustomerIdFromOriginatorEntity; // e.g. from alarm + @NotNull + private UUID customerId; @Override public UsersFilterType getType() { return UsersFilterType.CUSTOMER_USERS; } - @AssertTrue(message = "customerId is required") - @JsonIgnore - public boolean isValid() { - if (!getCustomerIdFromOriginatorEntity) { - return customerId != null && !customerId.equals(EntityId.NULL_UUID); - } else { - return true; - } - } - } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/OriginatorEntityOwnerUsersFilter.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/OriginatorEntityOwnerUsersFilter.java new file mode 100644 index 0000000000..6ab20e8675 --- /dev/null +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/OriginatorEntityOwnerUsersFilter.java @@ -0,0 +1,28 @@ +/** + * 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.targets.platform; + +import lombok.Data; + +@Data +public class OriginatorEntityOwnerUsersFilter implements UsersFilter { + + @Override + public UsersFilterType getType() { + return UsersFilterType.ORIGINATOR_ENTITY_OWNER_USERS; + } + +} diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilter.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilter.java index 7a47c73081..b45dbaffc8 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilter.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilter.java @@ -26,7 +26,8 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; @JsonSubTypes({ @Type(value = UserListFilter.class, name = "USER_LIST"), @Type(value = CustomerUsersFilter.class, name = "CUSTOMER_USERS"), - @Type(value = AllUsersFilter.class, name = "ALL_USERS") + @Type(value = AllUsersFilter.class, name = "ALL_USERS"), + @Type(value = OriginatorEntityOwnerUsersFilter.class, name = "ORIGINATOR_ENTITY_OWNER_USERS") // for usage in notification rules }) public interface UsersFilter { diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilterType.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilterType.java index 88a826a9a4..4fdc2305a7 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilterType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilterType.java @@ -18,7 +18,8 @@ package org.thingsboard.server.common.data.notification.targets.platform; public enum UsersFilterType { USER_LIST, CUSTOMER_USERS, - ALL_USERS + ALL_USERS, + ORIGINATOR_ENTITY_OWNER_USERS // USER_GROUP, // USERS_WITH_ROLE, diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationTargetEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationTargetEntity.java index 436c62d57a..984a099902 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationTargetEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationTargetEntity.java @@ -23,15 +23,12 @@ import org.hibernate.annotations.TypeDef; import org.thingsboard.server.common.data.id.NotificationTargetId; import org.thingsboard.server.common.data.notification.targets.NotificationTarget; import org.thingsboard.server.common.data.notification.targets.NotificationTargetConfig; -import org.thingsboard.server.common.data.notification.targets.NotificationTargetType; import org.thingsboard.server.dao.model.BaseSqlEntity; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.util.mapping.JsonStringType; import javax.persistence.Column; import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; import javax.persistence.Table; import java.util.UUID; @@ -48,10 +45,6 @@ public class NotificationTargetEntity extends BaseSqlEntity @Column(name = ModelConstants.NAME_PROPERTY, nullable = false) private String name; - @Enumerated(EnumType.STRING) - @Column(name = ModelConstants.NOTIFICATION_TARGET_TYPE_PROPERTY, nullable = false) - private NotificationTargetType type; - @Type(type = "json") @Column(name = ModelConstants.NOTIFICATION_TARGET_CONFIGURATION_PROPERTY, nullable = false) private JsonNode configuration; @@ -63,7 +56,6 @@ public class NotificationTargetEntity extends BaseSqlEntity setCreatedTime(notificationTarget.getCreatedTime()); setTenantId(getTenantUuid(notificationTarget.getTenantId())); setName(notificationTarget.getName()); - setType(notificationTarget.getType()); setConfiguration(toJson(notificationTarget.getConfiguration())); } @@ -74,7 +66,6 @@ public class NotificationTargetEntity extends BaseSqlEntity notificationTarget.setCreatedTime(createdTime); notificationTarget.setTenantId(getTenantId(tenantId)); notificationTarget.setName(name); - notificationTarget.setType(type); notificationTarget.setConfiguration(fromJson(configuration, NotificationTargetConfig.class)); return notificationTarget; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTargetService.java b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTargetService.java index 10395ba18e..b4cf39dbeb 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTargetService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTargetService.java @@ -24,9 +24,10 @@ import org.thingsboard.server.common.data.id.NotificationTargetId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.notification.NotificationRequestStatus; -import org.thingsboard.server.common.data.notification.targets.platform.CustomerUsersFilter; import org.thingsboard.server.common.data.notification.targets.NotificationTarget; import org.thingsboard.server.common.data.notification.targets.NotificationTargetConfig; +import org.thingsboard.server.common.data.notification.targets.platform.CustomerUsersFilter; +import org.thingsboard.server.common.data.notification.targets.platform.OriginatorEntityOwnerUsersFilter; import org.thingsboard.server.common.data.notification.targets.platform.PlatformUsersNotificationTargetConfig; import org.thingsboard.server.common.data.notification.targets.platform.UserListFilter; import org.thingsboard.server.common.data.notification.targets.platform.UsersFilter; @@ -107,14 +108,8 @@ public class DefaultNotificationTargetService extends AbstractEntityService impl if (tenantId.equals(TenantId.SYS_TENANT_ID)) { throw new IllegalArgumentException("Customer users target is not supported for system administrator"); } - CustomerUsersFilter customerUsersConfig = (CustomerUsersFilter) usersFilter; - if (!customerUsersConfig.isGetCustomerIdFromOriginatorEntity()) { - customerId = new CustomerId(customerUsersConfig.getCustomerId()); - } - if (customerId != null && !customerId.isNullUid()) { - return userService.findCustomerUsers(tenantId, customerId, pageLink); - } - break; + CustomerUsersFilter filter = (CustomerUsersFilter) usersFilter; + return userService.findCustomerUsers(tenantId, new CustomerId(filter.getCustomerId()), pageLink); } case ALL_USERS: { if (!tenantId.equals(TenantId.SYS_TENANT_ID)) { @@ -123,6 +118,14 @@ public class DefaultNotificationTargetService extends AbstractEntityService impl return userService.findUsers(TenantId.SYS_TENANT_ID, pageLink); } } + case ORIGINATOR_ENTITY_OWNER_USERS: { + OriginatorEntityOwnerUsersFilter filter = (OriginatorEntityOwnerUsersFilter) usersFilter; + if (customerId != null && !customerId.isNullUid()) { + return userService.findCustomerUsers(tenantId, customerId, pageLink); + } else { + return userService.findTenantAdmins(tenantId, pageLink); // TODO: or should we send to all users within tenant? + } + } } return new PageData<>(); } diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index b79a4e04ab..a64fa398cd 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/dao/src/main/resources/sql/schema-entities.sql @@ -798,7 +798,6 @@ CREATE TABLE IF NOT EXISTS notification_target ( created_time BIGINT NOT NULL, tenant_id UUID NULL CONSTRAINT fk_notification_target_tenant_id REFERENCES tenant(id) ON DELETE CASCADE, name VARCHAR(255) NOT NULL, - type VARCHAR(32) NOT NULL, configuration VARCHAR(10000) NOT NULL, CONSTRAINT uq_notification_target_name UNIQUE (tenant_id, name) ); diff --git a/ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.component.html b/ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.component.html index 9bbf2a9829..1793f97f17 100644 --- a/ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.component.html +++ b/ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.component.html @@ -65,14 +65,10 @@
- - {{ 'notification.get-customer-id-from-originator' | translate }} - + [entityType]="entityType.CUSTOMER">
diff --git a/ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.componet.ts b/ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.componet.ts index 6d69db61aa..c9a68b2684 100644 --- a/ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.componet.ts +++ b/ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.componet.ts @@ -79,8 +79,7 @@ export class TargetNotificationDialogComponent extends usersFilter: this.fb.group({ type: [NotificationTargetConfigType.ALL_USERS], usersIds: [{value: null, disabled: true}, Validators.required], - customerId: [{value: null, disabled: true}, Validators.required], - getCustomerIdFromOriginatorEntity: [{value: false, disabled: true}] + customerId: [{value: null, disabled: true}, Validators.required] }) }) }); @@ -94,20 +93,11 @@ export class TargetNotificationDialogComponent extends this.targetNotificationForm.get('configuration.usersFilter.usersIds').enable({emitEvent: false}); break; case NotificationTargetConfigType.CUSTOMER_USERS: - this.targetNotificationForm.get('configuration.usersFilter.getCustomerIdFromOriginatorEntity').enable({onlySelf: true}); + this.targetNotificationForm.get('configuration.usersFilter.customerId').enable({emitEvent: false}); break; } this.targetNotificationForm.get('configuration.usersFilter.type').enable({emitEvent: false}); }); - this.targetNotificationForm.get('configuration.usersFilter.getCustomerIdFromOriginatorEntity').valueChanges.pipe( - takeUntil(this.destroy$) - ).subscribe((value: boolean) => { - if (value) { - this.targetNotificationForm.get('configuration.usersFilter.customerId').disable({emitEvent: false}); - } else { - this.targetNotificationForm.get('configuration.usersFilter.customerId').enable({emitEvent: false}); - } - }); if (isDefined(data.target)) { this.targetNotificationForm.patchValue(data.target, {emitEvent: false}); diff --git a/ui-ngx/src/app/modules/home/pages/notification-center/template-table/template-notification-dialog.component.html b/ui-ngx/src/app/modules/home/pages/notification-center/template-table/template-notification-dialog.component.html index 0aa15e225c..61df1b497c 100644 --- a/ui-ngx/src/app/modules/home/pages/notification-center/template-table/template-notification-dialog.component.html +++ b/ui-ngx/src/app/modules/home/pages/notification-center/template-table/template-notification-dialog.component.html @@ -48,7 +48,7 @@
{{ notificationTemplateTypeTranslateMap.get(notificationType).name | translate }}
-
{{ notificationTemplateTypeTranslateMap.get(notificationType).hint }}
+
{{ notificationTemplateTypeTranslateMap.get(notificationType).hint | translate }}
diff --git a/ui-ngx/src/app/shared/models/notification.models.ts b/ui-ngx/src/app/shared/models/notification.models.ts index 4fe90210a5..a793dc9e66 100644 --- a/ui-ngx/src/app/shared/models/notification.models.ts +++ b/ui-ngx/src/app/shared/models/notification.models.ts @@ -33,7 +33,6 @@ export interface Notification { readonly subject: string; readonly text: string; readonly info: NotificationInfo; - readonly originatorType: NotificationOriginatorType; readonly status: NotificationStatus; readonly createdTime: number; readonly additionalConfig?: PushDeliveryMethodAdditionalConfig; @@ -41,8 +40,7 @@ export interface Notification { export interface NotificationInfo { description: string; - dashboardId: DashboardId; - originatorType: NotificationOriginatorType; + type: string; } export interface NotificationRequest extends Omit, 'label'> { @@ -52,7 +50,6 @@ export interface NotificationRequest extends Omit; originatorEntityId: EntityId; - originatorType: NotificationOriginatorType; status: NotificationRequestStatus; stats: NotificationRequestStats; additionalConfig: NotificationRequestConfig; @@ -143,7 +140,6 @@ interface UserListNotificationTargetConfig { interface CustomerUsersNotificationTargetConfig { customerId: string; - getCustomerIdFromOriginatorEntity: boolean; } export interface SlackNotificationTargetConfig { @@ -210,12 +206,6 @@ interface SlackDeliveryMethodNotificationTemplate { conversationId: string; } -export enum NotificationOriginatorType { - ADMIN = 'ADMIN', - ALARM = 'ALARM', - RULE_NODE = 'RULE_NODE' -} - export enum NotificationStatus { SENT = 'SENT', READ = 'READ' @@ -242,9 +232,9 @@ export enum NotificationRequestStatus { } export const NotificationRequestStatusTranslateMap = new Map([ - [NotificationRequestStatus.PROCESSING, 'notification.requet-status.processing'], - [NotificationRequestStatus.SCHEDULED, 'notification.requet-status.scheduled'], - [NotificationRequestStatus.SENT, 'notification.requet-status.sent'] + [NotificationRequestStatus.PROCESSING, 'notification.request-status.processing'], + [NotificationRequestStatus.SCHEDULED, 'notification.request-status.scheduled'], + [NotificationRequestStatus.SENT, 'notification.request-status.sent'] ]); export enum SlackChanelType { @@ -262,18 +252,22 @@ export const SlackChanelTypesTranslateMap = new Map([ export enum NotificationTargetConfigType { USER_LIST = 'USER_LIST', CUSTOMER_USERS = 'CUSTOMER_USERS', - ALL_USERS = 'ALL_USERS' + ALL_USERS = 'ALL_USERS', + ORIGINATOR_ENTITY_OWNER_USERS = 'ORIGINATOR_ENTITY_OWNER_USERS' } export const NotificationTargetConfigTypeTranslateMap = new Map([ [NotificationTargetConfigType.ALL_USERS, 'notification.target-type.all-users'], [NotificationTargetConfigType.USER_LIST, 'notification.target-type.user-list'], [NotificationTargetConfigType.CUSTOMER_USERS, 'notification.target-type.customer-users'], + [NotificationTargetConfigType.ORIGINATOR_ENTITY_OWNER_USERS, 'notification.target-type.originator-entity-owner-users'] ]); export enum NotificationType { GENERAL = 'GENERAL', - ALARM = 'ALARM' + ALARM = 'ALARM', + DEVICE_INACTIVITY = 'DEVICE_INACTIVITY', + ENTITY_ACTION = "ENTITY_ACTION" } interface NotificationTemplateTypeTranslate { @@ -285,12 +279,25 @@ export const NotificationTemplateTypeTranslateMap = new Map