@ -18,6 +18,7 @@ package org.thingsboard.server.controller;
import com.fasterxml.jackson.databind.JsonNode ;
import com.fasterxml.jackson.databind.node.ObjectNode ;
import io.swagger.v3.oas.annotations.Parameter ;
import io.swagger.v3.oas.annotations.media.ArraySchema ;
import io.swagger.v3.oas.annotations.media.Content ;
import io.swagger.v3.oas.annotations.media.ExampleObject ;
import io.swagger.v3.oas.annotations.media.Schema ;
@ -64,10 +65,12 @@ 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.HashSet ;
import java.util.List ;
import java.util.Set ;
import java.util.UUID ;
import java.util.concurrent.ExecutionException ;
import java.util.stream.Collectors ;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE ;
@ -604,14 +607,7 @@ public class DashboardController extends BaseController {
checkEdgeId ( edgeId , Operation . READ ) ;
PageLink pageLink = createPageLink ( pageSize , page , textSearch , sortProperty , sortOrder ) ;
PageData < DashboardInfo > nonFilteredResult = dashboardService . findDashboardsByTenantIdAndEdgeId ( tenantId , edgeId , pageLink ) ;
List < DashboardInfo > filteredDashboards = nonFilteredResult . getData ( ) . stream ( ) . filter ( dashboardInfo - > {
try {
accessControlService . checkPermission ( getCurrentUser ( ) , Resource . DASHBOARD , Operation . READ , dashboardInfo . getId ( ) , dashboardInfo ) ;
return true ;
} catch ( ThingsboardException e ) {
return false ;
}
} ) . collect ( Collectors . toList ( ) ) ;
List < DashboardInfo > filteredDashboards = filterDashboardsByReadPermission ( nonFilteredResult . getData ( ) ) ;
PageData < DashboardInfo > filteredResult = new PageData < > ( filteredDashboards ,
nonFilteredResult . getTotalPages ( ) ,
nonFilteredResult . getTotalElements ( ) ,
@ -619,6 +615,24 @@ public class DashboardController extends BaseController {
return checkNotNull ( filteredResult ) ;
}
@ApiOperation ( value = "Get dashboards by Dashboard Ids (getDashboardsByIds)" ,
notes = "Returns a list of DashboardInfo objects based on the provided ids. " +
TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH )
@PreAuthorize ( "hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')" )
@GetMapping ( value = "/dashboards" , params = { "dashboardIds" } )
public List < DashboardInfo > getDashboardsByIds ( @Parameter ( description = "A list of dashboard ids, separated by comma ','" , array = @ArraySchema ( schema = @Schema ( type = "string" ) ) , required = true )
@RequestParam ( "dashboardIds" ) String [ ] strDashboardIds ) throws ThingsboardException , ExecutionException , InterruptedException {
checkArrayParameter ( "dashboardIds" , strDashboardIds ) ;
SecurityUser user = getCurrentUser ( ) ;
TenantId tenantId = user . getTenantId ( ) ;
List < DashboardId > dashboardIds = new ArrayList < > ( ) ;
for ( String strDashboardId : strDashboardIds ) {
dashboardIds . add ( new DashboardId ( toUUID ( strDashboardId ) ) ) ;
}
List < DashboardInfo > dashboards = checkNotNull ( dashboardService . findDashboardInfoByIdsAsync ( tenantId , dashboardIds ) . get ( ) ) ;
return filterDashboardsByReadPermission ( dashboards ) ;
}
private Set < CustomerId > customerIdFromStr ( String [ ] strCustomerIds ) {
Set < CustomerId > customerIds = new HashSet < > ( ) ;
if ( strCustomerIds ! = null ) {
@ -629,4 +643,14 @@ public class DashboardController extends BaseController {
return customerIds ;
}
private List < DashboardInfo > filterDashboardsByReadPermission ( List < DashboardInfo > dashboards ) {
return dashboards . stream ( ) . filter ( dashboard - > {
try {
return accessControlService . hasPermission ( getCurrentUser ( ) , Resource . DASHBOARD , Operation . READ , dashboard . getId ( ) , dashboard ) ;
} catch ( ThingsboardException e ) {
return false ;
}
} ) . collect ( Collectors . toList ( ) ) ;
}
}