From c9dcbda18dc1c6f5649eb23c5fa13d8d1b1effd4 Mon Sep 17 00:00:00 2001 From: Bohdan Smetaniuk Date: Fri, 2 Oct 2020 14:21:52 +0300 Subject: [PATCH] ui side + handle exceptions --- .../server/controller/BaseController.java | 4 ++++ .../server/controller/EdgeController.java | 11 ++++++++--- .../server/service/edge/rpc/EdgeGrpcService.java | 9 +++++++++ ui/src/app/api/edge.service.js | 14 +++++++++++++- ui/src/app/edge/edge-fieldset.tpl.html | 6 ++++++ ui/src/app/edge/edge.directive.js | 13 ++++++++++++- ui/src/app/locale/locale.constant-de_DE.json | 2 ++ ui/src/app/locale/locale.constant-en_US.json | 2 ++ ui/src/app/locale/locale.constant-es_ES.json | 2 ++ ui/src/app/locale/locale.constant-fr_FR.json | 2 ++ 10 files changed, 60 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/BaseController.java b/application/src/main/java/org/thingsboard/server/controller/BaseController.java index 856ee71314..582af82f71 100644 --- a/application/src/main/java/org/thingsboard/server/controller/BaseController.java +++ b/application/src/main/java/org/thingsboard/server/controller/BaseController.java @@ -104,6 +104,7 @@ import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.component.ComponentDiscoveryService; import org.thingsboard.server.service.edge.EdgeNotificationService; +import org.thingsboard.server.service.edge.rpc.EdgeGrpcService; import org.thingsboard.server.service.edge.rpc.init.SyncEdgeService; import org.thingsboard.server.service.queue.TbClusterService; import org.thingsboard.server.service.security.model.SecurityUser; @@ -212,6 +213,9 @@ public abstract class BaseController { @Autowired(required = false) protected SyncEdgeService syncEdgeService; + @Autowired(required = false) + protected EdgeGrpcService edgeGrpcService; + @Value("${server.log_controller_error_stack_trace}") @Getter private boolean logControllerErrorStackTrace; 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 e1d7c0aa53..be03c034e9 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java @@ -26,7 +26,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; -import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.EntitySubtype; import org.thingsboard.server.common.data.EntityType; @@ -47,6 +46,7 @@ import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.queue.util.TbCoreComponent; +import org.thingsboard.server.service.edge.rpc.EdgeGrpcSession; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.permission.Operation; import org.thingsboard.server.service.security.permission.Resource; @@ -415,8 +415,13 @@ public class EdgeController extends BaseController { public void syncEdge(@RequestBody EdgeId edgeId) throws ThingsboardException { try { edgeId = checkNotNull(edgeId); - Edge edge = checkEdgeId(edgeId, Operation.READ); - syncEdgeService.sync(edge); + if (isEdgesSupportEnabled()) { + EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(edgeId); + Edge edge = session.getEdge(); + syncEdgeService.sync(edge); + } else { + throw new ThingsboardException("Edges support disabled", ThingsboardErrorCode.GENERAL); + } } catch (Exception e) { throw handleException(e); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java index 85ea93bed3..936a805ea0 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java @@ -146,6 +146,15 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i save(edgeId, DefaultDeviceStateService.LAST_CONNECT_TIME, System.currentTimeMillis()); } + public EdgeGrpcSession getEdgeGrpcSessionById(EdgeId edgeId) { + EdgeGrpcSession session = sessions.get(edgeId); + if (session != null && session.isConnected()) { + return session; + } else { + throw new RuntimeException("Edge is not connected"); + } + } + private void processHandleMessages() { executor.submit(() -> { while (!Thread.interrupted()) { diff --git a/ui/src/app/api/edge.service.js b/ui/src/app/api/edge.service.js index 7814e1d826..528dea960c 100644 --- a/ui/src/app/api/edge.service.js +++ b/ui/src/app/api/edge.service.js @@ -33,7 +33,8 @@ function EdgeService($http, $q, customerService) { unassignEdgeFromCustomer: unassignEdgeFromCustomer, makeEdgePublic: makeEdgePublic, setRootRuleChain: setRootRuleChain, - getEdgeEvents: getEdgeEvents + getEdgeEvents: getEdgeEvents, + syncEdge: syncEdge }; return service; @@ -262,4 +263,15 @@ function EdgeService($http, $q, customerService) { }); return deferred.promise; } + + function syncEdge(edgeId) { + var deferred = $q.defer(); + var url = '/api/edge/sync'; + $http.post(url, edgeId).then(function success(response) { + deferred.resolve(response); + }, function fail(response) { + deferred.reject(response.data); + }); + return deferred.promise; + } } diff --git a/ui/src/app/edge/edge-fieldset.tpl.html b/ui/src/app/edge/edge-fieldset.tpl.html index 1595b2aebd..5811969b6a 100644 --- a/ui/src/app/edge/edge-fieldset.tpl.html +++ b/ui/src/app/edge/edge-fieldset.tpl.html @@ -48,6 +48,12 @@ edge.copy-id + + + edge.sync + diff --git a/ui/src/app/edge/edge.directive.js b/ui/src/app/edge/edge.directive.js index 98f010e009..04165418e9 100644 --- a/ui/src/app/edge/edge.directive.js +++ b/ui/src/app/edge/edge.directive.js @@ -20,7 +20,7 @@ import edgeFieldsetTemplate from './edge-fieldset.tpl.html'; /* eslint-enable import/no-unresolved, import/default */ /*@ngInject*/ -export default function EdgeDirective($compile, $templateCache, $translate, $mdDialog, $document, utils, toast, types, customerService) { +export default function EdgeDirective($compile, $templateCache, $translate, $mdDialog, $document, utils, toast, types, customerService, edgeService) { var linker = function (scope, element) { var template = $templateCache.get(edgeFieldsetTemplate); element.html(template); @@ -69,6 +69,17 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD toast.showSuccess($translate.instant('edge.id-copied-message'), 750, angular.element(element).parent().parent(), 'bottom left'); }; + scope.onEdgeSync = function (edgeId) { + edgeService.syncEdge(edgeId).then( + function success() { + toast.showSuccess($translate.instant('edge.sync-message'), 750, angular.element(element).parent().parent(), 'bottom left'); + }, + function fail(error) { + toast.showError(error); + } + ); + } + $compile(element.contents())(scope); scope.onEdgeInfoCopied = function(type) { diff --git a/ui/src/app/locale/locale.constant-de_DE.json b/ui/src/app/locale/locale.constant-de_DE.json index f8a1d887ff..582b7b72c2 100644 --- a/ui/src/app/locale/locale.constant-de_DE.json +++ b/ui/src/app/locale/locale.constant-de_DE.json @@ -756,6 +756,8 @@ "details": "Details", "copy-id": "Regelketten-ID kopieren", "id-copied-message": "Regelketten-ID wurde in die Zwischenablage kopiert", + "sync": "Sync Edge", + "sync-message": "Edge wurde synchronisiert", "permissions": "Berechtigungen", "edge-required": "Rand ist erforderlich.", "edge-type": "Randtyp", diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index c77192bffb..412280603c 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -788,6 +788,8 @@ "events": "Events", "copy-id": "Copy Edge Id", "id-copied-message": "Edge Id has been copied to clipboard", + "sync": "Sync Edge", + "sync-message": "Edge has been synchronized", "permissions": "Permissions", "edge-required": "Edge required", "edge-type": "Edge type", diff --git a/ui/src/app/locale/locale.constant-es_ES.json b/ui/src/app/locale/locale.constant-es_ES.json index f8f4e6bbe9..3eea48845f 100644 --- a/ui/src/app/locale/locale.constant-es_ES.json +++ b/ui/src/app/locale/locale.constant-es_ES.json @@ -769,6 +769,8 @@ "details": "Detalles", "copy-id": "Copiar ID de borde", "id-copied-message": "El ID de borde se ha copiado al portapapeles", + "sync": "Sinc Edge", + "sync-message": "Edge se ha sincronizado", "permissions": "Permisos", "edge-required": "Edge required", "edge-type": "Type de la bordure", diff --git a/ui/src/app/locale/locale.constant-fr_FR.json b/ui/src/app/locale/locale.constant-fr_FR.json index 4058148bbd..ffd4e05896 100644 --- a/ui/src/app/locale/locale.constant-fr_FR.json +++ b/ui/src/app/locale/locale.constant-fr_FR.json @@ -774,6 +774,8 @@ "details": "Détails de l'entité", "copy-id": "Copier borudre Id", "id-copied-message": "Id de la bordure a été copié dans le presse-papier", + "sync": "Sync Edge", + "sync-message": "Edge a été synchronisé", "permissions": "Autorisations", "edge-required": "Bordure est requise", "edge-type": "Type de la bordure",