From 0be3c0b5bbf194393e1c883eb3c187c93a915ee9 Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Tue, 14 Mar 2023 16:26:55 +0100 Subject: [PATCH] removed countEntitiesByTypes and added ability to use Entity count query for sysadmin --- .../server/controller/AdminController.java | 1 - .../controller/EntityQueryController.java | 17 +---- .../query/DefaultEntityQueryService.java | 7 +- .../service/query/EntityQueryService.java | 6 -- .../BaseEntityQueryControllerTest.java | 52 +++++++++++++- .../server/dao/entity/EntityService.java | 7 +- .../server/dao/entity/BaseEntityService.java | 13 +--- .../server/dao/entity/EntityQueryDao.java | 6 -- .../query/DefaultEntityQueryRepository.java | 68 +++---------------- .../dao/sql/query/EntityQueryRepository.java | 6 -- .../dao/sql/query/JpaEntityQueryDao.java | 8 --- .../thingsboard/rest/client/RestClient.java | 7 -- 12 files changed, 64 insertions(+), 134 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/AdminController.java b/application/src/main/java/org/thingsboard/server/controller/AdminController.java index c3078e7f83..a8eee51f17 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AdminController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AdminController.java @@ -401,7 +401,6 @@ public class AdminController extends BaseController { @ResponseBody public SystemInfo getSystemInfo() throws ThingsboardException { return systemInfoService.getSystemInfo(); - } } diff --git a/application/src/main/java/org/thingsboard/server/controller/EntityQueryController.java b/application/src/main/java/org/thingsboard/server/controller/EntityQueryController.java index f64dea7b8d..3fdc1bc236 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EntityQueryController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EntityQueryController.java @@ -27,7 +27,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.async.DeferredResult; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; @@ -42,9 +41,6 @@ import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.query.EntityQueryService; import org.thingsboard.server.service.security.permission.Operation; -import java.util.List; -import java.util.Map; - import static org.thingsboard.server.controller.ControllerConstants.ALARM_DATA_QUERY_DESCRIPTION; import static org.thingsboard.server.controller.ControllerConstants.ENTITY_COUNT_QUERY_DESCRIPTION; import static org.thingsboard.server.controller.ControllerConstants.ENTITY_DATA_QUERY_DESCRIPTION; @@ -60,7 +56,7 @@ public class EntityQueryController extends BaseController { private static final int MAX_PAGE_SIZE = 100; @ApiOperation(value = "Count Entities by Query", notes = ENTITY_COUNT_QUERY_DESCRIPTION) - @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") + @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") @RequestMapping(value = "/entitiesQuery/count", method = RequestMethod.POST) @ResponseBody public long countEntitiesByQuery( @@ -70,17 +66,6 @@ public class EntityQueryController extends BaseController { return this.entityQueryService.countEntitiesByQuery(getCurrentUser(), query); } - @ApiOperation(value = "Count Entities by Entity Types") - @PreAuthorize("hasAnyAuthority('SYS_ADMIN')") - @RequestMapping(value = "/entitiesTypes/count", method = RequestMethod.POST) - @ResponseBody - public Map countEntitiesByQuery( - @ApiParam(value = "A JSON value representing the entity types array.") - @RequestBody List entityTypes) throws ThingsboardException { - checkNotNull(entityTypes); - return this.entityQueryService.countEntitiesByTypes(getCurrentUser(), entityTypes); - } - @ApiOperation(value = "Find Entity Data by Query", notes = ENTITY_DATA_QUERY_DESCRIPTION) @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") @RequestMapping(value = "/entitiesQuery/find", method = RequestMethod.POST) diff --git a/application/src/main/java/org/thingsboard/server/service/query/DefaultEntityQueryService.java b/application/src/main/java/org/thingsboard/server/service/query/DefaultEntityQueryService.java index 154f64202a..ba5b29c11b 100644 --- a/application/src/main/java/org/thingsboard/server/service/query/DefaultEntityQueryService.java +++ b/application/src/main/java/org/thingsboard/server/service/query/DefaultEntityQueryService.java @@ -29,6 +29,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.web.context.request.async.DeferredResult; +import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.KvUtil; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.EntityId; @@ -55,7 +56,6 @@ import org.thingsboard.server.dao.attributes.AttributesService; import org.thingsboard.server.dao.entity.EntityService; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.timeseries.TimeseriesService; -import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.executors.DbCallbackExecutorService; import org.thingsboard.server.service.security.AccessValidator; @@ -102,11 +102,6 @@ public class DefaultEntityQueryService implements EntityQueryService { return entityService.countEntitiesByQuery(securityUser.getTenantId(), securityUser.getCustomerId(), query); } - @Override - public Map countEntitiesByTypes(SecurityUser securityUser, List entityTypes) { - return entityService.countEntitiesByTypes(securityUser.getTenantId(), securityUser.getCustomerId(), entityTypes); - } - @Override public PageData findEntityDataByQuery(SecurityUser securityUser, EntityDataQuery query) { if (query.getKeyFilters() != null) { diff --git a/application/src/main/java/org/thingsboard/server/service/query/EntityQueryService.java b/application/src/main/java/org/thingsboard/server/service/query/EntityQueryService.java index 8a37eadb70..b03fb02b33 100644 --- a/application/src/main/java/org/thingsboard/server/service/query/EntityQueryService.java +++ b/application/src/main/java/org/thingsboard/server/service/query/EntityQueryService.java @@ -17,7 +17,6 @@ package org.thingsboard.server.service.query; import org.springframework.http.ResponseEntity; import org.springframework.web.context.request.async.DeferredResult; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.query.AlarmData; @@ -27,15 +26,10 @@ import org.thingsboard.server.common.data.query.EntityData; import org.thingsboard.server.common.data.query.EntityDataQuery; import org.thingsboard.server.service.security.model.SecurityUser; -import java.util.List; -import java.util.Map; - public interface EntityQueryService { long countEntitiesByQuery(SecurityUser securityUser, EntityCountQuery query); - Map countEntitiesByTypes(SecurityUser securityUser, List entityTypes); - PageData findEntityDataByQuery(SecurityUser securityUser, EntityDataQuery query); PageData findAlarmDataByQuery(SecurityUser securityUser, AlarmDataQuery query); diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseEntityQueryControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseEntityQueryControllerTest.java index aeebc7bfee..f29827fbe2 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseEntityQueryControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseEntityQueryControllerTest.java @@ -92,7 +92,7 @@ public abstract class BaseEntityQueryControllerTest extends AbstractControllerTe } @Test - public void testCountEntitiesByQuery() throws Exception { + public void testTenantCountEntitiesByQuery() throws Exception { List devices = new ArrayList<>(); for (int i = 0; i < 97; i++) { Device device = new Device(); @@ -139,6 +139,56 @@ public abstract class BaseEntityQueryControllerTest extends AbstractControllerTe Assert.assertEquals(97, count2.longValue()); } + @Test + public void testSysAdminCountEntitiesByQuery() throws Exception { + List devices = new ArrayList<>(); + for (int i = 0; i < 97; i++) { + Device device = new Device(); + device.setName("Device" + i); + device.setType("default"); + device.setLabel("testLabel" + (int) (Math.random() * 1000)); + devices.add(doPost("/api/device", device, Device.class)); + Thread.sleep(1); + } + DeviceTypeFilter filter = new DeviceTypeFilter(); + filter.setDeviceType("default"); + filter.setDeviceNameFilter(""); + + loginSysAdmin(); + + EntityCountQuery countQuery = new EntityCountQuery(filter); + + Long count = doPostWithResponse("/api/entitiesQuery/count", countQuery, Long.class); + Assert.assertEquals(97, count.longValue()); + + filter.setDeviceType("unknown"); + count = doPostWithResponse("/api/entitiesQuery/count", countQuery, Long.class); + Assert.assertEquals(0, count.longValue()); + + filter.setDeviceType("default"); + filter.setDeviceNameFilter("Device1"); + + count = doPostWithResponse("/api/entitiesQuery/count", countQuery, Long.class); + Assert.assertEquals(11, count.longValue()); + + EntityListFilter entityListFilter = new EntityListFilter(); + entityListFilter.setEntityType(EntityType.DEVICE); + entityListFilter.setEntityList(devices.stream().map(Device::getId).map(DeviceId::toString).collect(Collectors.toList())); + + countQuery = new EntityCountQuery(entityListFilter); + + count = doPostWithResponse("/api/entitiesQuery/count", countQuery, Long.class); + Assert.assertEquals(97, count.longValue()); + + EntityTypeFilter filter2 = new EntityTypeFilter(); + filter2.setEntityType(EntityType.DEVICE); + + EntityCountQuery countQuery2 = new EntityCountQuery(filter2); + + Long count2 = doPostWithResponse("/api/entitiesQuery/count", countQuery2, Long.class); + Assert.assertEquals(97, count2.longValue()); + } + @Test public void testSimpleFindEntityDataByQuery() throws Exception { List devices = new ArrayList<>(); diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityService.java index 23e33b26e5..3983494d70 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityService.java @@ -15,18 +15,15 @@ */ package org.thingsboard.server.dao.entity; -import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.id.NameLabelAndCustomerDetails; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.NameLabelAndCustomerDetails; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.query.EntityCountQuery; import org.thingsboard.server.common.data.query.EntityData; import org.thingsboard.server.common.data.query.EntityDataQuery; -import java.util.List; -import java.util.Map; import java.util.Optional; public interface EntityService { @@ -41,7 +38,5 @@ public interface EntityService { long countEntitiesByQuery(TenantId tenantId, CustomerId customerId, EntityCountQuery query); - Map countEntitiesByTypes(TenantId tenantId, CustomerId customerId, List entityTypes); - PageData findEntityDataByQuery(TenantId tenantId, CustomerId customerId, EntityDataQuery query); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java b/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java index f4ce434635..a7c918f9ee 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java @@ -19,17 +19,16 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.HasCustomerId; import org.thingsboard.server.common.data.HasEmail; import org.thingsboard.server.common.data.HasLabel; import org.thingsboard.server.common.data.HasName; import org.thingsboard.server.common.data.HasTitle; import org.thingsboard.server.common.data.StringUtils; -import org.thingsboard.server.common.data.id.NameLabelAndCustomerDetails; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.HasId; +import org.thingsboard.server.common.data.id.NameLabelAndCustomerDetails; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.query.EntityCountQuery; @@ -39,8 +38,6 @@ import org.thingsboard.server.common.data.query.EntityFilterType; import org.thingsboard.server.common.data.query.RelationsQueryFilter; import org.thingsboard.server.dao.exception.IncorrectParameterException; -import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.function.Function; @@ -74,14 +71,6 @@ public class BaseEntityService extends AbstractEntityService implements EntitySe return this.entityQueryDao.countEntitiesByQuery(tenantId, customerId, query); } - @Override - public Map countEntitiesByTypes(TenantId tenantId, CustomerId customerId, List entityTypes) { - log.trace("Executing countEntitiesByQuery, tenantId [{}], customerId [{}], entityTypes [{}]", tenantId, customerId, entityTypes); - validateId(tenantId, INCORRECT_TENANT_ID + tenantId); - validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); - return this.entityQueryDao.countEntitiesByTypes(tenantId, customerId, entityTypes); - } - @Override public PageData findEntityDataByQuery(TenantId tenantId, CustomerId customerId, EntityDataQuery query) { log.trace("Executing findEntityDataByQuery, tenantId [{}], customerId [{}], query [{}]", tenantId, customerId, query); diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/EntityQueryDao.java b/dao/src/main/java/org/thingsboard/server/dao/entity/EntityQueryDao.java index bcdde392dc..9fafe2e0f0 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entity/EntityQueryDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entity/EntityQueryDao.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.dao.entity; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; @@ -23,15 +22,10 @@ import org.thingsboard.server.common.data.query.EntityCountQuery; import org.thingsboard.server.common.data.query.EntityData; import org.thingsboard.server.common.data.query.EntityDataQuery; -import java.util.List; -import java.util.Map; - public interface EntityQueryDao { long countEntitiesByQuery(TenantId tenantId, CustomerId customerId, EntityCountQuery query); PageData findEntityDataByQuery(TenantId tenantId, CustomerId customerId, EntityDataQuery query); - Map countEntitiesByTypes(TenantId tenantId, CustomerId customerId, List entityTypes); - } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java index c4bf057efd..8f9226c180 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java @@ -53,7 +53,6 @@ import org.thingsboard.server.common.data.query.SingleEntityFilter; import org.thingsboard.server.common.data.relation.EntitySearchDirection; import org.thingsboard.server.common.data.relation.RelationEntityTypeFilter; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -312,12 +311,18 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { @Override public long countEntitiesByQuery(TenantId tenantId, CustomerId customerId, EntityCountQuery query) { EntityType entityType = resolveEntityType(query.getEntityFilter()); - QueryContext ctx = new QueryContext(new QuerySecurityContext(tenantId, customerId, entityType)); + QueryContext ctx = new QueryContext(new QuerySecurityContext(tenantId, customerId, entityType, TenantId.SYS_TENANT_ID.equals(tenantId))); if (query.getKeyFilters() == null || query.getKeyFilters().isEmpty()) { ctx.append("select count(e.id) from "); ctx.append(addEntityTableQuery(ctx, query.getEntityFilter())); - ctx.append(" e where "); - ctx.append(buildEntityWhere(ctx, query.getEntityFilter(), Collections.emptyList())); +// +// if (TenantId.SYS_TENANT_ID.equals(tenantId)) { +// ctx.append(" e"); +// } else { + ctx.append(" e where "); + ctx.append(buildEntityWhere(ctx, query.getEntityFilter(), Collections.emptyList())); +// } + return transactionTemplate.execute(status -> { long startTs = System.currentTimeMillis(); try { @@ -389,61 +394,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { return findEntityDataByQuery(tenantId, customerId, query, false); } - @Override - public Map countEntitiesByTypes(TenantId tenantId, CustomerId customerId, List entityTypes) { - int size = entityTypes.size(); - - QueryContext ctx = new QueryContext(new QuerySecurityContext(tenantId, customerId, null, true)); - ctx.append("select "); - - for (int i = 0; i < size; i++) { - ctx.append("(select count(*) from "); - ctx.append(getTableName(entityTypes.get(i))); - ctx.append(")"); - if (i < size - 1) { - ctx.append(", "); - } - } - - return transactionTemplate.execute(status -> { - long startTs = System.currentTimeMillis(); - try { - List counts = jdbcTemplate.query(ctx.getQuery(), rs -> { - List result = new ArrayList<>(); - if (rs.next()) { - for (int i = 1; i <= size; i++) { - result.add(rs.getLong(i)); - } - } - return result; - }); - - Map result = new HashMap<>(size); - for (int i = 0; i < size; i++) { - result.put(entityTypes.get(i), counts.get(i)); - } - return result; - } finally { - queryLog.logQuery(ctx, ctx.getQuery(), System.currentTimeMillis() - startTs); - } - }); - } - - private String getTableName(EntityType entityType) { - switch (entityType) { - case TENANT: - case TENANT_PROFILE: - case CUSTOMER: - case DEVICE: - case ASSET: - return entityType.name().toLowerCase(); - case USER: - return "tb_user"; - default: - throw new IllegalArgumentException("Not supported entity type: " + entityType + "!"); - } - } - public PageData findEntityDataByQuery(TenantId tenantId, CustomerId customerId, EntityDataQuery query, boolean ignorePermissionCheck) { return transactionTemplate.execute(status -> { EntityType entityType = resolveEntityType(query.getEntityFilter()); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityQueryRepository.java index 5fd91057ce..7d78a34981 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityQueryRepository.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.dao.sql.query; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; @@ -23,9 +22,6 @@ import org.thingsboard.server.common.data.query.EntityCountQuery; import org.thingsboard.server.common.data.query.EntityData; import org.thingsboard.server.common.data.query.EntityDataQuery; -import java.util.List; -import java.util.Map; - public interface EntityQueryRepository { long countEntitiesByQuery(TenantId tenantId, CustomerId customerId, EntityCountQuery query); @@ -34,6 +30,4 @@ public interface EntityQueryRepository { PageData findEntityDataByQueryInternal(EntityDataQuery query); - Map countEntitiesByTypes(TenantId tenantId, CustomerId customerId, List entityTypes); - } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/JpaEntityQueryDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/JpaEntityQueryDao.java index 3929c98eec..192caed6a8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/JpaEntityQueryDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/JpaEntityQueryDao.java @@ -17,7 +17,6 @@ package org.thingsboard.server.dao.sql.query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; @@ -26,9 +25,6 @@ import org.thingsboard.server.common.data.query.EntityData; import org.thingsboard.server.common.data.query.EntityDataQuery; import org.thingsboard.server.dao.entity.EntityQueryDao; -import java.util.List; -import java.util.Map; - @Component public class JpaEntityQueryDao implements EntityQueryDao { @@ -45,8 +41,4 @@ public class JpaEntityQueryDao implements EntityQueryDao { return entityQueryRepository.findEntityDataByQuery(tenantId, customerId, query); } - @Override - public Map countEntitiesByTypes(TenantId tenantId, CustomerId customerId, List entityTypes) { - return entityQueryRepository.countEntitiesByTypes(tenantId, customerId, entityTypes); - } } diff --git a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java index 7eee546632..832f4c7046 100644 --- a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java +++ b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java @@ -1584,13 +1584,6 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { return restTemplate.postForObject(baseURL + "/api/entitiesQuery/count", query, Long.class); } - public Map countEntitiesByTypes(List entityTypes) { - return restTemplate.exchange( - baseURL + "/api/entitiesTypes/count", - HttpMethod.POST, new HttpEntity<>(entityTypes), new ParameterizedTypeReference>() { - }).getBody(); - } - public PageData findEntityDataByQuery(EntityDataQuery query) { return restTemplate.exchange( baseURL + "/api/entitiesQuery/find",