Browse Source

added get entity views by ids endpoint

pull/14355/head
Artem Barysh 10 months ago
parent
commit
0dd37617e1
  1. 49
      application/src/main/java/org/thingsboard/server/controller/EntityViewController.java
  2. 33
      application/src/test/java/org/thingsboard/server/controller/EntityViewControllerTest.java
  3. 2
      common/dao-api/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java
  4. 2
      dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java
  5. 10
      dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java
  6. 2
      dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java
  7. 5
      dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java

49
application/src/main/java/org/thingsboard/server/controller/EntityViewController.java

@ -17,11 +17,13 @@ package org.thingsboard.server.controller;
import com.google.common.util.concurrent.ListenableFuture;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
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;
@ -53,6 +55,7 @@ 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.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
@ -347,14 +350,7 @@ public class EntityViewController extends BaseController {
checkNotNull(query.getEntityViewTypes());
checkEntityId(query.getParameters().getEntityId(), Operation.READ);
List<EntityView> entityViews = checkNotNull(entityViewService.findEntityViewsByQuery(getTenantId(), query).get());
entityViews = entityViews.stream().filter(entityView -> {
try {
accessControlService.checkPermission(getCurrentUser(), Resource.ENTITY_VIEW, Operation.READ, entityView.getId(), entityView);
return true;
} catch (ThingsboardException e) {
return false;
}
}).collect(Collectors.toList());
entityViews = filterEntityViewsByReadPermission(entityViews);
return entityViews;
}
@ -459,18 +455,39 @@ public class EntityViewController extends BaseController {
} else {
nonFilteredResult = entityViewService.findEntityViewsByTenantIdAndEdgeId(tenantId, edgeId, pageLink);
}
List<EntityView> filteredEntityViews = nonFilteredResult.getData().stream().filter(entityView -> {
try {
accessControlService.checkPermission(getCurrentUser(), Resource.ENTITY_VIEW, Operation.READ, entityView.getId(), entityView);
return true;
} catch (ThingsboardException e) {
return false;
}
}).collect(Collectors.toList());
List<EntityView> filteredEntityViews = filterEntityViewsByReadPermission(nonFilteredResult.getData());
PageData<EntityView> filteredResult = new PageData<>(filteredEntityViews,
nonFilteredResult.getTotalPages(),
nonFilteredResult.getTotalElements(),
nonFilteredResult.hasNext());
return checkNotNull(filteredResult);
}
@ApiOperation(value = "Get Entity Views By Ids (getEntityViewsByIds)",
notes = "Requested entity views must be owned by tenant or assigned to customer which user is performing the request. ")
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
@GetMapping(value = "/entityViews", params = {"entityViewIds"})
public List<EntityView> getEntityViewsByIds(@Parameter(description = "A list of entity view ids, separated by comma ','", array = @ArraySchema(schema = @Schema(type = "string")), required = true)
@RequestParam("entityViewIds") String[] strEntityViewIds) throws ThingsboardException, ExecutionException, InterruptedException {
checkArrayParameter("entityViewIds", strEntityViewIds);
SecurityUser user = getCurrentUser();
TenantId tenantId = user.getTenantId();
List<EntityViewId> entityViewIds = new ArrayList<>();
for (String strEntityViewId : strEntityViewIds) {
entityViewIds.add(new EntityViewId(toUUID(strEntityViewId)));
}
List<EntityView> entityViews = checkNotNull(entityViewService.findEntityViewsByTenantIdAndIdsAsync(tenantId, entityViewIds).get());
return filterEntityViewsByReadPermission(entityViews);
}
private List<EntityView> filterEntityViewsByReadPermission(List<EntityView> entityViews) {
return entityViews.stream().filter(entityView -> {
try {
return accessControlService.hasPermission(getCurrentUser(), Resource.ENTITY_VIEW, Operation.READ, entityView.getId(), entityView);
} catch (ThingsboardException e) {
return false;
}
}).collect(Collectors.toList());
}
}

33
application/src/test/java/org/thingsboard/server/controller/EntityViewControllerTest.java

