From 2c826c12cd86a4c27fd3ed74b9640074400adaa1 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 20 May 2021 13:05:21 +0300 Subject: [PATCH] added admin setting fetcher --- .../controller/RuleChainController.java | 2 +- .../service/edge/EdgeContextComponent.java | 5 + .../service/edge/rpc/EdgeGrpcSession.java | 8 +- .../DeviceProfileMsgConstructor.java | 2 +- .../fetch/AdminSettingsEdgeEventFetcher.java | 165 ++++++++++-------- .../fetch/BasePageableEdgeEventFetcher.java | 3 + .../edge/rpc/fetch/EdgeEventFetcher.java | 2 +- .../rpc/processor/DeviceEdgeProcessor.java | 2 - .../rpc/processor/TelemetryEdgeProcessor.java | 2 +- .../thingsboard/server/edge/BaseEdgeTest.java | 2 - .../server/dao/edge/EdgeServiceImpl.java | 2 +- .../dao/entity/AbstractEntityService.java | 2 +- .../rule/engine/edge/TbMsgPushToEdgeNode.java | 2 +- .../rule-chain-autocomplete.component.ts | 2 +- 14 files changed, 115 insertions(+), 86 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java index 6f7cf4e81d..d3035b4f3b 100644 --- a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java +++ b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java @@ -635,7 +635,7 @@ public class RuleChainController extends BaseController { } } - // TODO: refactor this - add new config to edge rule chain to set it as auto-assign + // TODO: @voba refactor this - add new config to edge rule chain to set it as auto-assign @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") @RequestMapping(value = "/ruleChain/autoAssignToEdgeRuleChains", method = RequestMethod.GET) @ResponseBody 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 bdc5c26889..72b5831a4d 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 @@ -27,6 +27,7 @@ import org.thingsboard.server.dao.device.DeviceProfileService; import org.thingsboard.server.dao.edge.EdgeEventService; import org.thingsboard.server.dao.edge.EdgeService; import org.thingsboard.server.dao.rule.RuleChainService; +import org.thingsboard.server.dao.settings.AdminSettingsService; import org.thingsboard.server.dao.user.UserService; import org.thingsboard.server.dao.widget.WidgetsBundleService; import org.thingsboard.server.queue.util.TbCoreComponent; @@ -62,6 +63,10 @@ public class EdgeContextComponent { @Autowired private EdgeEventService edgeEventService; + @Lazy + @Autowired + private AdminSettingsService adminSettingsService; + @Lazy @Autowired private AssetService assetService; 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 e95c5952f4..c168c20983 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 @@ -68,6 +68,7 @@ import org.thingsboard.server.gen.edge.UplinkResponseMsg; import org.thingsboard.server.gen.edge.UserCredentialsRequestMsg; import org.thingsboard.server.gen.edge.WidgetBundleTypesRequestMsg; import org.thingsboard.server.service.edge.EdgeContextComponent; +import org.thingsboard.server.service.edge.rpc.fetch.AdminSettingsEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.AssetsEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.CustomerUsersEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.DashboardsEdgeEventFetcher; @@ -207,8 +208,7 @@ public final class EdgeGrpcSession implements Closeable { startProcessingEdgeEvents(new CustomerUsersEdgeEventFetcher(ctx.getUserService(), edge.getCustomerId())); } - // TODO: voba - implement this functionality - // syncAdminSettings(edge); + startProcessingEdgeEvents(new AdminSettingsEdgeEventFetcher(ctx.getAdminSettingsService())); startProcessingEdgeEvents(new AssetsEdgeEventFetcher(ctx.getAssetService())); startProcessingEdgeEvents(new DashboardsEdgeEventFetcher(ctx.getDashboardService())); @@ -285,7 +285,7 @@ public final class EdgeGrpcSession implements Closeable { sendDownlinkMsg(edgeConfigMsg); } - void processEdgeEvents() throws ExecutionException, InterruptedException { + void processEdgeEvents() throws Exception { log.trace("[{}] processHandleMessages started", this.sessionId); if (isConnected() && isSyncCompleted()) { Long queueStartTs = getQueueStartTs().get(); @@ -301,7 +301,7 @@ public final class EdgeGrpcSession implements Closeable { log.trace("[{}] processHandleMessages finished", this.sessionId); } - private UUID startProcessingEdgeEvents(EdgeEventFetcher fetcher) throws InterruptedException { + private UUID startProcessingEdgeEvents(EdgeEventFetcher fetcher) throws Exception { PageLink pageLink = fetcher.getPageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount()); PageData pageData; UUID ifOffset = null; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java index c3f5346170..b5ec2cd396 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java @@ -41,7 +41,7 @@ public class DeviceProfileMsgConstructor { .setDefault(deviceProfile.isDefault()) .setType(deviceProfile.getType().name()) .setProfileDataBytes(ByteString.copyFrom(dataDecodingEncodingService.encode(deviceProfile.getProfileData()))); - // TODO: voba - should this be always null at the moment?? + // TODO: @voba - add possibility to setup edge rule chain as device profile default // if (deviceProfile.getDefaultRuleChainId() != null) { // builder.setDefaultRuleChainIdMSB(deviceProfile.getDefaultRuleChainId().getId().getMostSignificantBits()) // .setDefaultRuleChainIdLSB(deviceProfile.getDefaultRuleChainId().getId().getLeastSignificantBits()); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AdminSettingsEdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AdminSettingsEdgeEventFetcher.java index be5344acd4..ec30e964b4 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AdminSettingsEdgeEventFetcher.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AdminSettingsEdgeEventFetcher.java @@ -15,90 +15,115 @@ */ package org.thingsboard.server.service.edge.rpc.fetch; +import com.datastax.oss.driver.api.core.uuid.Uuids; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.text.WordUtils; +import org.springframework.core.io.DefaultResourceLoader; +import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.edge.EdgeEvent; +import org.thingsboard.server.common.data.edge.EdgeEventActionType; +import org.thingsboard.server.common.data.edge.EdgeEventType; +import org.thingsboard.server.common.data.id.AdminSettingsId; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; +import org.thingsboard.server.dao.settings.AdminSettingsService; +import org.thingsboard.server.service.edge.rpc.EdgeEventUtils; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @AllArgsConstructor @Slf4j public class AdminSettingsEdgeEventFetcher extends BasePageableEdgeEventFetcher { + private final AdminSettingsService adminSettingsService; + @Override - public PageData fetchEdgeEvents(TenantId tenantId, EdgeId edgeId, PageLink pageLink) { - return null; + public PageData fetchEdgeEvents(TenantId tenantId, EdgeId edgeId, PageLink pageLink) throws Exception { + List result = new ArrayList<>(); + + AdminSettings systemMailSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "mail"); + result.add(EdgeEventUtils.constructEdgeEvent(tenantId, edgeId, EdgeEventType.ADMIN_SETTINGS, + EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailSettings))); + + AdminSettings tenantMailSettings = convertToTenantAdminSettings(systemMailSettings.getKey(), (ObjectNode) systemMailSettings.getJsonValue()); + result.add(EdgeEventUtils.constructEdgeEvent(tenantId, edgeId, EdgeEventType.ADMIN_SETTINGS, + EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailSettings))); + + AdminSettings systemMailTemplates = loadMailTemplates(); + result.add(EdgeEventUtils.constructEdgeEvent(tenantId, edgeId, EdgeEventType.ADMIN_SETTINGS, + EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailTemplates))); + + AdminSettings tenantMailTemplates = convertToTenantAdminSettings(systemMailTemplates.getKey(), (ObjectNode) systemMailTemplates.getJsonValue()); + result.add(EdgeEventUtils.constructEdgeEvent(tenantId, edgeId, EdgeEventType.ADMIN_SETTINGS, + EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailTemplates))); + + // @voba - returns PageData object to be in sync with other fetchers + return new PageData<>(result, 1, result.size(), false); } + private AdminSettings loadMailTemplates() throws Exception { + Map mailTemplates = new HashMap<>(); + Pattern startPattern = Pattern.compile("
"); + Pattern endPattern = Pattern.compile("
"); + File[] files = new DefaultResourceLoader().getResource("classpath:/templates/").getFile().listFiles(); + for (File file : files) { + Map mailTemplate = new HashMap<>(); + String name = validateName(file.getName()); + String stringTemplate = FileUtils.readFileToString(file, StandardCharsets.UTF_8); + Matcher start = startPattern.matcher(stringTemplate); + Matcher end = endPattern.matcher(stringTemplate); + if (start.find() && end.find()) { + String body = StringUtils.substringBetween(stringTemplate, start.group(), end.group()).replaceAll("\t", ""); + String subject = StringUtils.substringBetween(body, "

