From ea7f876d4d6e097ff9ec024c3ffd665fbea3a465 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Mon, 20 Mar 2023 11:32:18 +0200 Subject: [PATCH 1/2] Tests fixes --- .../DefaultNotificationService.java | 18 +++++++++++++++++- .../usagerecord/DefaultApiLimitService.java | 4 +++- .../test/resources/application-test.properties | 2 ++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationService.java b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationService.java index cf34f6fcfb..20a32efbe0 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationService.java @@ -18,6 +18,9 @@ package org.thingsboard.server.dao.notification; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.HasId; import org.thingsboard.server.common.data.id.NotificationId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; @@ -26,12 +29,15 @@ import org.thingsboard.server.common.data.notification.NotificationStatus; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.SortOrder; +import org.thingsboard.server.dao.entity.EntityDaoService; import org.thingsboard.server.dao.sql.query.EntityKeyMapping; +import java.util.Optional; + @Service @Slf4j @RequiredArgsConstructor -public class DefaultNotificationService implements NotificationService { +public class DefaultNotificationService implements NotificationService, EntityDaoService { private final NotificationDao notificationDao; @@ -81,4 +87,14 @@ public class DefaultNotificationService implements NotificationService { return notificationDao.deleteByIdAndRecipientId(tenantId, recipientId, notificationId); } + @Override + public Optional> findEntity(TenantId tenantId, EntityId entityId) { + return Optional.ofNullable(findNotificationById(tenantId, new NotificationId(entityId.getId()))); + } + + @Override + public EntityType getEntityType() { + return EntityType.NOTIFICATION; + } + } 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 7a25c70a75..24d2e4eb3a 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 @@ -19,6 +19,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.query.EntityCountQuery; import org.thingsboard.server.common.data.query.EntityTypeFilter; @@ -44,7 +46,7 @@ public class DefaultApiLimitService implements ApiLimitService { if (limit > 0) { EntityTypeFilter filter = new EntityTypeFilter(); filter.setEntityType(entityType); - long currentCount = entityService.countEntitiesByQuery(tenantId, null, new EntityCountQuery(filter)); + long currentCount = entityService.countEntitiesByQuery(tenantId, new CustomerId(EntityId.NULL_UUID), new EntityCountQuery(filter)); if (notificationRuleProcessingService != null) { notificationRuleProcessingService.process(tenantId, entityType, limit, currentCount); } diff --git a/dao/src/test/resources/application-test.properties b/dao/src/test/resources/application-test.properties index a2a21abc11..fc46ba431a 100644 --- a/dao/src/test/resources/application-test.properties +++ b/dao/src/test/resources/application-test.properties @@ -65,6 +65,8 @@ cache.specs.otaPackagesData.maxSize=100000 cache.specs.edges.timeToLiveInMinutes=1440 cache.specs.edges.maxSize=100000 +cache.specs.notificationRules.timeToLiveInMinutes=1440 +cache.specs.notificationRules.maxSize=10000 redis.connection.host=localhost redis.connection.port=6379 From 1382c49881d70b1fc66a171f462ffa6346b92f40 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Mon, 20 Mar 2023 14:06:53 +0200 Subject: [PATCH 2/2] Endpoint to find tenant profiles by ids --- .../controller/TenantProfileController.java | 15 +++++++++++++++ .../server/dao/tenant/TenantProfileService.java | 5 +++++ .../DefaultNotificationSettingsService.java | 2 -- .../DefaultNotificationTargetService.java | 2 +- .../dao/sql/tenant/JpaTenantProfileDao.java | 8 ++++++++ .../dao/sql/tenant/TenantProfileRepository.java | 3 +++ .../server/dao/tenant/TenantProfileDao.java | 3 +++ .../dao/tenant/TenantProfileServiceImpl.java | 6 ++++++ 8 files changed, 41 insertions(+), 3 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/TenantProfileController.java b/application/src/main/java/org/thingsboard/server/controller/TenantProfileController.java index 6c46fc0fdf..a28842a6ee 100644 --- a/application/src/main/java/org/thingsboard/server/controller/TenantProfileController.java +++ b/application/src/main/java/org/thingsboard/server/controller/TenantProfileController.java @@ -21,6 +21,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -32,14 +34,19 @@ import org.springframework.web.bind.annotation.RestController; import org.thingsboard.server.common.data.EntityInfo; import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.exception.ThingsboardException; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantProfileId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.entitiy.tenant.profile.TbTenantProfileService; +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 java.util.List; +import java.util.UUID; + import static org.thingsboard.server.controller.ControllerConstants.MARKDOWN_CODE_BLOCK_END; import static org.thingsboard.server.controller.ControllerConstants.MARKDOWN_CODE_BLOCK_START; import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS; @@ -268,4 +275,12 @@ public class TenantProfileController extends BaseController { throw handleException(e); } } + + @GetMapping(value = "/tenantProfiles", params = {"ids"}) + @PreAuthorize("hasAuthority('SYS_ADMIN')") + public List getTenantProfilesByIds(@RequestParam("ids") UUID[] ids) { + return tenantProfileService.findTenantProfilesByIds(TenantId.SYS_TENANT_ID, ids); + } + + } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileService.java index 02345e77fd..d1b5bcc1cb 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileService.java @@ -23,6 +23,9 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.entity.EntityDaoService; +import java.util.List; +import java.util.UUID; + public interface TenantProfileService extends EntityDaoService { TenantProfile findTenantProfileById(TenantId tenantId, TenantProfileId tenantProfileId); @@ -47,4 +50,6 @@ public interface TenantProfileService extends EntityDaoService { void deleteTenantProfiles(TenantId tenantId); + List findTenantProfilesByIds(TenantId tenantId, UUID[] ids); + } 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 80b56da689..b6d976e57a 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 @@ -101,8 +101,6 @@ public class DefaultNotificationSettingsService implements NotificationSettingsS }); } - // TODO: validate that wasn't already created (catch exception unique name) - // FIXME: user that does not have access to some entity, gets notifications about this entity - check permissions? @Transactional(propagation = Propagation.NOT_SUPPORTED) // so that parent transaction is not aborted on method failure @Override public void createDefaultNotificationConfigs(TenantId tenantId) { 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 01180c6ee4..fe85e4c6fc 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 @@ -147,7 +147,7 @@ public class DefaultNotificationTargetService extends AbstractEntityService impl if (customerId != null && !customerId.isNullUid()) { return userService.findCustomerUsers(tenantId, customerId, pageLink); } else { - return userService.findTenantAdmins(tenantId, pageLink); // TODO: or should we send to all users within tenant? + return userService.findTenantAdmins(tenantId, pageLink); } } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java index 147d065e8b..6ba2337f5f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java @@ -29,6 +29,8 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; import org.thingsboard.server.dao.tenant.TenantProfileDao; import org.thingsboard.server.dao.util.SqlDao; +import java.util.Arrays; +import java.util.List; import java.util.Objects; import java.util.UUID; @@ -79,4 +81,10 @@ public class JpaTenantProfileDao extends JpaAbstractSearchTextDao findTenantProfilesByIds(TenantId tenantId, UUID[] ids) { + return DaoUtil.convertDataList(tenantProfileRepository.findByIdIn(Arrays.asList(ids))); + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java index 21d44daa59..74cc24be86 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java @@ -23,6 +23,7 @@ import org.springframework.data.repository.query.Param; import org.thingsboard.server.common.data.EntityInfo; import org.thingsboard.server.dao.model.sql.TenantProfileEntity; +import java.util.List; import java.util.UUID; public interface TenantProfileRepository extends JpaRepository { @@ -52,4 +53,6 @@ public interface TenantProfileRepository extends JpaRepository findByIdIn(List ids); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileDao.java b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileDao.java index 0875c7664e..d6353b213c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileDao.java @@ -22,6 +22,7 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.Dao; +import java.util.List; import java.util.UUID; public interface TenantProfileDao extends Dao { @@ -38,4 +39,6 @@ public interface TenantProfileDao extends Dao { EntityInfo findDefaultTenantProfileInfo(TenantId tenantId); + List findTenantProfilesByIds(TenantId tenantId, UUID[] ids); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileServiceImpl.java index b52bab1d3a..4262aca2e4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileServiceImpl.java @@ -40,6 +40,7 @@ import org.thingsboard.server.dao.service.Validator; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.UUID; import static org.thingsboard.server.dao.service.Validator.validateId; @@ -202,6 +203,11 @@ public class TenantProfileServiceImpl extends AbstractCachedEntityService findTenantProfilesByIds(TenantId tenantId, UUID[] ids) { + return tenantProfileDao.findTenantProfilesByIds(tenantId, ids); + } + @Override public void deleteTenantProfiles(TenantId tenantId) { log.trace("Executing deleteTenantProfiles");