@ -68,11 +68,14 @@ import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.service.DaoSqlTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import static java.util.concurrent.TimeUnit.HOURS;
@ -148,6 +151,36 @@ public class EntityViewControllerTest extends AbstractControllerTest {
assertEquals(savedView, foundView);
}
@Test
public void testFindEntityViewByIds() throws Exception {
List<EntityView> assetProfiles = new ArrayList<>();
for (int i = 0; i < 20; i++) {
assetProfiles.add(getNewSavedEntityView("Test entity view " + i));
}
List<EntityView> expected = assetProfiles.subList(5, 15);
String idsParam = expected.stream()
.map(ap -> ap.getId().getId().toString())
.collect(Collectors.joining(","));
EntityView[] foundEntityViews = doGet("/api/entityViews?entityViewIds=" + idsParam, EntityView[].class);
Assert.assertNotNull(foundEntityViews);
Assert.assertEquals(expected.size(), foundEntityViews.length);
Map<UUID, EntityView> infoById = Arrays.stream(foundEntityViews)
.collect(Collectors.toMap(info -> info.getId().getId(), Function.identity()));
for (EntityView entityView : expected) {
UUID id = entityView.getId().getId();
EntityView view = infoById.get(id);
Assert.assertNotNull("Entity view not found for id " + id, view);
Assert.assertEquals(entityView.getId(), view.getId());
Assert.assertEquals(entityView.getName(), view.getName());
}
}
@Test
public void testSaveEntityView() throws Exception {
String name = "Test entity view";

2
common/dao-api/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java

@ -65,6 +65,8 @@ public interface EntityViewService extends EntityDaoService {
PageData<EntityView> findEntityViewsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, PageLink pageLink);
ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndIdsAsync(TenantId tenantId, List<EntityViewId> entityViewIds);
PageData<EntityViewInfo> findEntityViewInfosByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, PageLink pageLink);
PageData<EntityView> findEntityViewsByTenantIdAndCustomerIdAndType(TenantId tenantId, CustomerId customerId, PageLink pageLink, String type);

2
dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java

@ -169,6 +169,8 @@ public interface EntityViewDao extends Dao<EntityView>, ExportableEntityDao<Enti
UUID edgeId,
PageLink pageLink);
ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndIdsAsync(UUID tenantId, List<UUID> entityViewIds);
/**
* Find entity views by tenantId, edgeId, type and page link.
*

10
dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java

@ -62,7 +62,9 @@ import java.util.Optional;
import java.util.stream.Collectors;
import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
import static org.thingsboard.server.dao.DaoUtil.toUUIDs;
import static org.thingsboard.server.dao.service.Validator.validateId;
import static org.thingsboard.server.dao.service.Validator.validateIds;
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
import static org.thingsboard.server.dao.service.Validator.validateString;
@ -255,6 +257,14 @@ public class EntityViewServiceImpl extends CachedVersionedEntityService<EntityVi
customerId.getId(), pageLink);
}
@Override
public ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndIdsAsync(TenantId tenantId, List<EntityViewId> entityViewIds) {
log.trace("Executing findEntityViewsByTenantIdAndIdsAsync, tenantId [{}], entityViewIds [{}]", tenantId, entityViewIds);
validateId(tenantId, id -> INCORRECT_TENANT_ID + id);
validateIds(entityViewIds, ids -> "Incorrect entityViewIds " + ids);
return entityViewDao.findEntityViewsByTenantIdAndIdsAsync(tenantId.getId(), toUUIDs(entityViewIds));
}
@Override
public PageData<EntityViewInfo> findEntityViewInfosByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, PageLink pageLink) {
log.trace("Executing findEntityViewInfosByTenantIdAndCustomerId, tenantId [{}], customerId [{}]," +

2
dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java

@ -122,6 +122,8 @@ public interface EntityViewRepository extends JpaRepository<EntityViewEntity, UU
boolean existsByTenantIdAndEntityId(UUID tenantId, UUID entityId);
List<EntityViewEntity> findEntityViewsByTenantIdAndIdIn(UUID tenantId, List<UUID> entityViewIds);
@Query("SELECT DISTINCT ev.type FROM EntityViewEntity ev WHERE ev.tenantId = :tenantId")
List<String> findTenantEntityViewTypes(@Param("tenantId") UUID tenantId);

5
dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java

@ -187,6 +187,11 @@ public class JpaEntityViewDao extends JpaAbstractDao<EntityViewEntity, EntityVie
DaoUtil.toPageable(pageLink)));
}
@Override
public ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndIdsAsync(UUID tenantId, List<UUID> entityViewIds) {
return service.submit(() -> DaoUtil.convertDataList(entityViewRepository.findEntityViewsByTenantIdAndIdIn(tenantId, entityViewIds)));
}
@Override
public PageData<EntityView> findEntityViewsByTenantIdAndEdgeIdAndType(UUID tenantId, UUID edgeId, String type, PageLink pageLink) {
log.debug("Try to find entity views by tenantId [{}], edgeId [{}], type [{}] and pageLink [{}]", tenantId, edgeId, type, pageLink);

Loading…
Cancel
Save