Browse Source

Refactor save rule chain note

pull/15121/head
Vladyslav_Prykhodko 7 months ago
parent
commit
7fdaf3f383
  1. 7
      application/src/main/data/upgrade/basic/schema_update.sql
  2. 46
      common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleChainDetails.java
  3. 1
      dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java
  4. 127
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractRuleChainEntity.java
  5. 65
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleChainDetailsEntity.java
  6. 78
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleChainEntity.java
  7. 29
      dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java
  8. 5
      dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java
  9. 15
      dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java
  10. 25
      dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainDetailsRepository.java
  11. 1
      dao/src/main/resources/sql/schema-entities.sql
  12. 15
      ui-ngx/src/app/modules/home/pages/rulechain/rule-note-editor.component.scss

7
application/src/main/data/upgrade/basic/schema_update.sql

@ -14,9 +14,8 @@
-- limitations under the License. -- limitations under the License.
-- --
-- RULE CHAIN NOTES MIGRATION START
-- RULE CHAIN NOTES START ALTER TABLE rule_chain ADD COLUMN IF NOT EXISTS notes varchar(10000000);
ALTER TABLE rule_chain ADD COLUMN IF NOT EXISTS notes text; -- RULE CHAIN NOTES MIGRATION END
-- RULE CHAIN NOTES END

46
common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleChainDetails.java

