From 2ec11b2af1dc3c7538536bcd6996e2c6f9af9ee1 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 29 Dec 2020 16:03:22 +0200 Subject: [PATCH] Display edge related entities on customer level --- .../server/controller/AssetController.java | 13 +- .../controller/DashboardController.java | 14 +- .../server/controller/DeviceController.java | 13 +- .../server/controller/EdgeController.java | 6 +- .../controller/EntityViewController.java | 13 +- ui/src/app/asset/asset.controller.js | 95 ++++++++------ ui/src/app/dashboard/dashboards.controller.js | 120 +++++++++++------- ui/src/app/device/device.controller.js | 95 ++++++++------ ui/src/app/edge/edge-fieldset.tpl.html | 8 +- ui/src/app/edge/edge.controller.js | 52 +++++++- ui/src/app/edge/edge.routes.js | 8 +- .../app/entity-view/entity-view.controller.js | 93 ++++++++------ 12 files changed, 348 insertions(+), 182 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/AssetController.java b/application/src/main/java/org/thingsboard/server/controller/AssetController.java index d512653483..91ddaa85ae 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AssetController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AssetController.java @@ -415,7 +415,7 @@ public class AssetController extends BaseController { } } - @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") + @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") @RequestMapping(value = "/edge/{edgeId}/assets", params = {"limit"}, method = RequestMethod.GET) @ResponseBody public TimePageData getEdgeAssets( @@ -431,7 +431,16 @@ public class AssetController extends BaseController { EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); checkEdgeId(edgeId, Operation.READ); TimePageLink pageLink = createPageLink(limit, startTime, endTime, ascOrder, offset); - return checkNotNull(assetService.findAssetsByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get()); + TimePageData nonFilteredResult = assetService.findAssetsByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get(); + List filteredAssets = nonFilteredResult.getData().stream().filter(asset -> { + try { + accessControlService.checkPermission(getCurrentUser(), Resource.ASSET, Operation.READ, asset.getId(), asset); + return true; + } catch (ThingsboardException e) { + return false; + } + }).collect(Collectors.toList()); + return checkNotNull(new TimePageData<>(filteredAssets, nonFilteredResult.getNextPageLink(), nonFilteredResult.hasNext())); } catch (Exception e) { throw handleException(e); } diff --git a/application/src/main/java/org/thingsboard/server/controller/DashboardController.java b/application/src/main/java/org/thingsboard/server/controller/DashboardController.java index 536522d53c..b0fb40067c 100644 --- a/application/src/main/java/org/thingsboard/server/controller/DashboardController.java +++ b/application/src/main/java/org/thingsboard/server/controller/DashboardController.java @@ -50,6 +50,7 @@ import org.thingsboard.server.service.security.permission.Resource; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; @RestController @TbCoreComponent @@ -554,7 +555,7 @@ public class DashboardController extends BaseController { } } - @PreAuthorize("hasAuthority('TENANT_ADMIN')") + @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") @RequestMapping(value = "/edge/{edgeId}/dashboards", params = { "limit" }, method = RequestMethod.GET) @ResponseBody public TimePageData getEdgeDashboards( @@ -570,7 +571,16 @@ public class DashboardController extends BaseController { EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); checkEdgeId(edgeId, Operation.READ); TimePageLink pageLink = createPageLink(limit, startTime, endTime, ascOrder, offset); - return checkNotNull(dashboardService.findDashboardsByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get()); + TimePageData nonFilteredResult = dashboardService.findDashboardsByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get(); + List filteredDashboards = nonFilteredResult.getData().stream().filter(dashboard -> { + try { + accessControlService.checkPermission(getCurrentUser(), Resource.DASHBOARD, Operation.READ, dashboard.getId(), dashboard); + return true; + } catch (ThingsboardException e) { + return false; + } + }).collect(Collectors.toList()); + return checkNotNull(new TimePageData<>(filteredDashboards, nonFilteredResult.getNextPageLink(), nonFilteredResult.hasNext())); } catch (Exception e) { throw handleException(e); } diff --git a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java index 6b272ab9d6..21ace2e57b 100644 --- a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java +++ b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java @@ -631,7 +631,7 @@ public class DeviceController extends BaseController { } } - @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") + @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") @RequestMapping(value = "/edge/{edgeId}/devices", params = {"limit"}, method = RequestMethod.GET) @ResponseBody public TimePageData getEdgeDevices( @@ -647,7 +647,16 @@ public class DeviceController extends BaseController { EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); checkEdgeId(edgeId, Operation.READ); TimePageLink pageLink = createPageLink(limit, startTime, endTime, ascOrder, offset); - return checkNotNull(deviceService.findDevicesByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get()); + TimePageData nonFilteredResult = deviceService.findDevicesByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get(); + List filteredDevices = nonFilteredResult.getData().stream().filter(device -> { + try { + accessControlService.checkPermission(getCurrentUser(), Resource.DEVICE, Operation.READ, device.getId(), device); + return true; + } catch (ThingsboardException e) { + return false; + } + }).collect(Collectors.toList()); + return checkNotNull(new TimePageData<>(filteredDevices, nonFilteredResult.getNextPageLink(), nonFilteredResult.hasNext())); } catch (Exception e) { throw handleException(e); } diff --git a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java index 54482d35e9..e31e711e5c 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java @@ -162,9 +162,9 @@ public class EdgeController extends BaseController { @RequestMapping(value = "/edges", params = {"limit"}, method = RequestMethod.GET) @ResponseBody public TextPageData getEdges(@RequestParam int limit, - @RequestParam(required = false) String textSearch, - @RequestParam(required = false) String idOffset, - @RequestParam(required = false) String textOffset) throws ThingsboardException { + @RequestParam(required = false) String textSearch, + @RequestParam(required = false) String idOffset, + @RequestParam(required = false) String textOffset) throws ThingsboardException { try { TextPageLink pageLink = createPageLink(limit, textSearch, idOffset, textOffset); TenantId tenantId = getCurrentUser().getTenantId(); diff --git a/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java b/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java index 99a58c8e7f..f2b91fa918 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java @@ -449,7 +449,7 @@ public class EntityViewController extends BaseController { } } - @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") + @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") @RequestMapping(value = "/edge/{edgeId}/entityViews", params = {"limit"}, method = RequestMethod.GET) @ResponseBody public TimePageData getEdgeEntityViews( @@ -465,7 +465,16 @@ public class EntityViewController extends BaseController { EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); checkEdgeId(edgeId, Operation.READ); TimePageLink pageLink = createPageLink(limit, startTime, endTime, ascOrder, offset); - return checkNotNull(entityViewService.findEntityViewsByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get()); + TimePageData nonFilteredResult = entityViewService.findEntityViewsByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get(); + List 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()); + return checkNotNull(new TimePageData<>(filteredEntityViews, nonFilteredResult.getNextPageLink(), nonFilteredResult.hasNext())); } catch (Exception e) { throw handleException(e); } diff --git a/ui/src/app/asset/asset.controller.js b/ui/src/app/asset/asset.controller.js index 1be789b233..6aba76f688 100644 --- a/ui/src/app/asset/asset.controller.js +++ b/ui/src/app/asset/asset.controller.js @@ -142,7 +142,11 @@ export function AssetController($rootScope, userService, assetService, customerS var user = userService.getCurrentUser(); if (user.authority === 'CUSTOMER_USER') { - vm.assetsScope = 'customer_user'; + if (vm.assetsScope === 'edge') { + vm.assetsScope = 'edge_customer_user'; + } else { + vm.assetsScope = 'customer_user'; + } customerId = user.customerId; } if (customerId) { @@ -323,51 +327,64 @@ export function AssetController($rootScope, userService, assetService, customerS } vm.assetGridConfig.addItemActions = []; - } else if (vm.assetsScope === 'edge') { + } else if (vm.assetsScope === 'edge' || vm.assetsScope === 'edge_customer_user') { fetchAssetsFunction = function (pageLink) { return assetService.getEdgeAssets(edgeId, pageLink, null); }; - deleteAssetFunction = function (assetId) { - return assetService.unassignAssetFromEdge(edgeId, assetId); - }; - refreshAssetsParamsFunction = function () { - return {"edgeId": edgeId, "topIndex": vm.topIndex}; - }; + if (vm.assetsScope === 'edge') { + deleteAssetFunction = function (assetId) { + return assetService.unassignAssetFromEdge(edgeId, assetId); + }; + refreshAssetsParamsFunction = function () { + return {"edgeId": edgeId, "topIndex": vm.topIndex}; + }; - assetActionsList.push( - { - onAction: function ($event, item) { - unassignFromEdge($event, item, false); - }, - name: function() { return $translate.instant('action.unassign') }, - details: function() { return $translate.instant('edge.unassign-from-edge') }, - icon: "assignment_return" - } - ); + assetActionsList.push( + { + onAction: function ($event, item) { + unassignFromEdge($event, item, false); + }, + name: function () { + return $translate.instant('action.unassign') + }, + details: function () { + return $translate.instant('edge.unassign-from-edge') + }, + icon: "assignment_return" + } + ); - assetGroupActionsList.push( - { - onAction: function ($event, items) { - unassignAssetsFromEdge($event, items); - }, - name: function() { return $translate.instant('asset.unassign-assets') }, - details: function(selectedCount) { - return $translate.instant('asset.unassign-assets-from-edge-action-title', {count: selectedCount}, "messageformat"); - }, - icon: "assignment_return" - } - ); + assetGroupActionsList.push( + { + onAction: function ($event, items) { + unassignAssetsFromEdge($event, items); + }, + name: function () { + return $translate.instant('asset.unassign-assets') + }, + details: function (selectedCount) { + return $translate.instant('asset.unassign-assets-from-edge-action-title', {count: selectedCount}, "messageformat"); + }, + icon: "assignment_return" + } + ); - vm.assetGridConfig.addItemAction = { - onAction: function ($event) { - addAssetsToEdge($event); - }, - name: function() { return $translate.instant('asset.assign-assets') }, - details: function() { return $translate.instant('asset.assign-new-asset') }, - icon: "add" - }; + vm.assetGridConfig.addItemAction = { + onAction: function ($event) { + addAssetsToEdge($event); + }, + name: function () { + return $translate.instant('asset.assign-assets') + }, + details: function () { + return $translate.instant('asset.assign-new-asset') + }, + icon: "add" + }; + } else if (vm.assetsScope === 'edge_customer_user') { + vm.assetGridConfig.addItemAction = {}; + } vm.assetGridConfig.addItemActions = []; - } vm.assetGridConfig.refreshParamsFunc = refreshAssetsParamsFunction; diff --git a/ui/src/app/dashboard/dashboards.controller.js b/ui/src/app/dashboard/dashboards.controller.js index 4186745ff4..da7e3e38c8 100644 --- a/ui/src/app/dashboard/dashboards.controller.js +++ b/ui/src/app/dashboard/dashboards.controller.js @@ -141,7 +141,11 @@ export function DashboardsController(userService, dashboardService, customerServ var user = userService.getCurrentUser(); if (user.authority === 'CUSTOMER_USER') { - vm.dashboardsScope = 'customer_user'; + if (vm.dashboardsScope === 'edge') { + vm.dashboardsScope = 'edge_customer_user'; + } else { + vm.dashboardsScope = 'customer_user'; + } customerId = user.customerId; } @@ -381,60 +385,80 @@ export function DashboardsController(userService, dashboardService, customerServ } else if (vm.dashboardsScope === 'customer_user') { vm.dashboardGridConfig.addItemAction = {}; } - } else if (vm.dashboardsScope === 'edge') { + } else if (vm.dashboardsScope === 'edge' || vm.dashboardsScope === 'edge_customer_user') { fetchDashboardsFunction = function (pageLink) { return dashboardService.getEdgeDashboards(edgeId, pageLink, null); }; - deleteDashboardFunction = function (dashboardId) { - return dashboardService.unassignDashboardFromEdge(edgeId, dashboardId); - }; - refreshDashboardsParamsFunction = function () { - return {"edgeId": edgeId, "topIndex": vm.topIndex}; - }; - dashboardActionsList.push( - { - onAction: function ($event, item) { - exportDashboard($event, item); - }, - name: function() { $translate.instant('action.export') }, - details: function() { return $translate.instant('dashboard.export') }, - icon: "file_download" - } - ); + if (vm.dashboardsScope === 'edge') { + deleteDashboardFunction = function (dashboardId) { + return dashboardService.unassignDashboardFromEdge(edgeId, dashboardId); + }; + refreshDashboardsParamsFunction = function () { + return {"edgeId": edgeId, "topIndex": vm.topIndex}; + }; - dashboardActionsList.push( - { - onAction: function ($event, item) { - unassignFromEdge($event, item, edgeId); - }, - name: function() { return $translate.instant('action.unassign') }, - details: function() { return $translate.instant('edge.unassign-from-edge') }, - icon: "assignment_return" - } - ); + dashboardActionsList.push( + { + onAction: function ($event, item) { + exportDashboard($event, item); + }, + name: function () { + $translate.instant('action.export') + }, + details: function () { + return $translate.instant('dashboard.export') + }, + icon: "file_download" + } + ); - dashboardGroupActionsList.push( - { - onAction: function ($event, items) { - unassignDashboardsFromEdge($event, items, edgeId); - }, - name: function() { return $translate.instant('dashboard.unassign-dashboards') }, - details: function(selectedCount) { - return $translate.instant('dashboard.unassign-dashboards-from-edge-action-title', {count: selectedCount}, "messageformat"); - }, - icon: "assignment_return" - } - ); + dashboardActionsList.push( + { + onAction: function ($event, item) { + unassignFromEdge($event, item, edgeId); + }, + name: function () { + return $translate.instant('action.unassign') + }, + details: function () { + return $translate.instant('edge.unassign-from-edge') + }, + icon: "assignment_return" + } + ); - vm.dashboardGridConfig.addItemAction = { - onAction: function ($event) { - addDashboardsToEdge($event); - }, - name: function() { return $translate.instant('dashboard.assign-dashboards') }, - details: function() { return $translate.instant('dashboard.assign-new-dashboard') }, - icon: "add" - }; + dashboardGroupActionsList.push( + { + onAction: function ($event, items) { + unassignDashboardsFromEdge($event, items, edgeId); + }, + name: function () { + return $translate.instant('dashboard.unassign-dashboards') + }, + details: function (selectedCount) { + return $translate.instant('dashboard.unassign-dashboards-from-edge-action-title', {count: selectedCount}, "messageformat"); + }, + icon: "assignment_return" + } + ); + + vm.dashboardGridConfig.addItemAction = { + onAction: function ($event) { + addDashboardsToEdge($event); + }, + name: function () { + return $translate.instant('dashboard.assign-dashboards') + }, + details: function () { + return $translate.instant('dashboard.assign-new-dashboard') + }, + icon: "add" + }; + } else if (vm.dashboardsScope === 'edge_customer_user') { + vm.dashboardGridConfig.addItemAction = {}; + vm.dashboardGridConfig.addItemActions = []; + } } vm.dashboardGridConfig.refreshParamsFunc = refreshDashboardsParamsFunction; diff --git a/ui/src/app/device/device.controller.js b/ui/src/app/device/device.controller.js index a3e24f0574..2139a86765 100644 --- a/ui/src/app/device/device.controller.js +++ b/ui/src/app/device/device.controller.js @@ -143,7 +143,11 @@ export function DeviceController($rootScope, userService, deviceService, custome var user = userService.getCurrentUser(); if (user.authority === 'CUSTOMER_USER') { - vm.devicesScope = 'customer_user'; + if (vm.devicesScope === 'edge') { + vm.devicesScope = 'edge_customer_user'; + } else { + vm.devicesScope = 'customer_user'; + } customerId = user.customerId; } if (customerId) { @@ -356,49 +360,64 @@ export function DeviceController($rootScope, userService, deviceService, custome } vm.deviceGridConfig.addItemActions = []; - } else if (vm.devicesScope === 'edge') { + } else if (vm.devicesScope === 'edge' || vm.devicesScope === 'edge_customer_user') { fetchDevicesFunction = function (pageLink) { return deviceService.getEdgeDevices(edgeId, pageLink, null); }; - deleteDeviceFunction = function (deviceId) { - return deviceService.unassignDeviceFromEdge(edgeId, deviceId); - }; - refreshDevicesParamsFunction = function () { - return {"edgeId": edgeId, "topIndex": vm.topIndex}; - }; - deviceActionsList.push( - { - onAction: function ($event, item) { - unassignFromEdge($event, item, false); - }, - name: function() { return $translate.instant('action.unassign') }, - details: function() { return $translate.instant('edge.unassign-from-edge') }, - icon: "assignment_return" - } - ); + if (vm.devicesScope === 'edge') { + deleteDeviceFunction = function (deviceId) { + return deviceService.unassignDeviceFromEdge(edgeId, deviceId); + }; + refreshDevicesParamsFunction = function () { + return {"edgeId": edgeId, "topIndex": vm.topIndex}; + }; - deviceGroupActionsList.push( - { - onAction: function ($event, items) { - unassignDevicesFromEdge($event, items); - }, - name: function() { return $translate.instant('device.unassign-devices') }, - details: function(selectedCount) { - return $translate.instant('device.unassign-devices-from-edge-action-title', {count: selectedCount}, "messageformat"); - }, - icon: "assignment_return" - } - ); + deviceActionsList.push( + { + onAction: function ($event, item) { + unassignFromEdge($event, item, false); + }, + name: function() { return $translate.instant('action.unassign') }, + details: function() { return $translate.instant('edge.unassign-from-edge') }, + icon: "assignment_return" + } + ); - vm.deviceGridConfig.addItemAction = { - onAction: function ($event) { - addDevicesToEdge($event); - }, - name: function() { return $translate.instant('device.assign-devices') }, - details: function() { return $translate.instant('device.assign-new-device') }, - icon: "add" - }; + deviceGroupActionsList.push( + { + onAction: function ($event, items) { + unassignDevicesFromEdge($event, items); + }, + name: function() { return $translate.instant('device.unassign-devices') }, + details: function(selectedCount) { + return $translate.instant('device.unassign-devices-from-edge-action-title', {count: selectedCount}, "messageformat"); + }, + icon: "assignment_return" + } + ); + + vm.deviceGridConfig.addItemAction = { + onAction: function ($event) { + addDevicesToEdge($event); + }, + name: function() { return $translate.instant('device.assign-devices') }, + details: function() { return $translate.instant('device.assign-new-device') }, + icon: "add" + }; + } else if (vm.devicesScope === 'edge_customer_user') { + deviceActionsList.push( + { + onAction: function ($event, item) { + manageCredentials($event, item); + }, + name: function() { return $translate.instant('device.credentials') }, + details: function() { return $translate.instant('device.view-credentials') }, + icon: "security" + } + ); + vm.deviceGridConfig.addItemAction = {}; + } vm.deviceGridConfig.addItemActions = []; } diff --git a/ui/src/app/edge/edge-fieldset.tpl.html b/ui/src/app/edge/edge-fieldset.tpl.html index aee00875b9..7058d44000 100644 --- a/ui/src/app/edge/edge-fieldset.tpl.html +++ b/ui/src/app/edge/edge-fieldset.tpl.html @@ -31,16 +31,16 @@
{{ 'edge.assets' | translate }} {{ 'edge.devices' | translate }} {{ 'edge.entity-views' | translate }} {{ 'edge.dashboards' | translate }}