", "

"); + mailTemplate.put("subject", subject); + mailTemplate.put("body", body); + mailTemplates.put(name, mailTemplate); + } else { + log.error("Can't load mail template from file {}", file.getName()); + } + } + AdminSettings adminSettings = new AdminSettings(); + adminSettings.setId(new AdminSettingsId(Uuids.timeBased())); + adminSettings.setKey("mailTemplates"); + adminSettings.setJsonValue(mapper.convertValue(mailTemplates, JsonNode.class)); + return adminSettings; + } -// -// private void syncAdminSettings(TenantId tenantId, Edge edge) { -// log.trace("[{}] syncAdminSettings [{}]", tenantId, edge.getName()); -// try { -// AdminSettings systemMailSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "mail"); -// saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailSettings)); -// AdminSettings tenantMailSettings = convertToTenantAdminSettings(systemMailSettings.getKey(), (ObjectNode) systemMailSettings.getJsonValue()); -// saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailSettings)); -// AdminSettings systemMailTemplates = loadMailTemplates(); -// saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailTemplates)); -// AdminSettings tenantMailTemplates = convertToTenantAdminSettings(systemMailTemplates.getKey(), (ObjectNode) systemMailTemplates.getJsonValue()); -// saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailTemplates)); -// } catch (Exception e) { -// log.error("Can't load admin settings", e); -// } -// } -// -// private AdminSettings loadMailTemplates() throws Exception { -// Map mailTemplates = new HashMap<>(); -// Pattern startPattern = Pattern.compile("
"); -// Pattern endPattern = Pattern.compile("
"); -// File[] files = new DefaultResourceLoader().getResource("classpath:/templates/").getFile().listFiles(); -// for (File file : files) { -// Map mailTemplate = new HashMap<>(); -// String name = validateName(file.getName()); -// String stringTemplate = FileUtils.readFileToString(file, StandardCharsets.UTF_8); -// Matcher start = startPattern.matcher(stringTemplate); -// Matcher end = endPattern.matcher(stringTemplate); -// if (start.find() && end.find()) { -// String body = StringUtils.substringBetween(stringTemplate, start.group(), end.group()).replaceAll("\t", ""); -// String subject = StringUtils.substringBetween(body, "

