Browse Source

Improvements for notification templates

pull/7511/head
ViacheslavKlimov 4 years ago
parent
commit
a6bfb049aa
  1. 2
      application/src/main/data/upgrade/3.4.3/schema_update.sql
  2. 46
      application/src/main/java/org/thingsboard/server/controller/NotificationController.java
  3. 34
      application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java
  4. 37
      application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java
  5. 68
      application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java
  6. 1
      application/src/main/java/org/thingsboard/server/service/security/permission/Resource.java
  7. 1
      application/src/main/java/org/thingsboard/server/service/security/permission/SysAdminPermissions.java
  8. 1
      application/src/main/java/org/thingsboard/server/service/security/permission/TenantAdminPermissions.java
  9. 2
      application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java
  10. 2
      application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java
  11. 2
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesImportCtx.java
  12. 18
      application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java
  13. 2
      application/src/test/java/org/thingsboard/server/service/sync/ie/BaseExportImportServiceTest.java
  14. 2
      common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleService.java
  15. 2
      common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationTemplateService.java
  16. 2
      common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java
  17. 8
      common/data/src/main/java/org/thingsboard/server/common/data/id/NotificationTemplateId.java
  18. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/EntityImportResult.java
  19. 8
      common/data/src/main/java/org/thingsboard/server/common/data/util/ThrowingBiFunction.java
  20. 2
      common/data/src/main/java/org/thingsboard/server/common/data/util/ThrowingRunnable.java
  21. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationEntity.java
  22. 5
      dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRuleService.java
  23. 5
      dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTemplateService.java
  24. 6
      dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java
  25. 6
      dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java
  26. 6
      dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java
  27. 6
      dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java
  28. 33
      dao/src/main/resources/sql/schema-entities.sql

2
application/src/main/data/upgrade/3.4.3/schema_update.sql