@ -0,0 +1,46 @@
/**
* Copyright © 2016-2026 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.common.data.rule;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
public class RuleChainDetails extends RuleChain {
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@Schema(description = "List of sticky notes placed on the rule chain canvas")
private List<RuleChainNote> notes;
public RuleChainDetails() {
super();
}
public RuleChainDetails(RuleChain ruleChain) {
super(ruleChain);
}
public RuleChainDetails(RuleChainDetails ruleChainDetails) {
super(ruleChainDetails);
this.notes = ruleChainDetails.getNotes();
}
}

1
dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java

@ -420,6 +420,7 @@ public class ModelConstants {
public static final String RULE_CHAIN_FIRST_RULE_NODE_ID_PROPERTY = "first_rule_node_id"; public static final String RULE_CHAIN_FIRST_RULE_NODE_ID_PROPERTY = "first_rule_node_id";
public static final String RULE_CHAIN_ROOT_PROPERTY = "root"; public static final String RULE_CHAIN_ROOT_PROPERTY = "root";
public static final String RULE_CHAIN_CONFIGURATION_PROPERTY = "configuration"; public static final String RULE_CHAIN_CONFIGURATION_PROPERTY = "configuration";
public static final String RULE_CHAIN_NOTES_PROPERTY = "notes";
/** /**
* Rule node constants. * Rule node constants.

127
dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractRuleChainEntity.java

@ -0,0 +1,127 @@
/**
* Copyright © 2016-2026 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model.sql;
import com.fasterxml.jackson.databind.JsonNode;
import jakarta.persistence.Column;
import jakarta.persistence.Convert;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.MappedSuperclass;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.RuleNodeId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.BaseVersionedEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.util.mapping.JsonConverter;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = true)
@MappedSuperclass
public abstract class AbstractRuleChainEntity<T extends RuleChain> extends BaseVersionedEntity<T> {
@Column(name = ModelConstants.RULE_CHAIN_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.RULE_CHAIN_NAME_PROPERTY)
private String name;
@Enumerated(EnumType.STRING)
@Column(name = ModelConstants.RULE_CHAIN_TYPE_PROPERTY)
private RuleChainType type;
@Column(name = ModelConstants.RULE_CHAIN_FIRST_RULE_NODE_ID_PROPERTY)
private UUID firstRuleNodeId;
@Column(name = ModelConstants.RULE_CHAIN_ROOT_PROPERTY)
private boolean root;
@Column(name = ModelConstants.DEBUG_MODE)
private boolean debugMode;
@Convert(converter = JsonConverter.class)
@Column(name = ModelConstants.RULE_CHAIN_CONFIGURATION_PROPERTY)
private JsonNode configuration;
@Convert(converter = JsonConverter.class)
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
@Column(name = ModelConstants.EXTERNAL_ID_PROPERTY)
private UUID externalId;
public AbstractRuleChainEntity() {
super();
}
public AbstractRuleChainEntity(T ruleChain) {
super(ruleChain);
this.tenantId = DaoUtil.getId(ruleChain.getTenantId());
this.name = ruleChain.getName();
this.type = ruleChain.getType();
if (ruleChain.getFirstRuleNodeId() != null) {
this.firstRuleNodeId = ruleChain.getFirstRuleNodeId().getId();
}
this.root = ruleChain.isRoot();
this.debugMode = ruleChain.isDebugMode();
this.configuration = ruleChain.getConfiguration();
this.additionalInfo = ruleChain.getAdditionalInfo();
if (ruleChain.getExternalId() != null) {
this.externalId = ruleChain.getExternalId().getId();
}
}
public AbstractRuleChainEntity(AbstractRuleChainEntity<?> ruleChainEntity) {
super(ruleChainEntity);
this.tenantId = ruleChainEntity.getTenantId();
this.name = ruleChainEntity.getName();
this.type = ruleChainEntity.getType();
this.firstRuleNodeId = ruleChainEntity.getFirstRuleNodeId();
this.root = ruleChainEntity.isRoot();
this.debugMode = ruleChainEntity.isDebugMode();
this.configuration = ruleChainEntity.getConfiguration();
this.additionalInfo = ruleChainEntity.getAdditionalInfo();
this.externalId = ruleChainEntity.getExternalId();
}
protected RuleChain toRuleChain() {
RuleChain ruleChain = new RuleChain(new RuleChainId(this.getUuid()));
ruleChain.setCreatedTime(createdTime);
ruleChain.setVersion(version);
ruleChain.setTenantId(TenantId.fromUUID(tenantId));
ruleChain.setName(name);
ruleChain.setType(type);
if (firstRuleNodeId != null) {
ruleChain.setFirstRuleNodeId(new RuleNodeId(firstRuleNodeId));
}
ruleChain.setRoot(root);
ruleChain.setDebugMode(debugMode);
ruleChain.setConfiguration(configuration);
ruleChain.setAdditionalInfo(additionalInfo);
if (externalId != null) {
ruleChain.setExternalId(new RuleChainId(externalId));
}
return ruleChain;
}
}

65
dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleChainDetailsEntity.java

@ -0,0 +1,65 @@
/**
* Copyright © 2016-2026 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model.sql;
import com.fasterxml.jackson.databind.JsonNode;
import jakarta.persistence.Column;
import jakarta.persistence.Convert;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainDetails;
import org.thingsboard.server.common.data.rule.RuleChainNote;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.util.mapping.JsonConverter;
import java.util.Arrays;
@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = ModelConstants.RULE_CHAIN_TABLE_NAME)
public class RuleChainDetailsEntity extends AbstractRuleChainEntity<RuleChainDetails> {
@Convert(converter = JsonConverter.class)
@Column(name = ModelConstants.RULE_CHAIN_NOTES_PROPERTY)
private JsonNode notes;
public RuleChainDetailsEntity() {
super();
}
public RuleChainDetailsEntity(RuleChainDetails ruleChainDetails) {
super(ruleChainDetails);
if (ruleChainDetails.getNotes() != null) {
this.notes = JacksonUtil.valueToTree(ruleChainDetails.getNotes());
}
}
@Override
public RuleChainDetails toData() {
RuleChain ruleChain = super.toRuleChain();
RuleChainDetails details = new RuleChainDetails(ruleChain);
if (notes != null && notes.isArray()) {
details.setNotes(Arrays.asList(JacksonUtil.treeToValue(notes, RuleChainNote[].class)));
}
return details;
}
}

78
dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleChainEntity.java

@ -15,102 +15,30 @@
*/ */
package org.thingsboard.server.dao.model.sql; package org.thingsboard.server.dao.model.sql;
import com.fasterxml.jackson.databind.JsonNode;
import jakarta.persistence.Column;
import jakarta.persistence.Convert;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.RuleNodeId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.BaseVersionedEntity;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.util.mapping.JsonConverter;
import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Entity @Entity
@Table(name = ModelConstants.RULE_CHAIN_TABLE_NAME) @Table(name = ModelConstants.RULE_CHAIN_TABLE_NAME)
public class RuleChainEntity extends BaseVersionedEntity<RuleChain> { public class RuleChainEntity extends AbstractRuleChainEntity<RuleChain> {
@Column(name = ModelConstants.RULE_CHAIN_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.RULE_CHAIN_NAME_PROPERTY)
private String name;
@Enumerated(EnumType.STRING)
@Column(name = ModelConstants.RULE_CHAIN_TYPE_PROPERTY)
private RuleChainType type;
@Column(name = ModelConstants.RULE_CHAIN_FIRST_RULE_NODE_ID_PROPERTY)
private UUID firstRuleNodeId;
@Column(name = ModelConstants.RULE_CHAIN_ROOT_PROPERTY)
private boolean root;
@Column(name = ModelConstants.DEBUG_MODE)
private boolean debugMode;
@Convert(converter = JsonConverter.class)
@Column(name = ModelConstants.RULE_CHAIN_CONFIGURATION_PROPERTY)
private JsonNode configuration;
@Convert(converter = JsonConverter.class)
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
@Column(name = ModelConstants.EXTERNAL_ID_PROPERTY)
private UUID externalId;
public RuleChainEntity() { public RuleChainEntity() {
super();
} }
public RuleChainEntity(RuleChain ruleChain) { public RuleChainEntity(RuleChain ruleChain) {
super(ruleChain); super(ruleChain);
this.tenantId = DaoUtil.getId(ruleChain.getTenantId());
this.name = ruleChain.getName();
this.type = ruleChain.getType();
if (ruleChain.getFirstRuleNodeId() != null) {
this.firstRuleNodeId = ruleChain.getFirstRuleNodeId().getId();
}
this.root = ruleChain.isRoot();
this.debugMode = ruleChain.isDebugMode();
this.configuration = ruleChain.getConfiguration();
this.additionalInfo = ruleChain.getAdditionalInfo();
if (ruleChain.getExternalId() != null) {
this.externalId = ruleChain.getExternalId().getId();
}
} }
@Override @Override
public RuleChain toData() { public RuleChain toData() {
RuleChain ruleChain = new RuleChain(new RuleChainId(this.getUuid())); return super.toRuleChain();
ruleChain.setCreatedTime(createdTime);
ruleChain.setVersion(version);
ruleChain.setTenantId(TenantId.fromUUID(tenantId));
ruleChain.setName(name);
ruleChain.setType(type);
if (firstRuleNodeId != null) {
ruleChain.setFirstRuleNodeId(new RuleNodeId(firstRuleNodeId));
}
ruleChain.setRoot(root);
ruleChain.setDebugMode(debugMode);
ruleChain.setConfiguration(configuration);
ruleChain.setAdditionalInfo(additionalInfo);
if (externalId != null) {
ruleChain.setExternalId(new RuleChainId(externalId));
}
return ruleChain;
} }
} }

