Commit 422ef7564e87b93dd6e38724f1bcd81404706360

Authored by VoBa
Committed by GitHub
2 parents ab14bcb9 2b2a513c

Merge pull request #36 from BohdanSmetanyuk/feature/propagate_relations

propagate delete/update action for relations
... ... @@ -47,6 +47,8 @@ import org.thingsboard.server.common.data.asset.Asset;
47 47 import org.thingsboard.server.common.data.audit.ActionType;
48 48 import org.thingsboard.server.common.data.edge.Edge;
49 49 import org.thingsboard.server.common.data.edge.EdgeEvent;
  50 +import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
  51 +import org.thingsboard.server.common.data.exception.ThingsboardException;
50 52 import org.thingsboard.server.common.data.id.AlarmId;
51 53 import org.thingsboard.server.common.data.id.AssetId;
52 54 import org.thingsboard.server.common.data.id.CustomerId;
... ... @@ -54,6 +56,7 @@ import org.thingsboard.server.common.data.id.DashboardId;
54 56 import org.thingsboard.server.common.data.id.DeviceId;
55 57 import org.thingsboard.server.common.data.id.EdgeId;
56 58 import org.thingsboard.server.common.data.id.EntityId;
  59 +import org.thingsboard.server.common.data.id.EntityIdFactory;
57 60 import org.thingsboard.server.common.data.id.EntityViewId;
58 61 import org.thingsboard.server.common.data.id.RuleChainId;
59 62 import org.thingsboard.server.common.data.id.TenantId;
... ... @@ -98,6 +101,7 @@ import org.thingsboard.server.gen.edge.EntityDataProto;
98 101 import org.thingsboard.server.gen.edge.EntityUpdateMsg;
99 102 import org.thingsboard.server.gen.edge.EntityViewUpdateMsg;
100 103 import org.thingsboard.server.gen.edge.RelationRequestMsg;
  104 +import org.thingsboard.server.gen.edge.RelationUpdateMsg;
101 105 import org.thingsboard.server.gen.edge.RequestMsg;
102 106 import org.thingsboard.server.gen.edge.RequestMsgType;
103 107 import org.thingsboard.server.gen.edge.ResponseMsg;
... ... @@ -813,6 +817,11 @@ public final class EdgeGrpcSession implements Closeable {
813 817 onAlarmUpdate(alarmUpdateMsg);
814 818 }
815 819 }
  820 + if (uplinkMsg.getRelationUpdateMsgList() != null && !uplinkMsg.getRelationUpdateMsgList().isEmpty()) {
  821 + for (RelationUpdateMsg relationUpdateMsg: uplinkMsg.getRelationUpdateMsgList()) {
  822 + onRelationUpdate(relationUpdateMsg);
  823 + }
  824 + }
