diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java index d21f8e8f66..2b9af96ead 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java @@ -24,6 +24,7 @@ import org.thingsboard.server.dao.alarm.AlarmService; import org.thingsboard.server.dao.asset.AssetService; import org.thingsboard.server.dao.attributes.AttributesService; import org.thingsboard.server.dao.customer.CustomerService; +import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.edge.EdgeService; import org.thingsboard.server.dao.entityview.EntityViewService; @@ -65,6 +66,10 @@ public class EdgeContextComponent { @Autowired private AlarmService alarmService; + @Lazy + @Autowired + private DashboardService dashboardService; + @Lazy @Autowired private ActorService actorService; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index c04dcf9e16..6355de537c 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java @@ -25,12 +25,14 @@ import com.google.protobuf.ByteString; import io.grpc.stub.StreamObserver; import lombok.Data; import lombok.extern.slf4j.Slf4j; +import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityView; import org.thingsboard.server.common.data.Event; +import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmStatus; @@ -67,6 +69,7 @@ import org.thingsboard.server.gen.edge.AssetUpdateMsg; import org.thingsboard.server.gen.edge.ConnectRequestMsg; import org.thingsboard.server.gen.edge.ConnectResponseCode; import org.thingsboard.server.gen.edge.ConnectResponseMsg; +import org.thingsboard.server.gen.edge.CustomerUpdateMsg; import org.thingsboard.server.gen.edge.DashboardUpdateMsg; import org.thingsboard.server.gen.edge.DeviceUpdateMsg; import org.thingsboard.server.gen.edge.DownlinkMsg; @@ -85,6 +88,7 @@ import org.thingsboard.server.gen.edge.RuleNodeProto; import org.thingsboard.server.gen.edge.UpdateMsgType; import org.thingsboard.server.gen.edge.UplinkMsg; import org.thingsboard.server.gen.edge.UplinkResponseMsg; +import org.thingsboard.server.gen.edge.UserUpdateMsg; import org.thingsboard.server.service.edge.EdgeContextComponent; import java.io.IOException; @@ -212,7 +216,7 @@ public final class EdgeGrpcSession implements Cloneable { } private void processCustomDownlinkMessage(EdgeQueueEntry entry) throws IOException { - log.trace("Executing processCustomDownlinkMessage, entry [{}], msgType [{}]", entry); + log.trace("Executing processCustomDownlinkMessage, entry [{}]", entry); TbMsg tbMsg = objectMapper.readValue(entry.getData(), TbMsg.class); String entityName = null; switch (entry.getEntityType()) { @@ -526,11 +530,25 @@ public final class EdgeGrpcSession implements Cloneable { } private DashboardUpdateMsg constructDashboardUpdatedMsg(UpdateMsgType msgType, Dashboard dashboard) { + dashboard = ctx.getDashboardService().findDashboardById(edge.getTenantId(), dashboard.getId()); DashboardUpdateMsg.Builder builder = DashboardUpdateMsg.newBuilder() .setMsgType(msgType) .setIdMSB(dashboard.getId().getId().getMostSignificantBits()) .setIdLSB(dashboard.getId().getId().getLeastSignificantBits()) - .setName(dashboard.getName()); + .setTitle(dashboard.getTitle()) + .setConfiguration(JacksonUtil.toString(dashboard.getConfiguration())); + return builder.build(); + } + + private CustomerUpdateMsg constructCustomerUpdatedMsg(UpdateMsgType msgType, Customer customer) { + CustomerUpdateMsg.Builder builder = CustomerUpdateMsg.newBuilder() + .setMsgType(msgType); + return builder.build(); + } + + private UserUpdateMsg constructUserUpdatedMsg(UpdateMsgType msgType, User user) { + UserUpdateMsg.Builder builder = UserUpdateMsg.newBuilder() + .setMsgType(msgType); return builder.build(); } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeQueueEntityType.java b/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeQueueEntityType.java index b0f228e39a..733eaf2992 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeQueueEntityType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeQueueEntityType.java @@ -16,5 +16,5 @@ package org.thingsboard.server.common.data.edge; public enum EdgeQueueEntityType { - DASHBOARD, ASSET, DEVICE, ENTITY_VIEW, ALARM, RULE_CHAIN, RULE_CHAIN_METADATA, EDGE + DASHBOARD, ASSET, DEVICE, ENTITY_VIEW, ALARM, RULE_CHAIN, RULE_CHAIN_METADATA, EDGE, USER, CUSTOMER } diff --git a/common/edge-api/src/main/proto/edge.proto b/common/edge-api/src/main/proto/edge.proto index ad13539ae1..1b54e0902a 100644 --- a/common/edge-api/src/main/proto/edge.proto +++ b/common/edge-api/src/main/proto/edge.proto @@ -52,6 +52,8 @@ message EntityUpdateMsg { AssetUpdateMsg assetUpdateMsg = 5; EntityViewUpdateMsg entityViewUpdateMsg = 6; AlarmUpdateMsg alarmUpdateMsg = 7; + UserUpdateMsg userUpdateMsg = 8; + CustomerUpdateMsg customerUpdateMsg = 9; } enum RequestMsgType { @@ -82,6 +84,7 @@ message EdgeConfiguration { string name = 5; string routingKey = 6; string type = 7; + string cloudType = 8; } enum UpdateMsgType { @@ -147,7 +150,8 @@ message DashboardUpdateMsg { UpdateMsgType msgType = 1; int64 idMSB = 2; int64 idLSB = 3; - string name = 4; + string title = 4; + string configuration = 5; } message DeviceUpdateMsg { @@ -187,6 +191,37 @@ message AlarmUpdateMsg { bool propagate = 13; } +message CustomerUpdateMsg { + UpdateMsgType msgType = 1; + int64 idMSB = 2; + int64 idLSB = 3; + string title = 4; + string country = 5; + string state = 6; + string city = 7; + string address = 8; + string address2 = 9; + string zip = 10; + string phone = 11; + string email = 12; + string additionalInfo = 13; +} + +message UserUpdateMsg { + UpdateMsgType msgType = 1; + int64 idMSB = 2; + int64 idLSB = 3; + int64 customerIdMSB = 4; + int64 customerIdLSB = 5; + string email = 7; + string authority = 8; + string firstName = 9; + string lastName = 10; + string additionalInfo = 11; + bool enabled = 12; + string password = 13; +} + enum EntityType { DEVICE = 0; ASSET = 1; diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeService.java b/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeService.java index 29eec1a6d9..f9b2c7dd31 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeService.java @@ -29,6 +29,7 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.Customer; +import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EntitySubtype; @@ -549,6 +550,16 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic edgeId = new EdgeId(UUID.fromString(tbMsg.getMetaData().getValue("unassignedEdgeId"))); pushEventToEdge(tenantId, edgeId, entityType, tbMsg, callback); break; + case DataConstants.ENTITY_DELETED: + case DataConstants.ENTITY_CREATED: + case DataConstants.ENTITY_UPDATED: + Dashboard dashboard = mapper.readValue(tbMsg.getData(), Dashboard.class); + if (dashboard.getAssignedEdges() != null && !dashboard.getAssignedEdges().isEmpty()) { + for (ShortEdgeInfo assignedEdge : dashboard.getAssignedEdges()) { + pushEventToEdge(tenantId, assignedEdge.getEdgeId(), EdgeQueueEntityType.DASHBOARD, tbMsg, callback); + } + } + break; } } diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index 79d53a3af1..7f3cf09e21 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -184,6 +184,8 @@ "filter-type-entity-view-type": "Entity View type", "filter-type-entity-view-type-description": "Entity Views of type '{{entityView}}'", "filter-type-entity-view-type-and-name-description": "Entity Views of type '{{entityView}}' and with name starting with '{{prefix}}'", + "filter-type-edge-type": "Edge type", + "filter-type-edge-type-description": "Edges of type '{{edgeType}}'", "filter-type-relations-query": "Relations query", "filter-type-relations-query-description": "{{entities}} that have {{relationType}} relation {{direction}} {{rootEntity}}", "filter-type-asset-search-query": "Asset search query", @@ -192,6 +194,8 @@ "filter-type-device-search-query-description": "Devices with types {{deviceTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}", "filter-type-entity-view-search-query": "Entity view search query", "filter-type-entity-view-search-query-description": "Entity views with types {{entityViewTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}", + "filter-type-edge-search-query": "Edge search query", + "filter-type-edge-search-query-description": "Edges with types {{edgeTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}", "entity-filter": "Entity filter", "resolve-multiple": "Resolve as multiple entities", "filter-type": "Filter type",