29
dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java

@ -16,7 +16,6 @@
package org.thingsboard.server.dao.rule; package org.thingsboard.server.dao.rule;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.FluentFuture;
@ -52,9 +51,9 @@ import org.thingsboard.server.common.data.rule.NodeConnectionInfo;
import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainConnectionInfo; import org.thingsboard.server.common.data.rule.RuleChainConnectionInfo;
import org.thingsboard.server.common.data.rule.RuleChainData; import org.thingsboard.server.common.data.rule.RuleChainData;
import org.thingsboard.server.common.data.rule.RuleChainDetails;
import org.thingsboard.server.common.data.rule.RuleChainImportResult; import org.thingsboard.server.common.data.rule.RuleChainImportResult;
import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.common.data.rule.RuleChainNote;
import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.common.data.rule.RuleChainUpdateResult; import org.thingsboard.server.common.data.rule.RuleChainUpdateResult;
import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.data.rule.RuleNode;
@ -318,12 +317,11 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
if (!relations.isEmpty()) { if (!relations.isEmpty()) {
relationService.saveRelations(tenantId, relations); relationService.saveRelations(tenantId, relations);
} }
ruleChain.setConfiguration(CollectionUtils.isNotEmpty(ruleChainMetaData.getNotes()) RuleChainDetails ruleChainDetails = new RuleChainDetails(ruleChain);
? JacksonUtil.newObjectNode().set("notes", JacksonUtil.valueToTree(ruleChainMetaData.getNotes())) ruleChainDetails.setNotes(ruleChainMetaData.getNotes());
: null); ruleChainDetails = ruleChainDao.saveDetails(ruleChainDetails);
ruleChain = ruleChainDao.save(tenantId, ruleChain); eventPublisher.publishEvent(SaveEntityEvent.builder().tenantId(tenantId).entity(ruleChainDetails)
eventPublisher.publishEvent(SaveEntityEvent.builder().tenantId(tenantId).entity(ruleChain) .entityId(ruleChainDetails.getId()).broadcastEvent(publishSaveEvent).build());
.entityId(ruleChain.getId()).broadcastEvent(publishSaveEvent).build());
return RuleChainUpdateResult.successful(updatedRuleNodes); return RuleChainUpdateResult.successful(updatedRuleNodes);
} }
@ -346,13 +344,13 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
@Override @Override
public RuleChainMetaData loadRuleChainMetaData(TenantId tenantId, RuleChainId ruleChainId) { public RuleChainMetaData loadRuleChainMetaData(TenantId tenantId, RuleChainId ruleChainId) {
Validator.validateId(ruleChainId, "Incorrect rule chain id."); Validator.validateId(ruleChainId, "Incorrect rule chain id.");
RuleChain ruleChain = findRuleChainById(tenantId, ruleChainId); RuleChainDetails ruleChainDetails = ruleChainDao.findDetailsById(ruleChainId.getId());
if (ruleChain == null) { if (ruleChainDetails == null) {
return null; return null;
} }
RuleChainMetaData ruleChainMetaData = new RuleChainMetaData(); RuleChainMetaData ruleChainMetaData = new RuleChainMetaData();
ruleChainMetaData.setRuleChainId(ruleChainId); ruleChainMetaData.setRuleChainId(ruleChainId);
ruleChainMetaData.setVersion(ruleChain.getVersion()); ruleChainMetaData.setVersion(ruleChainDetails.getVersion());
List<RuleNode> ruleNodes = getRuleChainNodes(tenantId, ruleChainId); List<RuleNode> ruleNodes = getRuleChainNodes(tenantId, ruleChainId);
Collections.sort(ruleNodes, Comparator.comparingLong(RuleNode::getCreatedTime).thenComparing(RuleNode::getId, Comparator.comparing(RuleNodeId::getId))); Collections.sort(ruleNodes, Comparator.comparingLong(RuleNode::getCreatedTime).thenComparing(RuleNode::getId, Comparator.comparing(RuleNodeId::getId)));
Map<RuleNodeId, Integer> ruleNodeIndexMap = new HashMap<>(); Map<RuleNodeId, Integer> ruleNodeIndexMap = new HashMap<>();
@ -360,8 +358,8 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
ruleNodeIndexMap.put(node.getId(), ruleNodes.indexOf(node)); ruleNodeIndexMap.put(node.getId(), ruleNodes.indexOf(node));
} }
ruleChainMetaData.setNodes(ruleNodes); ruleChainMetaData.setNodes(ruleNodes);
if (ruleChain.getFirstRuleNodeId() != null) { if (ruleChainDetails.getFirstRuleNodeId() != null) {
ruleChainMetaData.setFirstNodeIndex(ruleNodeIndexMap.get(ruleChain.getFirstRuleNodeId())); ruleChainMetaData.setFirstNodeIndex(ruleNodeIndexMap.get(ruleChainDetails.getFirstRuleNodeId()));
} }
for (RuleNode node : ruleNodes) { for (RuleNode node : ruleNodes) {
int fromIndex = ruleNodeIndexMap.get(node.getId()); int fromIndex = ruleNodeIndexMap.get(node.getId());
@ -381,10 +379,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
Collections.sort(ruleChainMetaData.getConnections(), Comparator.comparingInt(NodeConnectionInfo::getFromIndex) Collections.sort(ruleChainMetaData.getConnections(), Comparator.comparingInt(NodeConnectionInfo::getFromIndex)
.thenComparing(NodeConnectionInfo::getToIndex).thenComparing(NodeConnectionInfo::getType)); .thenComparing(NodeConnectionInfo::getToIndex).thenComparing(NodeConnectionInfo::getType));
} }
ruleChainMetaData.setNotes(Optional.ofNullable(ruleChain.getConfiguration()) ruleChainMetaData.setNotes(ruleChainDetails.getNotes());
.filter(c -> c.has("notes"))
.map(c -> JacksonUtil.convertValue(c.get("notes"), new TypeReference<List<RuleChainNote>>() {}))
.orElse(null));
return ruleChainMetaData; return ruleChainMetaData;
} }

