Commit 546bded3633e8f7d0f1715c6e3d3f182919b56d7

Authored by Andrii Shvaika
1 parent b0912519

Rule Chain Controller description

@@ -187,11 +187,13 @@ public abstract class BaseController { @@ -187,11 +187,13 @@ public abstract class BaseController {
187 protected static final String DEVICE_TYPE_DESCRIPTION = "Device type as the name of the device profile"; 187 protected static final String DEVICE_TYPE_DESCRIPTION = "Device type as the name of the device profile";
188 protected static final String ASSET_TYPE_DESCRIPTION = "Asset type"; 188 protected static final String ASSET_TYPE_DESCRIPTION = "Asset type";
189 protected static final String EDGE_TYPE_DESCRIPTION = "A string value representing the edge type. For example, 'default'"; 189 protected static final String EDGE_TYPE_DESCRIPTION = "A string value representing the edge type. For example, 'default'";
  190 + protected static final String RULE_CHAIN_TYPE_DESCRIPTION = "Rule chain type (CORE or EDGE)";
190 191
191 protected static final String ASSET_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the asset name."; 192 protected static final String ASSET_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the asset name.";
192 protected static final String DASHBOARD_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the dashboard title."; 193 protected static final String DASHBOARD_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the dashboard title.";
193 protected static final String RPC_TEXT_SEARCH_DESCRIPTION = "Not implemented. Leave empty."; 194 protected static final String RPC_TEXT_SEARCH_DESCRIPTION = "Not implemented. Leave empty.";
194 protected static final String DEVICE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device name."; 195 protected static final String DEVICE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device name.";
  196 + protected static final String RULE_CHAIN_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the rule chain name.";
195 protected static final String DEVICE_PROFILE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device profile name."; 197 protected static final String DEVICE_PROFILE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device profile name.";
196 protected static final String CUSTOMER_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the customer title."; 198 protected static final String CUSTOMER_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the customer title.";
197 protected static final String EDGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the edge name."; 199 protected static final String EDGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the edge name.";
@@ -207,10 +209,12 @@ public abstract class BaseController { @@ -207,10 +209,12 @@ public abstract class BaseController {
207 protected static final String ALARM_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, startTs, endTs, type, ackTs, clearTs, severity, status"; 209 protected static final String ALARM_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, startTs, endTs, type, ackTs, clearTs, severity, status";
208 protected static final String EVENT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, id"; 210 protected static final String EVENT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, id";
209 protected static final String EDGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle"; 211 protected static final String EDGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle";
  212 + protected static final String RULE_CHAIN_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, root";
210 protected static final String AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, entityType, entityName, userName, actionType, actionStatus"; 213 protected static final String AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, entityType, entityName, userName, actionType, actionStatus";
211 protected static final String SORT_ORDER_DESCRIPTION = "Sort order. ASC (ASCENDING) or DESC (DESCENDING)"; 214 protected static final String SORT_ORDER_DESCRIPTION = "Sort order. ASC (ASCENDING) or DESC (DESCENDING)";
212 protected static final String SORT_ORDER_ALLOWABLE_VALUES = "ASC, DESC"; 215 protected static final String SORT_ORDER_ALLOWABLE_VALUES = "ASC, DESC";
213 protected static final String RPC_STATUS_ALLOWABLE_VALUES = "QUEUED, SENT, DELIVERED, SUCCESSFUL, TIMEOUT, EXPIRED, FAILED"; 216 protected static final String RPC_STATUS_ALLOWABLE_VALUES = "QUEUED, SENT, DELIVERED, SUCCESSFUL, TIMEOUT, EXPIRED, FAILED";
  217 + protected static final String RULE_CHAIN_TYPES_ALLOWABLE_VALUES = "CORE, EDGE";
214 protected static final String TRANSPORT_TYPE_ALLOWABLE_VALUES = "DEFAULT, MQTT, COAP, LWM2M, SNMP"; 218 protected static final String TRANSPORT_TYPE_ALLOWABLE_VALUES = "DEFAULT, MQTT, COAP, LWM2M, SNMP";
215 protected static final String DEVICE_INFO_DESCRIPTION = "Device Info is an extension of the default Device object that contains information about the assigned customer name and device profile name. "; 219 protected static final String DEVICE_INFO_DESCRIPTION = "Device Info is an extension of the default Device object that contains information about the assigned customer name and device profile name. ";
216 protected static final String ASSET_INFO_DESCRIPTION = "Asset Info is an extension of the default Asset object that contains information about the assigned customer name. "; 220 protected static final String ASSET_INFO_DESCRIPTION = "Asset Info is an extension of the default Asset object that contains information about the assigned customer name. ";
@@ -91,9 +91,9 @@ public class RpcV2Controller extends AbstractRpcController { @@ -91,9 +91,9 @@ public class RpcV2Controller extends AbstractRpcController {
91 "In case of persistent RPC, the result of this call is 'rpcId' UUID. In case of lightweight RPC, " + 91 "In case of persistent RPC, the result of this call is 'rpcId' UUID. In case of lightweight RPC, " +
92 "the result of this call is the response from device, or 504 Gateway Timeout if device is offline."; 92 "the result of this call is the response from device, or 504 Gateway Timeout if device is offline.";
93 93
94 - private static final String ONE_WAY_RPC_REQUEST_DESCRIPTION = "Sends the one-way remote-procedure call (RPC) request to device. " + RPC_REQUEST_DESCRIPTION + ONE_WAY_RPC_RESULT; 94 + private static final String ONE_WAY_RPC_REQUEST_DESCRIPTION = "Sends the one-way remote-procedure call (RPC) request to device. " + RPC_REQUEST_DESCRIPTION + ONE_WAY_RPC_RESULT + TENANT_AND_USER_AUTHORITY_PARAGRAPH;
95 95
96 - private static final String TWO_WAY_RPC_REQUEST_DESCRIPTION = "Sends the two-way remote-procedure call (RPC) request to device. " + RPC_REQUEST_DESCRIPTION + TWO_WAY_RPC_RESULT; 96 + private static final String TWO_WAY_RPC_REQUEST_DESCRIPTION = "Sends the two-way remote-procedure call (RPC) request to device. " + RPC_REQUEST_DESCRIPTION + TWO_WAY_RPC_RESULT + TENANT_AND_USER_AUTHORITY_PARAGRAPH;
97 97
98 @ApiOperation(value = "Send one-way RPC request", notes = ONE_WAY_RPC_REQUEST_DESCRIPTION) 98 @ApiOperation(value = "Send one-way RPC request", notes = ONE_WAY_RPC_REQUEST_DESCRIPTION)
99 @ApiResponses(value = { 99 @ApiResponses(value = {
@@ -131,7 +131,7 @@ public class RpcV2Controller extends AbstractRpcController { @@ -131,7 +131,7 @@ public class RpcV2Controller extends AbstractRpcController {
131 return handleDeviceRPCRequest(false, new DeviceId(UUID.fromString(deviceIdStr)), requestBody, HttpStatus.GATEWAY_TIMEOUT, HttpStatus.GATEWAY_TIMEOUT); 131 return handleDeviceRPCRequest(false, new DeviceId(UUID.fromString(deviceIdStr)), requestBody, HttpStatus.GATEWAY_TIMEOUT, HttpStatus.GATEWAY_TIMEOUT);
132 } 132 }
133 133
134 - @ApiOperation(value = "Get persistent RPC request", notes = "Get information about the status of the RPC call.") 134 + @ApiOperation(value = "Get persistent RPC request", notes = "Get information about the status of the RPC call." + TENANT_AND_USER_AUTHORITY_PARAGRAPH)
135 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") 135 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
136 @RequestMapping(value = "/persistent/{rpcId}", method = RequestMethod.GET) 136 @RequestMapping(value = "/persistent/{rpcId}", method = RequestMethod.GET)
137 @ResponseBody 137 @ResponseBody
@@ -147,7 +147,7 @@ public class RpcV2Controller extends AbstractRpcController { @@ -147,7 +147,7 @@ public class RpcV2Controller extends AbstractRpcController {
147 } 147 }
148 } 148 }
149 149
150 - @ApiOperation(value = "Get persistent RPC requests", notes = "Allows to query RPC calls for specific device using pagination.") 150 + @ApiOperation(value = "Get persistent RPC requests", notes = "Allows to query RPC calls for specific device using pagination." + TENANT_AND_USER_AUTHORITY_PARAGRAPH)
151 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") 151 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
152 @RequestMapping(value = "/persistent/device/{deviceId}", method = RequestMethod.GET) 152 @RequestMapping(value = "/persistent/device/{deviceId}", method = RequestMethod.GET)
153 @ResponseBody 153 @ResponseBody
@@ -177,7 +177,7 @@ public class RpcV2Controller extends AbstractRpcController { @@ -177,7 +177,7 @@ public class RpcV2Controller extends AbstractRpcController {
177 } 177 }
178 } 178 }
179 179
180 - @ApiOperation(value = "Delete persistent RPC", notes = "Deletes the persistent RPC request.") 180 + @ApiOperation(value = "Delete persistent RPC", notes = "Deletes the persistent RPC request." + TENANT_AUTHORITY_PARAGRAPH)
181 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 181 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
182 @RequestMapping(value = "/persistent/{rpcId}", method = RequestMethod.DELETE) 182 @RequestMapping(value = "/persistent/{rpcId}", method = RequestMethod.DELETE)
183 @ResponseBody 183 @ResponseBody
@@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; @@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
21 import com.fasterxml.jackson.databind.node.ArrayNode; 21 import com.fasterxml.jackson.databind.node.ArrayNode;
22 import com.fasterxml.jackson.databind.node.ObjectNode; 22 import com.fasterxml.jackson.databind.node.ObjectNode;
23 import io.swagger.annotations.ApiOperation; 23 import io.swagger.annotations.ApiOperation;
  24 +import io.swagger.annotations.ApiParam;
24 import lombok.extern.slf4j.Slf4j; 25 import lombok.extern.slf4j.Slf4j;
25 import org.springframework.beans.factory.annotation.Autowired; 26 import org.springframework.beans.factory.annotation.Autowired;
26 import org.springframework.beans.factory.annotation.Value; 27 import org.springframework.beans.factory.annotation.Value;
@@ -95,6 +96,25 @@ public class RuleChainController extends BaseController { @@ -95,6 +96,25 @@ public class RuleChainController extends BaseController {
95 private static final ObjectMapper objectMapper = new ObjectMapper(); 96 private static final ObjectMapper objectMapper = new ObjectMapper();
96 public static final int TIMEOUT = 20; 97 public static final int TIMEOUT = 20;
97 98
  99 + private static final String RULE_CHAIN_DESCRIPTION = "The rule chain object is lightweight and contains general information about the rule chain. " +
  100 + "List of rule nodes and their connection is stored in a separate 'metadata' object.";
  101 + private static final String RULE_CHAIN_METADATA_DESCRIPTION = "The metadata object contains information about the rule nodes and their connections.";
  102 + private static final String TEST_JS_FUNCTION = "Execute the JavaScript function and return the result. The format of request: \n\n"
  103 + + MARKDOWN_CODE_BLOCK_START
  104 + + "{\n" +
  105 + " \"script\": \"Your JS Function as String\",\n" +
  106 + " \"scriptType\": \"One of: update, generate, filter, switch, json, string\",\n" +
  107 + " \"argNames\": [\"msg\", \"metadata\", \"type\"],\n" +
  108 + " \"msg\": \"{\\\"temperature\\\": 42}\", \n" +
  109 + " \"metadata\": {\n" +
  110 + " \"deviceName\": \"Device A\",\n" +
  111 + " \"deviceType\": \"Thermometer\"\n" +
  112 + " },\n" +
  113 + " \"msgType\": \"POST_TELEMETRY_REQUEST\"\n" +
  114 + "}"
  115 + + MARKDOWN_CODE_BLOCK_END
  116 + + "\n\n Expected result JSON contains \"output\" and \"error\".";
  117 +
98 @Autowired 118 @Autowired
99 private InstallScripts installScripts; 119 private InstallScripts installScripts;
100 120
@@ -110,10 +130,14 @@ public class RuleChainController extends BaseController { @@ -110,10 +130,14 @@ public class RuleChainController extends BaseController {
110 @Value("${actors.rule.chain.debug_mode_rate_limits_per_tenant.enabled}") 130 @Value("${actors.rule.chain.debug_mode_rate_limits_per_tenant.enabled}")
111 private boolean debugPerTenantEnabled; 131 private boolean debugPerTenantEnabled;
112 132
  133 + @ApiOperation(value = "Get Rule Chain (getRuleChainById)",
  134 + notes = "Fetch the Rule Chain object based on the provided Rule Chain Id. " + RULE_CHAIN_DESCRIPTION + TENANT_AUTHORITY_PARAGRAPH)
113 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 135 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
114 @RequestMapping(value = "/ruleChain/{ruleChainId}", method = RequestMethod.GET) 136 @RequestMapping(value = "/ruleChain/{ruleChainId}", method = RequestMethod.GET)
115 @ResponseBody 137 @ResponseBody
116 - public RuleChain getRuleChainById(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { 138 + public RuleChain getRuleChainById(
  139 + @ApiParam(value = RULE_CHAIN_ID_PARAM_DESCRIPTION)
  140 + @PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException {
117 checkParameter(RULE_CHAIN_ID, strRuleChainId); 141 checkParameter(RULE_CHAIN_ID, strRuleChainId);
118 try { 142 try {
119 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); 143 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId));
@@ -123,10 +147,14 @@ public class RuleChainController extends BaseController { @@ -123,10 +147,14 @@ public class RuleChainController extends BaseController {
123 } 147 }
124 } 148 }
125 149
  150 + @ApiOperation(value = "Get Rule Chain (getRuleChainById)",
  151 + notes = "Fetch the Rule Chain Metadata object based on the provided Rule Chain Id. " + RULE_CHAIN_METADATA_DESCRIPTION + TENANT_AUTHORITY_PARAGRAPH)
126 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 152 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
127 @RequestMapping(value = "/ruleChain/{ruleChainId}/metadata", method = RequestMethod.GET) 153 @RequestMapping(value = "/ruleChain/{ruleChainId}/metadata", method = RequestMethod.GET)
128 @ResponseBody 154 @ResponseBody
129 - public RuleChainMetaData getRuleChainMetaData(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { 155 + public RuleChainMetaData getRuleChainMetaData(
  156 + @ApiParam(value = RULE_CHAIN_ID_PARAM_DESCRIPTION)
  157 + @PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException {
130 checkParameter(RULE_CHAIN_ID, strRuleChainId); 158 checkParameter(RULE_CHAIN_ID, strRuleChainId);
131 try { 159 try {
132 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); 160 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId));
@@ -137,11 +165,18 @@ public class RuleChainController extends BaseController { @@ -137,11 +165,18 @@ public class RuleChainController extends BaseController {
137 } 165 }
138 } 166 }
139 167
140 - 168 + @ApiOperation(value = "Create Or Update Rule Chain (saveRuleChain)",
  169 + notes = "Create or update the Rule Chain. When creating Rule Chain, platform generates Rule Chain Id as [time-based UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_(date-time_and_MAC_address). " +
  170 + "The newly created Rule Chain Id will be present in the response. " +
  171 + "Specify existing Rule Chain id to update the rule chain. " +
  172 + "Referencing non-existing rule chain Id will cause 'Not Found' error." +
  173 + "\n\n" + RULE_CHAIN_DESCRIPTION)
141 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 174 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
142 @RequestMapping(value = "/ruleChain", method = RequestMethod.POST) 175 @RequestMapping(value = "/ruleChain", method = RequestMethod.POST)
143 @ResponseBody 176 @ResponseBody
144 - public RuleChain saveRuleChain(@RequestBody RuleChain ruleChain) throws ThingsboardException { 177 + public RuleChain saveRuleChain(
  178 + @ApiParam(value = "A JSON value representing the rule chain.")
  179 + @RequestBody RuleChain ruleChain) throws ThingsboardException {
145 try { 180 try {
146 boolean created = ruleChain.getId() == null; 181 boolean created = ruleChain.getId() == null;
147 ruleChain.setTenantId(getCurrentUser().getTenantId()); 182 ruleChain.setTenantId(getCurrentUser().getTenantId());
@@ -175,10 +210,15 @@ public class RuleChainController extends BaseController { @@ -175,10 +210,15 @@ public class RuleChainController extends BaseController {
175 } 210 }
176 } 211 }
177 212
  213 + @ApiOperation(value = "Create Default Rule Chain",
  214 + notes = "Create rule chain from template, based on the specified name in the request. " +
  215 + "Creates the rule chain based on the template that is used to create root rule chain. " + TENANT_AUTHORITY_PARAGRAPH)
178 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 216 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
179 @RequestMapping(value = "/ruleChain/device/default", method = RequestMethod.POST) 217 @RequestMapping(value = "/ruleChain/device/default", method = RequestMethod.POST)
180 @ResponseBody 218 @ResponseBody
181 - public RuleChain saveRuleChain(@RequestBody DefaultRuleChainCreateRequest request) throws ThingsboardException { 219 + public RuleChain saveRuleChain(
  220 + @ApiParam(value = "A JSON value representing the request.")
  221 + @RequestBody DefaultRuleChainCreateRequest request) throws ThingsboardException {
182 try { 222 try {
183 checkNotNull(request); 223 checkNotNull(request);
184 checkParameter(request.getName(), "name"); 224 checkParameter(request.getName(), "name");
@@ -198,10 +238,14 @@ public class RuleChainController extends BaseController { @@ -198,10 +238,14 @@ public class RuleChainController extends BaseController {
198 } 238 }
199 } 239 }
200 240
  241 + @ApiOperation(value = "Set Root Rule Chain (setRootRuleChain)",
  242 + notes = "Makes the rule chain to be root rule chain. Updates previous root rule chain as well. " + TENANT_AUTHORITY_PARAGRAPH)
201 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 243 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
202 @RequestMapping(value = "/ruleChain/{ruleChainId}/root", method = RequestMethod.POST) 244 @RequestMapping(value = "/ruleChain/{ruleChainId}/root", method = RequestMethod.POST)
203 @ResponseBody 245 @ResponseBody
204 - public RuleChain setRootRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { 246 + public RuleChain setRootRuleChain(
  247 + @ApiParam(value = RULE_CHAIN_ID_PARAM_DESCRIPTION)
  248 + @PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException {
205 checkParameter(RULE_CHAIN_ID, strRuleChainId); 249 checkParameter(RULE_CHAIN_ID, strRuleChainId);
206 try { 250 try {
207 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); 251 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId));
@@ -237,10 +281,14 @@ public class RuleChainController extends BaseController { @@ -237,10 +281,14 @@ public class RuleChainController extends BaseController {
237 } 281 }
238 } 282 }
239 283
  284 + @ApiOperation(value = "Update Rule Chain Metadata",
  285 + notes = "Updates the rule chain metadata. " + RULE_CHAIN_METADATA_DESCRIPTION + TENANT_AUTHORITY_PARAGRAPH)
240 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 286 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
241 @RequestMapping(value = "/ruleChain/metadata", method = RequestMethod.POST) 287 @RequestMapping(value = "/ruleChain/metadata", method = RequestMethod.POST)
242 @ResponseBody 288 @ResponseBody
243 - public RuleChainMetaData saveRuleChainMetaData(@RequestBody RuleChainMetaData ruleChainMetaData) throws ThingsboardException { 289 + public RuleChainMetaData saveRuleChainMetaData(
  290 + @ApiParam(value = "A JSON value representing the rule chain metadata.")
  291 + @RequestBody RuleChainMetaData ruleChainMetaData) throws ThingsboardException {
244 try { 292 try {
245 TenantId tenantId = getTenantId(); 293 TenantId tenantId = getTenantId();
246 if (debugPerTenantEnabled) { 294 if (debugPerTenantEnabled) {
@@ -278,15 +326,24 @@ public class RuleChainController extends BaseController { @@ -278,15 +326,24 @@ public class RuleChainController extends BaseController {
278 } 326 }
279 } 327 }
280 328
  329 +
  330 + @ApiOperation(value = "Get Rule Chains (getRuleChains)",
  331 + notes = "Returns a page of Rule Chains owned by tenant. " + RULE_CHAIN_DESCRIPTION + PAGE_DATA_PARAMETERS)
281 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 332 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
282 @RequestMapping(value = "/ruleChains", params = {"pageSize", "page"}, method = RequestMethod.GET) 333 @RequestMapping(value = "/ruleChains", params = {"pageSize", "page"}, method = RequestMethod.GET)
283 @ResponseBody 334 @ResponseBody
284 public PageData<RuleChain> getRuleChains( 335 public PageData<RuleChain> getRuleChains(
  336 + @ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
285 @RequestParam int pageSize, 337 @RequestParam int pageSize,
  338 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
286 @RequestParam int page, 339 @RequestParam int page,
  340 + @ApiParam(value = RULE_CHAIN_TYPE_DESCRIPTION, allowableValues = RULE_CHAIN_TYPES_ALLOWABLE_VALUES)
287 @RequestParam(value = "type", required = false) String typeStr, 341 @RequestParam(value = "type", required = false) String typeStr,
  342 + @ApiParam(value = RULE_CHAIN_TEXT_SEARCH_DESCRIPTION)
288 @RequestParam(required = false) String textSearch, 343 @RequestParam(required = false) String textSearch,
  344 + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = RULE_CHAIN_SORT_PROPERTY_ALLOWABLE_VALUES)
289 @RequestParam(required = false) String sortProperty, 345 @RequestParam(required = false) String sortProperty,
  346 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
290 @RequestParam(required = false) String sortOrder) throws ThingsboardException { 347 @RequestParam(required = false) String sortOrder) throws ThingsboardException {
291 try { 348 try {
292 TenantId tenantId = getCurrentUser().getTenantId(); 349 TenantId tenantId = getCurrentUser().getTenantId();
@@ -301,10 +358,14 @@ public class RuleChainController extends BaseController { @@ -301,10 +358,14 @@ public class RuleChainController extends BaseController {
301 } 358 }
302 } 359 }
303 360
  361 + @ApiOperation(value = "Delete rule chain (deleteRuleChain)",
  362 + notes = "Deletes the rule chain. Referencing non-existing rule chain Id will cause an error. Referencing rule chain that is used in the device profiles will cause an error.")
304 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 363 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
305 @RequestMapping(value = "/ruleChain/{ruleChainId}", method = RequestMethod.DELETE) 364 @RequestMapping(value = "/ruleChain/{ruleChainId}", method = RequestMethod.DELETE)
306 @ResponseStatus(value = HttpStatus.OK) 365 @ResponseStatus(value = HttpStatus.OK)
307 - public void deleteRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { 366 + public void deleteRuleChain(
  367 + @ApiParam(value = RULE_CHAIN_ID_PARAM_DESCRIPTION)
  368 + @PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException {
308 checkParameter(RULE_CHAIN_ID, strRuleChainId); 369 checkParameter(RULE_CHAIN_ID, strRuleChainId);
309 try { 370 try {
310 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); 371 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId));
@@ -347,10 +408,15 @@ public class RuleChainController extends BaseController { @@ -347,10 +408,15 @@ public class RuleChainController extends BaseController {
347 } 408 }
348 } 409 }
349 410
  411 + @ApiOperation(value = "Get latest input message (getLatestRuleNodeDebugInput)",
  412 + notes = "Gets the input message from the debug events for specified Rule Chain Id. " +
  413 + "Referencing non-existing rule chain Id will cause an error. ")
350 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 414 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
351 @RequestMapping(value = "/ruleNode/{ruleNodeId}/debugIn", method = RequestMethod.GET) 415 @RequestMapping(value = "/ruleNode/{ruleNodeId}/debugIn", method = RequestMethod.GET)
352 @ResponseBody 416 @ResponseBody
353 - public JsonNode getLatestRuleNodeDebugInput(@PathVariable(RULE_NODE_ID) String strRuleNodeId) throws ThingsboardException { 417 + public JsonNode getLatestRuleNodeDebugInput(
  418 + @ApiParam(value = RULE_CHAIN_ID_PARAM_DESCRIPTION)
  419 + @PathVariable(RULE_NODE_ID) String strRuleNodeId) throws ThingsboardException {
354 checkParameter(RULE_NODE_ID, strRuleNodeId); 420 checkParameter(RULE_NODE_ID, strRuleNodeId);
355 try { 421 try {
356 RuleNodeId ruleNodeId = new RuleNodeId(toUUID(strRuleNodeId)); 422 RuleNodeId ruleNodeId = new RuleNodeId(toUUID(strRuleNodeId));
@@ -373,10 +439,15 @@ public class RuleChainController extends BaseController { @@ -373,10 +439,15 @@ public class RuleChainController extends BaseController {
373 } 439 }
374 } 440 }
375 441
  442 +
  443 + @ApiOperation(value = "Test JavaScript function",
  444 + notes = TEST_JS_FUNCTION + TENANT_AUTHORITY_PARAGRAPH)
376 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 445 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
377 @RequestMapping(value = "/ruleChain/testScript", method = RequestMethod.POST) 446 @RequestMapping(value = "/ruleChain/testScript", method = RequestMethod.POST)
378 @ResponseBody 447 @ResponseBody
379 - public JsonNode testScript(@RequestBody JsonNode inputParams) throws ThingsboardException { 448 + public JsonNode testScript(
  449 + @ApiParam(value = "Test JS request. See API call description above.")
  450 + @RequestBody JsonNode inputParams) throws ThingsboardException {
380 try { 451 try {
381 String script = inputParams.get("script").asText(); 452 String script = inputParams.get("script").asText();
382 String scriptType = inputParams.get("scriptType").asText(); 453 String scriptType = inputParams.get("scriptType").asText();
@@ -436,10 +507,13 @@ public class RuleChainController extends BaseController { @@ -436,10 +507,13 @@ public class RuleChainController extends BaseController {
436 } 507 }
437 } 508 }
438 509
  510 + @ApiOperation(value = "Export Rule Chains", notes = "Exports all tenant rule chains as one JSON." + TENANT_AUTHORITY_PARAGRAPH)
439 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 511 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
440 @RequestMapping(value = "/ruleChains/export", params = {"limit"}, method = RequestMethod.GET) 512 @RequestMapping(value = "/ruleChains/export", params = {"limit"}, method = RequestMethod.GET)
441 @ResponseBody 513 @ResponseBody
442 - public RuleChainData exportRuleChains(@RequestParam("limit") int limit) throws ThingsboardException { 514 + public RuleChainData exportRuleChains(
  515 + @ApiParam(value = "A limit of rule chains to export.", required = true)
  516 + @RequestParam("limit") int limit) throws ThingsboardException {
443 try { 517 try {
444 TenantId tenantId = getCurrentUser().getTenantId(); 518 TenantId tenantId = getCurrentUser().getTenantId();
445 PageLink pageLink = new PageLink(limit); 519 PageLink pageLink = new PageLink(limit);
@@ -449,10 +523,15 @@ public class RuleChainController extends BaseController { @@ -449,10 +523,15 @@ public class RuleChainController extends BaseController {
449 } 523 }
450 } 524 }
451 525
  526 + @ApiOperation(value = "Import Rule Chains", notes = "Imports all tenant rule chains as one JSON." + TENANT_AUTHORITY_PARAGRAPH)
452 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 527 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
453 @RequestMapping(value = "/ruleChains/import", method = RequestMethod.POST) 528 @RequestMapping(value = "/ruleChains/import", method = RequestMethod.POST)
454 @ResponseBody 529 @ResponseBody
455 - public void importRuleChains(@RequestBody RuleChainData ruleChainData, @RequestParam(required = false, defaultValue = "false") boolean overwrite) throws ThingsboardException { 530 + public void importRuleChains(
  531 + @ApiParam(value = "A JSON value representing the rule chains.")
  532 + @RequestBody RuleChainData ruleChainData,
  533 + @ApiParam(value = "Enables overwrite for existing rule chains with the same name.")
  534 + @RequestParam(required = false, defaultValue = "false") boolean overwrite) throws ThingsboardException {
456 try { 535 try {
457 TenantId tenantId = getCurrentUser().getTenantId(); 536 TenantId tenantId = getCurrentUser().getTenantId();
458 List<RuleChainImportResult> importResults = ruleChainService.importTenantRuleChains(tenantId, ruleChainData, RuleChainType.CORE, overwrite); 537 List<RuleChainImportResult> importResults = ruleChainService.importTenantRuleChains(tenantId, ruleChainData, RuleChainType.CORE, overwrite);
@@ -15,17 +15,21 @@ @@ -15,17 +15,21 @@
15 */ 15 */
16 package org.thingsboard.server.common.data.rule; 16 package org.thingsboard.server.common.data.rule;
17 17
  18 +import io.swagger.annotations.ApiModel;
  19 +import io.swagger.annotations.ApiModelProperty;
18 import lombok.Data; 20 import lombok.Data;
19 import lombok.extern.slf4j.Slf4j; 21 import lombok.extern.slf4j.Slf4j;
20 22
21 import java.io.Serializable; 23 import java.io.Serializable;
22 24
  25 +@ApiModel
23 @Data 26 @Data
24 @Slf4j 27 @Slf4j
25 public class DefaultRuleChainCreateRequest implements Serializable { 28 public class DefaultRuleChainCreateRequest implements Serializable {
26 29
27 private static final long serialVersionUID = 5600333716030561537L; 30 private static final long serialVersionUID = 5600333716030561537L;
28 31
  32 + @ApiModelProperty(position = 1, required = true, value = "Name of the new rule chain", example = "Root Rule Chain")
29 private String name; 33 private String name;
30 34
31 } 35 }
@@ -15,14 +15,20 @@ @@ -15,14 +15,20 @@
15 */ 15 */
16 package org.thingsboard.server.common.data.rule; 16 package org.thingsboard.server.common.data.rule;
17 17
  18 +import io.swagger.annotations.ApiModel;
  19 +import io.swagger.annotations.ApiModelProperty;
18 import lombok.Data; 20 import lombok.Data;
19 21
20 /** 22 /**
21 * Created by ashvayka on 21.03.18. 23 * Created by ashvayka on 21.03.18.
22 */ 24 */
  25 +@ApiModel
23 @Data 26 @Data
24 public class NodeConnectionInfo { 27 public class NodeConnectionInfo {
  28 + @ApiModelProperty(position = 1, required = true, value = "Index of rule node in the 'nodes' array of the RuleChainMetaData. Indicates the 'from' part of the connection.")
25 private int fromIndex; 29 private int fromIndex;
  30 + @ApiModelProperty(position = 2, required = true, value = "Index of rule node in the 'nodes' array of the RuleChainMetaData. Indicates the 'to' part of the connection.")
26 private int toIndex; 31 private int toIndex;
  32 + @ApiModelProperty(position = 3, required = true, value = "Type of the relation. Typically indicated the result of processing by the 'from' rule node. For example, 'Success' or 'Failure'")
27 private String type; 33 private String type;
28 } 34 }
@@ -17,6 +17,8 @@ package org.thingsboard.server.common.data.rule; @@ -17,6 +17,8 @@ package org.thingsboard.server.common.data.rule;
17 17
18 import com.fasterxml.jackson.annotation.JsonIgnore; 18 import com.fasterxml.jackson.annotation.JsonIgnore;
19 import com.fasterxml.jackson.databind.JsonNode; 19 import com.fasterxml.jackson.databind.JsonNode;
  20 +import io.swagger.annotations.ApiModel;
  21 +import io.swagger.annotations.ApiModelProperty;
20 import lombok.Data; 22 import lombok.Data;
21 import lombok.EqualsAndHashCode; 23 import lombok.EqualsAndHashCode;
22 import lombok.extern.slf4j.Slf4j; 24 import lombok.extern.slf4j.Slf4j;
@@ -28,6 +30,7 @@ import org.thingsboard.server.common.data.id.RuleNodeId; @@ -28,6 +30,7 @@ import org.thingsboard.server.common.data.id.RuleNodeId;
28 import org.thingsboard.server.common.data.id.TenantId; 30 import org.thingsboard.server.common.data.id.TenantId;
29 import org.thingsboard.server.common.data.validation.NoXss; 31 import org.thingsboard.server.common.data.validation.NoXss;
30 32
  33 +@ApiModel
31 @Data 34 @Data
32 @EqualsAndHashCode(callSuper = true) 35 @EqualsAndHashCode(callSuper = true)
33 @Slf4j 36 @Slf4j
@@ -35,13 +38,20 @@ public class RuleChain extends SearchTextBasedWithAdditionalInfo<RuleChainId> im @@ -35,13 +38,20 @@ public class RuleChain extends SearchTextBasedWithAdditionalInfo<RuleChainId> im
35 38
36 private static final long serialVersionUID = -5656679015121935465L; 39 private static final long serialVersionUID = -5656679015121935465L;
37 40
  41 + @ApiModelProperty(position = 3, required = true, value = "JSON object with Tenant Id.", readOnly = true)
38 private TenantId tenantId; 42 private TenantId tenantId;
39 @NoXss 43 @NoXss
  44 + @ApiModelProperty(position = 4, required = true, value = "Rule Chain name", example = "Humidity data processing")
40 private String name; 45 private String name;
  46 + @ApiModelProperty(position = 5, value = "Rule Chain type. 'EDGE' rule chains are processing messages on the edge devices only.", example = "A4B72CCDFF33")
41 private RuleChainType type; 47 private RuleChainType type;
  48 + @ApiModelProperty(position = 6, value = "JSON object with Rule Chain Id. Pointer to the first rule node that should receive all messages pushed to this rule chain.")
42 private RuleNodeId firstRuleNodeId; 49 private RuleNodeId firstRuleNodeId;
  50 + @ApiModelProperty(position = 7, value = "Indicates root rule chain. The root rule chain process messages from all devices and entities by default. User may configure default rule chain per device profile.")
43 private boolean root; 51 private boolean root;
  52 + @ApiModelProperty(position = 8, value = "Reserved for future usage.")
44 private boolean debugMode; 53 private boolean debugMode;
  54 + @ApiModelProperty(position = 9, value = "Reserved for future usage. The actual list of rule nodes and their relations is stored in the database separately.")
45 private transient JsonNode configuration; 55 private transient JsonNode configuration;
46 56
47 @JsonIgnore 57 @JsonIgnore
@@ -75,6 +85,21 @@ public class RuleChain extends SearchTextBasedWithAdditionalInfo<RuleChainId> im @@ -75,6 +85,21 @@ public class RuleChain extends SearchTextBasedWithAdditionalInfo<RuleChainId> im
75 return name; 85 return name;
76 } 86 }
77 87
  88 + @ApiModelProperty(position = 1, value = "JSON object with the Rule Chain Id. " +
  89 + "Specify this field to update the Rule Chain. " +
  90 + "Referencing non-existing Rule Chain Id will cause error. " +
  91 + "Omit this field to create new rule chain." )
  92 + @Override
  93 + public RuleChainId getId() {
  94 + return super.getId();
  95 + }
  96 +
  97 + @ApiModelProperty(position = 2, value = "Timestamp of the rule chain creation, in milliseconds", example = "1609459200000", readOnly = true)
  98 + @Override
  99 + public long getCreatedTime() {
  100 + return super.getCreatedTime();
  101 + }
  102 +
78 public JsonNode getConfiguration() { 103 public JsonNode getConfiguration() {
79 return SearchTextBasedWithAdditionalInfo.getJson(() -> configuration, () -> configurationBytes); 104 return SearchTextBasedWithAdditionalInfo.getJson(() -> configuration, () -> configurationBytes);
80 } 105 }
@@ -82,4 +107,5 @@ public class RuleChain extends SearchTextBasedWithAdditionalInfo<RuleChainId> im @@ -82,4 +107,5 @@ public class RuleChain extends SearchTextBasedWithAdditionalInfo<RuleChainId> im
82 public void setConfiguration(JsonNode data) { 107 public void setConfiguration(JsonNode data) {
83 setJson(data, json -> this.configuration = json, bytes -> this.configurationBytes = bytes); 108 setJson(data, json -> this.configuration = json, bytes -> this.configurationBytes = bytes);
84 } 109 }
  110 +
85 } 111 }
@@ -16,16 +16,23 @@ @@ -16,16 +16,23 @@
16 package org.thingsboard.server.common.data.rule; 16 package org.thingsboard.server.common.data.rule;
17 17
18 import com.fasterxml.jackson.databind.JsonNode; 18 import com.fasterxml.jackson.databind.JsonNode;
  19 +import io.swagger.annotations.ApiModel;
  20 +import io.swagger.annotations.ApiModelProperty;
19 import lombok.Data; 21 import lombok.Data;
20 import org.thingsboard.server.common.data.id.RuleChainId; 22 import org.thingsboard.server.common.data.id.RuleChainId;
21 23
22 /** 24 /**
23 * Created by ashvayka on 21.03.18. 25 * Created by ashvayka on 21.03.18.
24 */ 26 */
  27 +@ApiModel
25 @Data 28 @Data
26 public class RuleChainConnectionInfo { 29 public class RuleChainConnectionInfo {
  30 + @ApiModelProperty(position = 1, required = true, value = "Index of rule node in the 'nodes' array of the RuleChainMetaData. Indicates the 'from' part of the connection.")
27 private int fromIndex; 31 private int fromIndex;
  32 + @ApiModelProperty(position = 2, required = true, value = "JSON object with the Rule Chain Id.")
28 private RuleChainId targetRuleChainId; 33 private RuleChainId targetRuleChainId;
  34 + @ApiModelProperty(position = 3, required = true, value = "JSON object with the additional information about the connection.")
29 private JsonNode additionalInfo; 35 private JsonNode additionalInfo;
  36 + @ApiModelProperty(position = 4, required = true, value = "Type of the relation. Typically indicated the result of processing by the 'from' rule node. For example, 'Success' or 'Failure'")
30 private String type; 37 private String type;
31 } 38 }
@@ -15,13 +15,18 @@ @@ -15,13 +15,18 @@
15 */ 15 */
16 package org.thingsboard.server.common.data.rule; 16 package org.thingsboard.server.common.data.rule;
17 17
  18 +import io.swagger.annotations.ApiModel;
  19 +import io.swagger.annotations.ApiModelProperty;
18 import lombok.Data; 20 import lombok.Data;
19 21
20 import java.util.List; 22 import java.util.List;
21 23
  24 +@ApiModel
22 @Data 25 @Data
23 public class RuleChainData { 26 public class RuleChainData {
24 27
  28 + @ApiModelProperty(position = 1, required = true, value = "List of the Rule Chain objects.", readOnly = true)
25 List<RuleChain> ruleChains; 29 List<RuleChain> ruleChains;
  30 + @ApiModelProperty(position = 2, required = true, value = "List of the Rule Chain metadata objects.", readOnly = true)
26 List<RuleChainMetaData> metadata; 31 List<RuleChainMetaData> metadata;
27 } 32 }
@@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
16 package org.thingsboard.server.common.data.rule; 16 package org.thingsboard.server.common.data.rule;
17 17
18 import com.fasterxml.jackson.databind.JsonNode; 18 import com.fasterxml.jackson.databind.JsonNode;
  19 +import io.swagger.annotations.ApiModel;
  20 +import io.swagger.annotations.ApiModelProperty;
19 import lombok.Data; 21 import lombok.Data;
20 import org.thingsboard.server.common.data.id.RuleChainId; 22 import org.thingsboard.server.common.data.id.RuleChainId;
21 23
@@ -25,17 +27,23 @@ import java.util.List; @@ -25,17 +27,23 @@ import java.util.List;
25 /** 27 /**
26 * Created by igor on 3/13/18. 28 * Created by igor on 3/13/18.
27 */ 29 */
  30 +@ApiModel
28 @Data 31 @Data
29 public class RuleChainMetaData { 32 public class RuleChainMetaData {
30 33
  34 + @ApiModelProperty(position = 1, required = true, value = "JSON object with Rule Chain Id.", readOnly = true)
31 private RuleChainId ruleChainId; 35 private RuleChainId ruleChainId;
32 36
  37 + @ApiModelProperty(position = 2, required = true, value = "Index of the first rule node in the 'nodes' list")
33 private Integer firstNodeIndex; 38 private Integer firstNodeIndex;
34 39
  40 + @ApiModelProperty(position = 3, required = true, value = "List of rule node JSON objects")
35 private List<RuleNode> nodes; 41 private List<RuleNode> nodes;
36 42
  43 + @ApiModelProperty(position = 4, required = true, value = "List of JSON objects that represent connections between rule nodes")
37 private List<NodeConnectionInfo> connections; 44 private List<NodeConnectionInfo> connections;
38 45
  46 + @ApiModelProperty(position = 5, required = true, value = "List of JSON objects that represent connections between rule nodes and other rule chains.")
39 private List<RuleChainConnectionInfo> ruleChainConnections; 47 private List<RuleChainConnectionInfo> ruleChainConnections;
40 48
41 public void addConnectionInfo(int fromIndex, int toIndex, String type) { 49 public void addConnectionInfo(int fromIndex, int toIndex, String type) {
@@ -17,6 +17,8 @@ package org.thingsboard.server.common.data.rule; @@ -17,6 +17,8 @@ package org.thingsboard.server.common.data.rule;
17 17
18 import com.fasterxml.jackson.annotation.JsonIgnore; 18 import com.fasterxml.jackson.annotation.JsonIgnore;
19 import com.fasterxml.jackson.databind.JsonNode; 19 import com.fasterxml.jackson.databind.JsonNode;
  20 +import io.swagger.annotations.ApiModel;
  21 +import io.swagger.annotations.ApiModelProperty;
20 import lombok.Data; 22 import lombok.Data;
21 import lombok.EqualsAndHashCode; 23 import lombok.EqualsAndHashCode;
22 import lombok.extern.slf4j.Slf4j; 24 import lombok.extern.slf4j.Slf4j;
@@ -25,6 +27,7 @@ import org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo; @@ -25,6 +27,7 @@ import org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo;
25 import org.thingsboard.server.common.data.id.RuleChainId; 27 import org.thingsboard.server.common.data.id.RuleChainId;
26 import org.thingsboard.server.common.data.id.RuleNodeId; 28 import org.thingsboard.server.common.data.id.RuleNodeId;
27 29
  30 +@ApiModel
28 @Data 31 @Data
29 @EqualsAndHashCode(callSuper = true) 32 @EqualsAndHashCode(callSuper = true)
30 @Slf4j 33 @Slf4j
@@ -32,10 +35,15 @@ public class RuleNode extends SearchTextBasedWithAdditionalInfo<RuleNodeId> impl @@ -32,10 +35,15 @@ public class RuleNode extends SearchTextBasedWithAdditionalInfo<RuleNodeId> impl
32 35
33 private static final long serialVersionUID = -5656679015121235465L; 36 private static final long serialVersionUID = -5656679015121235465L;
34 37
  38 + @ApiModelProperty(position = 3, value = "JSON object with the Rule Chain Id. ", readOnly = true)
35 private RuleChainId ruleChainId; 39 private RuleChainId ruleChainId;
  40 + @ApiModelProperty(position = 4, value = "Full Java Class Name of the rule node implementation. ", example = "com.mycompany.iot.rule.engine.ProcessingNode")
36 private String type; 41 private String type;
  42 + @ApiModelProperty(position = 5, value = "User defined name of the rule node. Used on UI and for logging. ", example = "Process sensor reading")
37 private String name; 43 private String name;
  44 + @ApiModelProperty(position = 6, value = "Enable/disable debug. ", example = "false")
38 private boolean debugMode; 45 private boolean debugMode;
  46 + @ApiModelProperty(position = 7, value = "JSON with the rule node configuration. Structure depends on the rule node implementation.", dataType = "com.fasterxml.jackson.databind.JsonNode")
39 private transient JsonNode configuration; 47 private transient JsonNode configuration;
40 @JsonIgnore 48 @JsonIgnore
41 private byte[] configurationBytes; 49 private byte[] configurationBytes;
@@ -75,4 +83,25 @@ public class RuleNode extends SearchTextBasedWithAdditionalInfo<RuleNodeId> impl @@ -75,4 +83,25 @@ public class RuleNode extends SearchTextBasedWithAdditionalInfo<RuleNodeId> impl
75 setJson(data, json -> this.configuration = json, bytes -> this.configurationBytes = bytes); 83 setJson(data, json -> this.configuration = json, bytes -> this.configurationBytes = bytes);
76 } 84 }
77 85
  86 + @ApiModelProperty(position = 1, value = "JSON object with the Rule Node Id. " +
  87 + "Specify this field to update the Rule Node. " +
  88 + "Referencing non-existing Rule Node Id will cause error. " +
  89 + "Omit this field to create new rule node." )
  90 + @Override
  91 + public RuleNodeId getId() {
  92 + return super.getId();
  93 + }
  94 +
  95 + @ApiModelProperty(position = 2, value = "Timestamp of the rule node creation, in milliseconds", example = "1609459200000", readOnly = true)
  96 + @Override
  97 + public long getCreatedTime() {
  98 + return super.getCreatedTime();
  99 + }
  100 +
  101 + @ApiModelProperty(position = 8, value = "Additional parameters of the rule node. Contains 'layoutX' and 'layoutY' properties for visualization.", dataType = "com.fasterxml.jackson.databind.JsonNode")
  102 + @Override
  103 + public JsonNode getAdditionalInfo() {
  104 + return super.getAdditionalInfo();
  105 + }
  106 +
78 } 107 }