diff --git a/application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleEngineComponentActor.java b/application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleEngineComponentActor.java index d330dfceec..f665ca256a 100644 --- a/application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleEngineComponentActor.java +++ b/application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleEngineComponentActor.java @@ -50,7 +50,8 @@ public abstract class RuleEngineComponentActor recipients = notificationTargetService.findRecipientsForNotificationTargetConfig(user.getTenantId(), null, - target.getConfiguration(), new PageLink(recipientsPreviewSize)); + PageData recipients = notificationTargetService.findRecipientsForNotificationTargetConfig(user.getTenantId(), + (PlatformUsersNotificationTargetConfig) target.getConfiguration(), new PageLink(recipientsPreviewSize)); recipientsCount = (int) recipients.getTotalElements(); for (User recipient : recipients.getData()) { if (recipientsPreview.size() < recipientsPreviewSize) { diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java index 3107435e2d..4fd6b93022 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java @@ -116,7 +116,7 @@ public class NotificationTargetController extends BaseController { } PageLink pageLink = createPageLink(pageSize, page, null, null, null); - return notificationTargetService.findRecipientsForNotificationTargetConfig(user.getTenantId(), null, notificationTarget.getConfiguration(), pageLink); + return notificationTargetService.findRecipientsForNotificationTargetConfig(user.getTenantId(), (PlatformUsersNotificationTargetConfig) notificationTarget.getConfiguration(), pageLink); } @GetMapping(value = "/targets", params = {"ids"}) 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 2eedd18d00..d39e200337 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 @@ -142,6 +142,13 @@ public class EntityActionService { if (user != null) { metaData.putValue("userId", user.getId().toString()); metaData.putValue("userName", user.getName()); + metaData.putValue("userEmail", user.getEmail()); + if (user.getFirstName() != null) { + metaData.putValue("userFirstName", user.getFirstName()); + } + if (user.getLastName() != null) { + metaData.putValue("userLastName", user.getLastName()); + } } if (customerId != null && !customerId.isNullUid()) { metaData.putValue("customerId", customerId.toString()); 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 65469a65a0..ef3c4f8706 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 @@ -22,13 +22,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.thingsboard.common.util.DonAsynchron; -import org.thingsboard.rule.engine.api.MailService; import org.thingsboard.rule.engine.api.NotificationCenter; -import org.thingsboard.rule.engine.api.SmsService; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.id.NotificationId; import org.thingsboard.server.common.data.id.NotificationRequestId; +import org.thingsboard.server.common.data.id.NotificationRuleId; import org.thingsboard.server.common.data.id.NotificationTargetId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; @@ -46,7 +45,6 @@ import org.thingsboard.server.common.data.notification.settings.NotificationSett import org.thingsboard.server.common.data.notification.targets.NotificationRecipient; import org.thingsboard.server.common.data.notification.targets.NotificationTarget; import org.thingsboard.server.common.data.notification.targets.platform.PlatformUsersNotificationTargetConfig; -import org.thingsboard.server.common.data.notification.targets.platform.UsersFilterType; 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.NotificationTemplate; @@ -103,59 +101,57 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple private final NotificationsTopicService notificationsTopicService; private final TbQueueProducerProvider producerProvider; private final RateLimitService rateLimitService; - private final MailService mailService; - private final SmsService smsService; private Map channels; - @Override - public NotificationRequest processNotificationRequest(TenantId tenantId, NotificationRequest notificationRequest) { + public NotificationRequest processNotificationRequest(TenantId tenantId, NotificationRequest request) { if (!rateLimitService.checkRateLimit(tenantId, LimitedApi.NOTIFICATION_REQUEST)) { throw new TbRateLimitsException(EntityType.TENANT); } - NotificationSettings settings = notificationSettingsService.findNotificationSettings(tenantId); + NotificationTemplate notificationTemplate; - if (notificationRequest.getTemplateId() != null) { - notificationTemplate = notificationTemplateService.findNotificationTemplateById(tenantId, notificationRequest.getTemplateId()); + if (request.getTemplateId() != null) { + notificationTemplate = notificationTemplateService.findNotificationTemplateById(tenantId, request.getTemplateId()); } else { - notificationTemplate = notificationRequest.getTemplate(); + notificationTemplate = request.getTemplate(); } if (notificationTemplate == null) throw new IllegalArgumentException("Template is missing"); - List targets = notificationRequest.getTargets().stream().map(NotificationTargetId::new) + List targets = request.getTargets().stream().map(NotificationTargetId::new) .map(id -> notificationTargetService.findNotificationTargetById(tenantId, id)).collect(Collectors.toList()); - Set availableDeliveryMethods = getAvailableDeliveryMethods(tenantId); + NotificationRuleId ruleId = request.getRuleId(); notificationTemplate.getConfiguration().getDeliveryMethodsTemplates().forEach((deliveryMethod, template) -> { if (!template.isEnabled()) return; - if (!availableDeliveryMethods.contains(deliveryMethod)) { - throw new IllegalArgumentException("Settings for " + deliveryMethod.getName() + " are missing"); + if (!channels.get(deliveryMethod).check(tenantId)) { + throw new IllegalArgumentException("Unable to send notification via " + deliveryMethod.getName() + ": not configured or not working"); } - if (notificationRequest.getRuleId() == null) { + if (ruleId == null) { if (targets.stream().noneMatch(target -> target.getConfiguration().getType().getSupportedDeliveryMethods().contains(deliveryMethod))) { throw new IllegalArgumentException("Target for " + deliveryMethod.getName() + " delivery method is missing"); } } }); - if (notificationRequest.getAdditionalConfig() != null) { - NotificationRequestConfig config = notificationRequest.getAdditionalConfig(); - if (config.getSendingDelayInSec() > 0 && notificationRequest.getId() == null) { - notificationRequest.setStatus(NotificationRequestStatus.SCHEDULED); - NotificationRequest savedNotificationRequest = notificationRequestService.saveNotificationRequest(tenantId, notificationRequest); - forwardToNotificationSchedulerService(tenantId, savedNotificationRequest.getId()); - return savedNotificationRequest; + if (request.getAdditionalConfig() != null) { + NotificationRequestConfig config = request.getAdditionalConfig(); + if (config.getSendingDelayInSec() > 0 && request.getId() == null) { + request.setStatus(NotificationRequestStatus.SCHEDULED); + request = notificationRequestService.saveNotificationRequest(tenantId, request); + forwardToNotificationSchedulerService(tenantId, request.getId()); + return request; } } + NotificationSettings settings = notificationSettingsService.findNotificationSettings(tenantId); - log.debug("Processing notification request (tenantId: {}, targets: {})", tenantId, notificationRequest.getTargets()); - notificationRequest.setStatus(NotificationRequestStatus.PROCESSING); - NotificationRequest savedNotificationRequest = notificationRequestService.saveNotificationRequest(tenantId, notificationRequest); + log.debug("Processing notification request (tenantId: {}, targets: {})", tenantId, request.getTargets()); + request.setStatus(NotificationRequestStatus.PROCESSING); + request = notificationRequestService.saveNotificationRequest(tenantId, request); NotificationProcessingContext ctx = NotificationProcessingContext.builder() .tenantId(tenantId) - .request(savedNotificationRequest) + .request(request) .settings(settings) .template(notificationTemplate) .build(); @@ -169,7 +165,7 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple } Futures.whenAllComplete(results).run(() -> { - NotificationRequestId requestId = savedNotificationRequest.getId(); + NotificationRequestId requestId = ctx.getRequest().getId(); log.debug("[{}] Notification request processing is finished", requestId); NotificationRequestStats stats = ctx.getStats(); try { @@ -180,33 +176,28 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple }, dbCallbackExecutorService); }); - return savedNotificationRequest; + return request; } private List> processForTarget(NotificationTarget target, NotificationProcessingContext ctx) { Iterable recipients; switch (target.getConfiguration().getType()) { case PLATFORM_USERS: { - PlatformUsersNotificationTargetConfig platformUsersTargetConfig = (PlatformUsersNotificationTargetConfig) target.getConfiguration(); - if (platformUsersTargetConfig.getUsersFilter().getType() == UsersFilterType.AFFECTED_USER) { - if (ctx.getRequest().getInfo() instanceof RuleOriginatedNotificationInfo) { - UserId targetUserId = ((RuleOriginatedNotificationInfo) ctx.getRequest().getInfo()).getTargetUserId(); - if (targetUserId != null) { - recipients = List.of(userService.findUserById(ctx.getTenantId(), targetUserId)); - break; - } - } - recipients = Collections.emptyList(); + PlatformUsersNotificationTargetConfig targetConfig = (PlatformUsersNotificationTargetConfig) target.getConfiguration(); + if (targetConfig.getUsersFilter().getType().isForRules()) { + recipients = new PageDataIterable<>(pageLink -> { + return notificationTargetService.findRecipientsForRuleNotificationTargetConfig(ctx.getTenantId(), targetConfig, (RuleOriginatedNotificationInfo) ctx.getRequest().getInfo(), pageLink); + }, 500); } else { recipients = new PageDataIterable<>(pageLink -> { - return notificationTargetService.findRecipientsForNotificationTargetConfig(ctx.getTenantId(), ctx.getCustomerId(), platformUsersTargetConfig, pageLink); + return notificationTargetService.findRecipientsForNotificationTargetConfig(ctx.getTenantId(), targetConfig, pageLink); }, 500); } break; } case SLACK: { - SlackNotificationTargetConfig slackTargetConfig = (SlackNotificationTargetConfig) target.getConfiguration(); - recipients = List.of(slackTargetConfig.getConversation()); + SlackNotificationTargetConfig targetConfig = (SlackNotificationTargetConfig) target.getConfiguration(); + recipients = List.of(targetConfig.getConversation()); break; } default: { @@ -345,20 +336,15 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple @Override public Set getAvailableDeliveryMethods(TenantId tenantId) { - Set deliveryMethods = new HashSet<>(); - deliveryMethods.add(NotificationDeliveryMethod.WEB); - NotificationSettings notificationSettings = notificationSettingsService.findNotificationSettings(tenantId); - if (notificationSettings.getDeliveryMethodsConfigs().containsKey(NotificationDeliveryMethod.SLACK)) { - deliveryMethods.add(NotificationDeliveryMethod.SLACK); - } - try { - mailService.testConnection(tenantId); - deliveryMethods.add(NotificationDeliveryMethod.EMAIL); - } catch (Exception e) {} - if (smsService.isConfigured(tenantId)) { - deliveryMethods.add(NotificationDeliveryMethod.SMS); - } - return deliveryMethods; + return channels.values().stream() + .filter(channel -> channel.check(tenantId)) + .map(NotificationChannel::getDeliveryMethod) + .collect(Collectors.toSet()); + } + + @Override + public boolean check(TenantId tenantId) { + return true; } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/notification/NotificationProcessingContext.java b/application/src/main/java/org/thingsboard/server/service/notification/NotificationProcessingContext.java index 5492650d48..c9e34227ee 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/NotificationProcessingContext.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/NotificationProcessingContext.java @@ -154,7 +154,7 @@ public class NotificationProcessingContext { public CustomerId getCustomerId() { if (request.getInfo() instanceof RuleOriginatedNotificationInfo) { - return ((RuleOriginatedNotificationInfo) request.getInfo()).getOriginatorEntityCustomerId(); + return ((RuleOriginatedNotificationInfo) request.getInfo()).getAffectedCustomerId(); } else { return null; } diff --git a/application/src/main/java/org/thingsboard/server/service/notification/channels/EmailNotificationChannel.java b/application/src/main/java/org/thingsboard/server/service/notification/channels/EmailNotificationChannel.java index ce9c6e3b98..bbcd483a0f 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/channels/EmailNotificationChannel.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/channels/EmailNotificationChannel.java @@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.thingsboard.rule.engine.api.MailService; import org.thingsboard.server.common.data.User; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.notification.NotificationDeliveryMethod; import org.thingsboard.server.common.data.notification.template.EmailDeliveryMethodNotificationTemplate; import org.thingsboard.server.service.mail.MailExecutorService; @@ -40,6 +41,16 @@ public class EmailNotificationChannel implements NotificationChannel { ListenableFuture sendNotification(R recipient, T processedTemplate, NotificationProcessingContext ctx); + boolean check(TenantId tenantId); + NotificationDeliveryMethod getDeliveryMethod(); } diff --git a/application/src/main/java/org/thingsboard/server/service/notification/channels/SlackNotificationChannel.java b/application/src/main/java/org/thingsboard/server/service/notification/channels/SlackNotificationChannel.java index 67108c2a37..7ff48d4cb9 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/channels/SlackNotificationChannel.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/channels/SlackNotificationChannel.java @@ -19,7 +19,10 @@ import com.google.common.util.concurrent.ListenableFuture; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.thingsboard.rule.engine.api.slack.SlackService; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.notification.NotificationDeliveryMethod; +import org.thingsboard.server.common.data.notification.settings.NotificationSettings; +import org.thingsboard.server.dao.notification.NotificationSettingsService; import org.thingsboard.server.service.notification.NotificationProcessingContext; import org.thingsboard.server.common.data.notification.settings.SlackNotificationDeliveryMethodConfig; import org.thingsboard.server.common.data.notification.targets.slack.SlackConversation; @@ -31,6 +34,7 @@ import org.thingsboard.server.service.executors.ExternalCallExecutorService; public class SlackNotificationChannel implements NotificationChannel { private final SlackService slackService; + private final NotificationSettingsService notificationSettingsService; private final ExternalCallExecutorService executor; @Override @@ -42,6 +46,12 @@ public class SlackNotificationChannel implements NotificationChannel ruleEngineMsgTypeToTriggerType = new HashMap<>(); @Override - public void process(TenantId tenantId, NotificationRuleTrigger trigger) { + public void process(NotificationRuleTrigger trigger) { List rules = notificationRuleService.findNotificationRulesByTenantIdAndTriggerType( - trigger.getType().isTenantLevel() ? tenantId : TenantId.SYS_TENANT_ID, trigger.getType()); + trigger.getType().isTenantLevel() ? trigger.getTenantId() : TenantId.SYS_TENANT_ID, trigger.getType()); for (NotificationRule rule : rules) { notificationExecutor.submit(() -> { try { - processNotificationRule(tenantId, rule, trigger); + processNotificationRule(rule, trigger); } catch (Throwable e) { log.error("Failed to process notification rule {} for trigger type {} with trigger object {}", rule.getId(), rule.getTriggerType(), trigger, e); } @@ -92,18 +92,19 @@ public class DefaultNotificationRuleProcessingService implements NotificationRul if (triggerType == null) { return; } - process(tenantId, RuleEngineMsgTrigger.builder() + process(RuleEngineMsgTrigger.builder() + .tenantId(tenantId) .msg(ruleEngineMsg) .triggerType(triggerType) .build()); } - private void processNotificationRule(TenantId tenantId, NotificationRule rule, NotificationRuleTrigger trigger) { + private void processNotificationRule(NotificationRule rule, NotificationRuleTrigger trigger) { NotificationRuleTriggerConfig triggerConfig = rule.getTriggerConfig(); log.debug("Processing notification rule '{}' for trigger type {}", rule.getName(), rule.getTriggerType()); if (matchesClearRule(trigger, triggerConfig)) { - List notificationRequests = notificationRequestService.findNotificationRequestsByRuleIdAndOriginatorEntityId(tenantId, rule.getId(), trigger.getOriginatorEntityId()); + List notificationRequests = findAlreadySentNotificationRequests(rule, trigger); if (notificationRequests.isEmpty()) { return; } @@ -113,11 +114,11 @@ public class DefaultNotificationRuleProcessingService implements NotificationRul .flatMap(notificationRequest -> notificationRequest.getTargets().stream()) .distinct().collect(Collectors.toList()); NotificationInfo notificationInfo = constructNotificationInfo(trigger, triggerConfig); - submitNotificationRequest(tenantId, targets, rule, trigger.getOriginatorEntityId(), notificationInfo, 0); + submitNotificationRequest(targets, rule, trigger.getOriginatorEntityId(), notificationInfo, 0); notificationRequests.forEach(notificationRequest -> { if (notificationRequest.isScheduled()) { - notificationCenter.deleteNotificationRequest(tenantId, notificationRequest.getId()); + notificationCenter.deleteNotificationRequest(rule.getTenantId(), notificationRequest.getId()); } }); return; @@ -126,31 +127,23 @@ public class DefaultNotificationRuleProcessingService implements NotificationRul if (matchesFilter(trigger, triggerConfig)) { NotificationInfo notificationInfo = constructNotificationInfo(trigger, triggerConfig); rule.getRecipientsConfig().getTargetsTable().forEach((delay, targets) -> { - submitNotificationRequest(tenantId, targets, rule, trigger.getOriginatorEntityId(), notificationInfo, delay); + submitNotificationRequest(targets, rule, trigger.getOriginatorEntityId(), notificationInfo, delay); }); } } - private boolean matchesFilter(NotificationRuleTrigger trigger, NotificationRuleTriggerConfig triggerConfig) { - return triggerProcessors.get(triggerConfig.getTriggerType()).matchesFilter(trigger, triggerConfig); + private List findAlreadySentNotificationRequests(NotificationRule rule, NotificationRuleTrigger trigger) { + return notificationRequestService.findNotificationRequestsByRuleIdAndOriginatorEntityId(rule.getTenantId(), rule.getId(), trigger.getOriginatorEntityId()); } - private boolean matchesClearRule(NotificationRuleTrigger trigger, NotificationRuleTriggerConfig triggerConfig) { - return triggerProcessors.get(triggerConfig.getTriggerType()).matchesClearRule(trigger, triggerConfig); - } - - private NotificationInfo constructNotificationInfo(NotificationRuleTrigger trigger, NotificationRuleTriggerConfig triggerConfig) { - return triggerProcessors.get(triggerConfig.getTriggerType()).constructNotificationInfo(trigger, triggerConfig); - } - - private void submitNotificationRequest(TenantId tenantId, List targets, NotificationRule rule, + private void submitNotificationRequest(List targets, NotificationRule rule, EntityId originatorEntityId, NotificationInfo notificationInfo, int delayInSec) { NotificationRequestConfig config = new NotificationRequestConfig(); if (delayInSec > 0) { config.setSendingDelayInSec(delayInSec); } NotificationRequest notificationRequest = NotificationRequest.builder() - .tenantId(tenantId) + .tenantId(rule.getTenantId()) .targets(targets) .templateId(rule.getTemplateId()) .additionalConfig(config) @@ -161,13 +154,25 @@ public class DefaultNotificationRuleProcessingService implements NotificationRul notificationExecutor.submit(() -> { try { log.debug("Submitting notification request for rule '{}' with delay of {} sec to targets {}", rule.getName(), delayInSec, targets); - notificationCenter.processNotificationRequest(tenantId, notificationRequest); + notificationCenter.processNotificationRequest(rule.getTenantId(), notificationRequest); } catch (Exception e) { log.error("Failed to process notification request for rule {}", rule.getId(), e); } }); } + private boolean matchesFilter(NotificationRuleTrigger trigger, NotificationRuleTriggerConfig triggerConfig) { + return triggerProcessors.get(triggerConfig.getTriggerType()).matchesFilter(trigger, triggerConfig); + } + + private boolean matchesClearRule(NotificationRuleTrigger trigger, NotificationRuleTriggerConfig triggerConfig) { + return triggerProcessors.get(triggerConfig.getTriggerType()).matchesClearRule(trigger, triggerConfig); + } + + private NotificationInfo constructNotificationInfo(NotificationRuleTrigger trigger, NotificationRuleTriggerConfig triggerConfig) { + return triggerProcessors.get(triggerConfig.getTriggerType()).constructNotificationInfo(trigger); + } + @EventListener(ComponentLifecycleMsg.class) public void onNotificationRuleDeleted(ComponentLifecycleMsg componentLifecycleMsg) { if (componentLifecycleMsg.getEvent() != ComponentLifecycleEvent.DELETED || diff --git a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmAssignmentTriggerProcessor.java b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmAssignmentTriggerProcessor.java index 9fd0c06118..a1e900763e 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmAssignmentTriggerProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmAssignmentTriggerProcessor.java @@ -23,7 +23,7 @@ import org.thingsboard.server.common.data.alarm.AlarmAssignee; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.alarm.AlarmStatusFilter; import org.thingsboard.server.common.data.notification.info.AlarmAssignmentNotificationInfo; -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.rule.trigger.AlarmAssignmentNotificationRuleTriggerConfig; import org.thingsboard.server.common.data.notification.rule.trigger.AlarmAssignmentNotificationRuleTriggerConfig.Action; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; @@ -49,7 +49,7 @@ public class AlarmAssignmentTriggerProcessor implements RuleEngineMsgNotificatio } @Override - public NotificationInfo constructNotificationInfo(RuleEngineMsgTrigger trigger, AlarmAssignmentNotificationRuleTriggerConfig triggerConfig) { + public RuleOriginatedNotificationInfo constructNotificationInfo(RuleEngineMsgTrigger trigger) { AlarmInfo alarmInfo = JacksonUtil.fromString(trigger.getMsg().getData(), AlarmInfo.class); AlarmAssignee assignee = alarmInfo.getAssignee(); return AlarmAssignmentNotificationInfo.builder() @@ -58,7 +58,9 @@ public class AlarmAssignmentTriggerProcessor implements RuleEngineMsgNotificatio .assigneeLastName(assignee != null ? assignee.getLastName() : null) .assigneeEmail(assignee != null ? assignee.getEmail() : null) .assigneeId(assignee != null ? assignee.getId() : null) - .userName(trigger.getMsg().getMetaData().getValue("userName")) + .userEmail(trigger.getMsg().getMetaData().getValue("userEmail")) + .userFirstName(trigger.getMsg().getMetaData().getValue("userFirstName")) + .userLastName(trigger.getMsg().getMetaData().getValue("userLastName")) .alarmId(alarmInfo.getUuidId()) .alarmType(alarmInfo.getType()) .alarmOriginator(alarmInfo.getOriginator()) diff --git a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmCommentTriggerProcessor.java b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmCommentTriggerProcessor.java index 0250f0929f..39891e8853 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmCommentTriggerProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmCommentTriggerProcessor.java @@ -24,7 +24,7 @@ import org.thingsboard.server.common.data.alarm.AlarmCommentType; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.alarm.AlarmStatusFilter; import org.thingsboard.server.common.data.notification.info.AlarmCommentNotificationInfo; -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.rule.trigger.AlarmCommentNotificationRuleTriggerConfig; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; import org.thingsboard.server.common.msg.TbMsg; @@ -59,14 +59,16 @@ public class AlarmCommentTriggerProcessor implements RuleEngineMsgNotificationRu } @Override - public NotificationInfo constructNotificationInfo(RuleEngineMsgTrigger trigger, AlarmCommentNotificationRuleTriggerConfig triggerConfig) { + public RuleOriginatedNotificationInfo constructNotificationInfo(RuleEngineMsgTrigger trigger) { TbMsg msg = trigger.getMsg(); AlarmComment comment = JacksonUtil.fromString(msg.getMetaData().getValue("comment"), AlarmComment.class); AlarmInfo alarmInfo = JacksonUtil.fromString(msg.getData(), AlarmInfo.class); return AlarmCommentNotificationInfo.builder() .comment(comment.getComment().get("text").asText()) .action(msg.getType().equals(DataConstants.COMMENT_CREATED) ? "added" : "updated") - .userName(msg.getMetaData().getValue("userName")) + .userEmail(trigger.getMsg().getMetaData().getValue("userEmail")) + .userFirstName(trigger.getMsg().getMetaData().getValue("userFirstName")) + .userLastName(trigger.getMsg().getMetaData().getValue("userLastName")) .alarmId(alarmInfo.getUuidId()) .alarmType(alarmInfo.getType()) .alarmOriginator(alarmInfo.getOriginator()) diff --git a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmTriggerProcessor.java b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmTriggerProcessor.java index 085fb02bbc..23dfb4938e 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmTriggerProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmTriggerProcessor.java @@ -20,7 +20,7 @@ import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.alarm.AlarmStatusFilter; 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.rule.trigger.AlarmNotificationRuleTriggerConfig; import org.thingsboard.server.common.data.notification.rule.trigger.AlarmNotificationRuleTriggerConfig.AlarmAction; import org.thingsboard.server.common.data.notification.rule.trigger.AlarmNotificationRuleTriggerConfig.ClearRule; @@ -93,7 +93,7 @@ public class AlarmTriggerProcessor implements NotificationRuleTriggerProcessor targets, NotificationTemplateId notificationTemplateId, int delayInSec) { NotificationRequestConfig config = new NotificationRequestConfig(); config.setSendingDelayInSec(delayInSec); - UserOriginatedNotificationInfo notificationInfo = new UserOriginatedNotificationInfo(); - notificationInfo.setDescription("My description"); NotificationRequest notificationRequest = NotificationRequest.builder() .targets(targets.stream().map(UUIDBased::getId).collect(Collectors.toList())) .templateId(notificationTemplateId) - .info(notificationInfo) .additionalConfig(config) .build(); return doPost("/api/notification/request", notificationRequest, NotificationRequest.class); 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 08ac826c51..784bc53335 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 @@ -35,7 +35,6 @@ import org.thingsboard.server.common.data.notification.NotificationRequestPrevie import org.thingsboard.server.common.data.notification.NotificationRequestStats; import org.thingsboard.server.common.data.notification.NotificationRequestStatus; 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.settings.SlackNotificationDeliveryMethodConfig; import org.thingsboard.server.common.data.notification.targets.NotificationTarget; @@ -49,9 +48,9 @@ import org.thingsboard.server.common.data.notification.template.DeliveryMethodNo import org.thingsboard.server.common.data.notification.template.EmailDeliveryMethodNotificationTemplate; import org.thingsboard.server.common.data.notification.template.NotificationTemplate; import org.thingsboard.server.common.data.notification.template.NotificationTemplateConfig; -import org.thingsboard.server.common.data.notification.template.WebDeliveryMethodNotificationTemplate; import org.thingsboard.server.common.data.notification.template.SlackDeliveryMethodNotificationTemplate; import org.thingsboard.server.common.data.notification.template.SmsDeliveryMethodNotificationTemplate; +import org.thingsboard.server.common.data.notification.template.WebDeliveryMethodNotificationTemplate; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.Authority; 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 fdcb5e754c..f748dea86e 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 @@ -123,7 +123,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { @Test public void testNotificationRuleProcessing_entityActionTrigger() throws Exception { String notificationSubject = "${actionType}: ${entityType} [${entityId}]"; - String notificationText = "User: ${originatorUserName}"; + String notificationText = "User: ${userEmail}"; NotificationTemplate notificationTemplate = createNotificationTemplate(NotificationType.GENERAL, notificationSubject, notificationText, NotificationDeliveryMethod.WEB); NotificationRule notificationRule = new NotificationRule(); diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleProcessingService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleProcessingService.java index f144db7a62..9b7b63a708 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleProcessingService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleProcessingService.java @@ -16,12 +16,12 @@ package org.thingsboard.server.dao.notification; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTrigger; +import org.thingsboard.server.dao.notification.trigger.NotificationRuleTrigger; import org.thingsboard.server.common.msg.TbMsg; public interface NotificationRuleProcessingService { - void process(TenantId tenantId, NotificationRuleTrigger trigger); + void process(NotificationRuleTrigger trigger); void process(TenantId tenantId, TbMsg ruleEngineMsg); diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationTargetService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationTargetService.java index b67edd123c..3c52a53933 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationTargetService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationTargetService.java @@ -20,8 +20,10 @@ import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.NotificationTargetId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.notification.NotificationType; +import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotificationInfo; 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.PlatformUsersNotificationTargetConfig; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; @@ -41,9 +43,9 @@ public interface NotificationTargetService { PageData findRecipientsForNotificationTarget(TenantId tenantId, CustomerId customerId, NotificationTargetId targetId, PageLink pageLink); - int countRecipientsForNotificationTargetConfig(TenantId tenantId, NotificationTargetConfig targetConfig); + PageData findRecipientsForNotificationTargetConfig(TenantId tenantId, PlatformUsersNotificationTargetConfig targetConfig, PageLink pageLink); - PageData findRecipientsForNotificationTargetConfig(TenantId tenantId, CustomerId customerId, NotificationTargetConfig targetConfig, PageLink pageLink); + PageData findRecipientsForRuleNotificationTargetConfig(TenantId tenantId, PlatformUsersNotificationTargetConfig targetConfig, RuleOriginatedNotificationInfo info, PageLink pageLink); void deleteNotificationTargetById(TenantId tenantId, NotificationTargetId id); diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/AlarmTrigger.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/AlarmTrigger.java index 309e48a3fc..f0495d358e 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/AlarmTrigger.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/AlarmTrigger.java @@ -18,7 +18,7 @@ package org.thingsboard.server.dao.notification.trigger; import lombok.Builder; import lombok.Data; import org.thingsboard.server.common.data.id.EntityId; -import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTrigger; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; import org.thingsboard.server.dao.alarm.AlarmApiCallResult; @@ -26,6 +26,7 @@ import org.thingsboard.server.dao.alarm.AlarmApiCallResult; @Builder public class AlarmTrigger implements NotificationRuleTrigger { + private final TenantId tenantId; private final AlarmApiCallResult alarmUpdate; @Override diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/EntitiesLimitTrigger.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/EntitiesLimitTrigger.java index 330e7de9d4..4d0f09bc94 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/EntitiesLimitTrigger.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/EntitiesLimitTrigger.java @@ -20,7 +20,6 @@ import lombok.Data; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTrigger; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; @Data diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NewPlatformVersionTrigger.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/NewPlatformVersionTrigger.java similarity index 82% rename from common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NewPlatformVersionTrigger.java rename to common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/NewPlatformVersionTrigger.java index 2959c22b8d..234aa2904c 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NewPlatformVersionTrigger.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/NewPlatformVersionTrigger.java @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.server.common.data.notification.rule.trigger; +package org.thingsboard.server.dao.notification.trigger; import lombok.Builder; import lombok.Data; import org.thingsboard.server.common.data.UpdateMessage; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; @Data @Builder @@ -32,6 +33,11 @@ public class NewPlatformVersionTrigger implements NotificationRuleTrigger { return NotificationRuleTriggerType.NEW_PLATFORM_VERSION; } + @Override + public TenantId getTenantId() { + return TenantId.SYS_TENANT_ID; + } + @Override public EntityId getOriginatorEntityId() { return TenantId.SYS_TENANT_ID; diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTrigger.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/NotificationRuleTrigger.java similarity index 77% rename from common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTrigger.java rename to common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/NotificationRuleTrigger.java index a2ac4c9d47..cadbbe107a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/NotificationRuleTrigger.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/NotificationRuleTrigger.java @@ -13,14 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.server.common.data.notification.rule.trigger; +package org.thingsboard.server.dao.notification.trigger; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; public interface NotificationRuleTrigger { NotificationRuleTriggerType getType(); + TenantId getTenantId(); + EntityId getOriginatorEntityId(); } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/RuleEngineComponentLifecycleEventTrigger.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/RuleEngineComponentLifecycleEventTrigger.java index 4ba438a385..5db59c557b 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/RuleEngineComponentLifecycleEventTrigger.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/RuleEngineComponentLifecycleEventTrigger.java @@ -19,7 +19,7 @@ import lombok.Builder; import lombok.Data; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.RuleChainId; -import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTrigger; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; @@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; @Builder public class RuleEngineComponentLifecycleEventTrigger implements NotificationRuleTrigger { + private final TenantId tenantId; private final RuleChainId ruleChainId; private final String ruleChainName; private final EntityId componentId; diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/RuleEngineMsgTrigger.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/RuleEngineMsgTrigger.java index 6e186c90c3..1dd3c153b3 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/RuleEngineMsgTrigger.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/trigger/RuleEngineMsgTrigger.java @@ -18,7 +18,7 @@ package org.thingsboard.server.dao.notification.trigger; import lombok.Builder; import lombok.Data; import org.thingsboard.server.common.data.id.EntityId; -import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTrigger; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType; import org.thingsboard.server.common.msg.TbMsg; @@ -26,6 +26,7 @@ import org.thingsboard.server.common.msg.TbMsg; @Builder public class RuleEngineMsgTrigger implements NotificationRuleTrigger { + private final TenantId tenantId; private final TbMsg msg; private final NotificationRuleTriggerType triggerType; diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmAssignmentNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmAssignmentNotificationInfo.java index 46de48840e..4328885509 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmAssignmentNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmAssignmentNotificationInfo.java @@ -37,11 +37,15 @@ import static org.thingsboard.server.common.data.util.CollectionsUtil.mapOf; public class AlarmAssignmentNotificationInfo implements RuleOriginatedNotificationInfo { private String action; + + private String assigneeEmail; private String assigneeFirstName; private String assigneeLastName; - private String assigneeEmail; private UserId assigneeId; - private String userName; + + private String userEmail; + private String userFirstName; + private String userLastName; private String alarmType; private UUID alarmId; @@ -59,7 +63,9 @@ public class AlarmAssignmentNotificationInfo implements RuleOriginatedNotificati "assigneeLastName", assigneeLastName, "assigneeEmail", assigneeEmail, "assigneeId", assigneeId != null ? assigneeId.toString() : null, - "userName", userName, + "userEmail", userEmail, + "userFirstName", userFirstName, + "userLastName", userLastName, "alarmType", alarmType, "alarmId", alarmId.toString(), "alarmSeverity", alarmSeverity.name().toLowerCase(), @@ -71,12 +77,12 @@ public class AlarmAssignmentNotificationInfo implements RuleOriginatedNotificati } @Override - public CustomerId getOriginatorEntityCustomerId() { + public CustomerId getAffectedCustomerId() { return alarmCustomerId; } @Override - public UserId getTargetUserId() { + public UserId getAffectedUserId() { return assigneeId; } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmCommentNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmCommentNotificationInfo.java index 59026a5666..1122741888 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmCommentNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmCommentNotificationInfo.java @@ -37,7 +37,10 @@ public class AlarmCommentNotificationInfo implements RuleOriginatedNotificationI private String comment; private String action; - private String userName; + + private String userEmail; + private String userFirstName; + private String userLastName; private String alarmType; private UUID alarmId; @@ -52,7 +55,9 @@ public class AlarmCommentNotificationInfo implements RuleOriginatedNotificationI return mapOf( "comment", comment, "action", action, - "userName", userName, + "userEmail", userEmail, + "userFirstName", userFirstName, + "userLastName", userLastName, "alarmType", alarmType, "alarmId", alarmId.toString(), "alarmSeverity", alarmSeverity.name().toLowerCase(), @@ -64,7 +69,7 @@ public class AlarmCommentNotificationInfo implements RuleOriginatedNotificationI } @Override - public CustomerId getOriginatorEntityCustomerId() { + public CustomerId getAffectedCustomerId() { return alarmCustomerId; } 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 ed179ad4a4..d3af30907d 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 @@ -59,7 +59,7 @@ public class AlarmNotificationInfo implements RuleOriginatedNotificationInfo { } @Override - public CustomerId getOriginatorEntityCustomerId() { + public CustomerId getAffectedCustomerId() { return alarmCustomerId; } 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 bb77068cdf..82a225bddc 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 @@ -40,11 +40,6 @@ public class DeviceInactivityNotificationInfo implements RuleOriginatedNotificat private String deviceType; private CustomerId deviceCustomerId; - @Override - public CustomerId getOriginatorEntityCustomerId() { - return deviceCustomerId; - } - @Override public Map getTemplateData() { return mapOf( @@ -55,6 +50,11 @@ public class DeviceInactivityNotificationInfo implements RuleOriginatedNotificat ); } + @Override + public CustomerId getAffectedCustomerId() { + return deviceCustomerId; + } + @Override public EntityId getStateEntityId() { return new DeviceId(deviceId); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntitiesLimitNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntitiesLimitNotificationInfo.java index 2d783ac036..4dfb3b41db 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntitiesLimitNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/EntitiesLimitNotificationInfo.java @@ -30,7 +30,7 @@ import static org.thingsboard.server.common.data.util.CollectionsUtil.mapOf; @NoArgsConstructor @AllArgsConstructor @Builder -public class EntitiesLimitNotificationInfo implements NotificationInfo { +public class EntitiesLimitNotificationInfo implements RuleOriginatedNotificationInfo { private EntityType entityType; private long currentCount; @@ -51,4 +51,9 @@ public class EntitiesLimitNotificationInfo implements NotificationInfo { ); } + @Override + public TenantId getAffectedTenantId() { + return tenantId; + } + } 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 825148e52c..43be1e3e2a 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 @@ -37,14 +37,12 @@ public class EntityActionNotificationInfo implements RuleOriginatedNotificationI private EntityId entityId; private String entityName; private ActionType actionType; - private UUID originatorUserId; - private String originatorUserName; private CustomerId entityCustomerId; - @Override - public CustomerId getOriginatorEntityCustomerId() { - return entityCustomerId; - } + private UUID userId; + private String userEmail; + private String userFirstName; + private String userLastName; @Override public Map getTemplateData() { @@ -53,11 +51,18 @@ public class EntityActionNotificationInfo implements RuleOriginatedNotificationI "entityId", entityId.toString(), "entityName", entityName, "actionType", actionType.name().toLowerCase(), - "originatorUserId", originatorUserId.toString(), - "originatorUserName", originatorUserName + "userId", userId.toString(), + "userEmail", userEmail, + "userFirstName", userFirstName, + "userLastName", userLastName ); } + @Override + public CustomerId getAffectedCustomerId() { + return entityCustomerId; + } + @Override public EntityId getStateEntityId() { return entityId; diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/NewPlatformVersionNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/NewPlatformVersionNotificationInfo.java index 0e85d95fd0..579007ad1a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/NewPlatformVersionNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/NewPlatformVersionNotificationInfo.java @@ -28,7 +28,7 @@ import static org.thingsboard.server.common.data.util.CollectionsUtil.mapOf; @NoArgsConstructor @AllArgsConstructor @Builder -public class NewPlatformVersionNotificationInfo implements NotificationInfo { +public class NewPlatformVersionNotificationInfo implements RuleOriginatedNotificationInfo { private String message; diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleEngineComponentLifecycleEventNotificationInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleEngineComponentLifecycleEventNotificationInfo.java index 9baac13c79..f35df2e446 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleEngineComponentLifecycleEventNotificationInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/RuleEngineComponentLifecycleEventNotificationInfo.java @@ -31,7 +31,7 @@ import static org.thingsboard.server.common.data.util.CollectionsUtil.mapOf; @AllArgsConstructor @NoArgsConstructor @Builder -public class RuleEngineComponentLifecycleEventNotificationInfo implements NotificationInfo { +public class RuleEngineComponentLifecycleEventNotificationInfo implements RuleOriginatedNotificationInfo { private RuleChainId ruleChainId; private String ruleChainName; 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 index 91320d7571..64af685b27 100644 --- 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 @@ -16,13 +16,20 @@ package org.thingsboard.server.common.data.notification.info; import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; public interface RuleOriginatedNotificationInfo extends NotificationInfo { - CustomerId getOriginatorEntityCustomerId(); + default CustomerId getAffectedCustomerId() { + return null; + } + + default UserId getAffectedUserId() { + return null; + } - default UserId getTargetUserId() { + default TenantId getAffectedTenantId() { return null; } 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 deleted file mode 100644 index eeede34dea..0000000000 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/info/UserOriginatedNotificationInfo.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright © 2016-2023 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 lombok.Data; - -import java.util.Collections; -import java.util.Map; - -@Data -public class UserOriginatedNotificationInfo implements NotificationInfo { - - private String description; - - @Override - public Map getTemplateData() { - return Collections.emptyMap(); - } - -} 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 b97ddf6d83..9ad71fe7e1 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 @@ -29,6 +29,7 @@ import org.thingsboard.server.common.data.id.TenantProfileId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.notification.NotificationRequestStatus; import org.thingsboard.server.common.data.notification.NotificationType; +import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotificationInfo; 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; @@ -97,20 +98,12 @@ public class DefaultNotificationTargetService extends AbstractEntityService impl NotificationTarget notificationTarget = findNotificationTargetById(tenantId, targetId); Objects.requireNonNull(notificationTarget, "Notification target [" + targetId + "] not found"); NotificationTargetConfig configuration = notificationTarget.getConfiguration(); - return findRecipientsForNotificationTargetConfig(tenantId, customerId, configuration, pageLink); + return findRecipientsForNotificationTargetConfig(tenantId, (PlatformUsersNotificationTargetConfig) configuration, pageLink); } @Override - public int countRecipientsForNotificationTargetConfig(TenantId tenantId, NotificationTargetConfig targetConfig) { - return (int) findRecipientsForNotificationTargetConfig(tenantId, null, targetConfig, new PageLink(1)).getTotalElements(); - } - - @Override - public PageData findRecipientsForNotificationTargetConfig(TenantId tenantId, CustomerId customerId, NotificationTargetConfig targetConfig, PageLink pageLink) { - if (!(targetConfig instanceof PlatformUsersNotificationTargetConfig)) { - throw new IllegalArgumentException("Unsupported target type " + targetConfig.getType()); - } - UsersFilter usersFilter = ((PlatformUsersNotificationTargetConfig) targetConfig).getUsersFilter(); + public PageData findRecipientsForNotificationTargetConfig(TenantId tenantId, PlatformUsersNotificationTargetConfig targetConfig, PageLink pageLink) { + UsersFilter usersFilter = targetConfig.getUsersFilter(); switch (usersFilter.getType()) { case USER_LIST: { List users = ((UserListFilter) usersFilter).getUsersIds().stream() @@ -142,8 +135,6 @@ public class DefaultNotificationTargetService extends AbstractEntityService impl } } } - case AFFECTED_TENANT_ADMINISTRATORS: - return userService.findTenantAdmins(tenantId, pageLink); case SYSTEM_ADMINISTRATORS: return userService.findSysAdmins(pageLink); case ALL_USERS: { @@ -153,13 +144,34 @@ public class DefaultNotificationTargetService extends AbstractEntityService impl return userService.findAllUsers(pageLink); } } - case ORIGINATOR_ENTITY_OWNER_USERS: { + } + return new PageData<>(); + } + + @Override + public PageData findRecipientsForRuleNotificationTargetConfig(TenantId tenantId, PlatformUsersNotificationTargetConfig targetConfig, RuleOriginatedNotificationInfo info, PageLink pageLink) { + switch (targetConfig.getUsersFilter().getType()) { + case ORIGINATOR_ENTITY_OWNER_USERS: + CustomerId customerId = info.getAffectedCustomerId(); if (customerId != null && !customerId.isNullUid()) { return userService.findCustomerUsers(tenantId, customerId, pageLink); } else { return userService.findTenantAdmins(tenantId, pageLink); } - } + case AFFECTED_USER: + UserId userId = info.getAffectedUserId(); + if (userId != null) { + return new PageData<>(List.of(userService.findUserById(tenantId, userId)), 1, 1, false); + } + case AFFECTED_TENANT_ADMINISTRATORS: + TenantId affectedTenantId = info.getAffectedTenantId(); + if (affectedTenantId == null) { + affectedTenantId = tenantId; + } + if (!affectedTenantId.isNullUid()) { + return userService.findTenantAdmins(affectedTenantId, pageLink); + } + break; } return new PageData<>(); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/usagerecord/DefaultApiLimitService.java b/dao/src/main/java/org/thingsboard/server/dao/usagerecord/DefaultApiLimitService.java index 4bb31f0425..db34c6c280 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/usagerecord/DefaultApiLimitService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/usagerecord/DefaultApiLimitService.java @@ -48,7 +48,7 @@ public class DefaultApiLimitService implements ApiLimitService { filter.setEntityType(entityType); long currentCount = entityService.countEntitiesByQuery(tenantId, new CustomerId(EntityId.NULL_UUID), new EntityCountQuery(filter)); if (notificationRuleProcessingService != null) { - notificationRuleProcessingService.process(tenantId, EntitiesLimitTrigger.builder() + notificationRuleProcessingService.process(EntitiesLimitTrigger.builder() .tenantId(tenantId) .entityType(entityType) .currentCount(currentCount)