diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java index 07059da06e..db0da5016e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java @@ -25,6 +25,7 @@ import org.apache.http.HttpHost; import org.apache.http.conn.ssl.DefaultHostnameVerifier; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; +import org.hibernate.exception.ConstraintViolationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.Cache; @@ -172,7 +173,22 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic public Edge saveEdge(Edge edge) { log.trace("Executing saveEdge [{}]", edge); edgeValidator.validate(edge, Edge::getTenantId); - return edgeDao.save(edge.getTenantId(), edge); + Edge savedEdge; + if (!sqlDatabaseUsed) { + savedEdge = edgeDao.save(edge.getTenantId(), edge); + } else { + try { + savedEdge = edgeDao.save(edge.getTenantId(), edge); + } catch (Exception t) { + ConstraintViolationException e = extractConstraintViolationException(t).orElse(null); + if (e != null && e.getConstraintName() != null && e.getConstraintName().equalsIgnoreCase("edge_name_unq_key")) { + throw new DataValidationException("Edge with such name already exists!"); + } else { + throw t; + } + } + } + return savedEdge; } @Override diff --git a/ui/src/app/api/asset.service.js b/ui/src/app/api/asset.service.js index 86d06670c9..090682acc3 100644 --- a/ui/src/app/api/asset.service.js +++ b/ui/src/app/api/asset.service.js @@ -322,19 +322,13 @@ function AssetService($http, $q, $filter, customerService, userService) { return deferred.promise; } - function getEdgeAssets(edgeId, pageLink, config, type) { + function getEdgeAssets(edgeId, pageLink, config) { var deferred = $q.defer(); var url = '/api/edge/' + edgeId + '/assets?limit=' + pageLink.limit; if (angular.isDefined(pageLink.idOffset)) { url += '&offset=' + pageLink.idOffset; } $http.get(url, config).then(function success(response) { - if (pageLink.textSearch) { - response.data.data = $filter('filter')(response.data.data, {name: pageLink.textSearch}); - } - if (angular.isDefined(type) && type.length) { - response.data.data = $filter('filter')(response.data.data, {type: type}); - } deferred.resolve(response.data); }, function fail() { deferred.reject(); diff --git a/ui/src/app/api/dashboard.service.js b/ui/src/app/api/dashboard.service.js index 9d59e24ebc..0011a81b1e 100644 --- a/ui/src/app/api/dashboard.service.js +++ b/ui/src/app/api/dashboard.service.js @@ -302,9 +302,6 @@ function DashboardService($rootScope, $http, $q, $location, $filter) { } $http.get(url, config).then(function success(response) { response.data = prepareDashboards(response.data); - if (pageLink.textSearch) { - response.data.data = $filter('filter')(response.data.data, {title: pageLink.textSearch}); - } deferred.resolve(response.data); }, function fail() { deferred.reject(); diff --git a/ui/src/app/api/device.service.js b/ui/src/app/api/device.service.js index 9cc4412e86..8d6d7cd585 100644 --- a/ui/src/app/api/device.service.js +++ b/ui/src/app/api/device.service.js @@ -384,19 +384,13 @@ function DeviceService($http, $q, $window, $filter, userService, attributeServic return deferred.promise; } - function getEdgeDevices(edgeId, pageLink, config, type) { + function getEdgeDevices(edgeId, pageLink, config) { var deferred = $q.defer(); var url = '/api/edge/' + edgeId + '/devices?limit=' + pageLink.limit; if (angular.isDefined(pageLink.idOffset)) { url += '&offset=' + pageLink.idOffset; } $http.get(url, config).then(function success(response) { - if (pageLink.textSearch) { - response.data.data = $filter('filter')(response.data.data, {name: pageLink.textSearch}); - } - if (angular.isDefined(type) && type.length) { - response.data.data = $filter('filter')(response.data.data, {type: type}); - } deferred.resolve(response.data); }, function fail() { deferred.reject(); diff --git a/ui/src/app/api/edge.service.js b/ui/src/app/api/edge.service.js index 528dea960c..8cd7aa81c1 100644 --- a/ui/src/app/api/edge.service.js +++ b/ui/src/app/api/edge.service.js @@ -30,6 +30,7 @@ function EdgeService($http, $q, customerService) { getTenantEdges: getTenantEdges, getCustomerEdges: getCustomerEdges, assignEdgeToCustomer: assignEdgeToCustomer, + findByQuery: findByQuery, unassignEdgeFromCustomer: unassignEdgeFromCustomer, makeEdgePublic: makeEdgePublic, setRootRuleChain: setRootRuleChain, @@ -61,13 +62,7 @@ function EdgeService($http, $q, customerService) { function getEdgesByIds(edgeIds, config) { var deferred = $q.defer(); - var ids = ''; - for (var i=0;i0) { - ids += ','; - } - ids += edgeIds[i]; - } + var ids = edgeIds.join(','); var url = '/api/edges?edgeIds=' + ids; $http.get(url, config).then(function success(response) { var entities = response.data; @@ -85,9 +80,13 @@ function EdgeService($http, $q, customerService) { return deferred.promise; } - function getEdge(edgeId, config) { + function getEdge(edgeId, ignoreErrors, config) { var deferred = $q.defer(); var url = '/api/edge/' + edgeId; + if (!config) { + config = {}; + } + config = Object.assign(config, { ignoreErrors: ignoreErrors }); $http.get(url, config).then(function success(response) { deferred.resolve(response.data); }, function fail(response) { @@ -129,7 +128,7 @@ function EdgeService($http, $q, customerService) { return deferred.promise; } - function getTenantEdges(pageLink, applyCustomersInfo, config, type) { + function getTenantEdges(pageLink, applyCustomersInfo, type, config) { var deferred = $q.defer(); var url = '/api/tenant/edges?limit=' + pageLink.limit; if (angular.isDefined(pageLink.textSearch)) { @@ -164,7 +163,7 @@ function EdgeService($http, $q, customerService) { return deferred.promise; } - function getCustomerEdges(customerId, pageLink, applyCustomersInfo, config, type) { + function getCustomerEdges(customerId, pageLink, applyCustomersInfo, type, config) { var deferred = $q.defer(); var url = '/api/customer/' + customerId + '/edges?limit=' + pageLink.limit; if (angular.isDefined(pageLink.textSearch)) { @@ -200,6 +199,21 @@ function EdgeService($http, $q, customerService) { return deferred.promise; } + function findByQuery(query, ignoreErrors, config) { + var deferred = $q.defer(); + var url = '/api/edges'; + if (!config) { + config = {}; + } + config = Object.assign(config, { ignoreErrors: ignoreErrors }); + $http.post(url, query, config).then(function success(response) { + deferred.resolve(response.data); + }, function fail() { + deferred.reject(); + }); + return deferred.promise; + } + function assignEdgeToCustomer(customerId, edgeId) { var deferred = $q.defer(); var url = '/api/customer/' + customerId + '/edge/' + edgeId; diff --git a/ui/src/app/api/entity-view.service.js b/ui/src/app/api/entity-view.service.js index cef08001cd..434f41dda4 100644 --- a/ui/src/app/api/entity-view.service.js +++ b/ui/src/app/api/entity-view.service.js @@ -245,19 +245,13 @@ function EntityViewService($http, $q, $window, $filter, userService, attributeSe return deferred.promise; } - function getEdgeEntityViews(edgeId, pageLink, config, type) { + function getEdgeEntityViews(edgeId, pageLink, config) { var deferred = $q.defer(); var url = '/api/edge/' + edgeId + '/entityViews?limit=' + pageLink.limit; if (angular.isDefined(pageLink.idOffset)) { url += '&offset=' + pageLink.idOffset; } $http.get(url, config).then(function success(response) { - if (pageLink.textSearch) { - response.data.data = $filter('filter')(response.data.data, {name: pageLink.textSearch}); - } - if (angular.isDefined(type) && type.length) { - response.data.data = $filter('filter')(response.data.data, {type: type}); - } deferred.resolve(response.data); }, function fail() { deferred.reject(); diff --git a/ui/src/app/api/entity.service.js b/ui/src/app/api/entity.service.js index ed479ae44d..32fac7b5db 100644 --- a/ui/src/app/api/entity.service.js +++ b/ui/src/app/api/entity.service.js @@ -78,7 +78,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device $log.error('Get Alarm Entity is not implemented!'); break; case types.entityType.edge: - promise = edgeService.getEdge(entityId, config); + promise = edgeService.getEdge(entityId, true, config); break; } return promise; @@ -164,7 +164,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device break; case types.entityType.edge: promise = getEntitiesByIdsPromise( - (id) => edgeService.getEdge(id, config), entityIds); + (id) => edgeService.getEdge(id, true, config), entityIds); break; } return promise; @@ -294,9 +294,9 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device break; case types.entityType.edge: if (user.authority === 'CUSTOMER_USER') { - promise = edgeService.getCustomerEdges(customerId, pageLink, false, config, subType); + promise = edgeService.getCustomerEdges(customerId, pageLink, false, subType, config); } else { - promise = edgeService.getTenantEdges(pageLink, false, config, subType); + promise = edgeService.getTenantEdges(pageLink, false, subType, config); } break; } @@ -960,9 +960,6 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device break; case types.entityType.entityView: case types.entityType.edge: - entityFieldKeys.push(types.entityField.name.keyName); - entityFieldKeys.push(types.entityField.type.keyName); - break; case types.entityType.device: case types.entityType.asset: entityFieldKeys.push(types.entityField.name.keyName); diff --git a/ui/src/app/api/rule-chain.service.js b/ui/src/app/api/rule-chain.service.js index af9cfe436a..ba91e9e748 100644 --- a/ui/src/app/api/rule-chain.service.js +++ b/ui/src/app/api/rule-chain.service.js @@ -321,9 +321,6 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co url += '&offset=' + pageLink.idOffset; } $http.get(url, config).then(function success(response) { - if (pageLink.textSearch) { - response.data.data = $filter('filter')(response.data.data, {title: pageLink.textSearch}); - } deferred.resolve(response.data); }, function fail() { deferred.reject(); diff --git a/ui/src/app/asset/asset.controller.js b/ui/src/app/asset/asset.controller.js index 105ef17dbd..1be789b233 100644 --- a/ui/src/app/asset/asset.controller.js +++ b/ui/src/app/asset/asset.controller.js @@ -324,8 +324,8 @@ export function AssetController($rootScope, userService, assetService, customerS vm.assetGridConfig.addItemActions = []; } else if (vm.assetsScope === 'edge') { - fetchAssetsFunction = function (pageLink, assetType) { - return assetService.getEdgeAssets(edgeId, pageLink, null, assetType); + fetchAssetsFunction = function (pageLink) { + return assetService.getEdgeAssets(edgeId, pageLink, null); }; deleteAssetFunction = function (assetId) { return assetService.unassignAssetFromEdge(edgeId, assetId); diff --git a/ui/src/app/device/device.controller.js b/ui/src/app/device/device.controller.js index e15dd14678..a3e24f0574 100644 --- a/ui/src/app/device/device.controller.js +++ b/ui/src/app/device/device.controller.js @@ -357,8 +357,8 @@ export function DeviceController($rootScope, userService, deviceService, custome vm.deviceGridConfig.addItemActions = []; } else if (vm.devicesScope === 'edge') { - fetchDevicesFunction = function (pageLink, deviceType) { - return deviceService.getEdgeDevices(edgeId, pageLink, null, deviceType); + fetchDevicesFunction = function (pageLink) { + return deviceService.getEdgeDevices(edgeId, pageLink, null); }; deleteDeviceFunction = function (deviceId) { return deviceService.unassignDeviceFromEdge(edgeId, deviceId); diff --git a/ui/src/app/edge/edge.controller.js b/ui/src/app/edge/edge.controller.js index 76b78960a1..0c9d42c584 100644 --- a/ui/src/app/edge/edge.controller.js +++ b/ui/src/app/edge/edge.controller.js @@ -161,7 +161,7 @@ export function EdgeController($rootScope, userService, edgeService, customerSer if (vm.edgesScope === 'tenant') { fetchEdgesFunction = function (pageLink, edgeType) { - return edgeService.getTenantEdges(pageLink, true, null, edgeType); + return edgeService.getTenantEdges(pageLink, true, edgeType, null); }; deleteEdgeFunction = function (edgeId) { return edgeService.deleteEdge(edgeId); @@ -337,7 +337,7 @@ export function EdgeController($rootScope, userService, edgeService, customerSer } else if (vm.edgesScope === 'customer' || vm.edgesScope === 'customer_user') { fetchEdgesFunction = function (pageLink, edgeType) { - return edgeService.getCustomerEdges(customerId, pageLink, true, null, edgeType); + return edgeService.getCustomerEdges(customerId, pageLink, true, edgeType, null); }; deleteEdgeFunction = function (edgeId) { return edgeService.unassignEdgeFromCustomer(edgeId); diff --git a/ui/src/app/entity-view/entity-view.controller.js b/ui/src/app/entity-view/entity-view.controller.js index d1ce45dc96..c81f95b0c0 100644 --- a/ui/src/app/entity-view/entity-view.controller.js +++ b/ui/src/app/entity-view/entity-view.controller.js @@ -285,8 +285,8 @@ export function EntityViewController($rootScope, userService, entityViewService, vm.entityViewGridConfig.addItemAction = {}; } } else if (vm.entityViewsScope === 'edge') { - fetchEntityViewsFunction = function (pageLink, entityViewType) { - return entityViewService.getEdgeEntityViews(edgeId, pageLink, null, entityViewType); + fetchEntityViewsFunction = function (pageLink) { + return entityViewService.getEdgeEntityViews(edgeId, pageLink, null); }; deleteEntityViewFunction = function (entityViewId) { return entityViewService.unassignEntityViewFromEdge(edgeId, entityViewId); diff --git a/ui/src/app/import-export/import-export.service.js b/ui/src/app/import-export/import-export.service.js index 17457ae8d6..dc0fbf1ea7 100644 --- a/ui/src/app/import-export/import-export.service.js +++ b/ui/src/app/import-export/import-export.service.js @@ -614,6 +614,16 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document, } ); return deferred.promise; + case types.entityType.edge: + openImportDialogCSV($event, entityType, 'edge.import', 'edge.edge-file').then( + function success() { + deferred.resolve(); + }, + function fail() { + deferred.reject(); + } + ); + return deferred.promise; } } diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index 1bb5af2024..4611500969 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -765,6 +765,7 @@ "edge": { "edge": "Edge", "edges": "Edges", + "edge-file": "Edge file", "management": "Edge management", "no-edges-matching": "No edges matching '{{entity}}' were found.", "add": "Add Edge", diff --git a/ui/src/app/rulechain/rulechains.controller.js b/ui/src/app/rulechain/rulechains.controller.js index 6e3908b0a7..65eb62abbe 100644 --- a/ui/src/app/rulechain/rulechains.controller.js +++ b/ui/src/app/rulechain/rulechains.controller.js @@ -107,7 +107,7 @@ export default function RuleChainsController(ruleChainService, userService, impo var deleteRuleChainFunction = null; if (edgeId) { - edgeService.getEdge(edgeId).then( + edgeService.getEdge(edgeId, true, null).then( function success(edge) { vm.edge = edge; }