Browse Source

Remove duplicated type from NotificationTarget; new OriginatorEntityOwnerUsersFilter; refactoring

pull/8046/head
ViacheslavKlimov 4 years ago
parent
commit
68b0158f3e
  1. 1
      application/src/main/data/upgrade/3.4.3/schema_update.sql
  2. 5
      application/src/main/java/org/thingsboard/server/controller/NotificationController.java
  3. 1
      application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java
  4. 8
      application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java
  5. 5
      application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmNotificationRuleTriggerProcessor.java
  6. 1
      application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/DeviceInactivityNotificationRuleTriggerProcessor.java
  7. 6
      application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/EntityActionNotificationRuleTriggerProcessor.java
  8. 3
      application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java
  9. 24
      application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java
  10. 2
      application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java
  11. 6
      application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java
  12. 19
      common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationProcessingContext.java
  13. 9
      common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmNotificationInfo.java
  14. 9
      common/data/src/main/java/org/thingsboard/server/common/data/notification/info/DeviceInactivityNotificationInfo.java
  15. 19
      common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntityActionNotificationInfo.java
  16. 18
      common/data/src/main/java/org/thingsboard/server/common/data/notification/info/NotificationInfo.java
  17. 6
      common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleEngineOriginatedNotificationInfo.java
  18. 24
      common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleOriginatedNotificationInfo.java
  19. 6
      common/data/src/main/java/org/thingsboard/server/common/data/notification/info/UserOriginatedNotificationInfo.java
  20. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTarget.java
  21. 18
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/CustomerUsersFilter.java
  22. 28
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/OriginatorEntityOwnerUsersFilter.java
  23. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilter.java
  24. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilterType.java
  25. 9
      dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationTargetEntity.java
  26. 21
      dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTargetService.java
  27. 1
      dao/src/main/resources/sql/schema-entities.sql
  28. 6
      ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.component.html
  29. 14
      ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.componet.ts
  30. 2
      ui-ngx/src/app/modules/home/pages/notification-center/template-table/template-notification-dialog.component.html
  31. 45
      ui-ngx/src/app/shared/models/notification.models.ts
  32. 16
      ui-ngx/src/assets/locale/locale.constant-en_US.json

1
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)
);

5
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;

1
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) {

8
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<ListenableFuture<Void>> processForTarget(NotificationTarget target, NotificationProcessingContext ctx) {
Iterable<? extends NotificationRecipient> 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<NotificationDeliveryMethod> 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<ListenableFuture<Void>> results = new ArrayList<>();
for (NotificationRecipient recipient : recipients) {

5
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();
}

1
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();
}

6
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();
}

3
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)));

24
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<NotificationDeliveryMethod, DeliveryMethodNotificationTemplate> 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<NotificationRequest> 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);

2
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();

6
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());

19
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<String, String> createTemplateContext(User recipient) {
Map<String, String> 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;
}
}

9
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

9
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

19
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
);
}

18
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<String, String> getTemplateData();

6
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<String, String> msgMetadata;
@Override
public EntityType getOriginatorType() {
return EntityType.RULE_CHAIN;
}
@Override
public Map<String, String> getTemplateData() {
Map<String, String> templateData = new HashMap<>(msgMetadata);

24
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();
}

6
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<String, String> getTemplateData() {
return Collections.emptyMap();

2
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTarget.java

@ -37,8 +37,6 @@ public class NotificationTarget extends BaseData<NotificationTargetId> implement
@NoXss
private String name;
@NotNull
private NotificationTargetType type;
@NotNull
@Valid
private NotificationTargetConfig configuration;

18
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;
}
}
}

28
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;
}
}

3
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 {

3
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,

9
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<NotificationTarget>
@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<NotificationTarget>
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>
notificationTarget.setCreatedTime(createdTime);
notificationTarget.setTenantId(getTenantId(tenantId));
notificationTarget.setName(name);
notificationTarget.setType(type);
notificationTarget.setConfiguration(fromJson(configuration, NotificationTargetConfig.class));
return notificationTarget;
}

21
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<>();
}

1
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)
);

6
ui-ngx/src/app/modules/home/pages/notification-center/targets-table/target-notification-dialog.component.html