@ -19,7 +19,7 @@ CREATE TABLE IF NOT EXISTS notification_target (
created_time BIGINT NOT NULL,
tenant_id UUID NOT NULL,
name VARCHAR(255) NOT NULL,
configuration VARCHAR(1000) NOT NULL
configuration VARCHAR(10000) NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_notification_target_tenant_id_created_time ON notification_target(tenant_id, created_time DESC);

46
application/src/main/java/org/thingsboard/server/controller/NotificationController.java

@ -29,8 +29,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.thingsboard.rule.engine.api.NotificationManager;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.audit.ActionType;
import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.NotificationId;
import org.thingsboard.server.common.data.id.NotificationRequestId;
@ -38,13 +38,11 @@ import org.thingsboard.server.common.data.notification.Notification;
import org.thingsboard.server.common.data.notification.NotificationOriginatorType;
import org.thingsboard.server.common.data.notification.NotificationRequest;
import org.thingsboard.server.common.data.notification.NotificationRequestInfo;
import org.thingsboard.server.common.data.notification.NotificationSeverity;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.notification.NotificationRequestService;
import org.thingsboard.server.dao.notification.NotificationService;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.rule.engine.api.NotificationManager;
import org.thingsboard.server.service.security.model.SecurityUser;
import org.thingsboard.server.service.security.permission.Operation;
import org.thingsboard.server.service.security.permission.Resource;
@ -88,14 +86,12 @@ public class NotificationController extends BaseController {
@PostMapping("/notification/request")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
public NotificationRequest createNotificationRequest(@RequestBody NotificationRequest notificationRequest,
@AuthenticationPrincipal SecurityUser user) throws ThingsboardException {
// todo: check permission for notification target
@AuthenticationPrincipal SecurityUser user) throws Exception {
if (notificationRequest.getId() != null) {
throw new IllegalArgumentException("Notification request cannot be updated. You may only cancel/delete it");
}
checkEntity(notificationRequest.getId(), notificationRequest, Resource.NOTIFICATION_REQUEST);
accessControlService.checkPermission(user, Resource.NOTIFICATION_REQUEST, Operation.CREATE, null, notificationRequest);
notificationRequest.setOriginatorType(NotificationOriginatorType.ADMIN);
notificationRequest.setOriginatorEntityId(user.getId());
if (StringUtils.isBlank(notificationRequest.getType())) {
@ -106,33 +102,22 @@ public class NotificationController extends BaseController {
}
notificationRequest.setRuleId(null);
notificationRequest.setStatus(null);
return notificationManager.processNotificationRequest(user.getTenantId(), notificationRequest);
//
// try {
// NotificationRequest savedNotificationRequest = ;
// logEntityAction(user, EntityType.NOTIFICATION_REQUEST, savedNotificationRequest, ActionType.ADDED);
// return savedNotificationRequest;
// } catch (Exception e) {
// logEntityAction(user, EntityType.NOTIFICATION_REQUEST, notificationRequest, null, ActionType.ADDED, e);
// throw e;
// }
return doSaveAndLog(EntityType.NOTIFICATION_REQUEST, notificationRequest, notificationManager::processNotificationRequest);
}
@GetMapping("/notification/request/{id}")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
public NotificationRequest getNotificationRequestById(@PathVariable UUID id,
@AuthenticationPrincipal SecurityUser user) {
public NotificationRequest getNotificationRequestById(@PathVariable UUID id) throws ThingsboardException {
NotificationRequestId notificationRequestId = new NotificationRequestId(id);
return notificationRequestService.findNotificationRequestById(user.getTenantId(), notificationRequestId);
return checkEntityId(notificationRequestId, notificationRequestService::findNotificationRequestById, Operation.READ);
}
@GetMapping("/notification/request/info/{id}")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
public NotificationRequestInfo getNotificationRequestInfoById(@PathVariable UUID id,
@AuthenticationPrincipal SecurityUser user) {
// fixme: permission checks
public NotificationRequestInfo getNotificationRequestInfoById(@PathVariable UUID id) throws ThingsboardException {
NotificationRequestId notificationRequestId = new NotificationRequestId(id);
return notificationRequestService.getNotificationRequestInfoById(user.getTenantId(), notificationRequestId);
return checkEntityId(notificationRequestId, notificationRequestService::getNotificationRequestInfoById, Operation.READ);
}
@GetMapping("/notification/requests")
@ -149,17 +134,10 @@ public class NotificationController extends BaseController {
@DeleteMapping("/notification/request/{id}")
public void deleteNotificationRequest(@PathVariable UUID id,
@AuthenticationPrincipal SecurityUser user) throws ThingsboardException {
@AuthenticationPrincipal SecurityUser user) throws Exception {
NotificationRequestId notificationRequestId = new NotificationRequestId(id);
NotificationRequest notificationRequest = notificationRequestService.findNotificationRequestById(user.getTenantId(), notificationRequestId);
accessControlService.checkPermission(user, Resource.NOTIFICATION_REQUEST, Operation.DELETE, notificationRequestId, notificationRequest);
try {
notificationManager.deleteNotificationRequest(user.getTenantId(), notificationRequestId);
logEntityAction(user, EntityType.NOTIFICATION_REQUEST, notificationRequest, ActionType.DELETED);
} catch (Exception e) {
logEntityAction(user, EntityType.NOTIFICATION_REQUEST, notificationRequest, notificationRequest, ActionType.DELETED, e);
throw e;
}
NotificationRequest notificationRequest = checkEntityId(notificationRequestId, notificationRequestService::findNotificationRequestById, Operation.DELETE);
doDeleteAndLog(EntityType.NOTIFICATION_REQUEST, notificationRequest, notificationManager::deleteNotificationRequest);
}
}

34
application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java

@ -19,6 +19,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
@ -26,6 +27,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.NotificationRuleId;
import org.thingsboard.server.common.data.notification.rule.NotificationRule;
@ -41,32 +43,28 @@ import java.util.UUID;
@RestController
@TbCoreComponent
@RequestMapping("/api")
@RequestMapping("/api/notification")
@RequiredArgsConstructor
@Slf4j
public class NotificationRuleController extends BaseController {
// todo: logEntityAction
private final NotificationRuleService notificationRuleService;
@PostMapping("/notification/rule")
@PostMapping("/rule")
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
public NotificationRule saveNotificationRule(@RequestBody NotificationRule notificationRule,
@AuthenticationPrincipal SecurityUser user) throws ThingsboardException {
// accessControlService.checkPermission(user, Resource.NOTIFICATION_RULE, notificationRule.getId() == null ? Operation.CREATE : Operation.WRITE, notificationRule.getId(), );
return notificationRuleService.saveNotificationRule(user.getTenantId(), notificationRule);
public NotificationRule saveNotificationRule(@RequestBody NotificationRule notificationRule) throws Exception {
checkEntity(notificationRule.getId(), notificationRule, Resource.NOTIFICATION_RULE);
return doSaveAndLog(EntityType.NOTIFICATION_RULE, notificationRule, notificationRuleService::saveNotificationRule);
}
@GetMapping("/notification/rule/{id}")
@GetMapping("/rule/{id}")
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
public NotificationRule getNotificationRuleById(@PathVariable UUID id,
@AuthenticationPrincipal SecurityUser user) throws ThingsboardException {
public NotificationRule getNotificationRuleById(@PathVariable UUID id) throws ThingsboardException {
NotificationRuleId notificationRuleId = new NotificationRuleId(id);
NotificationRule notificationRule = notificationRuleService.findNotificationRuleById(user.getTenantId(), notificationRuleId);
accessControlService.checkPermission(user, Resource.NOTIFICATION_RULE, Operation.READ, notificationRuleId, notificationRule);
return notificationRule;
return checkEntityId(notificationRuleId, notificationRuleService::findNotificationRuleById, Operation.READ);
}
@GetMapping("/notification/rules")
@GetMapping("/rules")
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
public PageData<NotificationRule> getNotificationRules(@RequestParam int pageSize,
@RequestParam int page,
@ -78,4 +76,12 @@ public class NotificationRuleController extends BaseController {
return notificationRuleService.findNotificationRulesByTenantId(user.getTenantId(), pageLink);
}
@DeleteMapping("/rule/{id}")
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
public void deleteNotificationRule(@PathVariable UUID id) throws Exception {
NotificationRuleId notificationRuleId = new NotificationRuleId(id);
NotificationRule notificationRule = checkEntityId(notificationRuleId, notificationRuleService::findNotificationRuleById, Operation.DELETE);
doDeleteAndLog(EntityType.NOTIFICATION_RULE, notificationRule, notificationRuleService::deleteNotificationRule);
}
}

37
application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java

@ -29,7 +29,6 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.audit.ActionType;
import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.NotificationTargetId;
import org.thingsboard.server.common.data.notification.targets.NotificationTarget;
@ -57,8 +56,8 @@ public class NotificationTargetController extends BaseController {
@PostMapping("/target")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
public NotificationTarget saveNotificationTarget(@RequestBody NotificationTarget notificationTarget,
@AuthenticationPrincipal SecurityUser user) throws ThingsboardException {
accessControlService.checkPermission(user, Resource.NOTIFICATION_TARGET, Operation.CREATE, null, notificationTarget);
@AuthenticationPrincipal SecurityUser user) throws Exception {
checkEntity(notificationTarget.getId(), notificationTarget, Resource.NOTIFICATION_TARGET);
if (!user.isSystemAdmin()) {
NotificationTargetConfig targetConfig = notificationTarget.getConfiguration();
if (targetConfig.getType() == NotificationTargetConfigType.SINGLE_USER ||
@ -70,26 +69,14 @@ public class NotificationTargetController extends BaseController {
}
}
try {
NotificationTarget savedNotificationTarget = notificationTargetService.saveNotificationTarget(user.getTenantId(), notificationTarget);
logEntityAction(user, EntityType.NOTIFICATION_TARGET, savedNotificationTarget,
notificationTarget.getId() == null ? ActionType.ADDED : ActionType.UPDATED);
return savedNotificationTarget;
} catch (Exception e) {
logEntityAction(user, EntityType.NOTIFICATION_TARGET, notificationTarget, null,
notificationTarget.getId() == null ? ActionType.ADDED : ActionType.UPDATED, e);
throw e;
}
return doSaveAndLog(EntityType.NOTIFICATION_TARGET, notificationTarget, notificationTargetService::saveNotificationTarget);
}
@GetMapping("/target/{id}")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
public NotificationTarget getNotificationTargetById(@PathVariable UUID id,
@AuthenticationPrincipal SecurityUser user) throws ThingsboardException {
public NotificationTarget getNotificationTargetById(@PathVariable UUID id) throws ThingsboardException {
NotificationTargetId notificationTargetId = new NotificationTargetId(id);
NotificationTarget notificationTarget = notificationTargetService.findNotificationTargetById(user.getTenantId(), notificationTargetId);
accessControlService.checkPermission(user, Resource.NOTIFICATION_TARGET, Operation.READ, notificationTargetId, notificationTarget);
return notificationTarget;
return checkEntityId(notificationTargetId, notificationTargetService::findNotificationTargetById, Operation.READ);
}
@PostMapping("/target/recipients")
@ -122,18 +109,10 @@ public class NotificationTargetController extends BaseController {
@DeleteMapping("/target/{id}")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
public void deleteNotificationTarget(@PathVariable UUID id,
@AuthenticationPrincipal SecurityUser user) throws ThingsboardException {
public void deleteNotificationTarget(@PathVariable UUID id) throws Exception {
NotificationTargetId notificationTargetId = new NotificationTargetId(id);
NotificationTarget notificationTarget = checkNotNull(notificationTargetService.findNotificationTargetById(user.getTenantId(), notificationTargetId));
accessControlService.checkPermission(user, Resource.NOTIFICATION_TARGET, Operation.DELETE, notificationTargetId, notificationTarget);
try {
notificationTargetService.deleteNotificationTarget(user.getTenantId(), notificationTargetId);
logEntityAction(user, EntityType.NOTIFICATION_TARGET, notificationTarget, ActionType.DELETED);
} catch (Exception e) {
logEntityAction(user, EntityType.NOTIFICATION_TARGET, null, notificationTarget, ActionType.DELETED, e);
}
NotificationTarget notificationTarget = checkEntityId(notificationTargetId, notificationTargetService::findNotificationTargetById, Operation.DELETE);
doDeleteAndLog(EntityType.NOTIFICATION_TARGET, notificationTarget, notificationTargetService::deleteNotificationTarget);
}
}

68
application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java

@ -0,0 +1,68 @@
/**
* 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.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.NotificationTemplateId;
import org.thingsboard.server.common.data.notification.template.NotificationTemplate;
import org.thingsboard.server.dao.notification.NotificationTemplateService;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.security.permission.Operation;
import org.thingsboard.server.service.security.permission.Resource;
import java.util.UUID;
@RestController
@TbCoreComponent
@RequiredArgsConstructor
@RequestMapping("/api/notification")
public class NotificationTemplateController extends BaseController {
private final NotificationTemplateService notificationTemplateService;
@PostMapping("/template")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
public NotificationTemplate saveNotificationTemplate(@RequestBody NotificationTemplate notificationTemplate) throws Exception {
checkEntity(notificationTemplate.getId(), notificationTemplate, Resource.NOTIFICATION_TEMPLATE);
return doSaveAndLog(EntityType.NOTIFICATION_TEMPLATE, notificationTemplate, notificationTemplateService::saveNotificationTemplate);
}
@GetMapping("/template/{id}")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
public NotificationTemplate getNotificationTemplateById(@PathVariable UUID id) throws ThingsboardException {
NotificationTemplateId notificationTemplateId = new NotificationTemplateId(id);
return checkEntityId(notificationTemplateId, notificationTemplateService::findNotificationTemplateById, Operation.READ);
}
@DeleteMapping("/template/{id}")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
public void deleteNotificationTemplate(@PathVariable UUID id) throws Exception {
NotificationTemplateId notificationTemplateId = new NotificationTemplateId(id);
NotificationTemplate notificationTemplate = checkEntityId(notificationTemplateId, notificationTemplateService::findNotificationTemplateById, Operation.DELETE);
doDeleteAndLog(EntityType.NOTIFICATION_TEMPLATE, notificationTemplate, notificationTemplateService::deleteNotificationTemplateById);
}
}

1
application/src/main/java/org/thingsboard/server/service/security/permission/Resource.java

@ -45,6 +45,7 @@ public enum Resource {
QUEUE(EntityType.QUEUE),
VERSION_CONTROL,
NOTIFICATION_TARGET(EntityType.NOTIFICATION_TARGET),
NOTIFICATION_TEMPLATE(EntityType.NOTIFICATION_TEMPLATE),
NOTIFICATION_REQUEST(EntityType.NOTIFICATION_REQUEST),
NOTIFICATION_RULE(EntityType.NOTIFICATION_RULE);

1
application/src/main/java/org/thingsboard/server/service/security/permission/SysAdminPermissions.java

@ -41,6 +41,7 @@ public class SysAdminPermissions extends AbstractPermissions {
put(Resource.TB_RESOURCE, systemEntityPermissionChecker);
put(Resource.QUEUE, systemEntityPermissionChecker);
put(Resource.NOTIFICATION_TARGET, systemEntityPermissionChecker);
put(Resource.NOTIFICATION_TEMPLATE, systemEntityPermissionChecker);
put(Resource.NOTIFICATION_REQUEST, systemEntityPermissionChecker);
}

1
application/src/main/java/org/thingsboard/server/service/security/permission/TenantAdminPermissions.java

@ -50,6 +50,7 @@ public class TenantAdminPermissions extends AbstractPermissions {
put(Resource.QUEUE, queuePermissionChecker);
put(Resource.VERSION_CONTROL, PermissionChecker.allowAllPermissionChecker);
put(Resource.NOTIFICATION_TARGET, tenantEntityPermissionChecker);
put(Resource.NOTIFICATION_TEMPLATE, tenantEntityPermissionChecker);
put(Resource.NOTIFICATION_REQUEST, tenantEntityPermissionChecker);
put(Resource.NOTIFICATION_RULE, tenantEntityPermissionChecker);
}

2
application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java

@ -26,7 +26,7 @@ import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.sync.ThrowingRunnable;
import org.thingsboard.server.common.data.util.ThrowingRunnable;
import org.thingsboard.server.common.data.sync.ie.EntityExportData;
import org.thingsboard.server.common.data.sync.ie.EntityImportResult;
import org.thingsboard.server.dao.exception.DataValidationException;

2
application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java

@ -44,7 +44,7 @@ import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.sync.ThrowingRunnable;
import org.thingsboard.server.common.data.util.ThrowingRunnable;
import org.thingsboard.server.common.data.sync.ie.EntityExportData;
import org.thingsboard.server.common.data.sync.ie.EntityExportSettings;
import org.thingsboard.server.common.data.sync.ie.EntityImportResult;

2
application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesImportCtx.java

@ -22,7 +22,7 @@ import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.sync.ThrowingRunnable;
import org.thingsboard.server.common.data.util.ThrowingRunnable;
import org.thingsboard.server.common.data.sync.ie.EntityImportResult;
import org.thingsboard.server.common.data.sync.ie.EntityImportSettings;
import org.thingsboard.server.common.data.sync.vc.EntityTypeLoadResult;

18
application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java

@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.id.NotificationRequestId;
import org.thingsboard.server.common.data.id.NotificationTargetId;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.notification.Notification;
import org.thingsboard.server.common.data.notification.NotificationDeliveryMethod;
import org.thingsboard.server.common.data.notification.NotificationInfo;
import org.thingsboard.server.common.data.notification.NotificationRequest;
import org.thingsboard.server.common.data.notification.NotificationRequestConfig;
@ -34,6 +35,9 @@ import org.thingsboard.server.common.data.notification.NotificationRequestStatus
import org.thingsboard.server.common.data.notification.targets.NotificationTarget;
import org.thingsboard.server.common.data.notification.targets.SingleUserNotificationTargetConfig;
import org.thingsboard.server.common.data.notification.targets.UserListNotificationTargetConfig;
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.NotificationTextTemplate;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.security.Authority;
@ -52,6 +56,7 @@ import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.not;
import static org.awaitility.Awaitility.await;
@DaoSqlTest
@ -332,6 +337,7 @@ public class NotificationApiTest extends AbstractControllerTest {
}
private NotificationRequest submitNotificationRequest(NotificationTargetId targetId, String text, int delayInSec) {
NotificationTemplate notificationTemplate = createNotificationTemplate(text);
NotificationRequestConfig config = new NotificationRequestConfig();
config.setSendingDelayInSec(delayInSec);
NotificationInfo notificationInfo = new NotificationInfo();
@ -348,6 +354,18 @@ public class NotificationApiTest extends AbstractControllerTest {
return doPost("/api/notification/request", notificationRequest, NotificationRequest.class);
}
private NotificationTemplate createNotificationTemplate(String text) {
NotificationTemplate notificationTemplate = new NotificationTemplate();
notificationTemplate.setTenantId(tenantId);
notificationTemplate.setName("Notification template for testing");
NotificationTemplateConfig config = new NotificationTemplateConfig();
NotificationTextTemplate textTemplate = new NotificationTextTemplate();
textTemplate.setBody(text);
config.setDefaultTextTemplate(textTemplate);
notificationTemplate.setConfiguration(config);
return doPost("/api/notification/template", notificationTemplate, NotificationTemplate.class);
}
private NotificationRequest findNotificationRequest(NotificationRequestId id) throws Exception {
return doGet("/api/notification/request/" + id, NotificationRequest.class);
}

2
application/src/test/java/org/thingsboard/server/service/sync/ie/BaseExportImportServiceTest.java

@ -60,7 +60,7 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.common.data.rule.RuleNode;
import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.common.data.sync.ThrowingRunnable;
import org.thingsboard.server.common.data.util.ThrowingRunnable;
import org.thingsboard.server.common.data.sync.ie.EntityExportData;
import org.thingsboard.server.common.data.sync.ie.EntityExportSettings;
import org.thingsboard.server.common.data.sync.ie.EntityImportResult;

2
common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleService.java

@ -29,4 +29,6 @@ public interface NotificationRuleService {
PageData<NotificationRule> findNotificationRulesByTenantId(TenantId tenantId, PageLink pageLink);
void deleteNotificationRule(TenantId tenantId, NotificationRuleId notificationRuleId);
}

2
common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationTemplateService.java

@ -28,4 +28,6 @@ public interface NotificationTemplateService {
NotificationTemplate saveNotificationTemplate(TenantId tenantId, NotificationTemplate notificationTemplate);
void deleteNotificationTemplateById(TenantId tenantId, NotificationTemplateId id);
}

2
common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java

@ -21,5 +21,5 @@ package org.thingsboard.server.common.data;
public enum EntityType {
TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM, RULE_CHAIN, RULE_NODE, ENTITY_VIEW, WIDGETS_BUNDLE, WIDGET_TYPE,
TENANT_PROFILE, DEVICE_PROFILE, ASSET_PROFILE, API_USAGE_STATE, TB_RESOURCE, OTA_PACKAGE, EDGE, RPC, QUEUE,
NOTIFICATION_TARGET, NOTIFICATION_REQUEST, NOTIFICATION_RULE;
NOTIFICATION_TARGET, NOTIFICATION_TEMPLATE, NOTIFICATION_REQUEST, NOTIFICATION_RULE;
}

8
common/data/src/main/java/org/thingsboard/server/common/data/id/NotificationTemplateId.java

@ -17,14 +17,20 @@ package org.thingsboard.server.common.data.id;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.thingsboard.server.common.data.EntityType;
import java.util.UUID;
public class NotificationTemplateId extends UUIDBased {
public class NotificationTemplateId extends UUIDBased implements EntityId {
@JsonCreator
public NotificationTemplateId(@JsonProperty("id") UUID id) {
super(id);
}
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_TEMPLATE;
}
}

2
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/EntityImportResult.java

@ -19,7 +19,7 @@ import lombok.Data;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.ExportableEntity;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.sync.ThrowingRunnable;
import org.thingsboard.server.common.data.util.ThrowingRunnable;
@Data
public class EntityImportResult<E extends ExportableEntity<? extends EntityId>> {

8
common/data/src/main/java/org/thingsboard/server/common/data/util/ThrowingBiFunction.java

@ -0,0 +1,8 @@
package org.thingsboard.server.common.data.util;
@FunctionalInterface
public interface ThrowingBiFunction<T, U, R> {
R apply(T t, U u) throws Exception;
}

2
common/data/src/main/java/org/thingsboard/server/common/data/sync/ThrowingRunnable.java → common/data/src/main/java/org/thingsboard/server/common/data/util/ThrowingRunnable.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.common.data.sync;
package org.thingsboard.server.common.data.util;
import org.thingsboard.server.common.data.exception.ThingsboardException;

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationEntity.java

@ -60,7 +60,7 @@ public class NotificationEntity extends BaseSqlEntity<Notification> {
private String text;
@Type(type = "json")
@Formula("(SELECT r.notification_info FROM notification_request r WHERE r.id = request_id)")
@Formula("(SELECT r.info FROM notification_request r WHERE r.id = request_id)")
private JsonNode info;
@Enumerated(EnumType.STRING)

5
dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRuleService.java

@ -48,6 +48,11 @@ public class DefaultNotificationRuleService implements NotificationRuleService {
return notificationRuleDao.findByTenantIdAndPageLink(tenantId, pageLink);
}
@Override
public void deleteNotificationRule(TenantId tenantId, NotificationRuleId notificationRuleId) {
notificationRuleDao.removeById(tenantId, notificationRuleId.getId());
}
private static class NotificationRuleValidator extends DataValidator<NotificationRule> {
}

5
dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTemplateService.java

@ -37,4 +37,9 @@ public class DefaultNotificationTemplateService implements NotificationTemplateS
return notificationTemplateDao.save(tenantId, notificationTemplate);
}
@Override
public void deleteNotificationTemplateById(TenantId tenantId, NotificationTemplateId id) {
notificationTemplateDao.removeById(tenantId, id.getId());
}
}

6
dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java

@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.NotificationRequestId;
import org.thingsboard.server.common.data.id.NotificationRuleId;
@ -87,4 +88,9 @@ public class JpaNotificationRequestDao extends JpaAbstractDao<NotificationReques
return notificationRequestRepository;
}
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_REQUEST;
}
}

6
dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java

@ -19,6 +19,7 @@ import com.google.common.base.Strings;
import lombok.RequiredArgsConstructor;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.notification.rule.NotificationRule;
import org.thingsboard.server.common.data.page.PageData;
@ -54,4 +55,9 @@ public class JpaNotificationRuleDao extends JpaAbstractDao<NotificationRuleEntit
return notificationRuleRepository;
}
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_RULE;
}
}

6
dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java

@ -19,6 +19,7 @@ import com.google.common.base.Strings;
import lombok.RequiredArgsConstructor;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.notification.targets.NotificationTarget;
import org.thingsboard.server.common.data.page.PageData;
@ -54,4 +55,9 @@ public class JpaNotificationTargetDao extends JpaAbstractDao<NotificationTargetE
return notificationTargetRepository;
}
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_TARGET;
}
}

6
dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java

@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.notification;
import lombok.RequiredArgsConstructor;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.notification.template.NotificationTemplate;
import org.thingsboard.server.dao.model.sql.NotificationTemplateEntity;
import org.thingsboard.server.dao.notification.NotificationTemplateDao;
@ -43,4 +44,9 @@ public class JpaNotificationTemplateDao extends JpaAbstractDao<NotificationTempl
return notificationTemplateRepository;
}
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_TEMPLATE;
}
}

33
dao/src/main/resources/sql/schema-entities.sql

@ -785,7 +785,15 @@ CREATE TABLE IF NOT EXISTS notification_target (
created_time BIGINT NOT NULL,
tenant_id UUID NOT NULL,
name VARCHAR(255) NOT NULL,
configuration VARCHAR NOT NULL
configuration VARCHAR(10000) NOT NULL
);
CREATE TABLE IF NOT EXISTS notification_template (
id UUID NOT NULL CONSTRAINT notification_template_pkey PRIMARY KEY,
created_time BIGINT NOT NULL,
tenant_id UUID NOT NULL,
name VARCHAR(255) NOT NULL,
configuration VARCHAR(10000) NOT NULL
);
CREATE TABLE IF NOT EXISTS notification_rule (
@ -793,7 +801,8 @@ CREATE TABLE IF NOT EXISTS notification_rule (
created_time BIGINT NOT NULL,
tenant_id UUID NOT NULL,
name VARCHAR(255) NOT NULL,
notification_text_template VARCHAR NOT NULL,
template_id UUID NOT NULL CONSTRAINT fk_notification_rule_template_id REFERENCES notification_template(id),
delivery_methods VARCHAR(255),
initial_notification_target_id UUID NULL CONSTRAINT fk_notification_rule_target_id REFERENCES notification_target(id),
escalation_config VARCHAR(500)
);
@ -803,28 +812,26 @@ CREATE TABLE IF NOT EXISTS notification_request (
created_time BIGINT NOT NULL,
tenant_id UUID NOT NULL,
target_id UUID NOT NULL CONSTRAINT fk_notification_request_target_id REFERENCES notification_target(id),
notification_reason VARCHAR NOT NULL,
text_template VARCHAR NOT NULL,
notification_info VARCHAR(1000),
notification_severity VARCHAR(32),
type VARCHAR(255) NOT NULL,
template_id UUID NOT NULL CONSTRAINT fk_notification_request_template_id REFERENCES notification_template(id),
info VARCHAR(1000),
delivery_methods VARCHAR(255),
additional_config VARCHAR(1000),
originator_type VARCHAR(32) NOT NULL,
originator_entity_id UUID,
originator_entity_type VARCHAR(32),
rule_id UUID NULL CONSTRAINT fk_notification_request_rule_id REFERENCES notification_rule(id),
additional_config VARCHAR(1000),
status VARCHAR(32)
);
CREATE TABLE IF NOT EXISTS notification (
id UUID NOT NULL,
created_time BIGINT NOT NULL,
request_id UUID NOT NULL CONSTRAINT fk_notification_request_id
REFERENCES notification_request(id) ON DELETE CASCADE,
recipient_id UUID NOT NULL,
reason VARCHAR NOT NULL,
text VARCHAR NOT NULL,
request_id UUID NOT NULL CONSTRAINT fk_notification_request_id REFERENCES notification_request(id) ON DELETE CASCADE,
recipient_id UUID NOT NULL CONSTRAINT fk_notification_recipient_id REFERENCES tb_user(id) ON DELETE CASCADE,
type VARCHAR(255) NOT NULL,
text VARCHAR(1000) NOT NULL,
info VARCHAR(1000),
severity VARCHAR(32),
originator_type VARCHAR(32) NOT NULL,
status VARCHAR(32)
) PARTITION BY RANGE (created_time);

Loading…
Cancel
Save