diff --git a/application/src/main/data/upgrade/3.4.4/schema_update.sql b/application/src/main/data/upgrade/3.4.4/schema_update.sql index 3b4e299daf..1023dbd2bd 100644 --- a/application/src/main/data/upgrade/3.4.4/schema_update.sql +++ b/application/src/main/data/upgrade/3.4.4/schema_update.sql @@ -65,7 +65,8 @@ CREATE TABLE IF NOT EXISTS notification_request ( created_time BIGINT NOT NULL, tenant_id UUID NULL CONSTRAINT fk_notification_request_tenant_id REFERENCES tenant(id) ON DELETE CASCADE, targets VARCHAR(10000) NOT NULL, - template_id UUID NOT NULL, + template_id UUID, + template VARCHAR(10000), info VARCHAR(1000), additional_config VARCHAR(1000), originator_entity_id UUID, diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationController.java index 66262a44bd..9554d62c1b 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationController.java @@ -189,17 +189,25 @@ public class NotificationController extends BaseController { @PostMapping("/notification/request/preview") @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") - public NotificationRequestPreview getNotificationRequestPreview(@RequestBody @Valid NotificationRequest notificationRequest, + public NotificationRequestPreview getNotificationRequestPreview(@RequestBody @Valid NotificationRequest request, @AuthenticationPrincipal SecurityUser user) { NotificationRequestPreview preview = new NotificationRequestPreview(); - notificationRequest.setOriginatorEntityId(user.getId()); - NotificationTemplate notificationTemplate = notificationTemplateService.findNotificationTemplateById(user.getTenantId(), notificationRequest.getTemplateId()); + request.setOriginatorEntityId(user.getId()); + NotificationTemplate template; + if (request.getTemplateId() != null) { + template = notificationTemplateService.findNotificationTemplateById(user.getTenantId(), request.getTemplateId()); + } else { + template = request.getTemplate(); + } + if (template == null) { + throw new IllegalArgumentException("Template is missing"); + } NotificationProcessingContext mockProcessingCtx = NotificationProcessingContext.builder() .tenantId(user.getTenantId()) - .request(notificationRequest) + .request(request) .settings(null) - .template(notificationTemplate) + .template(template) .build(); Map processedTemplates = mockProcessingCtx.getDeliveryMethods().stream() @@ -215,7 +223,7 @@ public class NotificationController extends BaseController { preview.setProcessedTemplates(processedTemplates); Map recipientsCountByTarget = new HashMap<>(); - notificationRequest.getTargets().forEach(targetId -> { + request.getTargets().forEach(targetId -> { NotificationTarget notificationTarget = notificationTargetService.findNotificationTargetById(user.getTenantId(), new NotificationTargetId(targetId)); if (notificationTarget == null) { throw new IllegalArgumentException("Notification target with id " + targetId + " not found"); 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 4ba1bd6749..8e7bb5aea0 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 @@ -99,7 +99,14 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple @Override public NotificationRequest processNotificationRequest(TenantId tenantId, NotificationRequest notificationRequest) { NotificationSettings settings = notificationSettingsService.findNotificationSettings(tenantId); - NotificationTemplate notificationTemplate = notificationTemplateService.findNotificationTemplateById(tenantId, notificationRequest.getTemplateId()); + NotificationTemplate notificationTemplate; + if (notificationRequest.getTemplateId() != null) { + notificationTemplate = notificationTemplateService.findNotificationTemplateById(tenantId, notificationRequest.getTemplateId()); + } else { + notificationTemplate = notificationRequest.getTemplate(); + } + if (notificationTemplate == null) throw new IllegalArgumentException("Template is missing"); + List targets = notificationRequest.getTargets().stream() .map(NotificationTargetId::new) .map(targetId -> notificationTargetService.findNotificationTargetById(tenantId, targetId)) diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationRequest.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationRequest.java index 8b77bb3755..b4be74f447 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationRequest.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationRequest.java @@ -31,6 +31,7 @@ import org.thingsboard.server.common.data.id.NotificationTemplateId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.notification.info.NotificationInfo; +import org.thingsboard.server.common.data.notification.template.NotificationTemplate; import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -48,9 +49,10 @@ public class NotificationRequest extends BaseData impleme @NotNull private List targets; - @NotNull private NotificationTemplateId templateId; @Valid + private NotificationTemplate template; + @Valid private NotificationInfo info; @NotNull @Valid @@ -68,6 +70,7 @@ public class NotificationRequest extends BaseData impleme this.tenantId = other.tenantId; this.targets = other.targets; this.templateId = other.templateId; + this.template = other.template; this.info = other.info; this.additionalConfig = other.additionalConfig; this.originatorEntityId = other.originatorEntityId; diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/notification/template/NotificationTemplate.java b/common/data/src/main/java/org/thingsboard/server/common/data/notification/template/NotificationTemplate.java index b8793b7605..abdd0c428a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/notification/template/NotificationTemplate.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/notification/template/NotificationTemplate.java @@ -34,7 +34,6 @@ public class NotificationTemplate extends BaseData imple private TenantId tenantId; @NoXss - @NotNull private String name; @NoXss @NotNull diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java index e7c382a5ea..6aa51bf7a3 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java @@ -682,6 +682,7 @@ public class ModelConstants { public static final String NOTIFICATION_REQUEST_TABLE_NAME = "notification_request"; public static final String NOTIFICATION_REQUEST_TARGETS_PROPERTY = "targets"; public static final String NOTIFICATION_REQUEST_TEMPLATE_ID_PROPERTY = "template_id"; + public static final String NOTIFICATION_REQUEST_TEMPLATE_PROPERTY = "template"; public static final String NOTIFICATION_REQUEST_INFO_PROPERTY = "info"; public static final String NOTIFICATION_REQUEST_ORIGINATOR_ENTITY_ID_PROPERTY = "originator_entity_id"; public static final String NOTIFICATION_REQUEST_ORIGINATOR_ENTITY_TYPE_PROPERTY = "originator_entity_type"; diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationRequestEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationRequestEntity.java index b1223c6d07..0da7b3543d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationRequestEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationRequestEntity.java @@ -31,6 +31,7 @@ import org.thingsboard.server.common.data.notification.NotificationRequest; import org.thingsboard.server.common.data.notification.NotificationRequestConfig; import org.thingsboard.server.common.data.notification.NotificationRequestStats; import org.thingsboard.server.common.data.notification.NotificationRequestStatus; +import org.thingsboard.server.common.data.notification.template.NotificationTemplate; import org.thingsboard.server.dao.model.BaseSqlEntity; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.util.mapping.JsonStringType; @@ -55,9 +56,13 @@ public class NotificationRequestEntity extends BaseSqlEntity deliveryMethods; + + NotificationTemplateConfig templateConfig = fromJson(this.templateConfig, NotificationTemplateConfig.class); + String templateName = this.templateName; + if (templateConfig == null && request.getTemplate() != null) { + templateConfig = request.getTemplate().getConfiguration(); + } if (templateConfig != null) { - deliveryMethods = fromJson(templateConfig, NotificationTemplateConfig.class) - .getDeliveryMethodsTemplates().entrySet().stream() + deliveryMethods = templateConfig.getDeliveryMethodsTemplates().entrySet().stream() .filter(entry -> entry.getValue().isEnabled()) .map(Map.Entry::getKey).collect(Collectors.toList()); } else if (request.getStats() != null) { diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index 4437cafca3..e16641704f 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/dao/src/main/resources/sql/schema-entities.sql @@ -829,7 +829,8 @@ CREATE TABLE IF NOT EXISTS notification_request ( created_time BIGINT NOT NULL, tenant_id UUID NULL CONSTRAINT fk_notification_request_tenant_id REFERENCES tenant(id) ON DELETE CASCADE, targets VARCHAR(10000) NOT NULL, - template_id UUID NOT NULL, + template_id UUID, + template VARCHAR(10000), info VARCHAR(1000), additional_config VARCHAR(1000), originator_entity_id UUID,