", "

"); -// mailTemplate.put("subject", subject); -// mailTemplate.put("body", body); -// mailTemplates.put(name, mailTemplate); -// } else { -// log.error("Can't load mail template from file {}", file.getName()); -// } -// } -// AdminSettings adminSettings = new AdminSettings(); -// adminSettings.setId(new AdminSettingsId(Uuids.timeBased())); -// adminSettings.setKey("mailTemplates"); -// adminSettings.setJsonValue(mapper.convertValue(mailTemplates, JsonNode.class)); -// return adminSettings; -// } -// -// private String validateName(String name) throws Exception { -// StringBuilder nameBuilder = new StringBuilder(); -// name = name.replace(".vm", ""); -// String[] nameParts = name.split("\\."); -// if (nameParts.length >= 1) { -// nameBuilder.append(nameParts[0]); -// for (int i = 1; i < nameParts.length; i++) { -// String word = WordUtils.capitalize(nameParts[i]); -// nameBuilder.append(word); -// } -// return nameBuilder.toString(); -// } else { -// throw new Exception("Error during filename validation"); -// } -// } -// -// private AdminSettings convertToTenantAdminSettings(String key, ObjectNode jsonValue) { -// AdminSettings tenantMailSettings = new AdminSettings(); -// jsonValue.put("useSystemMailSettings", true); -// tenantMailSettings.setJsonValue(jsonValue); -// tenantMailSettings.setKey(key); -// return tenantMailSettings; -// } + private String validateName(String name) throws Exception { + StringBuilder nameBuilder = new StringBuilder(); + name = name.replace(".vm", ""); + String[] nameParts = name.split("\\."); + if (nameParts.length >= 1) { + nameBuilder.append(nameParts[0]); + for (int i = 1; i < nameParts.length; i++) { + String word = WordUtils.capitalize(nameParts[i]); + nameBuilder.append(word); + } + return nameBuilder.toString(); + } else { + throw new Exception("Error during filename validation"); + } + } + + private AdminSettings convertToTenantAdminSettings(String key, ObjectNode jsonValue) { + AdminSettings tenantMailSettings = new AdminSettings(); + jsonValue.put("useSystemMailSettings", true); + tenantMailSettings.setJsonValue(jsonValue); + tenantMailSettings.setKey(key); + return tenantMailSettings; + } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/BasePageableEdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/BasePageableEdgeEventFetcher.java index 3c2f7f82fd..409e044864 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/BasePageableEdgeEventFetcher.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/BasePageableEdgeEventFetcher.java @@ -15,10 +15,13 @@ */ package org.thingsboard.server.service.edge.rpc.fetch; +import com.fasterxml.jackson.databind.ObjectMapper; import org.thingsboard.server.common.data.page.PageLink; public abstract class BasePageableEdgeEventFetcher implements EdgeEventFetcher { + protected static final ObjectMapper mapper = new ObjectMapper(); + @Override public PageLink getPageLink(int pageSize) { return new PageLink(pageSize); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/EdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/EdgeEventFetcher.java index d36b072c3d..077a4105ed 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/EdgeEventFetcher.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/EdgeEventFetcher.java @@ -25,5 +25,5 @@ public interface EdgeEventFetcher { PageLink getPageLink(int pageSize); - PageData fetchEdgeEvents(TenantId tenantId, EdgeId edgeId, PageLink pageLink); + PageData fetchEdgeEvents(TenantId tenantId, EdgeId edgeId, PageLink pageLink) throws Exception; } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java index b3ec44195e..c889b3a49c 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java @@ -72,8 +72,6 @@ public class DeviceEdgeProcessor extends BaseEdgeProcessor { private static final ReentrantLock deviceCreationLock = new ReentrantLock(); - // TODO onDeviceUpdateFromEdge onDeviceUpdateToEdge - public ListenableFuture processDeviceFromEdge(TenantId tenantId, Edge edge, DeviceUpdateMsg deviceUpdateMsg) { log.trace("[{}] onDeviceUpdate [{}] from edge [{}]", tenantId, deviceUpdateMsg, edge.getName()); switch (deviceUpdateMsg.getMsgType()) { diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/TelemetryEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/TelemetryEdgeProcessor.java index c475542892..dcced3d687 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/TelemetryEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/TelemetryEdgeProcessor.java @@ -82,7 +82,7 @@ public class TelemetryEdgeProcessor extends BaseEdgeProcessor { List> result = new ArrayList<>(); EntityId entityId = constructEntityId(entityData); if ((entityData.hasPostAttributesMsg() || entityData.hasPostTelemetryMsg() || entityData.hasAttributesUpdatedMsg()) && entityId != null) { - // TODO: voba - in terms of performance we should not fetch device from DB by id + // @voba - in terms of performance we should not fetch device from DB by id // TbMsgMetaData metaData = constructBaseMsgMetadata(tenantId, entityId); TbMsgMetaData metaData = new TbMsgMetaData(); metaData.putValue(DataConstants.MSG_SOURCE_KEY, DataConstants.EDGE_MSG_SOURCE); diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 8e3e8be882..c255ce93ea 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -171,8 +171,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { installation(); edgeImitator = new EdgeImitator("localhost", 7070, edge.getRoutingKey(), edge.getSecret()); - // TODO: voba - should be less, but events from SyncEdgeService stack with events from controller. will be fixed in next releases - // so ideally sync process should check current edge queue and add only missing entities to the edge queue edgeImitator.expectMessageAmount(9); edgeImitator.connect(); } 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 21ca4228a3..aee1fe7d34 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 @@ -497,7 +497,7 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic @Override public ListenableFuture> findRelatedEdgeIdsByEntityId(TenantId tenantId, EntityId entityId) { - // TODO: voba - rewrite 'find' to use native SQL queries instead of fetching relations + // TODO: @voba - rewrite 'find' to use native SQL queries instead of fetching relations log.trace("[{}] Executing findRelatedEdgeIdsByEntityId [{}]", tenantId, entityId); if (EntityType.TENANT.equals(entityId.getEntityType()) || diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java b/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java index 0c80195d9b..5da1d56181 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java @@ -77,7 +77,7 @@ public abstract class AbstractEntityService { List entityViews = entityViewService.findEntityViewsByTenantIdAndEntityIdAsync(tenantId, entityId).get(); if (entityViews != null && !entityViews.isEmpty()) { EntityView entityView = entityViews.get(0); - // TODO: voba - refactor this blocking operation in 3.3+ + // TODO: @voba - refactor this blocking operation in 3.3+ Boolean relationExists = relationService.checkRelation(tenantId,edgeId, entityView.getId(), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE).get(); if (relationExists) { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java index e766c2600c..f208213d63 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java @@ -223,7 +223,7 @@ public class TbMsgPushToEdgeNode implements TbNode { private String getScope(Map metadata) { String scope = metadata.get(SCOPE); if (StringUtils.isEmpty(scope)) { - // TODO: voba - move this to configuration of the node UI or some other place + // TODO: @voba - move this to configuration of the node UI or some other place scope = DataConstants.SERVER_SCOPE; } return scope; diff --git a/ui-ngx/src/app/modules/home/components/rule-chain/rule-chain-autocomplete.component.ts b/ui-ngx/src/app/modules/home/components/rule-chain/rule-chain-autocomplete.component.ts index b190b0d293..82241702ae 100644 --- a/ui-ngx/src/app/modules/home/components/rule-chain/rule-chain-autocomplete.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-chain/rule-chain-autocomplete.component.ts @@ -188,7 +188,7 @@ export class RuleChainAutocompleteComponent implements ControlValueAccessor, OnI fetchRuleChain(searchText?: string): Observable>> { this.searchText = searchText; - // voba: at the moment device profiles are not supported by edge, so 'core' hardcoded + // @voba: at the moment device profiles are not supported by edge, so 'core' hardcoded return this.entityService.getEntitiesByNameFilter(EntityType.RULE_CHAIN, searchText, 50, RuleChainType.CORE, {ignoreLoading: true}); }