816 825 if (uplinkMsg.getRuleChainMetadataRequestMsgList() != null && !uplinkMsg.getRuleChainMetadataRequestMsgList().isEmpty()) {
817 826 for (RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg : uplinkMsg.getRuleChainMetadataRequestMsgList()) {
818 827 ctx.getSyncEdgeService().processRuleChainMetadataRequestMsg(edge, ruleChainMetadataRequestMsg);
... ... @@ -1164,6 +1173,60 @@ public final class EdgeGrpcSession implements Closeable {
1164 1173 }
1165 1174 }
1166 1175
  1176 + private void onRelationUpdate(RelationUpdateMsg relationUpdateMsg) {
  1177 + log.info("onRelationUpdate {}", relationUpdateMsg);
  1178 + try {
  1179 + EntityRelation entityRelation = new EntityRelation();
  1180 +
  1181 + UUID fromUUID = new UUID(relationUpdateMsg.getFromIdMSB(), relationUpdateMsg.getFromIdLSB());
  1182 + EntityId fromId = EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(relationUpdateMsg.getFromEntityType()), fromUUID);
  1183 + entityRelation.setFrom(fromId);
  1184 +
  1185 + UUID toUUID = new UUID(relationUpdateMsg.getToIdMSB(), relationUpdateMsg.getToIdLSB());
  1186 + EntityId toId = EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(relationUpdateMsg.getToEntityType()), toUUID);
  1187 + entityRelation.setTo(toId);
  1188 +
  1189 + entityRelation.setType(relationUpdateMsg.getType());
  1190 + entityRelation.setTypeGroup(RelationTypeGroup.valueOf(relationUpdateMsg.getTypeGroup()));
  1191 + entityRelation.setAdditionalInfo(mapper.readTree(relationUpdateMsg.getAdditionalInfo()));
  1192 + switch (relationUpdateMsg.getMsgType()) {
  1193 + case ENTITY_CREATED_RPC_MESSAGE:
  1194 + case ENTITY_UPDATED_RPC_MESSAGE:
  1195 + if (isEntityExists(edge.getTenantId(), entityRelation.getTo())
  1196 + && isEntityExists(edge.getTenantId(), entityRelation.getFrom())) {
  1197 + ctx.getRelationService().saveRelationAsync(edge.getTenantId(), entityRelation);
  1198 + }
  1199 + break;
  1200 + case ENTITY_DELETED_RPC_MESSAGE:
  1201 + ctx.getRelationService().deleteRelation(edge.getTenantId(), entityRelation);
  1202 + break;
  1203 + case UNRECOGNIZED:
  1204 + log.error("Unsupported msg type");
  1205 + }
  1206 + } catch (Exception e) {
  1207 + log.error("Error during relation update msg", e);
  1208 + }
  1209 + }
  1210 +
  1211 + private boolean isEntityExists(TenantId tenantId, EntityId entityId) throws ThingsboardException {
  1212 + switch (entityId.getEntityType()) {
  1213 + case DEVICE:
  1214 + return ctx.getDeviceService().findDeviceById(tenantId, new DeviceId(entityId.getId())) != null;
  1215 + case ASSET:
  1216 + return ctx.getAssetService().findAssetById(tenantId, new AssetId(entityId.getId())) != null;
  1217 + case ENTITY_VIEW:
  1218 + return ctx.getEntityViewService().findEntityViewById(tenantId, new EntityViewId(entityId.getId())) != null;
  1219 + case CUSTOMER:
  1220 + return ctx.getCustomerService().findCustomerById(tenantId, new CustomerId(entityId.getId())) != null;
  1221 + case USER:
  1222 + return ctx.getUserService().findUserById(tenantId, new UserId(entityId.getId())) != null;
  1223 + case DASHBOARD:
  1224 + return ctx.getDashboardService().findDashboardById(tenantId, new DashboardId(entityId.getId())) != null;
  1225 + default:
  1226 + throw new ThingsboardException("Unsupported entity type " + entityId.getEntityType(), ThingsboardErrorCode.INVALID_ARGUMENTS);
  1227 + }
  1228 + }
  1229 +
1167 1230 private ConnectResponseMsg processConnect(ConnectRequestMsg request) {
1168 1231 Optional<Edge> optional = ctx.getEdgeService().findEdgeByRoutingKey(TenantId.SYS_TENANT_ID, request.getEdgeRoutingKey());
1169 1232 if (optional.isPresent()) {
... ...
... ... @@ -348,11 +348,12 @@ message UplinkMsg {
348 348 repeated DeviceUpdateMsg deviceUpdateMsg = 3;
349 349 repeated DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg = 4;
350 350 repeated AlarmUpdateMsg alarmUpdateMsg = 5;
351   - repeated RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg = 6;
352   - repeated AttributesRequestMsg attributesRequestMsg = 7;
353   - repeated RelationRequestMsg relationRequestMsg = 8;
354   - repeated UserCredentialsRequestMsg userCredentialsRequestMsg = 9;
355   - repeated DeviceCredentialsRequestMsg deviceCredentialsRequestMsg = 10;
  351 + repeated RelationUpdateMsg relationUpdateMsg = 6;
  352 + repeated RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg = 7;
  353 + repeated AttributesRequestMsg attributesRequestMsg = 8;
  354 + repeated RelationRequestMsg relationRequestMsg = 9;
  355 + repeated UserCredentialsRequestMsg userCredentialsRequestMsg = 10;
  356 + repeated DeviceCredentialsRequestMsg deviceCredentialsRequestMsg = 11;
356 357 }
357 358
358 359 message UplinkResponseMsg {
... ...