@ -65,14 +65,10 @@
</tb-entity-list>
<section
*ngIf="targetNotificationForm.get('configuration.usersFilter.type').value === notificationTargetConfigType.CUSTOMER_USERS">
<mat-slide-toggle formControlName="getCustomerIdFromOriginatorEntity">
{{ 'notification.get-customer-id-from-originator' | translate }}
</mat-slide-toggle>
<tb-entity-autocomplete
required
formControlName="customerId"
[entityType]="entityType.CUSTOMER"
*ngIf="!targetNotificationForm.get('configuration.usersFilter.getCustomerIdFromOriginatorEntity').value">
[entityType]="entityType.CUSTOMER">
</tb-entity-autocomplete>
</section>
</section>

14
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});

2
ui-ngx/src/app/modules/home/pages/notification-center/template-table/template-notification-dialog.component.html

@ -48,7 +48,7 @@
<mat-radio-button *ngFor="let notificationType of notificationTypes" [value]="notificationType">
<div fxLayout="column">
<div>{{ notificationTemplateTypeTranslateMap.get(notificationType).name | translate }}</div>
<div class="tb-hint">{{ notificationTemplateTypeTranslateMap.get(notificationType).hint }}</div>
<div class="tb-hint">{{ notificationTemplateTypeTranslateMap.get(notificationType).hint | translate }}</div>
</div>
</mat-radio-button>
</mat-radio-group>

45
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<BaseData<NotificationRequestId>, 'label'> {
@ -52,7 +50,6 @@ export interface NotificationRequest extends Omit<BaseData<NotificationRequestId
info?: NotificationInfo;
deliveryMethods: Array<NotificationDeliveryMethod>;
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, string>([
[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<SlackChanelType, string>([
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, string>([
[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<NotificationType, No
[NotificationType.GENERAL,
{
name: 'notification.template-type.general',
hint: 'hint'
hint: 'notification.template-hint.general'
}
],
[NotificationType.ALARM,
{
name: 'notification.template-type.alarm',
hint: 'hint'
}]
hint: 'notification.template-hint.alarm'
}
],
[NotificationType.DEVICE_INACTIVITY,
{
name: 'notification.template-type.device-inactivity',
hint: 'notification.template-hint.device-inactivity'
}
],
[NotificationType.ENTITY_ACTION,
{
name: 'notification.template-type.entity-action',
hint: 'notification.template-hint.entity-action'
}
]
]);

16
ui-ngx/src/assets/locale/locale.constant-en_US.json

@ -2713,7 +2713,6 @@
"edit-notification-template": "Edit notification template",
"edit-template": "Edit template",
"email-settings": "Email settings",
"get-customer-id-from-originator": "Get Customer id from originator",
"inbox": "Inbox",
"link": "Link",
"link-required": "Link is required",
@ -2734,7 +2733,7 @@
"notification-target": "Notification recipient",
"notify-again": "Notify again",
"recipients-count": "{ count, plural, 1 {1 Recipient} other {# Recipients} }",
"requet-status": {
"request-status": {
"processing": "Processing",
"scheduled": "Scheduled",
"sent": "Sent"
@ -2768,7 +2767,8 @@
"all-users": "All users",
"customer-users": "Customer users",
"type": "Type",
"user-list": "User list"
"user-list": "User list",
"originator-entity-owner-users": "Users of originator entity owner"
},
"targets": "Recipients",
"targets-required": "Recipients is required",
@ -2776,7 +2776,15 @@
"template-required": "Template is required",
"template-type": {
"alarm": "Alarm",
"general": "General"
"general": "General",
"device-inactivity": "Device inactivity",
"entity-action": "Entity action"
},
"template-hint": {
"general": "Available params: ${recipientEmail}, ${recipientFirstName}, ${recipientLastName}",
"alarm": "Available params: ${alarmType}, ${alarmSeverity}, ${alarmStatus}, ${alarmOriginatorEntityType}, ${alarmOriginatorId}, ${alarmId}",
"device-inactivity": "Available params: ${deviceName}, ${deviceType}, ${deviceId}",
"entity-action": "Available params: ${actionType}, ${entityType}, ${entityName}, ${entityId}, ${originatorUserName}, ${originatorUserId}"
},
"templates": "Templates",
"text": "Text",

Loading…
Cancel
Save