From 627889a437fe052921e428b60263b7ef1410b1cb Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Fri, 24 Feb 2023 13:17:24 +0200 Subject: [PATCH] Remove tenant_id constraint from notification entities; permission checks refactoring --- .../main/data/upgrade/3.4.4/schema_update.sql | 8 ++--- .../server/controller/BaseController.java | 13 ++++---- .../controller/NotificationController.java | 11 +++---- .../NotificationRuleController.java | 5 ++- .../NotificationTargetController.java | 7 ++-- .../NotificationTemplateController.java | 5 ++- .../DefaultSystemDataLoaderService.java | 18 +++++++++-- .../install/SystemDataLoaderService.java | 2 +- .../service/security/permission/Resource.java | 19 ++++++----- .../NotificationRequestService.java | 2 ++ .../notification/NotificationRuleService.java | 2 ++ .../NotificationSettingsService.java | 2 ++ .../NotificationTargetService.java | 2 ++ .../NotificationTemplateService.java | 2 ++ .../DefaultNotificationRequestService.java | 5 +++ .../DefaultNotificationRuleService.java | 5 +++ .../DefaultNotificationSettingsService.java | 32 +++++++++++++++++++ .../DefaultNotificationTargetService.java | 5 +++ .../DefaultNotificationTemplateService.java | 5 +++ .../notification/NotificationRequestDao.java | 2 ++ .../dao/notification/NotificationRuleDao.java | 2 ++ .../notification/NotificationTargetDao.java | 2 ++ .../notification/NotificationTemplateDao.java | 2 ++ .../JpaNotificationRequestDao.java | 5 +++ .../notification/JpaNotificationRuleDao.java | 5 +++ .../JpaNotificationTargetDao.java | 5 +++ .../JpaNotificationTemplateDao.java | 5 +++ .../NotificationRequestRepository.java | 2 ++ .../NotificationRuleRepository.java | 2 ++ .../NotificationTargetRepository.java | 2 ++ .../NotificationTemplateRepository.java | 2 ++ .../server/dao/tenant/TenantServiceImpl.java | 20 ++++++++++++ .../main/resources/sql/schema-entities.sql | 8 ++--- 33 files changed, 171 insertions(+), 43 deletions(-) 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 1023dbd2bd..d724f21a45 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 @@ -28,7 +28,7 @@ CREATE INDEX IF NOT EXISTS idx_alarm_comment_alarm_id ON alarm_comment(alarm_id) CREATE TABLE IF NOT EXISTS notification_target ( id UUID NOT NULL CONSTRAINT notification_target_pkey PRIMARY KEY, created_time BIGINT NOT NULL, - tenant_id UUID NULL CONSTRAINT fk_notification_target_tenant_id REFERENCES tenant(id) ON DELETE CASCADE, + tenant_id UUID NOT NULL, name VARCHAR(255) NOT NULL, configuration VARCHAR(10000) NOT NULL, CONSTRAINT uq_notification_target_name UNIQUE (tenant_id, name) @@ -38,7 +38,7 @@ CREATE INDEX IF NOT EXISTS idx_notification_target_tenant_id_created_time ON not 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 NULL CONSTRAINT fk_notification_template_tenant_id REFERENCES tenant(id) ON DELETE CASCADE, + tenant_id UUID NOT NULL, name VARCHAR(255) NOT NULL, notification_type VARCHAR(50) NOT NULL, configuration VARCHAR(10000) NOT NULL, @@ -49,7 +49,7 @@ CREATE INDEX IF NOT EXISTS idx_notification_template_tenant_id_created_time ON n CREATE TABLE IF NOT EXISTS notification_rule ( id UUID NOT NULL CONSTRAINT notification_rule_pkey PRIMARY KEY, created_time BIGINT NOT NULL, - tenant_id UUID NULL CONSTRAINT fk_notification_rule_tenant_id REFERENCES tenant(id) ON DELETE CASCADE, + tenant_id UUID NOT NULL, name VARCHAR(255) NOT NULL, template_id UUID NOT NULL CONSTRAINT fk_notification_rule_template_id REFERENCES notification_template(id), trigger_type VARCHAR(50) NOT NULL, @@ -63,7 +63,7 @@ CREATE INDEX IF NOT EXISTS idx_notification_rule_tenant_id_created_time ON notif CREATE TABLE IF NOT EXISTS notification_request ( id UUID NOT NULL CONSTRAINT notification_request_pkey PRIMARY KEY, created_time BIGINT NOT NULL, - tenant_id UUID NULL CONSTRAINT fk_notification_request_tenant_id REFERENCES tenant(id) ON DELETE CASCADE, + tenant_id UUID NOT NULL, targets VARCHAR(10000) NOT NULL, template_id UUID, template VARCHAR(10000), diff --git a/application/src/main/java/org/thingsboard/server/controller/BaseController.java b/application/src/main/java/org/thingsboard/server/controller/BaseController.java index de3b7ffab6..624a4ce3ef 100644 --- a/application/src/main/java/org/thingsboard/server/controller/BaseController.java +++ b/application/src/main/java/org/thingsboard/server/controller/BaseController.java @@ -601,22 +601,23 @@ public abstract class BaseController { } protected & HasTenantId, I extends EntityId> E checkEntityId(I entityId, ThrowingBiFunction findingFunction, Operation operation) throws ThingsboardException { - return checkEntityId(Resource.of(entityId.getEntityType()), operation, entityId, findingFunction); - } - - protected & HasTenantId, I extends EntityId> E checkEntityId(Resource resource, Operation operation, I entityId, ThrowingBiFunction findingFunction) throws ThingsboardException { try { validateId((UUIDBased) entityId, "Invalid entity id"); SecurityUser user = getCurrentUser(); E entity = findingFunction.apply(user.getTenantId(), entityId); checkNotNull(entity, entityId.getEntityType() + " with id [" + entityId + "] not found"); - accessControlService.checkPermission(user, resource, operation, entityId, entity); - return entity; + return checkEntity(user, entity, operation); } catch (Exception e) { throw handleException(e, false); } } + protected & HasTenantId, I extends EntityId> E checkEntity(SecurityUser user, E entity, Operation operation) throws ThingsboardException { + checkNotNull(entity, "Entity not found"); + accessControlService.checkPermission(user, Resource.of(entity.getId().getEntityType()), operation, entity.getId(), entity); + return entity; + } + Device checkDeviceId(DeviceId deviceId, Operation operation) throws ThingsboardException { return checkEntityId(deviceId, deviceService::findDeviceById, operation); } 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 ba223141c5..e4e37a7788 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationController.java @@ -58,7 +58,6 @@ import org.thingsboard.server.dao.notification.NotificationTemplateService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.permission.Operation; -import org.thingsboard.server.service.security.permission.Resource; import javax.validation.Valid; import java.util.Collections; @@ -133,7 +132,7 @@ public class NotificationController extends BaseController { "```\n{\n" + " \"cmdId\": 1234,\n" + " \"totalUnreadCount\": 5\n" + - "}\n```" ) + "}\n```") @GetMapping("/notifications") @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") public PageData getNotifications(@RequestParam int pageSize, @@ -203,9 +202,7 @@ public class NotificationController extends BaseController { request.setOriginatorEntityId(user.getId()); NotificationTemplate template; if (request.getTemplateId() != null) { - template = notificationTemplateService.findNotificationTemplateById(user.getTenantId(), request.getTemplateId()); - checkNotNull(template, "Template not found"); - accessControlService.checkPermission(user, NOTIFICATION, Operation.READ, template.getId(), template); + template = checkEntityId(request.getTemplateId(), notificationTemplateService::findNotificationTemplateById, Operation.READ); } else { template = request.getTemplate(); } @@ -254,7 +251,7 @@ public class NotificationController extends BaseController { @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") public NotificationRequestInfo getNotificationRequestById(@PathVariable UUID id) throws ThingsboardException { NotificationRequestId notificationRequestId = new NotificationRequestId(id); - return checkEntityId(NOTIFICATION, Operation.READ, notificationRequestId, notificationRequestService::findNotificationRequestInfoById); + return checkEntityId(notificationRequestId, notificationRequestService::findNotificationRequestInfoById, Operation.READ); } @GetMapping("/notification/requests") @@ -274,7 +271,7 @@ public class NotificationController extends BaseController { @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") public void deleteNotificationRequest(@PathVariable UUID id) throws Exception { NotificationRequestId notificationRequestId = new NotificationRequestId(id); - NotificationRequest notificationRequest = checkEntityId(NOTIFICATION, Operation.DELETE, notificationRequestId, notificationRequestService::findNotificationRequestById); + NotificationRequest notificationRequest = checkEntityId(notificationRequestId, notificationRequestService::findNotificationRequestById, Operation.DELETE); doDeleteAndLog(EntityType.NOTIFICATION_REQUEST, notificationRequest, notificationCenter::deleteNotificationRequest); } diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java index 492a9eb079..8c08e1eab2 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java @@ -39,7 +39,6 @@ import org.thingsboard.server.dao.notification.NotificationRuleService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.permission.Operation; -import org.thingsboard.server.service.security.permission.Resource; import javax.validation.Valid; import java.util.UUID; @@ -67,7 +66,7 @@ public class NotificationRuleController extends BaseController { @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") public NotificationRuleInfo getNotificationRuleById(@PathVariable UUID id) throws ThingsboardException { NotificationRuleId notificationRuleId = new NotificationRuleId(id); - return checkEntityId(NOTIFICATION, Operation.READ, notificationRuleId, notificationRuleService::findNotificationRuleInfoById); + return checkEntityId(notificationRuleId, notificationRuleService::findNotificationRuleInfoById, Operation.READ); } @GetMapping("/rules") @@ -88,7 +87,7 @@ public class NotificationRuleController extends BaseController { public void deleteNotificationRule(@PathVariable UUID id, @AuthenticationPrincipal SecurityUser user) throws Exception { NotificationRuleId notificationRuleId = new NotificationRuleId(id); - NotificationRule notificationRule = checkEntityId(NOTIFICATION, Operation.DELETE, notificationRuleId, notificationRuleService::findNotificationRuleById); + NotificationRule notificationRule = checkEntityId(notificationRuleId, notificationRuleService::findNotificationRuleById, Operation.DELETE); doDeleteAndLog(EntityType.NOTIFICATION_RULE, notificationRule, notificationRuleService::deleteNotificationRuleById); tbClusterService.broadcastEntityStateChangeEvent(user.getTenantId(), notificationRuleId, ComponentLifecycleEvent.DELETED); } 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 24d21bfade..abc78c8efd 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java @@ -47,7 +47,6 @@ import org.thingsboard.server.dao.notification.NotificationTargetService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.permission.Operation; -import org.thingsboard.server.service.security.permission.Resource; import javax.validation.Valid; import java.util.Arrays; @@ -101,7 +100,7 @@ public class NotificationTargetController extends BaseController { @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") public NotificationTarget getNotificationTargetById(@PathVariable UUID id) throws ThingsboardException { NotificationTargetId notificationTargetId = new NotificationTargetId(id); - return checkEntityId(NOTIFICATION, Operation.READ, notificationTargetId, notificationTargetService::findNotificationTargetById); + return checkEntityId(notificationTargetId, notificationTargetService::findNotificationTargetById, Operation.READ); } @ApiOperation(value = "Get recipients for notification target config (getRecipientsForNotificationTargetConfig)", @@ -158,7 +157,7 @@ public class NotificationTargetController extends BaseController { @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") public void deleteNotificationTargetById(@PathVariable UUID id) throws Exception { NotificationTargetId notificationTargetId = new NotificationTargetId(id); - NotificationTarget notificationTarget = checkEntityId(NOTIFICATION, Operation.DELETE, notificationTargetId, notificationTargetService::findNotificationTargetById); + NotificationTarget notificationTarget = checkEntityId(notificationTargetId, notificationTargetService::findNotificationTargetById, Operation.DELETE); doDeleteAndLog(EntityType.NOTIFICATION_TARGET, notificationTarget, notificationTargetService::deleteNotificationTargetById); } @@ -173,7 +172,7 @@ public class NotificationTargetController extends BaseController { return notificationTargetService.findRecipientsForNotificationTargetConfig(user.getTenantId(), null, targetConfig, pageLink); }, 200); for (User recipient : recipients) { - accessControlService.checkPermission(user, Resource.USER, Operation.READ, recipient.getId(), recipient); + checkEntity(user, recipient, Operation.READ); } } else if (usersFilter.getType() == UsersFilterType.CUSTOMER_USERS) { CustomerId customerId = new CustomerId(((CustomerUsersFilter) usersFilter).getCustomerId()); diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java index ee90f8c694..5524255648 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java @@ -45,7 +45,6 @@ import org.thingsboard.server.dao.notification.NotificationTemplateService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.permission.Operation; -import org.thingsboard.server.service.security.permission.Resource; import javax.validation.Valid; import java.util.List; @@ -94,7 +93,7 @@ public class NotificationTemplateController extends BaseController { @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") public NotificationTemplate getNotificationTemplateById(@PathVariable UUID id) throws ThingsboardException { NotificationTemplateId notificationTemplateId = new NotificationTemplateId(id); - return checkEntityId(NOTIFICATION, Operation.READ, notificationTemplateId, notificationTemplateService::findNotificationTemplateById); + return checkEntityId(notificationTemplateId, notificationTemplateService::findNotificationTemplateById, Operation.READ); } @ApiOperation(value = "Get notification templates (getNotificationTemplates)", @@ -126,7 +125,7 @@ public class NotificationTemplateController extends BaseController { @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") public void deleteNotificationTemplateById(@PathVariable UUID id) throws Exception { NotificationTemplateId notificationTemplateId = new NotificationTemplateId(id); - NotificationTemplate notificationTemplate = checkEntityId(NOTIFICATION, Operation.DELETE, notificationTemplateId, notificationTemplateService::findNotificationTemplateById); + NotificationTemplate notificationTemplate = checkEntityId(notificationTemplateId, notificationTemplateService::findNotificationTemplateById, Operation.DELETE); doDeleteAndLog(EntityType.NOTIFICATION_TEMPLATE, notificationTemplate, notificationTemplateService::deleteNotificationTemplateById); } diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java index abadb04e70..d1b95a3f06 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java @@ -62,6 +62,7 @@ import org.thingsboard.server.common.data.kv.BasicTsKvEntry; import org.thingsboard.server.common.data.kv.BooleanDataEntry; import org.thingsboard.server.common.data.kv.DoubleDataEntry; import org.thingsboard.server.common.data.kv.LongDataEntry; +import org.thingsboard.server.common.data.page.PageDataIterable; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.query.BooleanFilterPredicate; import org.thingsboard.server.common.data.query.DynamicValue; @@ -82,13 +83,13 @@ import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileCon import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration; import org.thingsboard.server.common.data.widget.WidgetsBundle; -import org.thingsboard.server.service.security.auth.jwt.settings.JwtSettingsService; import org.thingsboard.server.dao.attributes.AttributesService; import org.thingsboard.server.dao.customer.CustomerService; import org.thingsboard.server.dao.device.DeviceCredentialsService; import org.thingsboard.server.dao.device.DeviceProfileService; import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.dao.notification.NotificationSettingsService; import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.settings.AdminSettingsService; @@ -97,6 +98,7 @@ import org.thingsboard.server.dao.tenant.TenantService; import org.thingsboard.server.dao.timeseries.TimeseriesService; import org.thingsboard.server.dao.user.UserService; import org.thingsboard.server.dao.widget.WidgetsBundleService; +import org.thingsboard.server.service.security.auth.jwt.settings.JwtSettingsService; import javax.annotation.Nullable; import javax.annotation.PostConstruct; @@ -171,6 +173,9 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { @Autowired private JwtSettingsService jwtSettingsService; + @Autowired + private NotificationSettingsService notificationSettingsService; + @Bean protected BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); @@ -672,8 +677,15 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { } @Override - public void createNotificationConfigs() { - // create default notification targets: Alarm's customer + public void createDefaultNotificationConfigs() { + PageDataIterable tenants = new PageDataIterable<>(tenantService::findTenantsIds, 500); + for (TenantId tenantId : tenants) { + try { + notificationSettingsService.createDefaultNotificationConfigs(tenantId); + } catch (Exception e) { + log.warn("Failed to create default notification configs for tenant {}: {}", tenantId, e.getMessage()); + } + } } } diff --git a/application/src/main/java/org/thingsboard/server/service/install/SystemDataLoaderService.java b/application/src/main/java/org/thingsboard/server/service/install/SystemDataLoaderService.java index 059ecd0046..fb6b28592c 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/SystemDataLoaderService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/SystemDataLoaderService.java @@ -39,6 +39,6 @@ public interface SystemDataLoaderService { void createQueues(); - void createNotificationConfigs(); + void createDefaultNotificationConfigs(); } diff --git a/application/src/main/java/org/thingsboard/server/service/security/permission/Resource.java b/application/src/main/java/org/thingsboard/server/service/security/permission/Resource.java index 049385756d..5b71530121 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/permission/Resource.java +++ b/application/src/main/java/org/thingsboard/server/service/security/permission/Resource.java @@ -17,7 +17,9 @@ package org.thingsboard.server.service.security.permission; import org.thingsboard.server.common.data.EntityType; +import java.util.Collections; import java.util.Optional; +import java.util.Set; public enum Resource { ADMIN_SETTINGS(), @@ -44,25 +46,26 @@ public enum Resource { RPC(EntityType.RPC), QUEUE(EntityType.QUEUE), VERSION_CONTROL, - NOTIFICATION; + NOTIFICATION(EntityType.NOTIFICATION_TARGET, EntityType.NOTIFICATION_TEMPLATE, + EntityType.NOTIFICATION_REQUEST, EntityType.NOTIFICATION_RULE); - private final EntityType entityType; + private final Set entityTypes; Resource() { - this.entityType = null; + this.entityTypes = null; } - Resource(EntityType entityType) { - this.entityType = entityType; + Resource(EntityType... entityTypes) { + this.entityTypes = Set.of(entityTypes); } - public Optional getEntityType() { - return Optional.ofNullable(entityType); + public Set getEntityTypes() { + return Optional.ofNullable(entityTypes).orElse(Collections.emptySet()); } public static Resource of(EntityType entityType) { for (Resource resource : Resource.values()) { - if (resource.getEntityType().orElse(null) == entityType) { + if (resource.getEntityTypes().contains(entityType)) { return resource; } } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRequestService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRequestService.java index 5d3dcdc8fc..bfdd87c534 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRequestService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRequestService.java @@ -51,4 +51,6 @@ public interface NotificationRequestService { void updateNotificationRequest(TenantId tenantId, NotificationRequestId requestId, NotificationRequestStatus requestStatus, NotificationRequestStats stats); + void deleteNotificationRequestsByTenantId(TenantId tenantId); + } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleService.java index 9ad6aa2ff3..29bdf09a56 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleService.java @@ -41,4 +41,6 @@ public interface NotificationRuleService { void deleteNotificationRuleById(TenantId tenantId, NotificationRuleId id); + void deleteNotificationRulesByTenantId(TenantId tenantId); + } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationSettingsService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationSettingsService.java index c137c4bcd1..46eb5ca54e 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationSettingsService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationSettingsService.java @@ -24,4 +24,6 @@ public interface NotificationSettingsService { NotificationSettings findNotificationSettings(TenantId tenantId); + void createDefaultNotificationConfigs(TenantId tenantId); + } 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 52555376b8..7852a64f0d 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 @@ -44,4 +44,6 @@ public interface NotificationTargetService { void deleteNotificationTargetById(TenantId tenantId, NotificationTargetId id); + void deleteNotificationTargetsByTenantId(TenantId tenantId); + } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationTemplateService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationTemplateService.java index 94a2789da9..04f7a9f95b 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationTemplateService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/notification/NotificationTemplateService.java @@ -34,4 +34,6 @@ public interface NotificationTemplateService { void deleteNotificationTemplateById(TenantId tenantId, NotificationTemplateId id); + void deleteNotificationTemplatesByTenantId(TenantId tenantId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRequestService.java b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRequestService.java index 9685a8ede9..a23c923e7b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRequestService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRequestService.java @@ -95,6 +95,11 @@ public class DefaultNotificationRequestService implements NotificationRequestSer notificationRequestDao.updateById(tenantId, requestId, requestStatus, stats); } + @Override + public void deleteNotificationRequestsByTenantId(TenantId tenantId) { + notificationRequestDao.removeByTenantId(tenantId); + } + private static class NotificationRequestValidator extends DataValidator { diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRuleService.java b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRuleService.java index bba938749c..bd4e6c6b5f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRuleService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRuleService.java @@ -98,6 +98,11 @@ public class DefaultNotificationRuleService extends AbstractCachedEntityService< notificationRuleDao.removeById(tenantId, id.getId()); } + @Override + public void deleteNotificationRulesByTenantId(TenantId tenantId) { + notificationRuleDao.removeByTenantId(tenantId); + } + @Override public void handleEvictEvent(NotificationRule notificationRule) { NotificationRuleCacheKey cacheKey = NotificationRuleCacheKey.builder() diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationSettingsService.java b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationSettingsService.java index 9588d2cec2..2d6defebc6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationSettingsService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationSettingsService.java @@ -21,6 +21,11 @@ import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.notification.settings.NotificationSettings; +import org.thingsboard.server.common.data.notification.targets.NotificationTarget; +import org.thingsboard.server.common.data.notification.targets.platform.AllUsersFilter; +import org.thingsboard.server.common.data.notification.targets.platform.OriginatorEntityOwnerUsersFilter; +import org.thingsboard.server.common.data.notification.targets.platform.PlatformUsersNotificationTargetConfig; +import org.thingsboard.server.common.data.notification.template.NotificationTemplate; import org.thingsboard.server.dao.settings.AdminSettingsService; import java.util.Collections; @@ -31,6 +36,9 @@ import java.util.Optional; public class DefaultNotificationSettingsService implements NotificationSettingsService { private final AdminSettingsService adminSettingsService; + private final NotificationTargetService notificationTargetService; + private final NotificationTemplateService notificationTemplateService; + private final NotificationRuleService notificationRuleService; private static final String SETTINGS_KEY = "notifications"; @@ -58,4 +66,28 @@ public class DefaultNotificationSettingsService implements NotificationSettingsS }); } + @Override + public void createDefaultNotificationConfigs(TenantId tenantId) { + NotificationTarget allUsersTarget = new NotificationTarget(); + allUsersTarget.setTenantId(tenantId); + allUsersTarget.setName("All users"); + PlatformUsersNotificationTargetConfig targetConfig = new PlatformUsersNotificationTargetConfig(); + targetConfig.setUsersFilter(new AllUsersFilter()); + targetConfig.setDescription("All users in scope of tenant"); + allUsersTarget.setConfiguration(targetConfig); + allUsersTarget = notificationTargetService.saveNotificationTarget(tenantId, allUsersTarget); + + NotificationTarget originatorEntityOwnerUsers = new NotificationTarget(); + originatorEntityOwnerUsers.setTenantId(tenantId); + originatorEntityOwnerUsers.setName("Users of rule trigger entity's owner"); + targetConfig.setUsersFilter(new OriginatorEntityOwnerUsersFilter()); + targetConfig.setDescription("For usage with notification rules. For example, if alarm trigger type is chosen, " + + "notifications will be sent to alarm owner's users, e.g. it's customer's users"); + originatorEntityOwnerUsers.setConfiguration(targetConfig); + originatorEntityOwnerUsers = notificationTargetService.saveNotificationTarget(tenantId, originatorEntityOwnerUsers); + + NotificationTemplate alarmNotificationTemplate = new NotificationTemplate(); + + } + } 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 3c40774ec6..e7e8d9458b 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 @@ -142,4 +142,9 @@ public class DefaultNotificationTargetService extends AbstractEntityService impl notificationTargetDao.removeById(tenantId, id.getId()); } + @Override + public void deleteNotificationTargetsByTenantId(TenantId tenantId) { + notificationTargetDao.removeByTenantId(tenantId); + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTemplateService.java b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTemplateService.java index 17904de321..49f17d4de4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTemplateService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTemplateService.java @@ -73,4 +73,9 @@ public class DefaultNotificationTemplateService extends AbstractEntityService im } } + @Override + public void deleteNotificationTemplatesByTenantId(TenantId tenantId) { + notificationTemplateDao.removeByTenantId(tenantId); + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationRequestDao.java b/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationRequestDao.java index cfe2ba9cd6..dfdd501dd0 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationRequestDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationRequestDao.java @@ -54,4 +54,6 @@ public interface NotificationRequestDao extends Dao { NotificationRequestInfo findInfoById(TenantId tenantId, NotificationRequestId id); + void removeByTenantId(TenantId tenantId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleDao.java b/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleDao.java index ced222abe7..049216ff63 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationRuleDao.java @@ -39,4 +39,6 @@ public interface NotificationRuleDao extends Dao { NotificationRuleInfo findInfoById(TenantId tenantId, NotificationRuleId id); + void removeByTenantId(TenantId tenantId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationTargetDao.java b/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationTargetDao.java index 941e548c3f..b3b0b6939c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationTargetDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationTargetDao.java @@ -30,4 +30,6 @@ public interface NotificationTargetDao extends Dao { List findByTenantIdAndIds(TenantId tenantId, List ids); + void removeByTenantId(TenantId tenantId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationTemplateDao.java b/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationTemplateDao.java index 78267305dd..e88f3351cf 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationTemplateDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/NotificationTemplateDao.java @@ -28,4 +28,6 @@ public interface NotificationTemplateDao extends Dao { PageData findByTenantIdAndNotificationTypesAndPageLink(TenantId tenantId, List notificationTypes, PageLink pageLink); + void removeByTenantId(TenantId tenantId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java index 5c2017fd53..f16ed5f48e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java @@ -107,6 +107,11 @@ public class JpaNotificationRequestDao extends JpaAbstractDao getEntityClass() { return NotificationRequestEntity.class; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java index 66a8bfae3f..876796601d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java @@ -75,6 +75,11 @@ public class JpaNotificationRuleDao extends JpaAbstractDao getEntityClass() { return NotificationRuleEntity.class; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java index 1a82981112..01869ee4d2 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java @@ -56,6 +56,11 @@ public class JpaNotificationTargetDao extends JpaAbstractDao getEntityClass() { return NotificationTargetEntity.class; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java index cf13190bd2..158c30d5bf 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java @@ -54,6 +54,11 @@ public class JpaNotificationTemplateDao extends JpaAbstractDao getRepository() { return notificationTemplateRepository; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java index cedd516227..0c114878c4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java @@ -71,4 +71,6 @@ public interface NotificationRequestRepository extends JpaRepository findByTenantIdAndIdIn(UUID tenantId, List ids); + void deleteByTenantId(UUID tenantId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java index 76ebec2d49..837ea95ec1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java @@ -39,4 +39,6 @@ public interface NotificationTemplateRepository extends JpaRepository existsTenantCache; @@ -209,6 +225,10 @@ public class TenantServiceImpl extends AbstractCachedEntityService