5
dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java

@ -20,6 +20,7 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainDetails;
import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.ExportableEntityDao; import org.thingsboard.server.dao.ExportableEntityDao;
@ -85,4 +86,8 @@ public interface RuleChainDao extends Dao<RuleChain>, TenantEntityDao<RuleChain>
List<RuleChain> findRuleChainsByTenantIdAndIds(UUID tenantId, List<UUID> ruleChainIds); List<RuleChain> findRuleChainsByTenantIdAndIds(UUID tenantId, List<UUID> ruleChainIds);
RuleChainDetails findDetailsById(UUID id);
RuleChainDetails saveDetails(RuleChainDetails ruleChainDetails);
} }

15
dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java

@ -29,8 +29,10 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainDetails;
import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.sql.RuleChainDetailsEntity;
import org.thingsboard.server.dao.model.sql.RuleChainEntity; import org.thingsboard.server.dao.model.sql.RuleChainEntity;
import org.thingsboard.server.dao.rule.RuleChainDao; import org.thingsboard.server.dao.rule.RuleChainDao;
import org.thingsboard.server.dao.sql.JpaAbstractDao; import org.thingsboard.server.dao.sql.JpaAbstractDao;
@ -49,6 +51,9 @@ public class JpaRuleChainDao extends JpaAbstractDao<RuleChainEntity, RuleChain>
@Autowired @Autowired
private RuleChainRepository ruleChainRepository; private RuleChainRepository ruleChainRepository;
@Autowired
private RuleChainDetailsRepository ruleChainDetailsRepository;
@Override @Override
protected Class<RuleChainEntity> getEntityClass() { protected Class<RuleChainEntity> getEntityClass() {
return RuleChainEntity.class; return RuleChainEntity.class;
@ -163,6 +168,16 @@ public class JpaRuleChainDao extends JpaAbstractDao<RuleChainEntity, RuleChain>
return ruleChainRepository.findNextBatch(id, Limit.of(batchSize)); return ruleChainRepository.findNextBatch(id, Limit.of(batchSize));
} }
@Override
public RuleChainDetails findDetailsById(UUID id) {
return DaoUtil.getData(ruleChainDetailsRepository.findById(id));
}
@Override
public RuleChainDetails saveDetails(RuleChainDetails ruleChainDetails) {
return DaoUtil.getData(ruleChainDetailsRepository.save(new RuleChainDetailsEntity(ruleChainDetails)));
}
@Override @Override
public EntityType getEntityType() { public EntityType getEntityType() {
return EntityType.RULE_CHAIN; return EntityType.RULE_CHAIN;

25
dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainDetailsRepository.java

@ -0,0 +1,25 @@
/**
* Copyright © 2016-2026 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.sql.rule;
import org.springframework.data.jpa.repository.JpaRepository;
import org.thingsboard.server.dao.model.sql.RuleChainDetailsEntity;
import java.util.UUID;
public interface RuleChainDetailsRepository extends JpaRepository<RuleChainDetailsEntity, UUID> {
}

1
dao/src/main/resources/sql/schema-entities.sql

@ -162,6 +162,7 @@ CREATE TABLE IF NOT EXISTS rule_chain (
created_time bigint NOT NULL, created_time bigint NOT NULL,
additional_info varchar, additional_info varchar,
configuration varchar(10000000), configuration varchar(10000000),
notes varchar(10000000),
name varchar(255), name varchar(255),
type varchar(255), type varchar(255),
first_rule_node_id uuid, first_rule_node_id uuid,

15
ui-ngx/src/app/modules/home/pages/rulechain/rule-note-editor.component.scss

@ -1,3 +1,18 @@
/**
* Copyright © 2016-2026 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
:host ::ng-deep { :host ::ng-deep {
tb-markdown-editor { tb-markdown-editor {
.markdown-content.tb-edit-mode { .markdown-content.tb-edit-mode {

Loading…
Cancel
Save