Commit 773d38067bf1082ac8832607f1fa24962b92ae34

Authored by Volodymyr Babak
2 parents 59c55fb2 004d8a7d

Merge branch 'develop/2.6-edge' of github.com:volodymyr-babak/thingsboard into develop/2.6-edge

@@ -25,6 +25,7 @@ import org.apache.http.HttpHost; @@ -25,6 +25,7 @@ import org.apache.http.HttpHost;
25 import org.apache.http.conn.ssl.DefaultHostnameVerifier; 25 import org.apache.http.conn.ssl.DefaultHostnameVerifier;
26 import org.apache.http.impl.client.CloseableHttpClient; 26 import org.apache.http.impl.client.CloseableHttpClient;
27 import org.apache.http.impl.client.HttpClients; 27 import org.apache.http.impl.client.HttpClients;
  28 +import org.hibernate.exception.ConstraintViolationException;
28 import org.springframework.beans.factory.annotation.Autowired; 29 import org.springframework.beans.factory.annotation.Autowired;
29 import org.springframework.beans.factory.annotation.Value; 30 import org.springframework.beans.factory.annotation.Value;
30 import org.springframework.cache.Cache; 31 import org.springframework.cache.Cache;
@@ -172,7 +173,22 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic @@ -172,7 +173,22 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic
172 public Edge saveEdge(Edge edge) { 173 public Edge saveEdge(Edge edge) {
173 log.trace("Executing saveEdge [{}]", edge); 174 log.trace("Executing saveEdge [{}]", edge);
174 edgeValidator.validate(edge, Edge::getTenantId); 175 edgeValidator.validate(edge, Edge::getTenantId);
175 - return edgeDao.save(edge.getTenantId(), edge); 176 + Edge savedEdge;
  177 + if (!sqlDatabaseUsed) {
  178 + savedEdge = edgeDao.save(edge.getTenantId(), edge);
  179 + } else {
  180 + try {
  181 + savedEdge = edgeDao.save(edge.getTenantId(), edge);
  182 + } catch (Exception t) {
  183 + ConstraintViolationException e = extractConstraintViolationException(t).orElse(null);
  184 + if (e != null && e.getConstraintName() != null && e.getConstraintName().equalsIgnoreCase("edge_name_unq_key")) {
  185 + throw new DataValidationException("Edge with such name already exists!");
  186 + } else {
  187 + throw t;
  188 + }
  189 + }
  190 + }
  191 + return savedEdge;
176 } 192 }
177 193
178 @Override 194 @Override
@@ -322,19 +322,13 @@ function AssetService($http, $q, $filter, customerService, userService) { @@ -322,19 +322,13 @@ function AssetService($http, $q, $filter, customerService, userService) {
322 return deferred.promise; 322 return deferred.promise;
323 } 323 }
324 324
325 - function getEdgeAssets(edgeId, pageLink, config, type) { 325 + function getEdgeAssets(edgeId, pageLink, config) {
326 var deferred = $q.defer(); 326 var deferred = $q.defer();
327 var url = '/api/edge/' + edgeId + '/assets?limit=' + pageLink.limit; 327 var url = '/api/edge/' + edgeId + '/assets?limit=' + pageLink.limit;
328 if (angular.isDefined(pageLink.idOffset)) { 328 if (angular.isDefined(pageLink.idOffset)) {
329 url += '&offset=' + pageLink.idOffset; 329 url += '&offset=' + pageLink.idOffset;
330 } 330 }
331 $http.get(url, config).then(function success(response) { 331 $http.get(url, config).then(function success(response) {
332 - if (pageLink.textSearch) {  
333 - response.data.data = $filter('filter')(response.data.data, {name: pageLink.textSearch});  
334 - }  
335 - if (angular.isDefined(type) && type.length) {  
336 - response.data.data = $filter('filter')(response.data.data, {type: type});  
337 - }  
338 deferred.resolve(response.data); 332 deferred.resolve(response.data);
339 }, function fail() { 333 }, function fail() {
340 deferred.reject(); 334 deferred.reject();
@@ -302,9 +302,6 @@ function DashboardService($rootScope, $http, $q, $location, $filter) { @@ -302,9 +302,6 @@ function DashboardService($rootScope, $http, $q, $location, $filter) {
302 } 302 }
303 $http.get(url, config).then(function success(response) { 303 $http.get(url, config).then(function success(response) {
304 response.data = prepareDashboards(response.data); 304 response.data = prepareDashboards(response.data);
305 - if (pageLink.textSearch) {  
306 - response.data.data = $filter('filter')(response.data.data, {title: pageLink.textSearch});  
307 - }  
308 deferred.resolve(response.data); 305 deferred.resolve(response.data);
309 }, function fail() { 306 }, function fail() {
310 deferred.reject(); 307 deferred.reject();
@@ -384,19 +384,13 @@ function DeviceService($http, $q, $window, $filter, userService, attributeServic @@ -384,19 +384,13 @@ function DeviceService($http, $q, $window, $filter, userService, attributeServic
384 return deferred.promise; 384 return deferred.promise;
385 } 385 }
386 386
387 - function getEdgeDevices(edgeId, pageLink, config, type) { 387 + function getEdgeDevices(edgeId, pageLink, config) {
388 var deferred = $q.defer(); 388 var deferred = $q.defer();
389 var url = '/api/edge/' + edgeId + '/devices?limit=' + pageLink.limit; 389 var url = '/api/edge/' + edgeId + '/devices?limit=' + pageLink.limit;
390 if (angular.isDefined(pageLink.idOffset)) { 390 if (angular.isDefined(pageLink.idOffset)) {
391 url += '&offset=' + pageLink.idOffset; 391 url += '&offset=' + pageLink.idOffset;
392 } 392 }
393 $http.get(url, config).then(function success(response) { 393 $http.get(url, config).then(function success(response) {
394 - if (pageLink.textSearch) {  
395 - response.data.data = $filter('filter')(response.data.data, {name: pageLink.textSearch});  
396 - }  
397 - if (angular.isDefined(type) && type.length) {  
398 - response.data.data = $filter('filter')(response.data.data, {type: type});  
399 - }  
400 deferred.resolve(response.data); 394 deferred.resolve(response.data);
401 }, function fail() { 395 }, function fail() {
402 deferred.reject(); 396 deferred.reject();
@@ -30,6 +30,7 @@ function EdgeService($http, $q, customerService) { @@ -30,6 +30,7 @@ function EdgeService($http, $q, customerService) {
30 getTenantEdges: getTenantEdges, 30 getTenantEdges: getTenantEdges,
31 getCustomerEdges: getCustomerEdges, 31 getCustomerEdges: getCustomerEdges,
32 assignEdgeToCustomer: assignEdgeToCustomer, 32 assignEdgeToCustomer: assignEdgeToCustomer,
  33 + findByQuery: findByQuery,
33 unassignEdgeFromCustomer: unassignEdgeFromCustomer, 34 unassignEdgeFromCustomer: unassignEdgeFromCustomer,
34 makeEdgePublic: makeEdgePublic, 35 makeEdgePublic: makeEdgePublic,
35 setRootRuleChain: setRootRuleChain, 36 setRootRuleChain: setRootRuleChain,
@@ -61,13 +62,7 @@ function EdgeService($http, $q, customerService) { @@ -61,13 +62,7 @@ function EdgeService($http, $q, customerService) {
61 62
62 function getEdgesByIds(edgeIds, config) { 63 function getEdgesByIds(edgeIds, config) {
63 var deferred = $q.defer(); 64 var deferred = $q.defer();
64 - var ids = '';  
65 - for (var i=0;i<edgeIds.length;i++) {  
66 - if (i>0) {  
67 - ids += ',';  
68 - }  
69 - ids += edgeIds[i];  
70 - } 65 + var ids = edgeIds.join(',');
71 var url = '/api/edges?edgeIds=' + ids; 66 var url = '/api/edges?edgeIds=' + ids;
72 $http.get(url, config).then(function success(response) { 67 $http.get(url, config).then(function success(response) {
73 var entities = response.data; 68 var entities = response.data;
@@ -85,9 +80,13 @@ function EdgeService($http, $q, customerService) { @@ -85,9 +80,13 @@ function EdgeService($http, $q, customerService) {
85 return deferred.promise; 80 return deferred.promise;
86 } 81 }
87 82
88 - function getEdge(edgeId, config) { 83 + function getEdge(edgeId, ignoreErrors, config) {
89 var deferred = $q.defer(); 84 var deferred = $q.defer();
90 var url = '/api/edge/' + edgeId; 85 var url = '/api/edge/' + edgeId;
  86 + if (!config) {
  87 + config = {};
  88 + }
  89 + config = Object.assign(config, { ignoreErrors: ignoreErrors });
91 $http.get(url, config).then(function success(response) { 90 $http.get(url, config).then(function success(response) {
92 deferred.resolve(response.data); 91 deferred.resolve(response.data);
93 }, function fail(response) { 92 }, function fail(response) {
@@ -129,7 +128,7 @@ function EdgeService($http, $q, customerService) { @@ -129,7 +128,7 @@ function EdgeService($http, $q, customerService) {
129 return deferred.promise; 128 return deferred.promise;
130 } 129 }
131 130
132 - function getTenantEdges(pageLink, applyCustomersInfo, config, type) { 131 + function getTenantEdges(pageLink, applyCustomersInfo, type, config) {
133 var deferred = $q.defer(); 132 var deferred = $q.defer();
134 var url = '/api/tenant/edges?limit=' + pageLink.limit; 133 var url = '/api/tenant/edges?limit=' + pageLink.limit;
135 if (angular.isDefined(pageLink.textSearch)) { 134 if (angular.isDefined(pageLink.textSearch)) {
@@ -164,7 +163,7 @@ function EdgeService($http, $q, customerService) { @@ -164,7 +163,7 @@ function EdgeService($http, $q, customerService) {
164 return deferred.promise; 163 return deferred.promise;
165 } 164 }
166 165
167 - function getCustomerEdges(customerId, pageLink, applyCustomersInfo, config, type) { 166 + function getCustomerEdges(customerId, pageLink, applyCustomersInfo, type, config) {
168 var deferred = $q.defer(); 167 var deferred = $q.defer();
169 var url = '/api/customer/' + customerId + '/edges?limit=' + pageLink.limit; 168 var url = '/api/customer/' + customerId + '/edges?limit=' + pageLink.limit;
170 if (angular.isDefined(pageLink.textSearch)) { 169 if (angular.isDefined(pageLink.textSearch)) {
@@ -200,6 +199,21 @@ function EdgeService($http, $q, customerService) { @@ -200,6 +199,21 @@ function EdgeService($http, $q, customerService) {
200 return deferred.promise; 199 return deferred.promise;
201 } 200 }
202 201
  202 + function findByQuery(query, ignoreErrors, config) {
  203 + var deferred = $q.defer();
  204 + var url = '/api/edges';
  205 + if (!config) {
  206 + config = {};
  207 + }
  208 + config = Object.assign(config, { ignoreErrors: ignoreErrors });
  209 + $http.post(url, query, config).then(function success(response) {
  210 + deferred.resolve(response.data);
  211 + }, function fail() {
  212 + deferred.reject();
  213 + });
  214 + return deferred.promise;
  215 + }
  216 +
203 function assignEdgeToCustomer(customerId, edgeId) { 217 function assignEdgeToCustomer(customerId, edgeId) {
204 var deferred = $q.defer(); 218 var deferred = $q.defer();
205 var url = '/api/customer/' + customerId + '/edge/' + edgeId; 219 var url = '/api/customer/' + customerId + '/edge/' + edgeId;
@@ -245,19 +245,13 @@ function EntityViewService($http, $q, $window, $filter, userService, attributeSe @@ -245,19 +245,13 @@ function EntityViewService($http, $q, $window, $filter, userService, attributeSe
245 return deferred.promise; 245 return deferred.promise;
246 } 246 }
247 247
248 - function getEdgeEntityViews(edgeId, pageLink, config, type) { 248 + function getEdgeEntityViews(edgeId, pageLink, config) {
249 var deferred = $q.defer(); 249 var deferred = $q.defer();
250 var url = '/api/edge/' + edgeId + '/entityViews?limit=' + pageLink.limit; 250 var url = '/api/edge/' + edgeId + '/entityViews?limit=' + pageLink.limit;
251 if (angular.isDefined(pageLink.idOffset)) { 251 if (angular.isDefined(pageLink.idOffset)) {
252 url += '&offset=' + pageLink.idOffset; 252 url += '&offset=' + pageLink.idOffset;
253 } 253 }
254 $http.get(url, config).then(function success(response) { 254 $http.get(url, config).then(function success(response) {
255 - if (pageLink.textSearch) {  
256 - response.data.data = $filter('filter')(response.data.data, {name: pageLink.textSearch});  
257 - }  
258 - if (angular.isDefined(type) && type.length) {  
259 - response.data.data = $filter('filter')(response.data.data, {type: type});  
260 - }  
261 deferred.resolve(response.data); 255 deferred.resolve(response.data);
262 }, function fail() { 256 }, function fail() {
263 deferred.reject(); 257 deferred.reject();
@@ -78,7 +78,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device @@ -78,7 +78,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
78 $log.error('Get Alarm Entity is not implemented!'); 78 $log.error('Get Alarm Entity is not implemented!');
79 break; 79 break;
80 case types.entityType.edge: 80 case types.entityType.edge:
81 - promise = edgeService.getEdge(entityId, config); 81 + promise = edgeService.getEdge(entityId, true, config);
82 break; 82 break;
83 } 83 }
84 return promise; 84 return promise;
@@ -164,7 +164,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device @@ -164,7 +164,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
164 break; 164 break;
165 case types.entityType.edge: 165 case types.entityType.edge:
166 promise = getEntitiesByIdsPromise( 166 promise = getEntitiesByIdsPromise(
167 - (id) => edgeService.getEdge(id, config), entityIds); 167 + (id) => edgeService.getEdge(id, true, config), entityIds);
168 break; 168 break;
169 } 169 }
170 return promise; 170 return promise;
@@ -294,9 +294,9 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device @@ -294,9 +294,9 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
294 break; 294 break;
295 case types.entityType.edge: 295 case types.entityType.edge:
296 if (user.authority === 'CUSTOMER_USER') { 296 if (user.authority === 'CUSTOMER_USER') {
297 - promise = edgeService.getCustomerEdges(customerId, pageLink, false, config, subType); 297 + promise = edgeService.getCustomerEdges(customerId, pageLink, false, subType, config);
298 } else { 298 } else {
299 - promise = edgeService.getTenantEdges(pageLink, false, config, subType); 299 + promise = edgeService.getTenantEdges(pageLink, false, subType, config);
300 } 300 }
301 break; 301 break;
302 } 302 }
@@ -960,9 +960,6 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device @@ -960,9 +960,6 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
960 break; 960 break;
961 case types.entityType.entityView: 961 case types.entityType.entityView:
962 case types.entityType.edge: 962 case types.entityType.edge:
963 - entityFieldKeys.push(types.entityField.name.keyName);  
964 - entityFieldKeys.push(types.entityField.type.keyName);  
965 - break;  
966 case types.entityType.device: 963 case types.entityType.device:
967 case types.entityType.asset: 964 case types.entityType.asset:
968 entityFieldKeys.push(types.entityField.name.keyName); 965 entityFieldKeys.push(types.entityField.name.keyName);
@@ -321,9 +321,6 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co @@ -321,9 +321,6 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co
321 url += '&offset=' + pageLink.idOffset; 321 url += '&offset=' + pageLink.idOffset;
322 } 322 }
323 $http.get(url, config).then(function success(response) { 323 $http.get(url, config).then(function success(response) {
324 - if (pageLink.textSearch) {  
325 - response.data.data = $filter('filter')(response.data.data, {title: pageLink.textSearch});  
326 - }  
327 deferred.resolve(response.data); 324 deferred.resolve(response.data);
328 }, function fail() { 325 }, function fail() {
329 deferred.reject(); 326 deferred.reject();
@@ -324,8 +324,8 @@ export function AssetController($rootScope, userService, assetService, customerS @@ -324,8 +324,8 @@ export function AssetController($rootScope, userService, assetService, customerS
324 vm.assetGridConfig.addItemActions = []; 324 vm.assetGridConfig.addItemActions = [];
325 325
326 } else if (vm.assetsScope === 'edge') { 326 } else if (vm.assetsScope === 'edge') {
327 - fetchAssetsFunction = function (pageLink, assetType) {  
328 - return assetService.getEdgeAssets(edgeId, pageLink, null, assetType); 327 + fetchAssetsFunction = function (pageLink) {
  328 + return assetService.getEdgeAssets(edgeId, pageLink, null);
329 }; 329 };
330 deleteAssetFunction = function (assetId) { 330 deleteAssetFunction = function (assetId) {
331 return assetService.unassignAssetFromEdge(edgeId, assetId); 331 return assetService.unassignAssetFromEdge(edgeId, assetId);
@@ -357,8 +357,8 @@ export function DeviceController($rootScope, userService, deviceService, custome @@ -357,8 +357,8 @@ export function DeviceController($rootScope, userService, deviceService, custome
357 vm.deviceGridConfig.addItemActions = []; 357 vm.deviceGridConfig.addItemActions = [];
358 358
359 } else if (vm.devicesScope === 'edge') { 359 } else if (vm.devicesScope === 'edge') {
360 - fetchDevicesFunction = function (pageLink, deviceType) {  
361 - return deviceService.getEdgeDevices(edgeId, pageLink, null, deviceType); 360 + fetchDevicesFunction = function (pageLink) {
  361 + return deviceService.getEdgeDevices(edgeId, pageLink, null);
362 }; 362 };
363 deleteDeviceFunction = function (deviceId) { 363 deleteDeviceFunction = function (deviceId) {
364 return deviceService.unassignDeviceFromEdge(edgeId, deviceId); 364 return deviceService.unassignDeviceFromEdge(edgeId, deviceId);
@@ -161,7 +161,7 @@ export function EdgeController($rootScope, userService, edgeService, customerSer @@ -161,7 +161,7 @@ export function EdgeController($rootScope, userService, edgeService, customerSer
161 161
162 if (vm.edgesScope === 'tenant') { 162 if (vm.edgesScope === 'tenant') {
163 fetchEdgesFunction = function (pageLink, edgeType) { 163 fetchEdgesFunction = function (pageLink, edgeType) {
164 - return edgeService.getTenantEdges(pageLink, true, null, edgeType); 164 + return edgeService.getTenantEdges(pageLink, true, edgeType, null);
165 }; 165 };
166 deleteEdgeFunction = function (edgeId) { 166 deleteEdgeFunction = function (edgeId) {
167 return edgeService.deleteEdge(edgeId); 167 return edgeService.deleteEdge(edgeId);
@@ -337,7 +337,7 @@ export function EdgeController($rootScope, userService, edgeService, customerSer @@ -337,7 +337,7 @@ export function EdgeController($rootScope, userService, edgeService, customerSer
337 337
338 } else if (vm.edgesScope === 'customer' || vm.edgesScope === 'customer_user') { 338 } else if (vm.edgesScope === 'customer' || vm.edgesScope === 'customer_user') {
339 fetchEdgesFunction = function (pageLink, edgeType) { 339 fetchEdgesFunction = function (pageLink, edgeType) {
340 - return edgeService.getCustomerEdges(customerId, pageLink, true, null, edgeType); 340 + return edgeService.getCustomerEdges(customerId, pageLink, true, edgeType, null);
341 }; 341 };
342 deleteEdgeFunction = function (edgeId) { 342 deleteEdgeFunction = function (edgeId) {
343 return edgeService.unassignEdgeFromCustomer(edgeId); 343 return edgeService.unassignEdgeFromCustomer(edgeId);
@@ -285,8 +285,8 @@ export function EntityViewController($rootScope, userService, entityViewService, @@ -285,8 +285,8 @@ export function EntityViewController($rootScope, userService, entityViewService,
285 vm.entityViewGridConfig.addItemAction = {}; 285 vm.entityViewGridConfig.addItemAction = {};
286 } 286 }
287 } else if (vm.entityViewsScope === 'edge') { 287 } else if (vm.entityViewsScope === 'edge') {
288 - fetchEntityViewsFunction = function (pageLink, entityViewType) {  
289 - return entityViewService.getEdgeEntityViews(edgeId, pageLink, null, entityViewType); 288 + fetchEntityViewsFunction = function (pageLink) {
  289 + return entityViewService.getEdgeEntityViews(edgeId, pageLink, null);
290 }; 290 };
291 deleteEntityViewFunction = function (entityViewId) { 291 deleteEntityViewFunction = function (entityViewId) {
292 return entityViewService.unassignEntityViewFromEdge(edgeId, entityViewId); 292 return entityViewService.unassignEntityViewFromEdge(edgeId, entityViewId);
@@ -614,6 +614,16 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document, @@ -614,6 +614,16 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document,
614 } 614 }
615 ); 615 );
616 return deferred.promise; 616 return deferred.promise;
  617 + case types.entityType.edge:
  618 + openImportDialogCSV($event, entityType, 'edge.import', 'edge.edge-file').then(
  619 + function success() {
  620 + deferred.resolve();
  621 + },
  622 + function fail() {
  623 + deferred.reject();
  624 + }
  625 + );
  626 + return deferred.promise;
617 } 627 }
618 628
619 } 629 }
@@ -765,6 +765,7 @@ @@ -765,6 +765,7 @@
765 "edge": { 765 "edge": {
766 "edge": "Edge", 766 "edge": "Edge",
767 "edges": "Edges", 767 "edges": "Edges",
  768 + "edge-file": "Edge file",
768 "management": "Edge management", 769 "management": "Edge management",
769 "no-edges-matching": "No edges matching '{{entity}}' were found.", 770 "no-edges-matching": "No edges matching '{{entity}}' were found.",
770 "add": "Add Edge", 771 "add": "Add Edge",
@@ -107,7 +107,7 @@ export default function RuleChainsController(ruleChainService, userService, impo @@ -107,7 +107,7 @@ export default function RuleChainsController(ruleChainService, userService, impo
107 var deleteRuleChainFunction = null; 107 var deleteRuleChainFunction = null;
108 108
109 if (edgeId) { 109 if (edgeId) {
110 - edgeService.getEdge(edgeId).then( 110 + edgeService.getEdge(edgeId, true, null).then(
111 function success(edge) { 111 function success(edge) {
112 vm.edge = edge; 112 vm.edge = edge;
113 } 113 }