Commit fbdb7bf224645d0f24b33f01e4a8042fdcb4959d

Authored by Andrii Shvaika
1 parent 45424ded

Move constants to ControllerConstants

Showing 31 changed files with 1620 additions and 1318 deletions
... ... @@ -41,6 +41,8 @@ import org.thingsboard.server.service.security.permission.Resource;
41 41 import org.thingsboard.server.service.security.system.SystemSecurityService;
42 42 import org.thingsboard.server.service.update.UpdateService;
43 43
  44 +import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_AUTHORITY_PARAGRAPH;
  45 +
44 46 @RestController
45 47 @TbCoreComponent
46 48 @RequestMapping("/api/admin")
... ...
... ... @@ -52,6 +52,21 @@ import org.thingsboard.server.service.security.permission.Resource;
52 52
53 53 import java.util.List;
54 54
  55 +import static org.thingsboard.server.controller.ControllerConstants.ALARM_ID_PARAM_DESCRIPTION;
  56 +import static org.thingsboard.server.controller.ControllerConstants.ALARM_INFO_DESCRIPTION;
  57 +import static org.thingsboard.server.controller.ControllerConstants.ALARM_SORT_PROPERTY_ALLOWABLE_VALUES;
  58 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_ID;
  59 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_ID_PARAM_DESCRIPTION;
  60 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_TYPE;
  61 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_TYPE_PARAM_DESCRIPTION;
  62 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  63 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  64 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  65 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  66 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  67 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  68 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
  69 +
55 70 @RestController
56 71 @TbCoreComponent
57 72 @RequestMapping("/api")
... ...
... ... @@ -64,6 +64,26 @@ import java.util.ArrayList;
64 64 import java.util.List;
65 65 import java.util.stream.Collectors;
66 66
  67 +import static org.thingsboard.server.controller.ControllerConstants.ASSET_ID_PARAM_DESCRIPTION;
  68 +import static org.thingsboard.server.controller.ControllerConstants.ASSET_INFO_DESCRIPTION;
  69 +import static org.thingsboard.server.controller.ControllerConstants.ASSET_NAME_DESCRIPTION;
  70 +import static org.thingsboard.server.controller.ControllerConstants.ASSET_SORT_PROPERTY_ALLOWABLE_VALUES;
  71 +import static org.thingsboard.server.controller.ControllerConstants.ASSET_TEXT_SEARCH_DESCRIPTION;
  72 +import static org.thingsboard.server.controller.ControllerConstants.ASSET_TYPE_DESCRIPTION;
  73 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID_PARAM_DESCRIPTION;
  74 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION;
  75 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION;
  76 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ID_PARAM_DESCRIPTION;
  77 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION;
  78 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION;
  79 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  80 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  81 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  82 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  83 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  84 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  85 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  86 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
67 87 import static org.thingsboard.server.controller.EdgeController.EDGE_ID;
68 88 import static org.thingsboard.server.dao.asset.BaseAssetService.TB_SERVICE_QUEUE;
69 89
... ...
... ... @@ -42,6 +42,19 @@ import java.util.List;
42 42 import java.util.UUID;
43 43 import java.util.stream.Collectors;
44 44
  45 +import static org.thingsboard.server.controller.ControllerConstants.AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES;
  46 +import static org.thingsboard.server.controller.ControllerConstants.AUDIT_LOG_TEXT_SEARCH_DESCRIPTION;
  47 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID_PARAM_DESCRIPTION;
  48 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_ID_PARAM_DESCRIPTION;
  49 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_TYPE_PARAM_DESCRIPTION;
  50 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  51 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  52 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  53 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  54 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  55 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  56 +import static org.thingsboard.server.controller.ControllerConstants.USER_ID_PARAM_DESCRIPTION;
  57 +
45 58 @RestController
46 59 @TbCoreComponent
47 60 @RequestMapping("/api")
... ...
... ... @@ -147,6 +147,8 @@ import java.util.Optional;
147 147 import java.util.Set;
148 148 import java.util.UUID;
149 149
  150 +import static org.thingsboard.server.controller.ControllerConstants.DEFAULT_PAGE_SIZE;
  151 +import static org.thingsboard.server.controller.ControllerConstants.INCORRECT_TENANT_ID;
150 152 import static org.thingsboard.server.dao.service.Validator.validateId;
151 153
152 154 @Slf4j
... ... @@ -155,251 +157,6 @@ public abstract class BaseController {
155 157
156 158 /*Swagger UI description*/
157 159
158   - protected static final String NEW_LINE = "\n\n";
159   -
160   - public static final String CUSTOMER_ID = "customerId";
161   - public static final String TENANT_ID = "tenantId";
162   - public static final String DEVICE_ID = "deviceId";
163   - public static final String RPC_ID = "rpcId";
164   - public static final String ENTITY_ID = "entityId";
165   - public static final String ENTITY_TYPE = "entityType";
166   -
167   - public static final String PAGE_DATA_PARAMETERS = "You can specify parameters to filter the results. " +
168   - "The result is wrapped with PageData object that allows you to iterate over result set using pagination. " +
169   - "See the 'Model' tab of the Response Class for more details. ";
170   - public static final String DASHBOARD_ID_PARAM_DESCRIPTION = "A string value representing the device id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
171   - public static final String RPC_ID_PARAM_DESCRIPTION = "A string value representing the rpc id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
172   - public static final String DEVICE_ID_PARAM_DESCRIPTION = "A string value representing the device id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
173   - public static final String DEVICE_PROFILE_ID_PARAM_DESCRIPTION = "A string value representing the device profile id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
174   - public static final String TENANT_PROFILE_ID_PARAM_DESCRIPTION = "A string value representing the tenant profile id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
175   - public static final String TENANT_ID_PARAM_DESCRIPTION = "A string value representing the tenant id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
176   - public static final String EDGE_ID_PARAM_DESCRIPTION = "A string value representing the edge id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
177   - public static final String CUSTOMER_ID_PARAM_DESCRIPTION = "A string value representing the customer id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
178   - public static final String USER_ID_PARAM_DESCRIPTION = "A string value representing the user id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
179   - public static final String ASSET_ID_PARAM_DESCRIPTION = "A string value representing the asset id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
180   - public static final String ALARM_ID_PARAM_DESCRIPTION = "A string value representing the alarm id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
181   - public static final String ENTITY_ID_PARAM_DESCRIPTION = "A string value representing the entity id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
182   - public static final String OTA_PACKAGE_ID_PARAM_DESCRIPTION = "A string value representing the ota package id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
183   - public static final String ENTITY_TYPE_PARAM_DESCRIPTION = "A string value representing the entity type. For example, 'DEVICE'";
184   - public static final String RULE_CHAIN_ID_PARAM_DESCRIPTION = "A string value representing the rule chain id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
185   - public static final String WIDGET_BUNDLE_ID_PARAM_DESCRIPTION = "A string value representing the widget bundle id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
186   - public static final String WIDGET_TYPE_ID_PARAM_DESCRIPTION = "A string value representing the widget type id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
187   - public static final String RESOURCE_ID_PARAM_DESCRIPTION = "A string value representing the resource id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
188   -
189   -
190   - protected static final String SYSTEM_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'SYS_ADMIN' authority.";
191   - protected static final String SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'SYS_ADMIN' or 'TENANT_ADMIN' authority.";
192   - protected static final String TENANT_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'TENANT_ADMIN' authority.";
193   - protected static final String TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'TENANT_ADMIN' or 'CUSTOMER_USER' authority.";
194   - protected static final String CUSTOMER_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'CUSTOMER_USER' authority.";
195   - protected static final String AVAILABLE_FOR_ANY_AUTHORIZED_USER = "\n\nAvailable for any authorized user. ";
196   -
197   - protected static final String PAGE_SIZE_DESCRIPTION = "Maximum amount of entities in a one page";
198   - protected static final String PAGE_NUMBER_DESCRIPTION = "Sequence number of page starting from 0";
199   - protected static final String DEVICE_TYPE_DESCRIPTION = "Device type as the name of the device profile";
200   - protected static final String ASSET_TYPE_DESCRIPTION = "Asset type";
201   - protected static final String EDGE_TYPE_DESCRIPTION = "A string value representing the edge type. For example, 'default'";
202   - protected static final String RULE_CHAIN_TYPE_DESCRIPTION = "Rule chain type (CORE or EDGE)";
203   -
204   - protected static final String ASSET_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the asset name.";
205   - protected static final String DASHBOARD_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the dashboard title.";
206   - protected static final String WIDGET_BUNDLE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the widget bundle title.";
207   - protected static final String RPC_TEXT_SEARCH_DESCRIPTION = "Not implemented. Leave empty.";
208   - protected static final String DEVICE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device name.";
209   - protected static final String USER_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the user email.";
210   - protected static final String TENANT_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the tenant name.";
211   - protected static final String TENANT_PROFILE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the tenant profile name.";
212   - protected static final String RULE_CHAIN_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the rule chain name.";
213   - protected static final String DEVICE_PROFILE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device profile name.";
214   - protected static final String CUSTOMER_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the customer title.";
215   - protected static final String EDGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the edge name.";
216   - protected static final String EVENT_TEXT_SEARCH_DESCRIPTION = "The value is not used in searching.";
217   - protected static final String AUDIT_LOG_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on one of the next properties: entityType, entityName, userName, actionType, actionStatus.";
218   - protected static final String SORT_PROPERTY_DESCRIPTION = "Property of entity to sort by";
219   - protected static final String DASHBOARD_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title";
220   - protected static final String CUSTOMER_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, email, country, city";
221   - protected static final String RPC_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, expirationTime, request, response";
222   - protected static final String DEVICE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, deviceProfileName, label, customerTitle";
223   - protected static final String USER_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, firstName, lastName, email";
224   - protected static final String TENANT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, email, country, state, city, address, address2, zip, phone, email";
225   - protected static final String TENANT_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, description, isDefault";
226   - protected static final String TENANT_PROFILE_INFO_SORT_PROPERTY_ALLOWABLE_VALUES = "id, name";
227   - protected static final String TENANT_INFO_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, tenantProfileName, title, email, country, state, city, address, address2, zip, phone, email";
228   - protected static final String DEVICE_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, transportType, description, isDefault";
229   - protected static final String ASSET_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle";
230   - protected static final String ALARM_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, startTs, endTs, type, ackTs, clearTs, severity, status";
231   - protected static final String EVENT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, id";
232   - protected static final String EDGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle";
233   - protected static final String RULE_CHAIN_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, root";
234   - protected static final String WIDGET_BUNDLE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, tenantId";
235   - protected static final String AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, entityType, entityName, userName, actionType, actionStatus";
236   - protected static final String SORT_ORDER_DESCRIPTION = "Sort order. ASC (ASCENDING) or DESC (DESCENDING)";
237   - protected static final String SORT_ORDER_ALLOWABLE_VALUES = "ASC, DESC";
238   - protected static final String RPC_STATUS_ALLOWABLE_VALUES = "QUEUED, SENT, DELIVERED, SUCCESSFUL, TIMEOUT, EXPIRED, FAILED";
239   - protected static final String RULE_CHAIN_TYPES_ALLOWABLE_VALUES = "CORE, EDGE";
240   - protected static final String TRANSPORT_TYPE_ALLOWABLE_VALUES = "DEFAULT, MQTT, COAP, LWM2M, SNMP";
241   - 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. ";
242   - 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. ";
243   - protected static final String ALARM_INFO_DESCRIPTION = "Alarm Info is an extension of the default Alarm object that also contains name of the alarm originator.";
244   - protected static final String RELATION_INFO_DESCRIPTION = "Relation Info is an extension of the default Relation object that contains information about the 'from' and 'to' entity names. ";
245   - protected static final String EDGE_INFO_DESCRIPTION = "Edge Info is an extension of the default Edge object that contains information about the assigned customer name. ";
246   - protected static final String DEVICE_PROFILE_INFO_DESCRIPTION = "Device Profile Info is a lightweight object that includes main information about Device Profile excluding the heavyweight configuration object. ";
247   - protected static final String QUEUE_SERVICE_TYPE_DESCRIPTION = "Service type (implemented only for the TB-RULE-ENGINE)";
248   - protected static final String QUEUE_SERVICE_TYPE_ALLOWABLE_VALUES = "TB-RULE-ENGINE, TB-CORE, TB-TRANSPORT, JS-EXECUTOR";
249   - protected static final String OTA_PACKAGE_INFO_DESCRIPTION = "OTA Package Info is a lightweight object that includes main information about the OTA Package excluding the heavyweight data. ";
250   - protected static final String OTA_PACKAGE_DESCRIPTION = "OTA Package is a heavyweight object that includes main information about the OTA Package and also data. ";
251   - protected static final String OTA_PACKAGE_CHECKSUM_ALGORITHM_ALLOWABLE_VALUES = "MD5, SHA256, SHA384, SHA512, CRC32, MURMUR3_32, MURMUR3_128";
252   - protected static final String OTA_PACKAGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the ota package title.";
253   - protected static final String OTA_PACKAGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, type, title, version, tag, url, fileName, dataSize, checksum";
254   - protected static final String RESOURCE_INFO_DESCRIPTION = "Resource Info is a lightweight object that includes main information about the Resource excluding the heavyweight data. ";
255   - protected static final String RESOURCE_DESCRIPTION = "Resource is a heavyweight object that includes main information about the Resource and also data. ";
256   - protected static final String RESOURCE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the resource title.";
257   - protected static final String RESOURCE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, resourceType, tenantId";
258   - protected static final String LWM2M_OBJECT_DESCRIPTION = "LwM2M Object is a object that includes information about the LwM2M model which can be used in transport configuration for the LwM2M device profile. ";
259   - protected static final String LWM2M_OBJECT_SORT_PROPERTY_ALLOWABLE_VALUES = "id, name";
260   -
261   - protected static final String DEVICE_NAME_DESCRIPTION = "A string value representing the Device name.";
262   - protected static final String ASSET_NAME_DESCRIPTION = "A string value representing the Asset name.";
263   -
264   - protected static final String EVENT_START_TIME_DESCRIPTION = "Timestamp. Events with creation time before it won't be queried.";
265   - protected static final String EVENT_END_TIME_DESCRIPTION = "Timestamp. Events with creation time after it won't be queried.";
266   -
267   - protected static final String EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION = "Unassignment works in async way - first, 'unassign' notification event pushed to edge queue on platform. ";
268   - protected static final String EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION = "(Edge will receive this instantly, if it's currently connected, or once it's going to be connected to platform)";
269   - protected static final String EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION = "Assignment works in async way - first, notification event pushed to edge service queue on platform. ";
270   - protected static final String EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION = "(Edge will receive this instantly, if it's currently connected, or once it's going to be connected to platform)";
271   -
272   - protected static final String MARKDOWN_CODE_BLOCK_START = "```json\n";
273   - protected static final String MARKDOWN_CODE_BLOCK_END = "\n```";
274   - protected static final String EVENT_ERROR_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"ERROR\", \"server\": \"ip-172-31-24-152\", " +
275   - "\"method\": \"onClusterEventMsg\", \"error\": \"Error Message\" }" + MARKDOWN_CODE_BLOCK_END;
276   - protected static final String EVENT_LC_EVENT_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"LC_EVENT\", \"server\": \"ip-172-31-24-152\", \"event\":" +
277   - " \"STARTED\", \"status\": \"Success\", \"error\": \"Error Message\" }" + MARKDOWN_CODE_BLOCK_END;
278   - protected static final String EVENT_STATS_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"STATS\", \"server\": \"ip-172-31-24-152\", \"messagesProcessed\": 10, \"errorsOccurred\": 5 }" + MARKDOWN_CODE_BLOCK_END;
279   - protected static final String DEBUG_FILTER_OBJ = "\"msgDirectionType\": \"IN\", \"server\": \"ip-172-31-24-152\", \"dataSearch\": \"humidity\", " +
280   - "\"metadataSearch\": \"deviceName\", \"entityName\": \"DEVICE\", \"relationType\": \"Success\"," +
281   - " \"entityId\": \"de9d54a0-2b7a-11ec-a3cc-23386423d98f\", \"msgType\": \"POST_TELEMETRY_REQUEST\"," +
282   - " \"isError\": \"false\", \"error\": \"Error Message\" }";
283   - protected static final String EVENT_DEBUG_RULE_NODE_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"DEBUG_RULE_NODE\"," + DEBUG_FILTER_OBJ + MARKDOWN_CODE_BLOCK_END;
284   - protected static final String EVENT_DEBUG_RULE_CHAIN_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"DEBUG_RULE_CHAIN\"," + DEBUG_FILTER_OBJ + MARKDOWN_CODE_BLOCK_END;
285   -
286   - protected static final String FILTER_VALUE_TYPE = NEW_LINE + "## Value Type and Operations" + NEW_LINE +
287   - "Provides a hint about the data type of the entity field that is defined in the filter key. " +
288   - "The value type impacts the list of possible operations that you may use in the corresponding predicate. For example, you may use 'STARTS_WITH' or 'END_WITH', but you can't use 'GREATER_OR_EQUAL' for string values." +
289   - "The following filter value types and corresponding predicate operations are supported: " + NEW_LINE +
290   - " * 'STRING' - used to filter any 'String' or 'JSON' values. Operations: EQUAL, NOT_EQUAL, STARTS_WITH, ENDS_WITH, CONTAINS, NOT_CONTAINS; \n" +
291   - " * 'NUMERIC' - used for 'Long' and 'Double' values. Operations: EQUAL, NOT_EQUAL, GREATER, LESS, GREATER_OR_EQUAL, LESS_OR_EQUAL; \n" +
292   - " * 'BOOLEAN' - used for boolean values. Operations: EQUAL, NOT_EQUAL;\n" +
293   - " * 'DATE_TIME' - similar to numeric, transforms value to milliseconds since epoch. Operations: EQUAL, NOT_EQUAL, GREATER, LESS, GREATER_OR_EQUAL, LESS_OR_EQUAL; \n";
294   -
295   - protected static final String DEVICE_PROFILE_ALARM_SCHEDULE_SPECIFIC_TIME_EXAMPLE = MARKDOWN_CODE_BLOCK_START +
296   - "{\n" +
297   - " \"schedule\":{\n" +
298   - " \"type\":\"SPECIFIC_TIME\",\n" +
299   - " \"endsOn\":64800000,\n" +
300   - " \"startsOn\":43200000,\n" +
301   - " \"timezone\":\"Europe/Kiev\",\n" +
302   - " \"daysOfWeek\":[\n" +
303   - " 1,\n" +
304   - " 3,\n" +
305   - " 5\n" +
306   - " ]\n" +
307   - " }\n" +
308   - "}" +
309   - MARKDOWN_CODE_BLOCK_END;
310   - protected static final String DEVICE_PROFILE_ALARM_SCHEDULE_CUSTOM_EXAMPLE = MARKDOWN_CODE_BLOCK_START +
311   - "{\n" +
312   - " \"schedule\":{\n" +
313   - " \"type\":\"CUSTOM\",\n" +
314   - " \"items\":[\n" +
315   - " {\n" +
316   - " \"endsOn\":0,\n" +
317   - " \"enabled\":false,\n" +
318   - " \"startsOn\":0,\n" +
319   - " \"dayOfWeek\":1\n" +
320   - " },\n" +
321   - " {\n" +
322   - " \"endsOn\":64800000,\n" +
323   - " \"enabled\":true,\n" +
324   - " \"startsOn\":43200000,\n" +
325   - " \"dayOfWeek\":2\n" +
326   - " },\n" +
327   - " {\n" +
328   - " \"endsOn\":0,\n" +
329   - " \"enabled\":false,\n" +
330   - " \"startsOn\":0,\n" +
331   - " \"dayOfWeek\":3\n" +
332   - " },\n" +
333   - " {\n" +
334   - " \"endsOn\":57600000,\n" +
335   - " \"enabled\":true,\n" +
336   - " \"startsOn\":36000000,\n" +
337   - " \"dayOfWeek\":4\n" +
338   - " },\n" +
339   - " {\n" +
340   - " \"endsOn\":0,\n" +
341   - " \"enabled\":false,\n" +
342   - " \"startsOn\":0,\n" +
343   - " \"dayOfWeek\":5\n" +
344   - " },\n" +
345   - " {\n" +
346   - " \"endsOn\":0,\n" +
347   - " \"enabled\":false,\n" +
348   - " \"startsOn\":0,\n" +
349   - " \"dayOfWeek\":6\n" +
350   - " },\n" +
351   - " {\n" +
352   - " \"endsOn\":0,\n" +
353   - " \"enabled\":false,\n" +
354   - " \"startsOn\":0,\n" +
355   - " \"dayOfWeek\":7\n" +
356   - " }\n" +
357   - " ],\n" +
358   - " \"timezone\":\"Europe/Kiev\"\n" +
359   - " }\n" +
360   - "}" +
361   - MARKDOWN_CODE_BLOCK_END;
362   - protected static final String DEVICE_PROFILE_ALARM_SCHEDULE_ALWAYS_EXAMPLE = MARKDOWN_CODE_BLOCK_START + "\"schedule\": null" + MARKDOWN_CODE_BLOCK_END;
363   -
364   - protected static final String DEVICE_PROFILE_ALARM_CONDITION_REPEATING_EXAMPLE = MARKDOWN_CODE_BLOCK_START +
365   - "{\n" +
366   - " \"spec\":{\n" +
367   - " \"type\":\"REPEATING\",\n" +
368   - " \"predicate\":{\n" +
369   - " \"userValue\":null,\n" +
370   - " \"defaultValue\":5,\n" +
371   - " \"dynamicValue\":{\n" +
372   - " \"inherit\":true,\n" +
373   - " \"sourceType\":\"CURRENT_DEVICE\",\n" +
374   - " \"sourceAttribute\":\"tempAttr\"\n" +
375   - " }\n" +
376   - " }\n" +
377   - " }\n" +
378   - "}" +
379   - MARKDOWN_CODE_BLOCK_END;
380   - protected static final String DEVICE_PROFILE_ALARM_CONDITION_DURATION_EXAMPLE = MARKDOWN_CODE_BLOCK_START +
381   - "{\n" +
382   - " \"spec\":{\n" +
383   - " \"type\":\"DURATION\",\n" +
384   - " \"unit\":\"MINUTES\",\n" +
385   - " \"predicate\":{\n" +
386   - " \"userValue\":null,\n" +
387   - " \"defaultValue\":30,\n" +
388   - " \"dynamicValue\":null\n" +
389   - " }\n" +
390   - " }\n" +
391   - "}" +
392   - MARKDOWN_CODE_BLOCK_END;
393   -
394   - protected static final String RELATION_TYPE_PARAM_DESCRIPTION = "A string value representing relation type between entities. For example, 'Contains', 'Manages'. It can be any string value.";
395   - protected static final String RELATION_TYPE_GROUP_PARAM_DESCRIPTION = "A string value representing relation type group. For example, 'COMMON'";
396   -
397   - public static final String INCORRECT_TENANT_ID = "Incorrect tenantId ";
398   - protected static final String DEFAULT_DASHBOARD = "defaultDashboardId";
399   - protected static final String HOME_DASHBOARD = "homeDashboardId";
400   -
401   - private static final int DEFAULT_PAGE_SIZE = 1000;
402   -
403 160 private static final ObjectMapper json = new ObjectMapper();
404 161
405 162 @Autowired
... ...
... ... @@ -35,6 +35,8 @@ import java.util.HashSet;
35 35 import java.util.List;
36 36 import java.util.Set;
37 37
  38 +import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH;
  39 +
38 40 @RestController
39 41 @TbCoreComponent
40 42 @RequestMapping("/api")
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.controller;
  17 +
  18 +public class ControllerConstants {
  19 +
  20 +
  21 + protected static final String NEW_LINE = "\n\n";
  22 + protected static final int DEFAULT_PAGE_SIZE = 1000;
  23 + protected static final String ENTITY_TYPE = "entityType";
  24 + protected static final String CUSTOMER_ID = "customerId";
  25 + protected static final String TENANT_ID = "tenantId";
  26 + protected static final String DEVICE_ID = "deviceId";
  27 + protected static final String RPC_ID = "rpcId";
  28 + protected static final String ENTITY_ID = "entityId";
  29 + protected static final String PAGE_DATA_PARAMETERS = "You can specify parameters to filter the results. " +
  30 + "The result is wrapped with PageData object that allows you to iterate over result set using pagination. " +
  31 + "See the 'Model' tab of the Response Class for more details. ";
  32 + protected static final String DASHBOARD_ID_PARAM_DESCRIPTION = "A string value representing the device id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  33 + protected static final String RPC_ID_PARAM_DESCRIPTION = "A string value representing the rpc id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  34 + protected static final String DEVICE_ID_PARAM_DESCRIPTION = "A string value representing the device id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  35 + protected static final String DEVICE_PROFILE_ID_PARAM_DESCRIPTION = "A string value representing the device profile id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  36 + protected static final String TENANT_PROFILE_ID_PARAM_DESCRIPTION = "A string value representing the tenant profile id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  37 + protected static final String TENANT_ID_PARAM_DESCRIPTION = "A string value representing the tenant id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  38 + protected static final String EDGE_ID_PARAM_DESCRIPTION = "A string value representing the edge id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  39 + protected static final String CUSTOMER_ID_PARAM_DESCRIPTION = "A string value representing the customer id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  40 + protected static final String USER_ID_PARAM_DESCRIPTION = "A string value representing the user id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  41 + protected static final String ASSET_ID_PARAM_DESCRIPTION = "A string value representing the asset id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  42 + protected static final String ALARM_ID_PARAM_DESCRIPTION = "A string value representing the alarm id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  43 + protected static final String ENTITY_ID_PARAM_DESCRIPTION = "A string value representing the entity id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  44 + protected static final String OTA_PACKAGE_ID_PARAM_DESCRIPTION = "A string value representing the ota package id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  45 + protected static final String ENTITY_TYPE_PARAM_DESCRIPTION = "A string value representing the entity type. For example, 'DEVICE'";
  46 + protected static final String RULE_CHAIN_ID_PARAM_DESCRIPTION = "A string value representing the rule chain id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  47 + protected static final String WIDGET_BUNDLE_ID_PARAM_DESCRIPTION = "A string value representing the widget bundle id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  48 + protected static final String WIDGET_TYPE_ID_PARAM_DESCRIPTION = "A string value representing the widget type id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  49 + protected static final String RESOURCE_ID_PARAM_DESCRIPTION = "A string value representing the resource id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  50 + protected static final String SYSTEM_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'SYS_ADMIN' authority.";
  51 + protected static final String SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'SYS_ADMIN' or 'TENANT_ADMIN' authority.";
  52 + protected static final String TENANT_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'TENANT_ADMIN' authority.";
  53 + protected static final String TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'TENANT_ADMIN' or 'CUSTOMER_USER' authority.";
  54 + protected static final String CUSTOMER_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'CUSTOMER_USER' authority.";
  55 + protected static final String AVAILABLE_FOR_ANY_AUTHORIZED_USER = "\n\nAvailable for any authorized user. ";
  56 + protected static final String PAGE_SIZE_DESCRIPTION = "Maximum amount of entities in a one page";
  57 + protected static final String PAGE_NUMBER_DESCRIPTION = "Sequence number of page starting from 0";
  58 + protected static final String DEVICE_TYPE_DESCRIPTION = "Device type as the name of the device profile";
  59 + protected static final String ASSET_TYPE_DESCRIPTION = "Asset type";
  60 + protected static final String EDGE_TYPE_DESCRIPTION = "A string value representing the edge type. For example, 'default'";
  61 + protected static final String RULE_CHAIN_TYPE_DESCRIPTION = "Rule chain type (CORE or EDGE)";
  62 + protected static final String ASSET_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the asset name.";
  63 + protected static final String DASHBOARD_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the dashboard title.";
  64 + protected static final String WIDGET_BUNDLE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the widget bundle title.";
  65 + protected static final String RPC_TEXT_SEARCH_DESCRIPTION = "Not implemented. Leave empty.";
  66 + protected static final String DEVICE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device name.";
  67 + protected static final String USER_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the user email.";
  68 + protected static final String TENANT_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the tenant name.";
  69 + protected static final String TENANT_PROFILE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the tenant profile name.";
  70 + protected static final String RULE_CHAIN_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the rule chain name.";
  71 + protected static final String DEVICE_PROFILE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device profile name.";
  72 + protected static final String CUSTOMER_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the customer title.";
  73 + protected static final String EDGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the edge name.";
  74 + protected static final String EVENT_TEXT_SEARCH_DESCRIPTION = "The value is not used in searching.";
  75 + protected static final String AUDIT_LOG_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on one of the next properties: entityType, entityName, userName, actionType, actionStatus.";
  76 + protected static final String SORT_PROPERTY_DESCRIPTION = "Property of entity to sort by";
  77 + protected static final String DASHBOARD_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title";
  78 + protected static final String CUSTOMER_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, email, country, city";
  79 + protected static final String RPC_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, expirationTime, request, response";
  80 + protected static final String DEVICE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, deviceProfileName, label, customerTitle";
  81 + protected static final String USER_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, firstName, lastName, email";
  82 + protected static final String TENANT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, email, country, state, city, address, address2, zip, phone, email";
  83 + protected static final String TENANT_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, description, isDefault";
  84 + protected static final String TENANT_PROFILE_INFO_SORT_PROPERTY_ALLOWABLE_VALUES = "id, name";
  85 + protected static final String TENANT_INFO_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, tenantProfileName, title, email, country, state, city, address, address2, zip, phone, email";
  86 + protected static final String DEVICE_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, transportType, description, isDefault";
  87 + protected static final String ASSET_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle";
  88 + protected static final String ALARM_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, startTs, endTs, type, ackTs, clearTs, severity, status";
  89 + protected static final String EVENT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, id";
  90 + protected static final String EDGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle";
  91 + protected static final String RULE_CHAIN_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, root";
  92 + protected static final String WIDGET_BUNDLE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, tenantId";
  93 + protected static final String AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, entityType, entityName, userName, actionType, actionStatus";
  94 + protected static final String SORT_ORDER_DESCRIPTION = "Sort order. ASC (ASCENDING) or DESC (DESCENDING)";
  95 + protected static final String SORT_ORDER_ALLOWABLE_VALUES = "ASC, DESC";
  96 + protected static final String RPC_STATUS_ALLOWABLE_VALUES = "QUEUED, SENT, DELIVERED, SUCCESSFUL, TIMEOUT, EXPIRED, FAILED";
  97 + protected static final String RULE_CHAIN_TYPES_ALLOWABLE_VALUES = "CORE, EDGE";
  98 + protected static final String TRANSPORT_TYPE_ALLOWABLE_VALUES = "DEFAULT, MQTT, COAP, LWM2M, SNMP";
  99 + 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. ";
  100 + 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. ";
  101 + protected static final String ALARM_INFO_DESCRIPTION = "Alarm Info is an extension of the default Alarm object that also contains name of the alarm originator.";
  102 + protected static final String RELATION_INFO_DESCRIPTION = "Relation Info is an extension of the default Relation object that contains information about the 'from' and 'to' entity names. ";
  103 + protected static final String EDGE_INFO_DESCRIPTION = "Edge Info is an extension of the default Edge object that contains information about the assigned customer name. ";
  104 + protected static final String DEVICE_PROFILE_INFO_DESCRIPTION = "Device Profile Info is a lightweight object that includes main information about Device Profile excluding the heavyweight configuration object. ";
  105 + protected static final String QUEUE_SERVICE_TYPE_DESCRIPTION = "Service type (implemented only for the TB-RULE-ENGINE)";
  106 + protected static final String QUEUE_SERVICE_TYPE_ALLOWABLE_VALUES = "TB-RULE-ENGINE, TB-CORE, TB-TRANSPORT, JS-EXECUTOR";
  107 + protected static final String OTA_PACKAGE_INFO_DESCRIPTION = "OTA Package Info is a lightweight object that includes main information about the OTA Package excluding the heavyweight data. ";
  108 + protected static final String OTA_PACKAGE_DESCRIPTION = "OTA Package is a heavyweight object that includes main information about the OTA Package and also data. ";
  109 + protected static final String OTA_PACKAGE_CHECKSUM_ALGORITHM_ALLOWABLE_VALUES = "MD5, SHA256, SHA384, SHA512, CRC32, MURMUR3_32, MURMUR3_128";
  110 + protected static final String OTA_PACKAGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the ota package title.";
  111 + protected static final String OTA_PACKAGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, type, title, version, tag, url, fileName, dataSize, checksum";
  112 + protected static final String RESOURCE_INFO_DESCRIPTION = "Resource Info is a lightweight object that includes main information about the Resource excluding the heavyweight data. ";
  113 + protected static final String RESOURCE_DESCRIPTION = "Resource is a heavyweight object that includes main information about the Resource and also data. ";
  114 +
  115 + protected static final String RESOURCE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the resource title.";
  116 + protected static final String RESOURCE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, resourceType, tenantId";
  117 + protected static final String LWM2M_OBJECT_DESCRIPTION = "LwM2M Object is a object that includes information about the LwM2M model which can be used in transport configuration for the LwM2M device profile. ";
  118 + protected static final String LWM2M_OBJECT_SORT_PROPERTY_ALLOWABLE_VALUES = "id, name";
  119 +
  120 + protected static final String DEVICE_NAME_DESCRIPTION = "A string value representing the Device name.";
  121 + protected static final String ASSET_NAME_DESCRIPTION = "A string value representing the Asset name.";
  122 +
  123 + protected static final String EVENT_START_TIME_DESCRIPTION = "Timestamp. Events with creation time before it won't be queried.";
  124 + protected static final String EVENT_END_TIME_DESCRIPTION = "Timestamp. Events with creation time after it won't be queried.";
  125 +
  126 + protected static final String EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION = "Unassignment works in async way - first, 'unassign' notification event pushed to edge queue on platform. ";
  127 + protected static final String EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION = "(Edge will receive this instantly, if it's currently connected, or once it's going to be connected to platform)";
  128 + protected static final String EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION = "Assignment works in async way - first, notification event pushed to edge service queue on platform. ";
  129 + protected static final String EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION = "(Edge will receive this instantly, if it's currently connected, or once it's going to be connected to platform)";
  130 +
  131 + protected static final String MARKDOWN_CODE_BLOCK_START = "```json\n";
  132 + protected static final String MARKDOWN_CODE_BLOCK_END = "\n```";
  133 + protected static final String EVENT_ERROR_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"ERROR\", \"server\": \"ip-172-31-24-152\", " +
  134 + "\"method\": \"onClusterEventMsg\", \"error\": \"Error Message\" }" + MARKDOWN_CODE_BLOCK_END;
  135 + protected static final String EVENT_LC_EVENT_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"LC_EVENT\", \"server\": \"ip-172-31-24-152\", \"event\":" +
  136 + " \"STARTED\", \"status\": \"Success\", \"error\": \"Error Message\" }" + MARKDOWN_CODE_BLOCK_END;
  137 + protected static final String EVENT_STATS_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"STATS\", \"server\": \"ip-172-31-24-152\", \"messagesProcessed\": 10, \"errorsOccurred\": 5 }" + MARKDOWN_CODE_BLOCK_END;
  138 + protected static final String DEBUG_FILTER_OBJ = "\"msgDirectionType\": \"IN\", \"server\": \"ip-172-31-24-152\", \"dataSearch\": \"humidity\", " +
  139 + "\"metadataSearch\": \"deviceName\", \"entityName\": \"DEVICE\", \"relationType\": \"Success\"," +
  140 + " \"entityId\": \"de9d54a0-2b7a-11ec-a3cc-23386423d98f\", \"msgType\": \"POST_TELEMETRY_REQUEST\"," +
  141 + " \"isError\": \"false\", \"error\": \"Error Message\" }";
  142 + protected static final String EVENT_DEBUG_RULE_NODE_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"DEBUG_RULE_NODE\"," + DEBUG_FILTER_OBJ + MARKDOWN_CODE_BLOCK_END;
  143 + protected static final String EVENT_DEBUG_RULE_CHAIN_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"DEBUG_RULE_CHAIN\"," + DEBUG_FILTER_OBJ + MARKDOWN_CODE_BLOCK_END;
  144 +
  145 + protected static final String FILTER_VALUE_TYPE = NEW_LINE + "## Value Type and Operations" + NEW_LINE +
  146 + "Provides a hint about the data type of the entity field that is defined in the filter key. " +
  147 + "The value type impacts the list of possible operations that you may use in the corresponding predicate. For example, you may use 'STARTS_WITH' or 'END_WITH', but you can't use 'GREATER_OR_EQUAL' for string values." +
  148 + "The following filter value types and corresponding predicate operations are supported: " + NEW_LINE +
  149 + " * 'STRING' - used to filter any 'String' or 'JSON' values. Operations: EQUAL, NOT_EQUAL, STARTS_WITH, ENDS_WITH, CONTAINS, NOT_CONTAINS; \n" +
  150 + " * 'NUMERIC' - used for 'Long' and 'Double' values. Operations: EQUAL, NOT_EQUAL, GREATER, LESS, GREATER_OR_EQUAL, LESS_OR_EQUAL; \n" +
  151 + " * 'BOOLEAN' - used for boolean values. Operations: EQUAL, NOT_EQUAL;\n" +
  152 + " * 'DATE_TIME' - similar to numeric, transforms value to milliseconds since epoch. Operations: EQUAL, NOT_EQUAL, GREATER, LESS, GREATER_OR_EQUAL, LESS_OR_EQUAL; \n";
  153 +
  154 + protected static final String DEVICE_PROFILE_ALARM_SCHEDULE_SPECIFIC_TIME_EXAMPLE = MARKDOWN_CODE_BLOCK_START +
  155 + "{\n" +
  156 + " \"schedule\":{\n" +
  157 + " \"type\":\"SPECIFIC_TIME\",\n" +
  158 + " \"endsOn\":64800000,\n" +
  159 + " \"startsOn\":43200000,\n" +
  160 + " \"timezone\":\"Europe/Kiev\",\n" +
  161 + " \"daysOfWeek\":[\n" +
  162 + " 1,\n" +
  163 + " 3,\n" +
  164 + " 5\n" +
  165 + " ]\n" +
  166 + " }\n" +
  167 + "}" +
  168 + MARKDOWN_CODE_BLOCK_END;
  169 + protected static final String DEVICE_PROFILE_ALARM_SCHEDULE_CUSTOM_EXAMPLE = MARKDOWN_CODE_BLOCK_START +
  170 + "{\n" +
  171 + " \"schedule\":{\n" +
  172 + " \"type\":\"CUSTOM\",\n" +
  173 + " \"items\":[\n" +
  174 + " {\n" +
  175 + " \"endsOn\":0,\n" +
  176 + " \"enabled\":false,\n" +
  177 + " \"startsOn\":0,\n" +
  178 + " \"dayOfWeek\":1\n" +
  179 + " },\n" +
  180 + " {\n" +
  181 + " \"endsOn\":64800000,\n" +
  182 + " \"enabled\":true,\n" +
  183 + " \"startsOn\":43200000,\n" +
  184 + " \"dayOfWeek\":2\n" +
  185 + " },\n" +
  186 + " {\n" +
  187 + " \"endsOn\":0,\n" +
  188 + " \"enabled\":false,\n" +
  189 + " \"startsOn\":0,\n" +
  190 + " \"dayOfWeek\":3\n" +
  191 + " },\n" +
  192 + " {\n" +
  193 + " \"endsOn\":57600000,\n" +
  194 + " \"enabled\":true,\n" +
  195 + " \"startsOn\":36000000,\n" +
  196 + " \"dayOfWeek\":4\n" +
  197 + " },\n" +
  198 + " {\n" +
  199 + " \"endsOn\":0,\n" +
  200 + " \"enabled\":false,\n" +
  201 + " \"startsOn\":0,\n" +
  202 + " \"dayOfWeek\":5\n" +
  203 + " },\n" +
  204 + " {\n" +
  205 + " \"endsOn\":0,\n" +
  206 + " \"enabled\":false,\n" +
  207 + " \"startsOn\":0,\n" +
  208 + " \"dayOfWeek\":6\n" +
  209 + " },\n" +
  210 + " {\n" +
  211 + " \"endsOn\":0,\n" +
  212 + " \"enabled\":false,\n" +
  213 + " \"startsOn\":0,\n" +
  214 + " \"dayOfWeek\":7\n" +
  215 + " }\n" +
  216 + " ],\n" +
  217 + " \"timezone\":\"Europe/Kiev\"\n" +
  218 + " }\n" +
  219 + "}" +
  220 + MARKDOWN_CODE_BLOCK_END;
  221 + protected static final String DEVICE_PROFILE_ALARM_SCHEDULE_ALWAYS_EXAMPLE = MARKDOWN_CODE_BLOCK_START + "\"schedule\": null" + MARKDOWN_CODE_BLOCK_END;
  222 +
  223 + protected static final String DEVICE_PROFILE_ALARM_CONDITION_REPEATING_EXAMPLE = MARKDOWN_CODE_BLOCK_START +
  224 + "{\n" +
  225 + " \"spec\":{\n" +
  226 + " \"type\":\"REPEATING\",\n" +
  227 + " \"predicate\":{\n" +
  228 + " \"userValue\":null,\n" +
  229 + " \"defaultValue\":5,\n" +
  230 + " \"dynamicValue\":{\n" +
  231 + " \"inherit\":true,\n" +
  232 + " \"sourceType\":\"CURRENT_DEVICE\",\n" +
  233 + " \"sourceAttribute\":\"tempAttr\"\n" +
  234 + " }\n" +
  235 + " }\n" +
  236 + " }\n" +
  237 + "}" +
  238 + MARKDOWN_CODE_BLOCK_END;
  239 + protected static final String DEVICE_PROFILE_ALARM_CONDITION_DURATION_EXAMPLE = MARKDOWN_CODE_BLOCK_START +
  240 + "{\n" +
  241 + " \"spec\":{\n" +
  242 + " \"type\":\"DURATION\",\n" +
  243 + " \"unit\":\"MINUTES\",\n" +
  244 + " \"predicate\":{\n" +
  245 + " \"userValue\":null,\n" +
  246 + " \"defaultValue\":30,\n" +
  247 + " \"dynamicValue\":null\n" +
  248 + " }\n" +
  249 + " }\n" +
  250 + "}" +
  251 + MARKDOWN_CODE_BLOCK_END;
  252 +
  253 + protected static final String RELATION_TYPE_PARAM_DESCRIPTION = "A string value representing relation type between entities. For example, 'Contains', 'Manages'. It can be any string value.";
  254 + protected static final String RELATION_TYPE_GROUP_PARAM_DESCRIPTION = "A string value representing relation type group. For example, 'COMMON'";
  255 +
  256 + public static final String INCORRECT_TENANT_ID = "Incorrect tenantId ";
  257 + protected static final String DEFAULT_DASHBOARD = "defaultDashboardId";
  258 + protected static final String HOME_DASHBOARD = "homeDashboardId";
  259 +
  260 + protected static final String SINGLE_ENTITY = "\n\n## Single Entity\n\n" +
  261 + "Allows to filter only one entity based on the id. For example, this entity filter selects certain device:\n\n" +
  262 + MARKDOWN_CODE_BLOCK_START +
  263 + "{\n" +
  264 + " \"type\": \"singleEntity\",\n" +
  265 + " \"singleEntity\": {\n" +
  266 + " \"id\": \"d521edb0-2a7a-11ec-94eb-213c95f54092\",\n" +
  267 + " \"entityType\": \"DEVICE\"\n" +
  268 + " }\n" +
  269 + "}" +
  270 + MARKDOWN_CODE_BLOCK_END +
  271 + "";
  272 +
  273 + protected static final String ENTITY_LIST = "\n\n## Entity List Filter\n\n" +
  274 + "Allows to filter entities of the same type using their ids. For example, this entity filter selects two devices:\n\n" +
  275 + MARKDOWN_CODE_BLOCK_START +
  276 + "{\n" +
  277 + " \"type\": \"entityList\",\n" +
  278 + " \"entityType\": \"DEVICE\",\n" +
  279 + " \"entityList\": [\n" +
  280 + " \"e6501f30-2a7a-11ec-94eb-213c95f54092\",\n" +
  281 + " \"e6657bf0-2a7a-11ec-94eb-213c95f54092\"\n" +
  282 + " ]\n" +
  283 + "}" +
  284 + MARKDOWN_CODE_BLOCK_END +
  285 + "";
  286 +
  287 + protected static final String ENTITY_NAME = "\n\n## Entity Name Filter\n\n" +
  288 + "Allows to filter entities of the same type using the **'starts with'** expression over entity name. " +
  289 + "For example, this entity filter selects all devices which name starts with 'Air Quality':\n\n" +
  290 + MARKDOWN_CODE_BLOCK_START +
  291 + "{\n" +
  292 + " \"type\": \"entityName\",\n" +
  293 + " \"entityType\": \"DEVICE\",\n" +
  294 + " \"entityNameFilter\": \"Air Quality\"\n" +
  295 + "}" +
  296 + MARKDOWN_CODE_BLOCK_END +
  297 + "";
  298 +
  299 + protected static final String ENTITY_TYPE_FILTER = "\n\n## Entity Type Filter\n\n" +
  300 + "Allows to filter entities based on their type (CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, etc)" +
  301 + "For example, this entity filter selects all tenant customers:\n\n" +
  302 + MARKDOWN_CODE_BLOCK_START +
  303 + "{\n" +
  304 + " \"type\": \"entityType\",\n" +
  305 + " \"entityType\": \"CUSTOMER\"\n" +
  306 + "}" +
  307 + MARKDOWN_CODE_BLOCK_END +
  308 + "";
  309 +
  310 + protected static final String ASSET_TYPE = "\n\n## Asset Type Filter\n\n" +
  311 + "Allows to filter assets based on their type and the **'starts with'** expression over their name. " +
  312 + "For example, this entity filter selects all 'charging station' assets which name starts with 'Tesla':\n\n" +
  313 + MARKDOWN_CODE_BLOCK_START +
  314 + "{\n" +
  315 + " \"type\": \"assetType\",\n" +
  316 + " \"assetType\": \"charging station\",\n" +
  317 + " \"assetNameFilter\": \"Tesla\"\n" +
  318 + "}" +
  319 + MARKDOWN_CODE_BLOCK_END +
  320 + "";
  321 +
  322 + protected static final String DEVICE_TYPE = "\n\n## Device Type Filter\n\n" +
  323 + "Allows to filter devices based on their type and the **'starts with'** expression over their name. " +
  324 + "For example, this entity filter selects all 'Temperature Sensor' devices which name starts with 'ABC':\n\n" +
  325 + MARKDOWN_CODE_BLOCK_START +
  326 + "{\n" +
  327 + " \"type\": \"deviceType\",\n" +
  328 + " \"deviceType\": \"Temperature Sensor\",\n" +
  329 + " \"deviceNameFilter\": \"ABC\"\n" +
  330 + "}" +
  331 + MARKDOWN_CODE_BLOCK_END +
  332 + "";
  333 +
  334 + protected static final String EDGE_TYPE = "\n\n## Edge Type Filter\n\n" +
  335 + "Allows to filter edge instances based on their type and the **'starts with'** expression over their name. " +
  336 + "For example, this entity filter selects all 'Factory' edge instances which name starts with 'Nevada':\n\n" +
  337 + MARKDOWN_CODE_BLOCK_START +
  338 + "{\n" +
  339 + " \"type\": \"edgeType\",\n" +
  340 + " \"edgeType\": \"Factory\",\n" +
  341 + " \"edgeNameFilter\": \"Nevada\"\n" +
  342 + "}" +
  343 + MARKDOWN_CODE_BLOCK_END +
  344 + "";
  345 +
  346 + protected static final String ENTITY_VIEW_TYPE = "\n\n## Entity View Filter\n\n" +
  347 + "Allows to filter entity views based on their type and the **'starts with'** expression over their name. " +
  348 + "For example, this entity filter selects all 'Concrete Mixer' entity views which name starts with 'CAT':\n\n" +
  349 + MARKDOWN_CODE_BLOCK_START +
  350 + "{\n" +
  351 + " \"type\": \"entityViewType\",\n" +
  352 + " \"entityViewType\": \"Concrete Mixer\",\n" +
  353 + " \"entityViewNameFilter\": \"CAT\"\n" +
  354 + "}" +
  355 + MARKDOWN_CODE_BLOCK_END +
  356 + "";
  357 +
  358 + protected static final String API_USAGE = "\n\n## Api Usage Filter\n\n" +
  359 + "Allows to query for Api Usage based on optional customer id. If the customer id is not set, returns current tenant API usage." +
  360 + "For example, this entity filter selects the 'Api Usage' entity for customer with id 'e6501f30-2a7a-11ec-94eb-213c95f54092':\n\n" +
  361 + MARKDOWN_CODE_BLOCK_START +
  362 + "{\n" +
  363 + " \"type\": \"apiUsageState\",\n" +
  364 + " \"customerId\": {\n" +
  365 + " \"id\": \"d521edb0-2a7a-11ec-94eb-213c95f54092\",\n" +
  366 + " \"entityType\": \"CUSTOMER\"\n" +
  367 + " }\n" +
  368 + "}" +
  369 + MARKDOWN_CODE_BLOCK_END +
  370 + "";
  371 +
  372 + protected static final String MAX_LEVEL_DESCRIPTION = "Possible direction values are 'TO' and 'FROM'. The 'maxLevel' defines how many relation levels should the query search 'recursively'. ";
  373 + protected static final String FETCH_LAST_LEVEL_ONLY_DESCRIPTION = "Assuming the 'maxLevel' is > 1, the 'fetchLastLevelOnly' defines either to return all related entities or only entities that are on the last level of relations. ";
  374 +
  375 + protected static final String RELATIONS_QUERY_FILTER = "\n\n## Relations Query Filter\n\n" +
  376 + "Allows to filter entities that are related to the provided root entity. " +
  377 + MAX_LEVEL_DESCRIPTION +
  378 + FETCH_LAST_LEVEL_ONLY_DESCRIPTION +
  379 + "The 'filter' object allows you to define the relation type and set of acceptable entity types to search for. " +
  380 + "The relation query calculates all related entities, even if they are filtered using different relation types, and then extracts only those who match the 'filters'.\n\n" +
  381 + "For example, this entity filter selects all devices and assets which are related to the asset with id 'e51de0c0-2a7a-11ec-94eb-213c95f54092':\n\n" +
  382 + MARKDOWN_CODE_BLOCK_START +
  383 + "{\n" +
  384 + " \"type\": \"relationsQuery\",\n" +
  385 + " \"rootEntity\": {\n" +
  386 + " \"entityType\": \"ASSET\",\n" +
  387 + " \"id\": \"e51de0c0-2a7a-11ec-94eb-213c95f54092\"\n" +
  388 + " },\n" +
  389 + " \"direction\": \"FROM\",\n" +
  390 + " \"maxLevel\": 1,\n" +
  391 + " \"fetchLastLevelOnly\": false,\n" +
  392 + " \"filters\": [\n" +
  393 + " {\n" +
  394 + " \"relationType\": \"Contains\",\n" +
  395 + " \"entityTypes\": [\n" +
  396 + " \"DEVICE\",\n" +
  397 + " \"ASSET\"\n" +
  398 + " ]\n" +
  399 + " }\n" +
  400 + " ]\n" +
  401 + "}" +
  402 + MARKDOWN_CODE_BLOCK_END +
  403 + "";
  404 +
  405 +
  406 + protected static final String ASSET_QUERY_FILTER = "\n\n## Asset Search Query\n\n" +
  407 + "Allows to filter assets that are related to the provided root entity. Filters related assets based on the relation type and set of asset types. " +
  408 + MAX_LEVEL_DESCRIPTION +
  409 + FETCH_LAST_LEVEL_ONLY_DESCRIPTION +
  410 + "The 'relationType' defines the type of the relation to search for. " +
  411 + "The 'assetTypes' defines the type of the asset to search for. " +
  412 + "The relation query calculates all related entities, even if they are filtered using different relation types, and then extracts only assets that match 'relationType' and 'assetTypes' conditions.\n\n" +
  413 + "For example, this entity filter selects 'charging station' assets which are related to the asset with id 'e51de0c0-2a7a-11ec-94eb-213c95f54092' using 'Contains' relation:\n\n" +
  414 + MARKDOWN_CODE_BLOCK_START +
  415 + "{\n" +
  416 + " \"type\": \"assetSearchQuery\",\n" +
  417 + " \"rootEntity\": {\n" +
  418 + " \"entityType\": \"ASSET\",\n" +
  419 + " \"id\": \"e51de0c0-2a7a-11ec-94eb-213c95f54092\"\n" +
  420 + " },\n" +
  421 + " \"direction\": \"FROM\",\n" +
  422 + " \"maxLevel\": 1,\n" +
  423 + " \"fetchLastLevelOnly\": false,\n" +
  424 + " \"relationType\": \"Contains\",\n" +
  425 + " \"assetTypes\": [\n" +
  426 + " \"charging station\"\n" +
  427 + " ]\n" +
  428 + "}" +
  429 + MARKDOWN_CODE_BLOCK_END +
  430 + "";
  431 +
  432 + protected static final String DEVICE_QUERY_FILTER = "\n\n## Device Search Query\n\n" +
  433 + "Allows to filter devices that are related to the provided root entity. Filters related devices based on the relation type and set of device types. " +
  434 + MAX_LEVEL_DESCRIPTION +
  435 + FETCH_LAST_LEVEL_ONLY_DESCRIPTION +
  436 + "The 'relationType' defines the type of the relation to search for. " +
  437 + "The 'deviceTypes' defines the type of the device to search for. " +
  438 + "The relation query calculates all related entities, even if they are filtered using different relation types, and then extracts only devices that match 'relationType' and 'deviceTypes' conditions.\n\n" +
  439 + "For example, this entity filter selects 'Charging port' and 'Air Quality Sensor' devices which are related to the asset with id 'e52b0020-2a7a-11ec-94eb-213c95f54092' using 'Contains' relation:\n\n" +
  440 + MARKDOWN_CODE_BLOCK_START +
  441 + "{\n" +
  442 + " \"type\": \"deviceSearchQuery\",\n" +
  443 + " \"rootEntity\": {\n" +
  444 + " \"entityType\": \"ASSET\",\n" +
  445 + " \"id\": \"e52b0020-2a7a-11ec-94eb-213c95f54092\"\n" +
  446 + " },\n" +
  447 + " \"direction\": \"FROM\",\n" +
  448 + " \"maxLevel\": 2,\n" +
  449 + " \"fetchLastLevelOnly\": true,\n" +
  450 + " \"relationType\": \"Contains\",\n" +
  451 + " \"deviceTypes\": [\n" +
  452 + " \"Air Quality Sensor\",\n" +
  453 + " \"Charging port\"\n" +
  454 + " ]\n" +
  455 + "}" +
  456 + MARKDOWN_CODE_BLOCK_END +
  457 + "";
  458 +
  459 + protected static final String EV_QUERY_FILTER = "\n\n## Entity View Query\n\n" +
  460 + "Allows to filter entity views that are related to the provided root entity. Filters related entity views based on the relation type and set of entity view types. " +
  461 + MAX_LEVEL_DESCRIPTION +
  462 + FETCH_LAST_LEVEL_ONLY_DESCRIPTION +
  463 + "The 'relationType' defines the type of the relation to search for. " +
  464 + "The 'entityViewTypes' defines the type of the entity view to search for. " +
  465 + "The relation query calculates all related entities, even if they are filtered using different relation types, and then extracts only devices that match 'relationType' and 'deviceTypes' conditions.\n\n" +
  466 + "For example, this entity filter selects 'Concrete mixer' entity views which are related to the asset with id 'e52b0020-2a7a-11ec-94eb-213c95f54092' using 'Contains' relation:\n\n" +
  467 + MARKDOWN_CODE_BLOCK_START +
  468 + "{\n" +
  469 + " \"type\": \"entityViewSearchQuery\",\n" +
  470 + " \"rootEntity\": {\n" +
  471 + " \"entityType\": \"ASSET\",\n" +
  472 + " \"id\": \"e52b0020-2a7a-11ec-94eb-213c95f54092\"\n" +
  473 + " },\n" +
  474 + " \"direction\": \"FROM\",\n" +
  475 + " \"maxLevel\": 1,\n" +
  476 + " \"fetchLastLevelOnly\": false,\n" +
  477 + " \"relationType\": \"Contains\",\n" +
  478 + " \"entityViewTypes\": [\n" +
  479 + " \"Concrete mixer\"\n" +
  480 + " ]\n" +
  481 + "}" +
  482 + MARKDOWN_CODE_BLOCK_END +
  483 + "";
  484 +
  485 + protected static final String EDGE_QUERY_FILTER = "\n\n## Edge Search Query\n\n" +
  486 + "Allows to filter edge instances that are related to the provided root entity. Filters related edge instances based on the relation type and set of edge types. " +
  487 + MAX_LEVEL_DESCRIPTION +
  488 + FETCH_LAST_LEVEL_ONLY_DESCRIPTION +
  489 + "The 'relationType' defines the type of the relation to search for. " +
  490 + "The 'deviceTypes' defines the type of the device to search for. " +
  491 + "The relation query calculates all related entities, even if they are filtered using different relation types, and then extracts only devices that match 'relationType' and 'deviceTypes' conditions.\n\n" +
  492 + "For example, this entity filter selects 'Factory' edge instances which are related to the asset with id 'e52b0020-2a7a-11ec-94eb-213c95f54092' using 'Contains' relation:\n\n" +
  493 + MARKDOWN_CODE_BLOCK_START +
  494 + "{\n" +
  495 + " \"type\": \"deviceSearchQuery\",\n" +
  496 + " \"rootEntity\": {\n" +
  497 + " \"entityType\": \"ASSET\",\n" +
  498 + " \"id\": \"e52b0020-2a7a-11ec-94eb-213c95f54092\"\n" +
  499 + " },\n" +
  500 + " \"direction\": \"FROM\",\n" +
  501 + " \"maxLevel\": 2,\n" +
  502 + " \"fetchLastLevelOnly\": true,\n" +
  503 + " \"relationType\": \"Contains\",\n" +
  504 + " \"edgeTypes\": [\n" +
  505 + " \"Factory\"\n" +
  506 + " ]\n" +
  507 + "}" +
  508 + MARKDOWN_CODE_BLOCK_END +
  509 + "";
  510 +
  511 + protected static final String EMPTY = "\n\n## Entity Type Filter\n\n" +
  512 + "Allows to filter multiple entities of the same type using the **'starts with'** expression over entity name. " +
  513 + "For example, this entity filter selects all devices which name starts with 'Air Quality':\n\n" +
  514 + MARKDOWN_CODE_BLOCK_START +
  515 + "" +
  516 + MARKDOWN_CODE_BLOCK_END +
  517 + "";
  518 +
  519 + protected static final String ENTITY_FILTERS =
  520 + "\n\n # Entity Filters" +
  521 + "\nEntity Filter body depends on the 'type' parameter. Let's review available entity filter types. In fact, they do correspond to available dashboard aliases." +
  522 + SINGLE_ENTITY + ENTITY_LIST + ENTITY_NAME + ENTITY_TYPE_FILTER + ASSET_TYPE + DEVICE_TYPE + EDGE_TYPE + ENTITY_VIEW_TYPE + API_USAGE + RELATIONS_QUERY_FILTER
  523 + + ASSET_QUERY_FILTER + DEVICE_QUERY_FILTER + EV_QUERY_FILTER + EDGE_QUERY_FILTER;
  524 +
  525 + protected static final String FILTER_KEY = "\n\n## Filter Key\n\n" +
  526 + "Filter Key defines either entity field, attribute or telemetry. It is a JSON object that consists the key name and type. " +
  527 + "The following filter key types are supported: \n\n" +
  528 + " * 'CLIENT_ATTRIBUTE' - used for client attributes; \n" +
  529 + " * 'SHARED_ATTRIBUTE' - used for shared attributes; \n" +
  530 + " * 'SERVER_ATTRIBUTE' - used for server attributes; \n" +
  531 + " * 'ATTRIBUTE' - used for any of the above; \n" +
  532 + " * 'TIME_SERIES' - used for time-series values; \n" +
  533 + " * 'ENTITY_FIELD' - used for accessing entity fields like 'name', 'label', etc. The list of available fields depends on the entity type; \n" +
  534 + " * 'ALARM_FIELD' - similar to entity field, but is used in alarm queries only; \n" +
  535 + "\n\n Let's review the example:\n\n" +
  536 + MARKDOWN_CODE_BLOCK_START +
  537 + "{\n" +
  538 + " \"type\": \"TIME_SERIES\",\n" +
  539 + " \"key\": \"temperature\"\n" +
  540 + "}" +
  541 + MARKDOWN_CODE_BLOCK_END +
  542 + "";
  543 +
  544 + protected static final String FILTER_PREDICATE = "\n\n## Filter Predicate\n\n" +
  545 + "Filter Predicate defines the logical expression to evaluate. The list of available operations depends on the filter value type, see above. " +
  546 + "Platform supports 4 predicate types: 'STRING', 'NUMERIC', 'BOOLEAN' and 'COMPLEX'. The last one allows to combine multiple operations over one filter key." +
  547 + "\n\nSimple predicate example to check 'value < 100': \n\n" +
  548 + MARKDOWN_CODE_BLOCK_START +
  549 + "{\n" +
  550 + " \"operation\": \"LESS\",\n" +
  551 + " \"value\": {\n" +
  552 + " \"defaultValue\": 100,\n" +
  553 + " \"dynamicValue\": null\n" +
  554 + " },\n" +
  555 + " \"type\": \"NUMERIC\"\n" +
  556 + "}" +
  557 + MARKDOWN_CODE_BLOCK_END +
  558 + "\n\nComplex predicate example, to check 'value < 10 or value > 20': \n\n" +
  559 + MARKDOWN_CODE_BLOCK_START +
  560 + "{\n" +
  561 + " \"type\": \"COMPLEX\",\n" +
  562 + " \"operation\": \"OR\",\n" +
  563 + " \"predicates\": [\n" +
  564 + " {\n" +
  565 + " \"operation\": \"LESS\",\n" +
  566 + " \"value\": {\n" +
  567 + " \"defaultValue\": 10,\n" +
  568 + " \"dynamicValue\": null\n" +
  569 + " },\n" +
  570 + " \"type\": \"NUMERIC\"\n" +
  571 + " },\n" +
  572 + " {\n" +
  573 + " \"operation\": \"GREATER\",\n" +
  574 + " \"value\": {\n" +
  575 + " \"defaultValue\": 20,\n" +
  576 + " \"dynamicValue\": null\n" +
  577 + " },\n" +
  578 + " \"type\": \"NUMERIC\"\n" +
  579 + " }\n" +
  580 + " ]\n" +
  581 + "}" +
  582 + MARKDOWN_CODE_BLOCK_END +
  583 + "\n\nMore complex predicate example, to check 'value < 10 or (value > 50 && value < 60)': \n\n" +
  584 + MARKDOWN_CODE_BLOCK_START +
  585 + "{\n" +
  586 + " \"type\": \"COMPLEX\",\n" +
  587 + " \"operation\": \"OR\",\n" +
  588 + " \"predicates\": [\n" +
  589 + " {\n" +
  590 + " \"operation\": \"LESS\",\n" +
  591 + " \"value\": {\n" +
  592 + " \"defaultValue\": 10,\n" +
  593 + " \"dynamicValue\": null\n" +
  594 + " },\n" +
  595 + " \"type\": \"NUMERIC\"\n" +
  596 + " },\n" +
  597 + " {\n" +
  598 + " \"type\": \"COMPLEX\",\n" +
  599 + " \"operation\": \"AND\",\n" +
  600 + " \"predicates\": [\n" +
  601 + " {\n" +
  602 + " \"operation\": \"GREATER\",\n" +
  603 + " \"value\": {\n" +
  604 + " \"defaultValue\": 50,\n" +
  605 + " \"dynamicValue\": null\n" +
  606 + " },\n" +
  607 + " \"type\": \"NUMERIC\"\n" +
  608 + " },\n" +
  609 + " {\n" +
  610 + " \"operation\": \"LESS\",\n" +
  611 + " \"value\": {\n" +
  612 + " \"defaultValue\": 60,\n" +
  613 + " \"dynamicValue\": null\n" +
  614 + " },\n" +
  615 + " \"type\": \"NUMERIC\"\n" +
  616 + " }\n" +
  617 + " ]\n" +
  618 + " }\n" +
  619 + " ]\n" +
  620 + "}" +
  621 + MARKDOWN_CODE_BLOCK_END +
  622 + "\n\n You may also want to replace hardcoded values (for example, temperature > 20) with the more dynamic " +
  623 + "expression (for example, temperature > 'value of the tenant attribute with key 'temperatureThreshold'). " +
  624 + "It is possible to use 'dynamicValue' to define attribute of the tenant, customer or user that is performing the API call. " +
  625 + "See example below: \n\n" +
  626 + MARKDOWN_CODE_BLOCK_START +
  627 + "{\n" +
  628 + " \"operation\": \"GREATER\",\n" +
  629 + " \"value\": {\n" +
  630 + " \"defaultValue\": 0,\n" +
  631 + " \"dynamicValue\": {\n" +
  632 + " \"sourceType\": \"CURRENT_USER\",\n" +
  633 + " \"sourceAttribute\": \"temperatureThreshold\"\n" +
  634 + " }\n" +
  635 + " },\n" +
  636 + " \"type\": \"NUMERIC\"\n" +
  637 + "}" +
  638 + MARKDOWN_CODE_BLOCK_END +
  639 + "\n\n Note that you may use 'CURRENT_USER', 'CURRENT_CUSTOMER' and 'CURRENT_TENANT' as a 'sourceType'. The 'defaultValue' is used when the attribute with such a name is not defined for the chosen source.";
  640 +
  641 + protected static final String KEY_FILTERS =
  642 + "\n\n # Key Filters" +
  643 + "\nKey Filter allows you to define complex logical expressions over entity field, attribute or latest time-series value. The filter is defined using 'key', 'valueType' and 'predicate' objects. " +
  644 + "Single Entity Query may have zero, one or multiple predicates. If multiple filters are defined, they are evaluated using logical 'AND'. " +
  645 + "The example below checks that temperature of the entity is above 20 degrees:" +
  646 + "\n\n" + MARKDOWN_CODE_BLOCK_START +
  647 + "{\n" +
  648 + " \"key\": {\n" +
  649 + " \"type\": \"TIME_SERIES\",\n" +
  650 + " \"key\": \"temperature\"\n" +
  651 + " },\n" +
  652 + " \"valueType\": \"NUMERIC\",\n" +
  653 + " \"predicate\": {\n" +
  654 + " \"operation\": \"GREATER\",\n" +
  655 + " \"value\": {\n" +
  656 + " \"defaultValue\": 20,\n" +
  657 + " \"dynamicValue\": null\n" +
  658 + " },\n" +
  659 + " \"type\": \"NUMERIC\"\n" +
  660 + " }\n" +
  661 + "}" +
  662 + MARKDOWN_CODE_BLOCK_END +
  663 + "\n\n Now let's review 'key', 'valueType' and 'predicate' objects in detail."
  664 + + FILTER_KEY + FILTER_VALUE_TYPE + FILTER_PREDICATE;
  665 +
  666 + protected static final String ENTITY_COUNT_QUERY_DESCRIPTION =
  667 + "Allows to run complex queries to search the count of platform entities (devices, assets, customers, etc) " +
  668 + "based on the combination of main entity filter and multiple key filters. Returns the number of entities that match the query definition.\n\n" +
  669 + "# Query Definition\n\n" +
  670 + "\n\nMain **entity filter** is mandatory and defines generic search criteria. " +
  671 + "For example, \"find all devices with profile 'Moisture Sensor'\" or \"Find all devices related to asset 'Building A'\"" +
  672 + "\n\nOptional **key filters** allow to filter results of the entity filter by complex criteria against " +
  673 + "main entity fields (name, label, type, etc), attributes and telemetry. " +
  674 + "For example, \"temperature > 20 or temperature< 10\" or \"name starts with 'T', and attribute 'model' is 'T1000', and timeseries field 'batteryLevel' > 40\"." +
  675 + "\n\nLet's review the example:" +
  676 + "\n\n" + MARKDOWN_CODE_BLOCK_START +
  677 + "{\n" +
  678 + " \"entityFilter\": {\n" +
  679 + " \"type\": \"entityType\",\n" +
  680 + " \"entityType\": \"DEVICE\"\n" +
  681 + " },\n" +
  682 + " \"keyFilters\": [\n" +
  683 + " {\n" +
  684 + " \"key\": {\n" +
  685 + " \"type\": \"ATTRIBUTE\",\n" +
  686 + " \"key\": \"active\"\n" +
  687 + " },\n" +
  688 + " \"valueType\": \"BOOLEAN\",\n" +
  689 + " \"predicate\": {\n" +
  690 + " \"operation\": \"EQUAL\",\n" +
  691 + " \"value\": {\n" +
  692 + " \"defaultValue\": true,\n" +
  693 + " \"dynamicValue\": null\n" +
  694 + " },\n" +
  695 + " \"type\": \"BOOLEAN\"\n" +
  696 + " }\n" +
  697 + " }\n" +
  698 + " ]\n" +
  699 + "}" +
  700 + MARKDOWN_CODE_BLOCK_END +
  701 + "\n\n Example mentioned above search all devices which have attribute 'active' set to 'true'. Now let's review available entity filters and key filters syntax:" +
  702 + ENTITY_FILTERS +
  703 + KEY_FILTERS +
  704 + ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
  705 +
  706 + protected static final String ENTITY_DATA_QUERY_DESCRIPTION =
  707 + "Allows to run complex queries over platform entities (devices, assets, customers, etc) " +
  708 + "based on the combination of main entity filter and multiple key filters. " +
  709 + "Returns the paginated result of the query that contains requested entity fields and latest values of requested attributes and time-series data.\n\n" +
  710 + "# Query Definition\n\n" +
  711 + "\n\nMain **entity filter** is mandatory and defines generic search criteria. " +
  712 + "For example, \"find all devices with profile 'Moisture Sensor'\" or \"Find all devices related to asset 'Building A'\"" +
  713 + "\n\nOptional **key filters** allow to filter results of the **entity filter** by complex criteria against " +
  714 + "main entity fields (name, label, type, etc), attributes and telemetry. " +
  715 + "For example, \"temperature > 20 or temperature< 10\" or \"name starts with 'T', and attribute 'model' is 'T1000', and timeseries field 'batteryLevel' > 40\"." +
  716 + "\n\nThe **entity fields** and **latest values** contains list of entity fields and latest attribute/telemetry fields to fetch for each entity." +
  717 + "\n\nThe **page link** contains information about the page to fetch and the sort ordering." +
  718 + "\n\nLet's review the example:" +
  719 + "\n\n" + MARKDOWN_CODE_BLOCK_START +
  720 + "{\n" +
  721 + " \"entityFilter\": {\n" +
  722 + " \"type\": \"entityType\",\n" +
  723 + " \"resolveMultiple\": true,\n" +
  724 + " \"entityType\": \"DEVICE\"\n" +
  725 + " },\n" +
  726 + " \"keyFilters\": [\n" +
  727 + " {\n" +
  728 + " \"key\": {\n" +
  729 + " \"type\": \"TIME_SERIES\",\n" +
  730 + " \"key\": \"temperature\"\n" +
  731 + " },\n" +
  732 + " \"valueType\": \"NUMERIC\",\n" +
  733 + " \"predicate\": {\n" +
  734 + " \"operation\": \"GREATER\",\n" +
  735 + " \"value\": {\n" +
  736 + " \"defaultValue\": 0,\n" +
  737 + " \"dynamicValue\": {\n" +
  738 + " \"sourceType\": \"CURRENT_USER\",\n" +
  739 + " \"sourceAttribute\": \"temperatureThreshold\",\n" +
  740 + " \"inherit\": false\n" +
  741 + " }\n" +
  742 + " },\n" +
  743 + " \"type\": \"NUMERIC\"\n" +
  744 + " }\n" +
  745 + " }\n" +
  746 + " ],\n" +
  747 + " \"entityFields\": [\n" +
  748 + " {\n" +
  749 + " \"type\": \"ENTITY_FIELD\",\n" +
  750 + " \"key\": \"name\"\n" +
  751 + " },\n" +
  752 + " {\n" +
  753 + " \"type\": \"ENTITY_FIELD\",\n" +
  754 + " \"key\": \"label\"\n" +
  755 + " },\n" +
  756 + " {\n" +
  757 + " \"type\": \"ENTITY_FIELD\",\n" +
  758 + " \"key\": \"additionalInfo\"\n" +
  759 + " }\n" +
  760 + " ],\n" +
  761 + " \"latestValues\": [\n" +
  762 + " {\n" +
  763 + " \"type\": \"ATTRIBUTE\",\n" +
  764 + " \"key\": \"model\"\n" +
  765 + " },\n" +
  766 + " {\n" +
  767 + " \"type\": \"TIME_SERIES\",\n" +
  768 + " \"key\": \"temperature\"\n" +
  769 + " }\n" +
  770 + " ],\n" +
  771 + " \"pageLink\": {\n" +
  772 + " \"page\": 0,\n" +
  773 + " \"pageSize\": 10,\n" +
  774 + " \"sortOrder\": {\n" +
  775 + " \"key\": {\n" +
  776 + " \"key\": \"name\",\n" +
  777 + " \"type\": \"ENTITY_FIELD\"\n" +
  778 + " },\n" +
  779 + " \"direction\": \"ASC\"\n" +
  780 + " }\n" +
  781 + " }\n" +
  782 + "}" +
  783 + MARKDOWN_CODE_BLOCK_END +
  784 + "\n\n Example mentioned above search all devices which have attribute 'active' set to 'true'. Now let's review available entity filters and key filters syntax:" +
  785 + ENTITY_FILTERS +
  786 + KEY_FILTERS +
  787 + ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
  788 +
  789 +
  790 + protected static final String ALARM_DATA_QUERY_DESCRIPTION = "This method description defines how Alarm Data Query extends the Entity Data Query. " +
  791 + "See method 'Find Entity Data by Query' first to get the info about 'Entity Data Query'." +
  792 + "\n\n The platform will first search the entities that match the entity and key filters. Then, the platform will use 'Alarm Page Link' to filter the alarms related to those entities. " +
  793 + "Finally, platform fetch the properties of alarm that are defined in the **'alarmFields'** and combine them with the other entity, attribute and latest time-series fields to return the result. " +
  794 + "\n\n See example of the alarm query below. The query will search first 100 active alarms with type 'Temperature Alarm' or 'Fire Alarm' for any device with current temperature > 0. " +
  795 + "The query will return combination of the entity fields: name of the device, device model and latest temperature reading and alarms fields: createdTime, type, severity and status: " +
  796 + "\n\n" + MARKDOWN_CODE_BLOCK_START +
  797 + "{\n" +
  798 + " \"entityFilter\": {\n" +
  799 + " \"type\": \"entityType\",\n" +
  800 + " \"resolveMultiple\": true,\n" +
  801 + " \"entityType\": \"DEVICE\"\n" +
  802 + " },\n" +
  803 + " \"pageLink\": {\n" +
  804 + " \"page\": 0,\n" +
  805 + " \"pageSize\": 100,\n" +
  806 + " \"textSearch\": null,\n" +
  807 + " \"searchPropagatedAlarms\": false,\n" +
  808 + " \"statusList\": [\n" +
  809 + " \"ACTIVE\"\n" +
  810 + " ],\n" +
  811 + " \"severityList\": [\n" +
  812 + " \"CRITICAL\",\n" +
  813 + " \"MAJOR\"\n" +
  814 + " ],\n" +
  815 + " \"typeList\": [\n" +
  816 + " \"Temperature Alarm\",\n" +
  817 + " \"Fire Alarm\"\n" +
  818 + " ],\n" +
  819 + " \"sortOrder\": {\n" +
  820 + " \"key\": {\n" +
  821 + " \"key\": \"createdTime\",\n" +
  822 + " \"type\": \"ALARM_FIELD\"\n" +
  823 + " },\n" +
  824 + " \"direction\": \"DESC\"\n" +
  825 + " },\n" +
  826 + " \"timeWindow\": 86400000\n" +
  827 + " },\n" +
  828 + " \"keyFilters\": [\n" +
  829 + " {\n" +
  830 + " \"key\": {\n" +
  831 + " \"type\": \"TIME_SERIES\",\n" +
  832 + " \"key\": \"temperature\"\n" +
  833 + " },\n" +
  834 + " \"valueType\": \"NUMERIC\",\n" +
  835 + " \"predicate\": {\n" +
  836 + " \"operation\": \"GREATER\",\n" +
  837 + " \"value\": {\n" +
  838 + " \"defaultValue\": 0,\n" +
  839 + " \"dynamicValue\": null\n" +
  840 + " },\n" +
  841 + " \"type\": \"NUMERIC\"\n" +
  842 + " }\n" +
  843 + " }\n" +
  844 + " ],\n" +
  845 + " \"alarmFields\": [\n" +
  846 + " {\n" +
  847 + " \"type\": \"ALARM_FIELD\",\n" +
  848 + " \"key\": \"createdTime\"\n" +
  849 + " },\n" +
  850 + " {\n" +
  851 + " \"type\": \"ALARM_FIELD\",\n" +
  852 + " \"key\": \"type\"\n" +
  853 + " },\n" +
  854 + " {\n" +
  855 + " \"type\": \"ALARM_FIELD\",\n" +
  856 + " \"key\": \"severity\"\n" +
  857 + " },\n" +
  858 + " {\n" +
  859 + " \"type\": \"ALARM_FIELD\",\n" +
  860 + " \"key\": \"status\"\n" +
  861 + " }\n" +
  862 + " ],\n" +
  863 + " \"entityFields\": [\n" +
  864 + " {\n" +
  865 + " \"type\": \"ENTITY_FIELD\",\n" +
  866 + " \"key\": \"name\"\n" +
  867 + " }\n" +
  868 + " ],\n" +
  869 + " \"latestValues\": [\n" +
  870 + " {\n" +
  871 + " \"type\": \"ATTRIBUTE\",\n" +
  872 + " \"key\": \"model\"\n" +
  873 + " },\n" +
  874 + " {\n" +
  875 + " \"type\": \"TIME_SERIES\",\n" +
  876 + " \"key\": \"temperature\"\n" +
  877 + " }\n" +
  878 + " ]\n" +
  879 + "}" +
  880 + MARKDOWN_CODE_BLOCK_END +
  881 + "";
  882 +
  883 + protected static final String COAP_TRANSPORT_CONFIGURATION_EXAMPLE = MARKDOWN_CODE_BLOCK_START +
  884 + "{\n" +
  885 + " \"type\":\"COAP\",\n" +
  886 + " \"clientSettings\":{\n" +
  887 + " \"edrxCycle\":null,\n" +
  888 + " \"powerMode\":\"DRX\",\n" +
  889 + " \"psmActivityTimer\":null,\n" +
  890 + " \"pagingTransmissionWindow\":null\n" +
  891 + " },\n" +
  892 + " \"coapDeviceTypeConfiguration\":{\n" +
  893 + " \"coapDeviceType\":\"DEFAULT\",\n" +
  894 + " \"transportPayloadTypeConfiguration\":{\n" +
  895 + " \"transportPayloadType\":\"JSON\"\n" +
  896 + " }\n" +
  897 + " }\n" +
  898 + "}"
  899 + + MARKDOWN_CODE_BLOCK_END;
  900 +
  901 + protected static final String TRANSPORT_CONFIGURATION = "# Transport Configuration" + NEW_LINE +
  902 + "5 transport configuration types are available:\n" +
  903 + " * 'DEFAULT';\n" +
  904 + " * 'MQTT';\n" +
  905 + " * 'LWM2M';\n" +
  906 + " * 'COAP';\n" +
  907 + " * 'SNMP'." + NEW_LINE + "Default type supports basic MQTT, HTTP, CoAP and LwM2M transports. " +
  908 + "Please refer to the [docs](https://thingsboard.io/docs/user-guide/device-profiles/#transport-configuration) for more details about other types.\n" +
  909 + "\nSee another example of COAP transport configuration below:" + NEW_LINE + COAP_TRANSPORT_CONFIGURATION_EXAMPLE;
  910 +
  911 + protected static final String ALARM_FILTER_KEY = "## Alarm Filter Key" + NEW_LINE +
  912 + "Filter Key defines either entity field, attribute, telemetry or constant. It is a JSON object that consists the key name and type. The following filter key types are supported:\n" +
  913 + " * 'ATTRIBUTE' - used for attributes values;\n" +
  914 + " * 'TIME_SERIES' - used for time-series values;\n" +
  915 + " * 'ENTITY_FIELD' - used for accessing entity fields like 'name', 'label', etc. The list of available fields depends on the entity type;\n" +
  916 + " * 'CONSTANT' - constant value specified." + NEW_LINE + "Let's review the example:" + NEW_LINE +
  917 + MARKDOWN_CODE_BLOCK_START +
  918 + "{\n" +
  919 + " \"type\": \"TIME_SERIES\",\n" +
  920 + " \"key\": \"temperature\"\n" +
  921 + "}" +
  922 + MARKDOWN_CODE_BLOCK_END;
  923 +
  924 + protected static final String DEVICE_PROFILE_FILTER_PREDICATE = NEW_LINE + "## Filter Predicate" + NEW_LINE +
  925 + "Filter Predicate defines the logical expression to evaluate. The list of available operations depends on the filter value type, see above. " +
  926 + "Platform supports 4 predicate types: 'STRING', 'NUMERIC', 'BOOLEAN' and 'COMPLEX'. The last one allows to combine multiple operations over one filter key." + NEW_LINE +
  927 + "Simple predicate example to check 'value < 100': " + NEW_LINE +
  928 + MARKDOWN_CODE_BLOCK_START +
  929 + "{\n" +
  930 + " \"operation\": \"LESS\",\n" +
  931 + " \"value\": {\n" +
  932 + " \"userValue\": null,\n" +
  933 + " \"defaultValue\": 100,\n" +
  934 + " \"dynamicValue\": null\n" +
  935 + " },\n" +
  936 + " \"type\": \"NUMERIC\"\n" +
  937 + "}" +
  938 + MARKDOWN_CODE_BLOCK_END + NEW_LINE +
  939 + "Complex predicate example, to check 'value < 10 or value > 20': " + NEW_LINE +
  940 + MARKDOWN_CODE_BLOCK_START +
  941 + "{\n" +
  942 + " \"type\": \"COMPLEX\",\n" +
  943 + " \"operation\": \"OR\",\n" +
  944 + " \"predicates\": [\n" +
  945 + " {\n" +
  946 + " \"operation\": \"LESS\",\n" +
  947 + " \"value\": {\n" +
  948 + " \"userValue\": null,\n" +
  949 + " \"defaultValue\": 10,\n" +
  950 + " \"dynamicValue\": null\n" +
  951 + " },\n" +
  952 + " \"type\": \"NUMERIC\"\n" +
  953 + " },\n" +
  954 + " {\n" +
  955 + " \"operation\": \"GREATER\",\n" +
  956 + " \"value\": {\n" +
  957 + " \"userValue\": null,\n" +
  958 + " \"defaultValue\": 20,\n" +
  959 + " \"dynamicValue\": null\n" +
  960 + " },\n" +
  961 + " \"type\": \"NUMERIC\"\n" +
  962 + " }\n" +
  963 + " ]\n" +
  964 + "}" +
  965 + MARKDOWN_CODE_BLOCK_END + NEW_LINE +
  966 + "More complex predicate example, to check 'value < 10 or (value > 50 && value < 60)': " + NEW_LINE +
  967 + MARKDOWN_CODE_BLOCK_START +
  968 + "{\n" +
  969 + " \"type\": \"COMPLEX\",\n" +
  970 + " \"operation\": \"OR\",\n" +
  971 + " \"predicates\": [\n" +
  972 + " {\n" +
  973 + " \"operation\": \"LESS\",\n" +
  974 + " \"value\": {\n" +
  975 + " \"userValue\": null,\n" +
  976 + " \"defaultValue\": 10,\n" +
  977 + " \"dynamicValue\": null\n" +
  978 + " },\n" +
  979 + " \"type\": \"NUMERIC\"\n" +
  980 + " },\n" +
  981 + " {\n" +
  982 + " \"type\": \"COMPLEX\",\n" +
  983 + " \"operation\": \"AND\",\n" +
  984 + " \"predicates\": [\n" +
  985 + " {\n" +
  986 + " \"operation\": \"GREATER\",\n" +
  987 + " \"value\": {\n" +
  988 + " \"userValue\": null,\n" +
  989 + " \"defaultValue\": 50,\n" +
  990 + " \"dynamicValue\": null\n" +
  991 + " },\n" +
  992 + " \"type\": \"NUMERIC\"\n" +
  993 + " },\n" +
  994 + " {\n" +
  995 + " \"operation\": \"LESS\",\n" +
  996 + " \"value\": {\n" +
  997 + " \"userValue\": null,\n" +
  998 + " \"defaultValue\": 60,\n" +
  999 + " \"dynamicValue\": null\n" +
  1000 + " },\n" +
  1001 + " \"type\": \"NUMERIC\"\n" +
  1002 + " }\n" +
  1003 + " ]\n" +
  1004 + " }\n" +
  1005 + " ]\n" +
  1006 + "}" +
  1007 + MARKDOWN_CODE_BLOCK_END + NEW_LINE +
  1008 + "You may also want to replace hardcoded values (for example, temperature > 20) with the more dynamic " +
  1009 + "expression (for example, temperature > value of the tenant attribute with key 'temperatureThreshold'). " +
  1010 + "It is possible to use 'dynamicValue' to define attribute of the tenant, customer or device. " +
  1011 + "See example below:" + NEW_LINE +
  1012 + MARKDOWN_CODE_BLOCK_START +
  1013 + "{\n" +
  1014 + " \"operation\": \"GREATER\",\n" +
  1015 + " \"value\": {\n" +
  1016 + " \"userValue\": null,\n" +
  1017 + " \"defaultValue\": 0,\n" +
  1018 + " \"dynamicValue\": {\n" +
  1019 + " \"inherit\": false,\n" +
  1020 + " \"sourceType\": \"CURRENT_TENANT\",\n" +
  1021 + " \"sourceAttribute\": \"temperatureThreshold\"\n" +
  1022 + " }\n" +
  1023 + " },\n" +
  1024 + " \"type\": \"NUMERIC\"\n" +
  1025 + "}" +
  1026 + MARKDOWN_CODE_BLOCK_END + NEW_LINE +
  1027 + "Note that you may use 'CURRENT_DEVICE', 'CURRENT_CUSTOMER' and 'CURRENT_TENANT' as a 'sourceType'. The 'defaultValue' is used when the attribute with such a name is not defined for the chosen source. " +
  1028 + "The 'sourceAttribute' can be inherited from the owner of the specified 'sourceType' if 'inherit' is set to true.";
  1029 +
  1030 + protected static final String KEY_FILTERS_DESCRIPTION = "# Key Filters" + NEW_LINE +
  1031 + "Key filter objects are created under the **'condition'** array. They allow you to define complex logical expressions over entity field, " +
  1032 + "attribute, latest time-series value or constant. The filter is defined using 'key', 'valueType', " +
  1033 + "'value' (refers to the value of the 'CONSTANT' alarm filter key type) and 'predicate' objects. Let's review each object:" + NEW_LINE +
  1034 + ALARM_FILTER_KEY + FILTER_VALUE_TYPE + NEW_LINE + DEVICE_PROFILE_FILTER_PREDICATE + NEW_LINE;
  1035 +
  1036 + protected static final String DEFAULT_DEVICE_PROFILE_DATA_EXAMPLE = MARKDOWN_CODE_BLOCK_START + "{\n" +
  1037 + " \"alarms\":[\n" +
  1038 + " ],\n" +
  1039 + " \"configuration\":{\n" +
  1040 + " \"type\":\"DEFAULT\"\n" +
  1041 + " },\n" +
  1042 + " \"provisionConfiguration\":{\n" +
  1043 + " \"type\":\"DISABLED\",\n" +
  1044 + " \"provisionDeviceSecret\":null\n" +
  1045 + " },\n" +
  1046 + " \"transportConfiguration\":{\n" +
  1047 + " \"type\":\"DEFAULT\"\n" +
  1048 + " }\n" +
  1049 + "}" + MARKDOWN_CODE_BLOCK_END;
  1050 +
  1051 + protected static final String CUSTOM_DEVICE_PROFILE_DATA_EXAMPLE = MARKDOWN_CODE_BLOCK_START + "{\n" +
  1052 + " \"alarms\":[\n" +
  1053 + " {\n" +
  1054 + " \"id\":\"2492b935-1226-59e9-8615-17d8978a4f93\",\n" +
  1055 + " \"alarmType\":\"Temperature Alarm\",\n" +
  1056 + " \"clearRule\":{\n" +
  1057 + " \"schedule\":null,\n" +
  1058 + " \"condition\":{\n" +
  1059 + " \"spec\":{\n" +
  1060 + " \"type\":\"SIMPLE\"\n" +
  1061 + " },\n" +
  1062 + " \"condition\":[\n" +
  1063 + " {\n" +
  1064 + " \"key\":{\n" +
  1065 + " \"key\":\"temperature\",\n" +
  1066 + " \"type\":\"TIME_SERIES\"\n" +
  1067 + " },\n" +
  1068 + " \"value\":null,\n" +
  1069 + " \"predicate\":{\n" +
  1070 + " \"type\":\"NUMERIC\",\n" +
  1071 + " \"value\":{\n" +
  1072 + " \"userValue\":null,\n" +
  1073 + " \"defaultValue\":30.0,\n" +
  1074 + " \"dynamicValue\":null\n" +
  1075 + " },\n" +
  1076 + " \"operation\":\"LESS\"\n" +
  1077 + " },\n" +
  1078 + " \"valueType\":\"NUMERIC\"\n" +
  1079 + " }\n" +
  1080 + " ]\n" +
  1081 + " },\n" +
  1082 + " \"dashboardId\":null,\n" +
  1083 + " \"alarmDetails\":null\n" +
  1084 + " },\n" +
  1085 + " \"propagate\":false,\n" +
  1086 + " \"createRules\":{\n" +
  1087 + " \"MAJOR\":{\n" +
  1088 + " \"schedule\":{\n" +
  1089 + " \"type\":\"SPECIFIC_TIME\",\n" +
  1090 + " \"endsOn\":64800000,\n" +
  1091 + " \"startsOn\":43200000,\n" +
  1092 + " \"timezone\":\"Europe/Kiev\",\n" +
  1093 + " \"daysOfWeek\":[\n" +
  1094 + " 1,\n" +
  1095 + " 3,\n" +
  1096 + " 5\n" +
  1097 + " ]\n" +
  1098 + " },\n" +
  1099 + " \"condition\":{\n" +
  1100 + " \"spec\":{\n" +
  1101 + " \"type\":\"DURATION\",\n" +
  1102 + " \"unit\":\"MINUTES\",\n" +
  1103 + " \"predicate\":{\n" +
  1104 + " \"userValue\":null,\n" +
  1105 + " \"defaultValue\":30,\n" +
  1106 + " \"dynamicValue\":null\n" +
  1107 + " }\n" +
  1108 + " },\n" +
  1109 + " \"condition\":[\n" +
  1110 + " {\n" +
  1111 + " \"key\":{\n" +
  1112 + " \"key\":\"temperature\",\n" +
  1113 + " \"type\":\"TIME_SERIES\"\n" +
  1114 + " },\n" +
  1115 + " \"value\":null,\n" +
  1116 + " \"predicate\":{\n" +
  1117 + " \"type\":\"COMPLEX\",\n" +
  1118 + " \"operation\":\"OR\",\n" +
  1119 + " \"predicates\":[\n" +
  1120 + " {\n" +
  1121 + " \"type\":\"NUMERIC\",\n" +
  1122 + " \"value\":{\n" +
  1123 + " \"userValue\":null,\n" +
  1124 + " \"defaultValue\":50.0,\n" +
  1125 + " \"dynamicValue\":null\n" +
  1126 + " },\n" +
  1127 + " \"operation\":\"LESS_OR_EQUAL\"\n" +
  1128 + " },\n" +
  1129 + " {\n" +
  1130 + " \"type\":\"NUMERIC\",\n" +
  1131 + " \"value\":{\n" +
  1132 + " \"userValue\":null,\n" +
  1133 + " \"defaultValue\":30.0,\n" +
  1134 + " \"dynamicValue\":null\n" +
  1135 + " },\n" +
  1136 + " \"operation\":\"GREATER\"\n" +
  1137 + " }\n" +
  1138 + " ]\n" +
  1139 + " },\n" +
  1140 + " \"valueType\":\"NUMERIC\"\n" +
  1141 + " }\n" +
  1142 + " ]\n" +
  1143 + " },\n" +
  1144 + " \"dashboardId\":null,\n" +
  1145 + " \"alarmDetails\":null\n" +
  1146 + " },\n" +
  1147 + " \"WARNING\":{\n" +
  1148 + " \"schedule\":{\n" +
  1149 + " \"type\":\"CUSTOM\",\n" +
  1150 + " \"items\":[\n" +
  1151 + " {\n" +
  1152 + " \"endsOn\":0,\n" +
  1153 + " \"enabled\":false,\n" +
  1154 + " \"startsOn\":0,\n" +
  1155 + " \"dayOfWeek\":1\n" +
  1156 + " },\n" +
  1157 + " {\n" +
  1158 + " \"endsOn\":64800000,\n" +
  1159 + " \"enabled\":true,\n" +
  1160 + " \"startsOn\":43200000,\n" +
  1161 + " \"dayOfWeek\":2\n" +
  1162 + " },\n" +
  1163 + " {\n" +
  1164 + " \"endsOn\":0,\n" +
  1165 + " \"enabled\":false,\n" +
  1166 + " \"startsOn\":0,\n" +
  1167 + " \"dayOfWeek\":3\n" +
  1168 + " },\n" +
  1169 + " {\n" +
  1170 + " \"endsOn\":57600000,\n" +
  1171 + " \"enabled\":true,\n" +
  1172 + " \"startsOn\":36000000,\n" +
  1173 + " \"dayOfWeek\":4\n" +
  1174 + " },\n" +
  1175 + " {\n" +
  1176 + " \"endsOn\":0,\n" +
  1177 + " \"enabled\":false,\n" +
  1178 + " \"startsOn\":0,\n" +
  1179 + " \"dayOfWeek\":5\n" +
  1180 + " },\n" +
  1181 + " {\n" +
  1182 + " \"endsOn\":0,\n" +
  1183 + " \"enabled\":false,\n" +
  1184 + " \"startsOn\":0,\n" +
  1185 + " \"dayOfWeek\":6\n" +
  1186 + " },\n" +
  1187 + " {\n" +
  1188 + " \"endsOn\":0,\n" +
  1189 + " \"enabled\":false,\n" +
  1190 + " \"startsOn\":0,\n" +
  1191 + " \"dayOfWeek\":7\n" +
  1192 + " }\n" +
  1193 + " ],\n" +
  1194 + " \"timezone\":\"Europe/Kiev\"\n" +
  1195 + " },\n" +
  1196 + " \"condition\":{\n" +
  1197 + " \"spec\":{\n" +
  1198 + " \"type\":\"REPEATING\",\n" +
  1199 + " \"predicate\":{\n" +
  1200 + " \"userValue\":null,\n" +
  1201 + " \"defaultValue\":5,\n" +
  1202 + " \"dynamicValue\":null\n" +
  1203 + " }\n" +
  1204 + " },\n" +
  1205 + " \"condition\":[\n" +
  1206 + " {\n" +
  1207 + " \"key\":{\n" +
  1208 + " \"key\":\"tempConstant\",\n" +
  1209 + " \"type\":\"CONSTANT\"\n" +
  1210 + " },\n" +
  1211 + " \"value\":30,\n" +
  1212 + " \"predicate\":{\n" +
  1213 + " \"type\":\"NUMERIC\",\n" +
  1214 + " \"value\":{\n" +
  1215 + " \"userValue\":null,\n" +
  1216 + " \"defaultValue\":0.0,\n" +
  1217 + " \"dynamicValue\":{\n" +
  1218 + " \"inherit\":false,\n" +
  1219 + " \"sourceType\":\"CURRENT_DEVICE\",\n" +
  1220 + " \"sourceAttribute\":\"tempThreshold\"\n" +
  1221 + " }\n" +
  1222 + " },\n" +
  1223 + " \"operation\":\"EQUAL\"\n" +
  1224 + " },\n" +
  1225 + " \"valueType\":\"NUMERIC\"\n" +
  1226 + " }\n" +
  1227 + " ]\n" +
  1228 + " },\n" +
  1229 + " \"dashboardId\":null,\n" +
  1230 + " \"alarmDetails\":null\n" +
  1231 + " },\n" +
  1232 + " \"CRITICAL\":{\n" +
  1233 + " \"schedule\":null,\n" +
  1234 + " \"condition\":{\n" +
  1235 + " \"spec\":{\n" +
  1236 + " \"type\":\"SIMPLE\"\n" +
  1237 + " },\n" +
  1238 + " \"condition\":[\n" +
  1239 + " {\n" +
  1240 + " \"key\":{\n" +
  1241 + " \"key\":\"temperature\",\n" +
  1242 + " \"type\":\"TIME_SERIES\"\n" +
  1243 + " },\n" +
  1244 + " \"value\":null,\n" +
  1245 + " \"predicate\":{\n" +
  1246 + " \"type\":\"NUMERIC\",\n" +
  1247 + " \"value\":{\n" +
  1248 + " \"userValue\":null,\n" +
  1249 + " \"defaultValue\":50.0,\n" +
  1250 + " \"dynamicValue\":null\n" +
  1251 + " },\n" +
  1252 + " \"operation\":\"GREATER\"\n" +
  1253 + " },\n" +
  1254 + " \"valueType\":\"NUMERIC\"\n" +
  1255 + " }\n" +
  1256 + " ]\n" +
  1257 + " },\n" +
  1258 + " \"dashboardId\":null,\n" +
  1259 + " \"alarmDetails\":null\n" +
  1260 + " }\n" +
  1261 + " },\n" +
  1262 + " \"propagateRelationTypes\":null\n" +
  1263 + " }\n" +
  1264 + " ],\n" +
  1265 + " \"configuration\":{\n" +
  1266 + " \"type\":\"DEFAULT\"\n" +
  1267 + " },\n" +
  1268 + " \"provisionConfiguration\":{\n" +
  1269 + " \"type\":\"ALLOW_CREATE_NEW_DEVICES\",\n" +
  1270 + " \"provisionDeviceSecret\":\"vaxb9hzqdbz3oqukvomg\"\n" +
  1271 + " },\n" +
  1272 + " \"transportConfiguration\":{\n" +
  1273 + " \"type\":\"MQTT\",\n" +
  1274 + " \"deviceTelemetryTopic\":\"v1/devices/me/telemetry\",\n" +
  1275 + " \"deviceAttributesTopic\":\"v1/devices/me/attributes\",\n" +
  1276 + " \"transportPayloadTypeConfiguration\":{\n" +
  1277 + " \"transportPayloadType\":\"PROTOBUF\",\n" +
  1278 + " \"deviceTelemetryProtoSchema\":\"syntax =\\\"proto3\\\";\\npackage telemetry;\\n\\nmessage SensorDataReading {\\n\\n optional double temperature = 1;\\n optional double humidity = 2;\\n InnerObject innerObject = 3;\\n\\n message InnerObject {\\n optional string key1 = 1;\\n optional bool key2 = 2;\\n optional double key3 = 3;\\n optional int32 key4 = 4;\\n optional string key5 = 5;\\n }\\n}\",\n" +
  1279 + " \"deviceAttributesProtoSchema\":\"syntax =\\\"proto3\\\";\\npackage attributes;\\n\\nmessage SensorConfiguration {\\n optional string firmwareVersion = 1;\\n optional string serialNumber = 2;\\n}\",\n" +
  1280 + " \"deviceRpcRequestProtoSchema\":\"syntax =\\\"proto3\\\";\\npackage rpc;\\n\\nmessage RpcRequestMsg {\\n optional string method = 1;\\n optional int32 requestId = 2;\\n optional string params = 3;\\n}\",\n" +
  1281 + " \"deviceRpcResponseProtoSchema\":\"syntax =\\\"proto3\\\";\\npackage rpc;\\n\\nmessage RpcResponseMsg {\\n optional string payload = 1;\\n}\"\n" +
  1282 + " }\n" +
  1283 + " }\n" +
  1284 + "}" + MARKDOWN_CODE_BLOCK_END;
  1285 + protected static final String DEVICE_PROFILE_DATA_DEFINITION = NEW_LINE + "# Device profile data definition" + NEW_LINE +
  1286 + "Device profile data object contains alarm rules configuration, device provision strategy and transport type configuration for device connectivity. Let's review some examples. " +
  1287 + "First one is the default device profile data configuration and second one - the custom one. " +
  1288 + NEW_LINE + DEFAULT_DEVICE_PROFILE_DATA_EXAMPLE + NEW_LINE + CUSTOM_DEVICE_PROFILE_DATA_EXAMPLE +
  1289 + NEW_LINE + "Let's review some specific objects examples related to the device profile configuration:";
  1290 +
  1291 + protected static final String ALARM_SCHEDULE = NEW_LINE + "# Alarm Schedule" + NEW_LINE +
  1292 + "Alarm Schedule JSON object represents the time interval during which the alarm rule is active. Note, " +
  1293 + NEW_LINE + DEVICE_PROFILE_ALARM_SCHEDULE_ALWAYS_EXAMPLE + NEW_LINE + "means alarm rule is active all the time. " +
  1294 + "**'daysOfWeek'** field represents Monday as 1, Tuesday as 2 and so on. **'startsOn'** and **'endsOn'** fields represent hours in millis (e.g. 64800000 = 18:00 or 6pm). " +
  1295 + "**'enabled'** flag specifies if item in a custom rule is active for specific day of the week:" + NEW_LINE +
  1296 + "## Specific Time Schedule" + NEW_LINE +
  1297 + DEVICE_PROFILE_ALARM_SCHEDULE_SPECIFIC_TIME_EXAMPLE + NEW_LINE +
  1298 + "## Custom Schedule" +
  1299 + NEW_LINE + DEVICE_PROFILE_ALARM_SCHEDULE_CUSTOM_EXAMPLE + NEW_LINE;
  1300 +
  1301 + protected static final String ALARM_CONDITION_TYPE = "# Alarm condition type (**'spec'**)" + NEW_LINE +
  1302 + "Alarm condition type can be either simple, duration, or repeating. For example, 5 times in a row or during 5 minutes." + NEW_LINE +
  1303 + "Note, **'userValue'** field is not used and reserved for future usage, **'dynamicValue'** is used for condition appliance by using the value of the **'sourceAttribute'** " +
  1304 + "or else **'defaultValue'** is used (if **'sourceAttribute'** is absent).\n" +
  1305 + "\n**'sourceType'** of the **'sourceAttribute'** can be: \n" +
  1306 + " * 'CURRENT_DEVICE';\n" +
  1307 + " * 'CURRENT_CUSTOMER';\n" +
  1308 + " * 'CURRENT_TENANT'." + NEW_LINE +
  1309 + "**'sourceAttribute'** can be inherited from the owner if **'inherit'** is set to true (for CURRENT_DEVICE and CURRENT_CUSTOMER)." + NEW_LINE +
  1310 + "## Repeating alarm condition" + NEW_LINE +
  1311 + DEVICE_PROFILE_ALARM_CONDITION_REPEATING_EXAMPLE + NEW_LINE +
  1312 + "## Duration alarm condition" + NEW_LINE +
  1313 + DEVICE_PROFILE_ALARM_CONDITION_DURATION_EXAMPLE + NEW_LINE +
  1314 + "**'unit'** can be: \n" +
  1315 + " * 'SECONDS';\n" +
  1316 + " * 'MINUTES';\n" +
  1317 + " * 'HOURS';\n" +
  1318 + " * 'DAYS'." + NEW_LINE;
  1319 +
  1320 + protected static final String PROVISION_CONFIGURATION = "# Provision Configuration" + NEW_LINE +
  1321 + "There are 3 types of device provision configuration for the device profile: \n" +
  1322 + " * 'DISABLED';\n" +
  1323 + " * 'ALLOW_CREATE_NEW_DEVICES';\n" +
  1324 + " * 'CHECK_PRE_PROVISIONED_DEVICES'." + NEW_LINE +
  1325 + "Please refer to the [docs](https://thingsboard.io/docs/user-guide/device-provisioning/) for more details." + NEW_LINE;
  1326 +
  1327 + protected static final String DEVICE_PROFILE_DATA = DEVICE_PROFILE_DATA_DEFINITION + ALARM_SCHEDULE + ALARM_CONDITION_TYPE +
  1328 + KEY_FILTERS_DESCRIPTION + PROVISION_CONFIGURATION + TRANSPORT_CONFIGURATION;
  1329 +
  1330 + protected static final String DEVICE_PROFILE_ID = "deviceProfileId";
  1331 +
  1332 +}
... ...
... ... @@ -47,6 +47,20 @@ import org.thingsboard.server.service.security.permission.Resource;
47 47
48 48 import java.util.List;
49 49
  50 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID;
  51 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID_PARAM_DESCRIPTION;
  52 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_SORT_PROPERTY_ALLOWABLE_VALUES;
  53 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_TEXT_SEARCH_DESCRIPTION;
  54 +import static org.thingsboard.server.controller.ControllerConstants.HOME_DASHBOARD;
  55 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  56 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  57 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  58 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  59 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  60 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  61 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  62 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
  63 +
50 64 @RestController
51 65 @TbCoreComponent
52 66 @RequestMapping("/api")
... ...
... ... @@ -31,6 +31,7 @@ import org.springframework.web.bind.annotation.RequestParam;
31 31 import org.springframework.web.bind.annotation.ResponseBody;
32 32 import org.springframework.web.bind.annotation.ResponseStatus;
33 33 import org.springframework.web.bind.annotation.RestController;
  34 +import org.thingsboard.common.util.JacksonUtil;
34 35 import org.thingsboard.server.common.data.Customer;
35 36 import org.thingsboard.server.common.data.Dashboard;
36 37 import org.thingsboard.server.common.data.DashboardInfo;
... ... @@ -50,7 +51,6 @@ import org.thingsboard.server.common.data.id.EdgeId;
50 51 import org.thingsboard.server.common.data.id.TenantId;
51 52 import org.thingsboard.server.common.data.page.PageData;
52 53 import org.thingsboard.server.common.data.page.PageLink;
53   -import org.thingsboard.common.util.JacksonUtil;
54 54 import org.thingsboard.server.common.data.page.TimePageLink;
55 55 import org.thingsboard.server.queue.util.TbCoreComponent;
56 56 import org.thingsboard.server.service.security.model.SecurityUser;
... ... @@ -62,6 +62,27 @@ import java.util.List;
62 62 import java.util.Set;
63 63 import java.util.stream.Collectors;
64 64
  65 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID;
  66 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID_PARAM_DESCRIPTION;
  67 +import static org.thingsboard.server.controller.ControllerConstants.DASHBOARD_ID_PARAM_DESCRIPTION;
  68 +import static org.thingsboard.server.controller.ControllerConstants.DASHBOARD_SORT_PROPERTY_ALLOWABLE_VALUES;
  69 +import static org.thingsboard.server.controller.ControllerConstants.DASHBOARD_TEXT_SEARCH_DESCRIPTION;
  70 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION;
  71 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION;
  72 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION;
  73 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION;
  74 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  75 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  76 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  77 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  78 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  79 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  80 +import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_AUTHORITY_PARAGRAPH;
  81 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  82 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_ID;
  83 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_ID_PARAM_DESCRIPTION;
  84 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
  85 +
65 86 @RestController
66 87 @TbCoreComponent
67 88 @RequestMapping("/api")
... ...
... ... @@ -86,6 +86,29 @@ import java.util.List;
86 86 import java.util.UUID;
87 87 import java.util.stream.Collectors;
88 88
  89 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_AUTHORITY_PARAGRAPH;
  90 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID_PARAM_DESCRIPTION;
  91 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_ID_PARAM_DESCRIPTION;
  92 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_INFO_DESCRIPTION;
  93 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_NAME_DESCRIPTION;
  94 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_PROFILE_ID_PARAM_DESCRIPTION;
  95 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_SORT_PROPERTY_ALLOWABLE_VALUES;
  96 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_TEXT_SEARCH_DESCRIPTION;
  97 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_TYPE_DESCRIPTION;
  98 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION;
  99 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION;
  100 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ID_PARAM_DESCRIPTION;
  101 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION;
  102 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION;
  103 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  104 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  105 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  106 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  107 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  108 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  109 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  110 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_ID_PARAM_DESCRIPTION;
  111 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
89 112 import static org.thingsboard.server.controller.EdgeController.EDGE_ID;
90 113
91 114 @RestController
... ...
... ... @@ -49,460 +49,29 @@ import java.util.List;
49 49 import java.util.Objects;
50 50 import java.util.UUID;
51 51
  52 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_PROFILE_DATA;
  53 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_PROFILE_ID;
  54 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_PROFILE_ID_PARAM_DESCRIPTION;
  55 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_PROFILE_INFO_DESCRIPTION;
  56 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES;
  57 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_PROFILE_TEXT_SEARCH_DESCRIPTION;
  58 +import static org.thingsboard.server.controller.ControllerConstants.NEW_LINE;
  59 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  60 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  61 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  62 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  63 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  64 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  65 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  66 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
  67 +import static org.thingsboard.server.controller.ControllerConstants.TRANSPORT_TYPE_ALLOWABLE_VALUES;
  68 +
52 69 @RestController
53 70 @TbCoreComponent
54 71 @RequestMapping("/api")
55 72 @Slf4j
56 73 public class DeviceProfileController extends BaseController {
57 74
58   - private static final String COAP_TRANSPORT_CONFIGURATION_EXAMPLE = MARKDOWN_CODE_BLOCK_START +
59   - "{\n" +
60   - " \"type\":\"COAP\",\n" +
61   - " \"clientSettings\":{\n" +
62   - " \"edrxCycle\":null,\n" +
63   - " \"powerMode\":\"DRX\",\n" +
64   - " \"psmActivityTimer\":null,\n" +
65   - " \"pagingTransmissionWindow\":null\n" +
66   - " },\n" +
67   - " \"coapDeviceTypeConfiguration\":{\n" +
68   - " \"coapDeviceType\":\"DEFAULT\",\n" +
69   - " \"transportPayloadTypeConfiguration\":{\n" +
70   - " \"transportPayloadType\":\"JSON\"\n" +
71   - " }\n" +
72   - " }\n" +
73   - "}"
74   - + MARKDOWN_CODE_BLOCK_END;
75   -
76   - private static final String TRANSPORT_CONFIGURATION = "# Transport Configuration" + NEW_LINE +
77   - "5 transport configuration types are available:\n" +
78   - " * 'DEFAULT';\n" +
79   - " * 'MQTT';\n" +
80   - " * 'LWM2M';\n" +
81   - " * 'COAP';\n" +
82   - " * 'SNMP'." + NEW_LINE + "Default type supports basic MQTT, HTTP, CoAP and LwM2M transports. " +
83   - "Please refer to the [docs](https://thingsboard.io/docs/user-guide/device-profiles/#transport-configuration) for more details about other types.\n" +
84   - "\nSee another example of COAP transport configuration below:" + NEW_LINE + COAP_TRANSPORT_CONFIGURATION_EXAMPLE;
85   -
86   - private static final String ALARM_FILTER_KEY = "## Alarm Filter Key" + NEW_LINE +
87   - "Filter Key defines either entity field, attribute, telemetry or constant. It is a JSON object that consists the key name and type. The following filter key types are supported:\n" +
88   - " * 'ATTRIBUTE' - used for attributes values;\n" +
89   - " * 'TIME_SERIES' - used for time-series values;\n" +
90   - " * 'ENTITY_FIELD' - used for accessing entity fields like 'name', 'label', etc. The list of available fields depends on the entity type;\n" +
91   - " * 'CONSTANT' - constant value specified." + NEW_LINE + "Let's review the example:" + NEW_LINE +
92   - MARKDOWN_CODE_BLOCK_START +
93   - "{\n" +
94   - " \"type\": \"TIME_SERIES\",\n" +
95   - " \"key\": \"temperature\"\n" +
96   - "}" +
97   - MARKDOWN_CODE_BLOCK_END;
98   -
99   - private static final String FILTER_PREDICATE = NEW_LINE + "## Filter Predicate" + NEW_LINE +
100   - "Filter Predicate defines the logical expression to evaluate. The list of available operations depends on the filter value type, see above. " +
101   - "Platform supports 4 predicate types: 'STRING', 'NUMERIC', 'BOOLEAN' and 'COMPLEX'. The last one allows to combine multiple operations over one filter key." + NEW_LINE +
102   - "Simple predicate example to check 'value < 100': " + NEW_LINE +
103   - MARKDOWN_CODE_BLOCK_START +
104   - "{\n" +
105   - " \"operation\": \"LESS\",\n" +
106   - " \"value\": {\n" +
107   - " \"userValue\": null,\n" +
108   - " \"defaultValue\": 100,\n" +
109   - " \"dynamicValue\": null\n" +
110   - " },\n" +
111   - " \"type\": \"NUMERIC\"\n" +
112   - "}" +
113   - MARKDOWN_CODE_BLOCK_END + NEW_LINE +
114   - "Complex predicate example, to check 'value < 10 or value > 20': " + NEW_LINE +
115   - MARKDOWN_CODE_BLOCK_START +
116   - "{\n" +
117   - " \"type\": \"COMPLEX\",\n" +
118   - " \"operation\": \"OR\",\n" +
119   - " \"predicates\": [\n" +
120   - " {\n" +
121   - " \"operation\": \"LESS\",\n" +
122   - " \"value\": {\n" +
123   - " \"userValue\": null,\n" +
124   - " \"defaultValue\": 10,\n" +
125   - " \"dynamicValue\": null\n" +
126   - " },\n" +
127   - " \"type\": \"NUMERIC\"\n" +
128   - " },\n" +
129   - " {\n" +
130   - " \"operation\": \"GREATER\",\n" +
131   - " \"value\": {\n" +
132   - " \"userValue\": null,\n" +
133   - " \"defaultValue\": 20,\n" +
134   - " \"dynamicValue\": null\n" +
135   - " },\n" +
136   - " \"type\": \"NUMERIC\"\n" +
137   - " }\n" +
138   - " ]\n" +
139   - "}" +
140   - MARKDOWN_CODE_BLOCK_END + NEW_LINE +
141   - "More complex predicate example, to check 'value < 10 or (value > 50 && value < 60)': " + NEW_LINE +
142   - MARKDOWN_CODE_BLOCK_START +
143   - "{\n" +
144   - " \"type\": \"COMPLEX\",\n" +
145   - " \"operation\": \"OR\",\n" +
146   - " \"predicates\": [\n" +
147   - " {\n" +
148   - " \"operation\": \"LESS\",\n" +
149   - " \"value\": {\n" +
150   - " \"userValue\": null,\n" +
151   - " \"defaultValue\": 10,\n" +
152   - " \"dynamicValue\": null\n" +
153   - " },\n" +
154   - " \"type\": \"NUMERIC\"\n" +
155   - " },\n" +
156   - " {\n" +
157   - " \"type\": \"COMPLEX\",\n" +
158   - " \"operation\": \"AND\",\n" +
159   - " \"predicates\": [\n" +
160   - " {\n" +
161   - " \"operation\": \"GREATER\",\n" +
162   - " \"value\": {\n" +
163   - " \"userValue\": null,\n" +
164   - " \"defaultValue\": 50,\n" +
165   - " \"dynamicValue\": null\n" +
166   - " },\n" +
167   - " \"type\": \"NUMERIC\"\n" +
168   - " },\n" +
169   - " {\n" +
170   - " \"operation\": \"LESS\",\n" +
171   - " \"value\": {\n" +
172   - " \"userValue\": null,\n" +
173   - " \"defaultValue\": 60,\n" +
174   - " \"dynamicValue\": null\n" +
175   - " },\n" +
176   - " \"type\": \"NUMERIC\"\n" +
177   - " }\n" +
178   - " ]\n" +
179   - " }\n" +
180   - " ]\n" +
181   - "}" +
182   - MARKDOWN_CODE_BLOCK_END + NEW_LINE +
183   - "You may also want to replace hardcoded values (for example, temperature > 20) with the more dynamic " +
184   - "expression (for example, temperature > value of the tenant attribute with key 'temperatureThreshold'). " +
185   - "It is possible to use 'dynamicValue' to define attribute of the tenant, customer or device. " +
186   - "See example below:" + NEW_LINE +
187   - MARKDOWN_CODE_BLOCK_START +
188   - "{\n" +
189   - " \"operation\": \"GREATER\",\n" +
190   - " \"value\": {\n" +
191   - " \"userValue\": null,\n" +
192   - " \"defaultValue\": 0,\n" +
193   - " \"dynamicValue\": {\n" +
194   - " \"inherit\": false,\n" +
195   - " \"sourceType\": \"CURRENT_TENANT\",\n" +
196   - " \"sourceAttribute\": \"temperatureThreshold\"\n" +
197   - " }\n" +
198   - " },\n" +
199   - " \"type\": \"NUMERIC\"\n" +
200   - "}" +
201   - MARKDOWN_CODE_BLOCK_END + NEW_LINE +
202   - "Note that you may use 'CURRENT_DEVICE', 'CURRENT_CUSTOMER' and 'CURRENT_TENANT' as a 'sourceType'. The 'defaultValue' is used when the attribute with such a name is not defined for the chosen source. " +
203   - "The 'sourceAttribute' can be inherited from the owner of the specified 'sourceType' if 'inherit' is set to true.";
204   -
205   - private static final String KEY_FILTERS_DESCRIPTION = "# Key Filters" + NEW_LINE +
206   - "Key filter objects are created under the **'condition'** array. They allow you to define complex logical expressions over entity field, " +
207   - "attribute, latest time-series value or constant. The filter is defined using 'key', 'valueType', " +
208   - "'value' (refers to the value of the 'CONSTANT' alarm filter key type) and 'predicate' objects. Let's review each object:" + NEW_LINE +
209   - ALARM_FILTER_KEY + FILTER_VALUE_TYPE + NEW_LINE + FILTER_PREDICATE + NEW_LINE;
210   -
211   - private static final String DEFAULT_DEVICE_PROFILE_DATA_EXAMPLE = MARKDOWN_CODE_BLOCK_START + "{\n" +
212   - " \"alarms\":[\n" +
213   - " ],\n" +
214   - " \"configuration\":{\n" +
215   - " \"type\":\"DEFAULT\"\n" +
216   - " },\n" +
217   - " \"provisionConfiguration\":{\n" +
218   - " \"type\":\"DISABLED\",\n" +
219   - " \"provisionDeviceSecret\":null\n" +
220   - " },\n" +
221   - " \"transportConfiguration\":{\n" +
222   - " \"type\":\"DEFAULT\"\n" +
223   - " }\n" +
224   - "}" + MARKDOWN_CODE_BLOCK_END;
225   -
226   - private static final String CUSTOM_DEVICE_PROFILE_DATA_EXAMPLE = MARKDOWN_CODE_BLOCK_START + "{\n" +
227   - " \"alarms\":[\n" +
228   - " {\n" +
229   - " \"id\":\"2492b935-1226-59e9-8615-17d8978a4f93\",\n" +
230   - " \"alarmType\":\"Temperature Alarm\",\n" +
231   - " \"clearRule\":{\n" +
232   - " \"schedule\":null,\n" +
233   - " \"condition\":{\n" +
234   - " \"spec\":{\n" +
235   - " \"type\":\"SIMPLE\"\n" +
236   - " },\n" +
237   - " \"condition\":[\n" +
238   - " {\n" +
239   - " \"key\":{\n" +
240   - " \"key\":\"temperature\",\n" +
241   - " \"type\":\"TIME_SERIES\"\n" +
242   - " },\n" +
243   - " \"value\":null,\n" +
244   - " \"predicate\":{\n" +
245   - " \"type\":\"NUMERIC\",\n" +
246   - " \"value\":{\n" +
247   - " \"userValue\":null,\n" +
248   - " \"defaultValue\":30.0,\n" +
249   - " \"dynamicValue\":null\n" +
250   - " },\n" +
251   - " \"operation\":\"LESS\"\n" +
252   - " },\n" +
253   - " \"valueType\":\"NUMERIC\"\n" +
254   - " }\n" +
255   - " ]\n" +
256   - " },\n" +
257   - " \"dashboardId\":null,\n" +
258   - " \"alarmDetails\":null\n" +
259   - " },\n" +
260   - " \"propagate\":false,\n" +
261   - " \"createRules\":{\n" +
262   - " \"MAJOR\":{\n" +
263   - " \"schedule\":{\n" +
264   - " \"type\":\"SPECIFIC_TIME\",\n" +
265   - " \"endsOn\":64800000,\n" +
266   - " \"startsOn\":43200000,\n" +
267   - " \"timezone\":\"Europe/Kiev\",\n" +
268   - " \"daysOfWeek\":[\n" +
269   - " 1,\n" +
270   - " 3,\n" +
271   - " 5\n" +
272   - " ]\n" +
273   - " },\n" +
274   - " \"condition\":{\n" +
275   - " \"spec\":{\n" +
276   - " \"type\":\"DURATION\",\n" +
277   - " \"unit\":\"MINUTES\",\n" +
278   - " \"predicate\":{\n" +
279   - " \"userValue\":null,\n" +
280   - " \"defaultValue\":30,\n" +
281   - " \"dynamicValue\":null\n" +
282   - " }\n" +
283   - " },\n" +
284   - " \"condition\":[\n" +
285   - " {\n" +
286   - " \"key\":{\n" +
287   - " \"key\":\"temperature\",\n" +
288   - " \"type\":\"TIME_SERIES\"\n" +
289   - " },\n" +
290   - " \"value\":null,\n" +
291   - " \"predicate\":{\n" +
292   - " \"type\":\"COMPLEX\",\n" +
293   - " \"operation\":\"OR\",\n" +
294   - " \"predicates\":[\n" +
295   - " {\n" +
296   - " \"type\":\"NUMERIC\",\n" +
297   - " \"value\":{\n" +
298   - " \"userValue\":null,\n" +
299   - " \"defaultValue\":50.0,\n" +
300   - " \"dynamicValue\":null\n" +
301   - " },\n" +
302   - " \"operation\":\"LESS_OR_EQUAL\"\n" +
303   - " },\n" +
304   - " {\n" +
305   - " \"type\":\"NUMERIC\",\n" +
306   - " \"value\":{\n" +
307   - " \"userValue\":null,\n" +
308   - " \"defaultValue\":30.0,\n" +
309   - " \"dynamicValue\":null\n" +
310   - " },\n" +
311   - " \"operation\":\"GREATER\"\n" +
312   - " }\n" +
313   - " ]\n" +
314   - " },\n" +
315   - " \"valueType\":\"NUMERIC\"\n" +
316   - " }\n" +
317   - " ]\n" +
318   - " },\n" +
319   - " \"dashboardId\":null,\n" +
320   - " \"alarmDetails\":null\n" +
321   - " },\n" +
322   - " \"WARNING\":{\n" +
323   - " \"schedule\":{\n" +
324   - " \"type\":\"CUSTOM\",\n" +
325   - " \"items\":[\n" +
326   - " {\n" +
327   - " \"endsOn\":0,\n" +
328   - " \"enabled\":false,\n" +
329   - " \"startsOn\":0,\n" +
330   - " \"dayOfWeek\":1\n" +
331   - " },\n" +
332   - " {\n" +
333   - " \"endsOn\":64800000,\n" +
334   - " \"enabled\":true,\n" +
335   - " \"startsOn\":43200000,\n" +
336   - " \"dayOfWeek\":2\n" +
337   - " },\n" +
338   - " {\n" +
339   - " \"endsOn\":0,\n" +
340   - " \"enabled\":false,\n" +
341   - " \"startsOn\":0,\n" +
342   - " \"dayOfWeek\":3\n" +
343   - " },\n" +
344   - " {\n" +
345   - " \"endsOn\":57600000,\n" +
346   - " \"enabled\":true,\n" +
347   - " \"startsOn\":36000000,\n" +
348   - " \"dayOfWeek\":4\n" +
349   - " },\n" +
350   - " {\n" +
351   - " \"endsOn\":0,\n" +
352   - " \"enabled\":false,\n" +
353   - " \"startsOn\":0,\n" +
354   - " \"dayOfWeek\":5\n" +
355   - " },\n" +
356   - " {\n" +
357   - " \"endsOn\":0,\n" +
358   - " \"enabled\":false,\n" +
359   - " \"startsOn\":0,\n" +
360   - " \"dayOfWeek\":6\n" +
361   - " },\n" +
362   - " {\n" +
363   - " \"endsOn\":0,\n" +
364   - " \"enabled\":false,\n" +
365   - " \"startsOn\":0,\n" +
366   - " \"dayOfWeek\":7\n" +
367   - " }\n" +
368   - " ],\n" +
369   - " \"timezone\":\"Europe/Kiev\"\n" +
370   - " },\n" +
371   - " \"condition\":{\n" +
372   - " \"spec\":{\n" +
373   - " \"type\":\"REPEATING\",\n" +
374   - " \"predicate\":{\n" +
375   - " \"userValue\":null,\n" +
376   - " \"defaultValue\":5,\n" +
377   - " \"dynamicValue\":null\n" +
378   - " }\n" +
379   - " },\n" +
380   - " \"condition\":[\n" +
381   - " {\n" +
382   - " \"key\":{\n" +
383   - " \"key\":\"tempConstant\",\n" +
384   - " \"type\":\"CONSTANT\"\n" +
385   - " },\n" +
386   - " \"value\":30,\n" +
387   - " \"predicate\":{\n" +
388   - " \"type\":\"NUMERIC\",\n" +
389   - " \"value\":{\n" +
390   - " \"userValue\":null,\n" +
391   - " \"defaultValue\":0.0,\n" +
392   - " \"dynamicValue\":{\n" +
393   - " \"inherit\":false,\n" +
394   - " \"sourceType\":\"CURRENT_DEVICE\",\n" +
395   - " \"sourceAttribute\":\"tempThreshold\"\n" +
396   - " }\n" +
397   - " },\n" +
398   - " \"operation\":\"EQUAL\"\n" +
399   - " },\n" +
400   - " \"valueType\":\"NUMERIC\"\n" +
401   - " }\n" +
402   - " ]\n" +
403   - " },\n" +
404   - " \"dashboardId\":null,\n" +
405   - " \"alarmDetails\":null\n" +
406   - " },\n" +
407   - " \"CRITICAL\":{\n" +
408   - " \"schedule\":null,\n" +
409   - " \"condition\":{\n" +
410   - " \"spec\":{\n" +
411   - " \"type\":\"SIMPLE\"\n" +
412   - " },\n" +
413   - " \"condition\":[\n" +
414   - " {\n" +
415   - " \"key\":{\n" +
416   - " \"key\":\"temperature\",\n" +
417   - " \"type\":\"TIME_SERIES\"\n" +
418   - " },\n" +
419   - " \"value\":null,\n" +
420   - " \"predicate\":{\n" +
421   - " \"type\":\"NUMERIC\",\n" +
422   - " \"value\":{\n" +
423   - " \"userValue\":null,\n" +
424   - " \"defaultValue\":50.0,\n" +
425   - " \"dynamicValue\":null\n" +
426   - " },\n" +
427   - " \"operation\":\"GREATER\"\n" +
428   - " },\n" +
429   - " \"valueType\":\"NUMERIC\"\n" +
430   - " }\n" +
431   - " ]\n" +
432   - " },\n" +
433   - " \"dashboardId\":null,\n" +
434   - " \"alarmDetails\":null\n" +
435   - " }\n" +
436   - " },\n" +
437   - " \"propagateRelationTypes\":null\n" +
438   - " }\n" +
439   - " ],\n" +
440   - " \"configuration\":{\n" +
441   - " \"type\":\"DEFAULT\"\n" +
442   - " },\n" +
443   - " \"provisionConfiguration\":{\n" +
444   - " \"type\":\"ALLOW_CREATE_NEW_DEVICES\",\n" +
445   - " \"provisionDeviceSecret\":\"vaxb9hzqdbz3oqukvomg\"\n" +
446   - " },\n" +
447   - " \"transportConfiguration\":{\n" +
448   - " \"type\":\"MQTT\",\n" +
449   - " \"deviceTelemetryTopic\":\"v1/devices/me/telemetry\",\n" +
450   - " \"deviceAttributesTopic\":\"v1/devices/me/attributes\",\n" +
451   - " \"transportPayloadTypeConfiguration\":{\n" +
452   - " \"transportPayloadType\":\"PROTOBUF\",\n" +
453   - " \"deviceTelemetryProtoSchema\":\"syntax =\\\"proto3\\\";\\npackage telemetry;\\n\\nmessage SensorDataReading {\\n\\n optional double temperature = 1;\\n optional double humidity = 2;\\n InnerObject innerObject = 3;\\n\\n message InnerObject {\\n optional string key1 = 1;\\n optional bool key2 = 2;\\n optional double key3 = 3;\\n optional int32 key4 = 4;\\n optional string key5 = 5;\\n }\\n}\",\n" +
454   - " \"deviceAttributesProtoSchema\":\"syntax =\\\"proto3\\\";\\npackage attributes;\\n\\nmessage SensorConfiguration {\\n optional string firmwareVersion = 1;\\n optional string serialNumber = 2;\\n}\",\n" +
455   - " \"deviceRpcRequestProtoSchema\":\"syntax =\\\"proto3\\\";\\npackage rpc;\\n\\nmessage RpcRequestMsg {\\n optional string method = 1;\\n optional int32 requestId = 2;\\n optional string params = 3;\\n}\",\n" +
456   - " \"deviceRpcResponseProtoSchema\":\"syntax =\\\"proto3\\\";\\npackage rpc;\\n\\nmessage RpcResponseMsg {\\n optional string payload = 1;\\n}\"\n" +
457   - " }\n" +
458   - " }\n" +
459   - "}" + MARKDOWN_CODE_BLOCK_END;
460   - private static final String DEVICE_PROFILE_DATA_DEFINITION = NEW_LINE + "# Device profile data definition" + NEW_LINE +
461   - "Device profile data object contains alarm rules configuration, device provision strategy and transport type configuration for device connectivity. Let's review some examples. " +
462   - "First one is the default device profile data configuration and second one - the custom one. " +
463   - NEW_LINE + DEFAULT_DEVICE_PROFILE_DATA_EXAMPLE + NEW_LINE + CUSTOM_DEVICE_PROFILE_DATA_EXAMPLE +
464   - NEW_LINE + "Let's review some specific objects examples related to the device profile configuration:";
465   -
466   - private static final String ALARM_SCHEDULE = NEW_LINE + "# Alarm Schedule" + NEW_LINE +
467   - "Alarm Schedule JSON object represents the time interval during which the alarm rule is active. Note, " +
468   - NEW_LINE + DEVICE_PROFILE_ALARM_SCHEDULE_ALWAYS_EXAMPLE + NEW_LINE + "means alarm rule is active all the time. " +
469   - "**'daysOfWeek'** field represents Monday as 1, Tuesday as 2 and so on. **'startsOn'** and **'endsOn'** fields represent hours in millis (e.g. 64800000 = 18:00 or 6pm). " +
470   - "**'enabled'** flag specifies if item in a custom rule is active for specific day of the week:" + NEW_LINE +
471   - "## Specific Time Schedule" + NEW_LINE +
472   - DEVICE_PROFILE_ALARM_SCHEDULE_SPECIFIC_TIME_EXAMPLE + NEW_LINE +
473   - "## Custom Schedule" +
474   - NEW_LINE + DEVICE_PROFILE_ALARM_SCHEDULE_CUSTOM_EXAMPLE + NEW_LINE;
475   -
476   - private static final String ALARM_CONDITION_TYPE = "# Alarm condition type (**'spec'**)" + NEW_LINE +
477   - "Alarm condition type can be either simple, duration, or repeating. For example, 5 times in a row or during 5 minutes." + NEW_LINE +
478   - "Note, **'userValue'** field is not used and reserved for future usage, **'dynamicValue'** is used for condition appliance by using the value of the **'sourceAttribute'** " +
479   - "or else **'defaultValue'** is used (if **'sourceAttribute'** is absent).\n" +
480   - "\n**'sourceType'** of the **'sourceAttribute'** can be: \n" +
481   - " * 'CURRENT_DEVICE';\n" +
482   - " * 'CURRENT_CUSTOMER';\n" +
483   - " * 'CURRENT_TENANT'." + NEW_LINE +
484   - "**'sourceAttribute'** can be inherited from the owner if **'inherit'** is set to true (for CURRENT_DEVICE and CURRENT_CUSTOMER)." + NEW_LINE +
485   - "## Repeating alarm condition" + NEW_LINE +
486   - DEVICE_PROFILE_ALARM_CONDITION_REPEATING_EXAMPLE + NEW_LINE +
487   - "## Duration alarm condition" + NEW_LINE +
488   - DEVICE_PROFILE_ALARM_CONDITION_DURATION_EXAMPLE + NEW_LINE +
489   - "**'unit'** can be: \n" +
490   - " * 'SECONDS';\n" +
491   - " * 'MINUTES';\n" +
492   - " * 'HOURS';\n" +
493   - " * 'DAYS'." + NEW_LINE;
494   -
495   - private static final String PROVISION_CONFIGURATION = "# Provision Configuration" + NEW_LINE +
496   - "There are 3 types of device provision configuration for the device profile: \n" +
497   - " * 'DISABLED';\n" +
498   - " * 'ALLOW_CREATE_NEW_DEVICES';\n" +
499   - " * 'CHECK_PRE_PROVISIONED_DEVICES'." + NEW_LINE +
500   - "Please refer to the [docs](https://thingsboard.io/docs/user-guide/device-provisioning/) for more details." + NEW_LINE;
501   -
502   - private static final String DEVICE_PROFILE_DATA = DEVICE_PROFILE_DATA_DEFINITION + ALARM_SCHEDULE + ALARM_CONDITION_TYPE +
503   - KEY_FILTERS_DESCRIPTION + PROVISION_CONFIGURATION + TRANSPORT_CONFIGURATION;
504   -
505   - private static final String DEVICE_PROFILE_ID = "deviceProfileId";
506 75
507 76 @Autowired
508 77 private TimeseriesService timeseriesService;
... ...
... ... @@ -69,6 +69,22 @@ import java.util.ArrayList;
69 69 import java.util.List;
70 70 import java.util.stream.Collectors;
71 71
  72 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID_PARAM_DESCRIPTION;
  73 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ID_PARAM_DESCRIPTION;
  74 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_INFO_DESCRIPTION;
  75 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_SORT_PROPERTY_ALLOWABLE_VALUES;
  76 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_TEXT_SEARCH_DESCRIPTION;
  77 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_TYPE_DESCRIPTION;
  78 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  79 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  80 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  81 +import static org.thingsboard.server.controller.ControllerConstants.RULE_CHAIN_ID_PARAM_DESCRIPTION;
  82 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  83 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  84 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  85 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  86 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
  87 +
72 88 @RestController
73 89 @TbCoreComponent
74 90 @Slf4j
... ...
... ... @@ -37,6 +37,15 @@ import org.thingsboard.server.dao.edge.EdgeEventService;
37 37 import org.thingsboard.server.queue.util.TbCoreComponent;
38 38 import org.thingsboard.server.service.security.permission.Operation;
39 39
  40 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ID_PARAM_DESCRIPTION;
  41 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_SORT_PROPERTY_ALLOWABLE_VALUES;
  42 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  43 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  44 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  45 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  46 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  47 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  48 +
40 49 @Slf4j
41 50 @RestController
42 51 @TbCoreComponent
... ...
... ... @@ -39,634 +39,15 @@ import org.thingsboard.server.common.data.query.EntityDataQuery;
39 39 import org.thingsboard.server.queue.util.TbCoreComponent;
40 40 import org.thingsboard.server.service.query.EntityQueryService;
41 41
  42 +import static org.thingsboard.server.controller.ControllerConstants.ALARM_DATA_QUERY_DESCRIPTION;
  43 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_COUNT_QUERY_DESCRIPTION;
  44 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_DATA_QUERY_DESCRIPTION;
  45 +
42 46 @RestController
43 47 @TbCoreComponent
44 48 @RequestMapping("/api")
45 49 public class EntityQueryController extends BaseController {
46 50
47   - private static final String SINGLE_ENTITY = "\n\n## Single Entity\n\n" +
48   - "Allows to filter only one entity based on the id. For example, this entity filter selects certain device:\n\n" +
49   - MARKDOWN_CODE_BLOCK_START +
50   - "{\n" +
51   - " \"type\": \"singleEntity\",\n" +
52   - " \"singleEntity\": {\n" +
53   - " \"id\": \"d521edb0-2a7a-11ec-94eb-213c95f54092\",\n" +
54   - " \"entityType\": \"DEVICE\"\n" +
55   - " }\n" +
56   - "}" +
57   - MARKDOWN_CODE_BLOCK_END +
58   - "";
59   -
60   - private static final String ENTITY_LIST = "\n\n## Entity List Filter\n\n" +
61   - "Allows to filter entities of the same type using their ids. For example, this entity filter selects two devices:\n\n" +
62   - MARKDOWN_CODE_BLOCK_START +
63   - "{\n" +
64   - " \"type\": \"entityList\",\n" +
65   - " \"entityType\": \"DEVICE\",\n" +
66   - " \"entityList\": [\n" +
67   - " \"e6501f30-2a7a-11ec-94eb-213c95f54092\",\n" +
68   - " \"e6657bf0-2a7a-11ec-94eb-213c95f54092\"\n" +
69   - " ]\n" +
70   - "}" +
71   - MARKDOWN_CODE_BLOCK_END +
72   - "";
73   -
74   - private static final String ENTITY_NAME = "\n\n## Entity Name Filter\n\n" +
75   - "Allows to filter entities of the same type using the **'starts with'** expression over entity name. " +
76   - "For example, this entity filter selects all devices which name starts with 'Air Quality':\n\n" +
77   - MARKDOWN_CODE_BLOCK_START +
78   - "{\n" +
79   - " \"type\": \"entityName\",\n" +
80   - " \"entityType\": \"DEVICE\",\n" +
81   - " \"entityNameFilter\": \"Air Quality\"\n" +
82   - "}" +
83   - MARKDOWN_CODE_BLOCK_END +
84   - "";
85   -
86   - private static final String ENTITY_TYPE = "\n\n## Entity Type Filter\n\n" +
87   - "Allows to filter entities based on their type (CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, etc)" +
88   - "For example, this entity filter selects all tenant customers:\n\n" +
89   - MARKDOWN_CODE_BLOCK_START +
90   - "{\n" +
91   - " \"type\": \"entityType\",\n" +
92   - " \"entityType\": \"CUSTOMER\"\n" +
93   - "}" +
94   - MARKDOWN_CODE_BLOCK_END +
95   - "";
96   -
97   - private static final String ASSET_TYPE = "\n\n## Asset Type Filter\n\n" +
98   - "Allows to filter assets based on their type and the **'starts with'** expression over their name. " +
99   - "For example, this entity filter selects all 'charging station' assets which name starts with 'Tesla':\n\n" +
100   - MARKDOWN_CODE_BLOCK_START +
101   - "{\n" +
102   - " \"type\": \"assetType\",\n" +
103   - " \"assetType\": \"charging station\",\n" +
104   - " \"assetNameFilter\": \"Tesla\"\n" +
105   - "}" +
106   - MARKDOWN_CODE_BLOCK_END +
107   - "";
108   -
109   - private static final String DEVICE_TYPE = "\n\n## Device Type Filter\n\n" +
110   - "Allows to filter devices based on their type and the **'starts with'** expression over their name. " +
111   - "For example, this entity filter selects all 'Temperature Sensor' devices which name starts with 'ABC':\n\n" +
112   - MARKDOWN_CODE_BLOCK_START +
113   - "{\n" +
114   - " \"type\": \"deviceType\",\n" +
115   - " \"deviceType\": \"Temperature Sensor\",\n" +
116   - " \"deviceNameFilter\": \"ABC\"\n" +
117   - "}" +
118   - MARKDOWN_CODE_BLOCK_END +
119   - "";
120   -
121   - private static final String EDGE_TYPE = "\n\n## Edge Type Filter\n\n" +
122   - "Allows to filter edge instances based on their type and the **'starts with'** expression over their name. " +
123   - "For example, this entity filter selects all 'Factory' edge instances which name starts with 'Nevada':\n\n" +
124   - MARKDOWN_CODE_BLOCK_START +
125   - "{\n" +
126   - " \"type\": \"edgeType\",\n" +
127   - " \"edgeType\": \"Factory\",\n" +
128   - " \"edgeNameFilter\": \"Nevada\"\n" +
129   - "}" +
130   - MARKDOWN_CODE_BLOCK_END +
131   - "";
132   -
133   - private static final String ENTITY_VIEW_TYPE = "\n\n## Entity View Filter\n\n" +
134   - "Allows to filter entity views based on their type and the **'starts with'** expression over their name. " +
135   - "For example, this entity filter selects all 'Concrete Mixer' entity views which name starts with 'CAT':\n\n" +
136   - MARKDOWN_CODE_BLOCK_START +
137   - "{\n" +
138   - " \"type\": \"entityViewType\",\n" +
139   - " \"entityViewType\": \"Concrete Mixer\",\n" +
140   - " \"entityViewNameFilter\": \"CAT\"\n" +
141   - "}" +
142   - MARKDOWN_CODE_BLOCK_END +
143   - "";
144   -
145   - private static final String API_USAGE = "\n\n## Api Usage Filter\n\n" +
146   - "Allows to query for Api Usage based on optional customer id. If the customer id is not set, returns current tenant API usage." +
147   - "For example, this entity filter selects the 'Api Usage' entity for customer with id 'e6501f30-2a7a-11ec-94eb-213c95f54092':\n\n" +
148   - MARKDOWN_CODE_BLOCK_START +
149   - "{\n" +
150   - " \"type\": \"apiUsageState\",\n" +
151   - " \"customerId\": {\n" +
152   - " \"id\": \"d521edb0-2a7a-11ec-94eb-213c95f54092\",\n" +
153   - " \"entityType\": \"CUSTOMER\"\n" +
154   - " }\n" +
155   - "}" +
156   - MARKDOWN_CODE_BLOCK_END +
157   - "";
158   -
159   - private static final String MAX_LEVEL_DESCRIPTION = "Possible direction values are 'TO' and 'FROM'. The 'maxLevel' defines how many relation levels should the query search 'recursively'. ";
160   - private static final String FETCH_LAST_LEVEL_ONLY_DESCRIPTION = "Assuming the 'maxLevel' is > 1, the 'fetchLastLevelOnly' defines either to return all related entities or only entities that are on the last level of relations. ";
161   -
162   - private static final String RELATIONS_QUERY_FILTER = "\n\n## Relations Query Filter\n\n" +
163   - "Allows to filter entities that are related to the provided root entity. " +
164   - MAX_LEVEL_DESCRIPTION +
165   - FETCH_LAST_LEVEL_ONLY_DESCRIPTION +
166   - "The 'filter' object allows you to define the relation type and set of acceptable entity types to search for. " +
167   - "The relation query calculates all related entities, even if they are filtered using different relation types, and then extracts only those who match the 'filters'.\n\n" +
168   - "For example, this entity filter selects all devices and assets which are related to the asset with id 'e51de0c0-2a7a-11ec-94eb-213c95f54092':\n\n" +
169   - MARKDOWN_CODE_BLOCK_START +
170   - "{\n" +
171   - " \"type\": \"relationsQuery\",\n" +
172   - " \"rootEntity\": {\n" +
173   - " \"entityType\": \"ASSET\",\n" +
174   - " \"id\": \"e51de0c0-2a7a-11ec-94eb-213c95f54092\"\n" +
175   - " },\n" +
176   - " \"direction\": \"FROM\",\n" +
177   - " \"maxLevel\": 1,\n" +
178   - " \"fetchLastLevelOnly\": false,\n" +
179   - " \"filters\": [\n" +
180   - " {\n" +
181   - " \"relationType\": \"Contains\",\n" +
182   - " \"entityTypes\": [\n" +
183   - " \"DEVICE\",\n" +
184   - " \"ASSET\"\n" +
185   - " ]\n" +
186   - " }\n" +
187   - " ]\n" +
188   - "}" +
189   - MARKDOWN_CODE_BLOCK_END +
190   - "";
191   -
192   -
193   - private static final String ASSET_QUERY_FILTER = "\n\n## Asset Search Query\n\n" +
194   - "Allows to filter assets that are related to the provided root entity. Filters related assets based on the relation type and set of asset types. " +
195   - MAX_LEVEL_DESCRIPTION +
196   - FETCH_LAST_LEVEL_ONLY_DESCRIPTION +
197   - "The 'relationType' defines the type of the relation to search for. " +
198   - "The 'assetTypes' defines the type of the asset to search for. " +
199   - "The relation query calculates all related entities, even if they are filtered using different relation types, and then extracts only assets that match 'relationType' and 'assetTypes' conditions.\n\n" +
200   - "For example, this entity filter selects 'charging station' assets which are related to the asset with id 'e51de0c0-2a7a-11ec-94eb-213c95f54092' using 'Contains' relation:\n\n" +
201   - MARKDOWN_CODE_BLOCK_START +
202   - "{\n" +
203   - " \"type\": \"assetSearchQuery\",\n" +
204   - " \"rootEntity\": {\n" +
205   - " \"entityType\": \"ASSET\",\n" +
206   - " \"id\": \"e51de0c0-2a7a-11ec-94eb-213c95f54092\"\n" +
207   - " },\n" +
208   - " \"direction\": \"FROM\",\n" +
209   - " \"maxLevel\": 1,\n" +
210   - " \"fetchLastLevelOnly\": false,\n" +
211   - " \"relationType\": \"Contains\",\n" +
212   - " \"assetTypes\": [\n" +
213   - " \"charging station\"\n" +
214   - " ]\n" +
215   - "}" +
216   - MARKDOWN_CODE_BLOCK_END +
217   - "";
218   -
219   - private static final String DEVICE_QUERY_FILTER = "\n\n## Device Search Query\n\n" +
220   - "Allows to filter devices that are related to the provided root entity. Filters related devices based on the relation type and set of device types. " +
221   - MAX_LEVEL_DESCRIPTION +
222   - FETCH_LAST_LEVEL_ONLY_DESCRIPTION +
223   - "The 'relationType' defines the type of the relation to search for. " +
224   - "The 'deviceTypes' defines the type of the device to search for. " +
225   - "The relation query calculates all related entities, even if they are filtered using different relation types, and then extracts only devices that match 'relationType' and 'deviceTypes' conditions.\n\n" +
226   - "For example, this entity filter selects 'Charging port' and 'Air Quality Sensor' devices which are related to the asset with id 'e52b0020-2a7a-11ec-94eb-213c95f54092' using 'Contains' relation:\n\n" +
227   - MARKDOWN_CODE_BLOCK_START +
228   - "{\n" +
229   - " \"type\": \"deviceSearchQuery\",\n" +
230   - " \"rootEntity\": {\n" +
231   - " \"entityType\": \"ASSET\",\n" +
232   - " \"id\": \"e52b0020-2a7a-11ec-94eb-213c95f54092\"\n" +
233   - " },\n" +
234   - " \"direction\": \"FROM\",\n" +
235   - " \"maxLevel\": 2,\n" +
236   - " \"fetchLastLevelOnly\": true,\n" +
237   - " \"relationType\": \"Contains\",\n" +
238   - " \"deviceTypes\": [\n" +
239   - " \"Air Quality Sensor\",\n" +
240   - " \"Charging port\"\n" +
241   - " ]\n" +
242   - "}" +
243   - MARKDOWN_CODE_BLOCK_END +
244   - "";
245   -
246   - private static final String EV_QUERY_FILTER = "\n\n## Entity View Query\n\n" +
247   - "Allows to filter entity views that are related to the provided root entity. Filters related entity views based on the relation type and set of entity view types. " +
248   - MAX_LEVEL_DESCRIPTION +
249   - FETCH_LAST_LEVEL_ONLY_DESCRIPTION +
250   - "The 'relationType' defines the type of the relation to search for. " +
251   - "The 'entityViewTypes' defines the type of the entity view to search for. " +
252   - "The relation query calculates all related entities, even if they are filtered using different relation types, and then extracts only devices that match 'relationType' and 'deviceTypes' conditions.\n\n" +
253   - "For example, this entity filter selects 'Concrete mixer' entity views which are related to the asset with id 'e52b0020-2a7a-11ec-94eb-213c95f54092' using 'Contains' relation:\n\n" +
254   - MARKDOWN_CODE_BLOCK_START +
255   - "{\n" +
256   - " \"type\": \"entityViewSearchQuery\",\n" +
257   - " \"rootEntity\": {\n" +
258   - " \"entityType\": \"ASSET\",\n" +
259   - " \"id\": \"e52b0020-2a7a-11ec-94eb-213c95f54092\"\n" +
260   - " },\n" +
261   - " \"direction\": \"FROM\",\n" +
262   - " \"maxLevel\": 1,\n" +
263   - " \"fetchLastLevelOnly\": false,\n" +
264   - " \"relationType\": \"Contains\",\n" +
265   - " \"entityViewTypes\": [\n" +
266   - " \"Concrete mixer\"\n" +
267   - " ]\n" +
268   - "}" +
269   - MARKDOWN_CODE_BLOCK_END +
270   - "";
271   -
272   - private static final String EDGE_QUERY_FILTER = "\n\n## Edge Search Query\n\n" +
273   - "Allows to filter edge instances that are related to the provided root entity. Filters related edge instances based on the relation type and set of edge types. " +
274   - MAX_LEVEL_DESCRIPTION +
275   - FETCH_LAST_LEVEL_ONLY_DESCRIPTION +
276   - "The 'relationType' defines the type of the relation to search for. " +
277   - "The 'deviceTypes' defines the type of the device to search for. " +
278   - "The relation query calculates all related entities, even if they are filtered using different relation types, and then extracts only devices that match 'relationType' and 'deviceTypes' conditions.\n\n" +
279   - "For example, this entity filter selects 'Factory' edge instances which are related to the asset with id 'e52b0020-2a7a-11ec-94eb-213c95f54092' using 'Contains' relation:\n\n" +
280   - MARKDOWN_CODE_BLOCK_START +
281   - "{\n" +
282   - " \"type\": \"deviceSearchQuery\",\n" +
283   - " \"rootEntity\": {\n" +
284   - " \"entityType\": \"ASSET\",\n" +
285   - " \"id\": \"e52b0020-2a7a-11ec-94eb-213c95f54092\"\n" +
286   - " },\n" +
287   - " \"direction\": \"FROM\",\n" +
288   - " \"maxLevel\": 2,\n" +
289   - " \"fetchLastLevelOnly\": true,\n" +
290   - " \"relationType\": \"Contains\",\n" +
291   - " \"edgeTypes\": [\n" +
292   - " \"Factory\"\n" +
293   - " ]\n" +
294   - "}" +
295   - MARKDOWN_CODE_BLOCK_END +
296   - "";
297   -
298   - private static final String EMPTY = "\n\n## Entity Type Filter\n\n" +
299   - "Allows to filter multiple entities of the same type using the **'starts with'** expression over entity name. " +
300   - "For example, this entity filter selects all devices which name starts with 'Air Quality':\n\n" +
301   - MARKDOWN_CODE_BLOCK_START +
302   - "" +
303   - MARKDOWN_CODE_BLOCK_END +
304   - "";
305   -
306   - private static final String ENTITY_FILTERS =
307   - "\n\n # Entity Filters" +
308   - "\nEntity Filter body depends on the 'type' parameter. Let's review available entity filter types. In fact, they do correspond to available dashboard aliases." +
309   - SINGLE_ENTITY + ENTITY_LIST + ENTITY_NAME + ENTITY_TYPE + ASSET_TYPE + DEVICE_TYPE + EDGE_TYPE + ENTITY_VIEW_TYPE + API_USAGE + RELATIONS_QUERY_FILTER
310   - + ASSET_QUERY_FILTER + DEVICE_QUERY_FILTER + EV_QUERY_FILTER + EDGE_QUERY_FILTER;
311   -
312   - private static final String FILTER_KEY = "\n\n## Filter Key\n\n" +
313   - "Filter Key defines either entity field, attribute or telemetry. It is a JSON object that consists the key name and type. " +
314   - "The following filter key types are supported: \n\n" +
315   - " * 'CLIENT_ATTRIBUTE' - used for client attributes; \n" +
316   - " * 'SHARED_ATTRIBUTE' - used for shared attributes; \n" +
317   - " * 'SERVER_ATTRIBUTE' - used for server attributes; \n" +
318   - " * 'ATTRIBUTE' - used for any of the above; \n" +
319   - " * 'TIME_SERIES' - used for time-series values; \n" +
320   - " * 'ENTITY_FIELD' - used for accessing entity fields like 'name', 'label', etc. The list of available fields depends on the entity type; \n" +
321   - " * 'ALARM_FIELD' - similar to entity field, but is used in alarm queries only; \n" +
322   - "\n\n Let's review the example:\n\n" +
323   - MARKDOWN_CODE_BLOCK_START +
324   - "{\n" +
325   - " \"type\": \"TIME_SERIES\",\n" +
326   - " \"key\": \"temperature\"\n" +
327   - "}" +
328   - MARKDOWN_CODE_BLOCK_END +
329   - "";
330   -
331   - private static final String FILTER_PREDICATE = "\n\n## Filter Predicate\n\n" +
332   - "Filter Predicate defines the logical expression to evaluate. The list of available operations depends on the filter value type, see above. " +
333   - "Platform supports 4 predicate types: 'STRING', 'NUMERIC', 'BOOLEAN' and 'COMPLEX'. The last one allows to combine multiple operations over one filter key." +
334   - "\n\nSimple predicate example to check 'value < 100': \n\n" +
335   - MARKDOWN_CODE_BLOCK_START +
336   - "{\n" +
337   - " \"operation\": \"LESS\",\n" +
338   - " \"value\": {\n" +
339   - " \"defaultValue\": 100,\n" +
340   - " \"dynamicValue\": null\n" +
341   - " },\n" +
342   - " \"type\": \"NUMERIC\"\n" +
343   - "}" +
344   - MARKDOWN_CODE_BLOCK_END +
345   - "\n\nComplex predicate example, to check 'value < 10 or value > 20': \n\n" +
346   - MARKDOWN_CODE_BLOCK_START +
347   - "{\n" +
348   - " \"type\": \"COMPLEX\",\n" +
349   - " \"operation\": \"OR\",\n" +
350   - " \"predicates\": [\n" +
351   - " {\n" +
352   - " \"operation\": \"LESS\",\n" +
353   - " \"value\": {\n" +
354   - " \"defaultValue\": 10,\n" +
355   - " \"dynamicValue\": null\n" +
356   - " },\n" +
357   - " \"type\": \"NUMERIC\"\n" +
358   - " },\n" +
359   - " {\n" +
360   - " \"operation\": \"GREATER\",\n" +
361   - " \"value\": {\n" +
362   - " \"defaultValue\": 20,\n" +
363   - " \"dynamicValue\": null\n" +
364   - " },\n" +
365   - " \"type\": \"NUMERIC\"\n" +
366   - " }\n" +
367   - " ]\n" +
368   - "}" +
369   - MARKDOWN_CODE_BLOCK_END +
370   - "\n\nMore complex predicate example, to check 'value < 10 or (value > 50 && value < 60)': \n\n" +
371   - MARKDOWN_CODE_BLOCK_START +
372   - "{\n" +
373   - " \"type\": \"COMPLEX\",\n" +
374   - " \"operation\": \"OR\",\n" +
375   - " \"predicates\": [\n" +
376   - " {\n" +
377   - " \"operation\": \"LESS\",\n" +
378   - " \"value\": {\n" +
379   - " \"defaultValue\": 10,\n" +
380   - " \"dynamicValue\": null\n" +
381   - " },\n" +
382   - " \"type\": \"NUMERIC\"\n" +
383   - " },\n" +
384   - " {\n" +
385   - " \"type\": \"COMPLEX\",\n" +
386   - " \"operation\": \"AND\",\n" +
387   - " \"predicates\": [\n" +
388   - " {\n" +
389   - " \"operation\": \"GREATER\",\n" +
390   - " \"value\": {\n" +
391   - " \"defaultValue\": 50,\n" +
392   - " \"dynamicValue\": null\n" +
393   - " },\n" +
394   - " \"type\": \"NUMERIC\"\n" +
395   - " },\n" +
396   - " {\n" +
397   - " \"operation\": \"LESS\",\n" +
398   - " \"value\": {\n" +
399   - " \"defaultValue\": 60,\n" +
400   - " \"dynamicValue\": null\n" +
401   - " },\n" +
402   - " \"type\": \"NUMERIC\"\n" +
403   - " }\n" +
404   - " ]\n" +
405   - " }\n" +
406   - " ]\n" +
407   - "}" +
408   - MARKDOWN_CODE_BLOCK_END +
409   - "\n\n You may also want to replace hardcoded values (for example, temperature > 20) with the more dynamic " +
410   - "expression (for example, temperature > 'value of the tenant attribute with key 'temperatureThreshold'). " +
411   - "It is possible to use 'dynamicValue' to define attribute of the tenant, customer or user that is performing the API call. " +
412   - "See example below: \n\n" +
413   - MARKDOWN_CODE_BLOCK_START +
414   - "{\n" +
415   - " \"operation\": \"GREATER\",\n" +
416   - " \"value\": {\n" +
417   - " \"defaultValue\": 0,\n" +
418   - " \"dynamicValue\": {\n" +
419   - " \"sourceType\": \"CURRENT_USER\",\n" +
420   - " \"sourceAttribute\": \"temperatureThreshold\"\n" +
421   - " }\n" +
422   - " },\n" +
423   - " \"type\": \"NUMERIC\"\n" +
424   - "}" +
425   - MARKDOWN_CODE_BLOCK_END +
426   - "\n\n Note that you may use 'CURRENT_USER', 'CURRENT_CUSTOMER' and 'CURRENT_TENANT' as a 'sourceType'. The 'defaultValue' is used when the attribute with such a name is not defined for the chosen source.";
427   -
428   - private static final String KEY_FILTERS =
429   - "\n\n # Key Filters" +
430   - "\nKey Filter allows you to define complex logical expressions over entity field, attribute or latest time-series value. The filter is defined using 'key', 'valueType' and 'predicate' objects. " +
431   - "Single Entity Query may have zero, one or multiple predicates. If multiple filters are defined, they are evaluated using logical 'AND'. " +
432   - "The example below checks that temperature of the entity is above 20 degrees:" +
433   - "\n\n" + MARKDOWN_CODE_BLOCK_START +
434   - "{\n" +
435   - " \"key\": {\n" +
436   - " \"type\": \"TIME_SERIES\",\n" +
437   - " \"key\": \"temperature\"\n" +
438   - " },\n" +
439   - " \"valueType\": \"NUMERIC\",\n" +
440   - " \"predicate\": {\n" +
441   - " \"operation\": \"GREATER\",\n" +
442   - " \"value\": {\n" +
443   - " \"defaultValue\": 20,\n" +
444   - " \"dynamicValue\": null\n" +
445   - " },\n" +
446   - " \"type\": \"NUMERIC\"\n" +
447   - " }\n" +
448   - "}" +
449   - MARKDOWN_CODE_BLOCK_END +
450   - "\n\n Now let's review 'key', 'valueType' and 'predicate' objects in detail."
451   - + FILTER_KEY + FILTER_VALUE_TYPE + FILTER_PREDICATE;
452   -
453   - private static final String ENTITY_COUNT_QUERY_DESCRIPTION =
454   - "Allows to run complex queries to search the count of platform entities (devices, assets, customers, etc) " +
455   - "based on the combination of main entity filter and multiple key filters. Returns the number of entities that match the query definition.\n\n" +
456   - "# Query Definition\n\n" +
457   - "\n\nMain **entity filter** is mandatory and defines generic search criteria. " +
458   - "For example, \"find all devices with profile 'Moisture Sensor'\" or \"Find all devices related to asset 'Building A'\"" +
459   - "\n\nOptional **key filters** allow to filter results of the entity filter by complex criteria against " +
460   - "main entity fields (name, label, type, etc), attributes and telemetry. " +
461   - "For example, \"temperature > 20 or temperature< 10\" or \"name starts with 'T', and attribute 'model' is 'T1000', and timeseries field 'batteryLevel' > 40\"." +
462   - "\n\nLet's review the example:" +
463   - "\n\n" + MARKDOWN_CODE_BLOCK_START +
464   - "{\n" +
465   - " \"entityFilter\": {\n" +
466   - " \"type\": \"entityType\",\n" +
467   - " \"entityType\": \"DEVICE\"\n" +
468   - " },\n" +
469   - " \"keyFilters\": [\n" +
470   - " {\n" +
471   - " \"key\": {\n" +
472   - " \"type\": \"ATTRIBUTE\",\n" +
473   - " \"key\": \"active\"\n" +
474   - " },\n" +
475   - " \"valueType\": \"BOOLEAN\",\n" +
476   - " \"predicate\": {\n" +
477   - " \"operation\": \"EQUAL\",\n" +
478   - " \"value\": {\n" +
479   - " \"defaultValue\": true,\n" +
480   - " \"dynamicValue\": null\n" +
481   - " },\n" +
482   - " \"type\": \"BOOLEAN\"\n" +
483   - " }\n" +
484   - " }\n" +
485   - " ]\n" +
486   - "}" +
487   - MARKDOWN_CODE_BLOCK_END +
488   - "\n\n Example mentioned above search all devices which have attribute 'active' set to 'true'. Now let's review available entity filters and key filters syntax:" +
489   - ENTITY_FILTERS +
490   - KEY_FILTERS +
491   - TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
492   -
493   - private static final String ENTITY_DATA_QUERY_DESCRIPTION =
494   - "Allows to run complex queries over platform entities (devices, assets, customers, etc) " +
495   - "based on the combination of main entity filter and multiple key filters. " +
496   - "Returns the paginated result of the query that contains requested entity fields and latest values of requested attributes and time-series data.\n\n" +
497   - "# Query Definition\n\n" +
498   - "\n\nMain **entity filter** is mandatory and defines generic search criteria. " +
499   - "For example, \"find all devices with profile 'Moisture Sensor'\" or \"Find all devices related to asset 'Building A'\"" +
500   - "\n\nOptional **key filters** allow to filter results of the **entity filter** by complex criteria against " +
501   - "main entity fields (name, label, type, etc), attributes and telemetry. " +
502   - "For example, \"temperature > 20 or temperature< 10\" or \"name starts with 'T', and attribute 'model' is 'T1000', and timeseries field 'batteryLevel' > 40\"." +
503   - "\n\nThe **entity fields** and **latest values** contains list of entity fields and latest attribute/telemetry fields to fetch for each entity." +
504   - "\n\nThe **page link** contains information about the page to fetch and the sort ordering." +
505   - "\n\nLet's review the example:" +
506   - "\n\n" + MARKDOWN_CODE_BLOCK_START +
507   - "{\n" +
508   - " \"entityFilter\": {\n" +
509   - " \"type\": \"entityType\",\n" +
510   - " \"resolveMultiple\": true,\n" +
511   - " \"entityType\": \"DEVICE\"\n" +
512   - " },\n" +
513   - " \"keyFilters\": [\n" +
514   - " {\n" +
515   - " \"key\": {\n" +
516   - " \"type\": \"TIME_SERIES\",\n" +
517   - " \"key\": \"temperature\"\n" +
518   - " },\n" +
519   - " \"valueType\": \"NUMERIC\",\n" +
520   - " \"predicate\": {\n" +
521   - " \"operation\": \"GREATER\",\n" +
522   - " \"value\": {\n" +
523   - " \"defaultValue\": 0,\n" +
524   - " \"dynamicValue\": {\n" +
525   - " \"sourceType\": \"CURRENT_USER\",\n" +
526   - " \"sourceAttribute\": \"temperatureThreshold\",\n" +
527   - " \"inherit\": false\n" +
528   - " }\n" +
529   - " },\n" +
530   - " \"type\": \"NUMERIC\"\n" +
531   - " }\n" +
532   - " }\n" +
533   - " ],\n" +
534   - " \"entityFields\": [\n" +
535   - " {\n" +
536   - " \"type\": \"ENTITY_FIELD\",\n" +
537   - " \"key\": \"name\"\n" +
538   - " },\n" +
539   - " {\n" +
540   - " \"type\": \"ENTITY_FIELD\",\n" +
541   - " \"key\": \"label\"\n" +
542   - " },\n" +
543   - " {\n" +
544   - " \"type\": \"ENTITY_FIELD\",\n" +
545   - " \"key\": \"additionalInfo\"\n" +
546   - " }\n" +
547   - " ],\n" +
548   - " \"latestValues\": [\n" +
549   - " {\n" +
550   - " \"type\": \"ATTRIBUTE\",\n" +
551   - " \"key\": \"model\"\n" +
552   - " },\n" +
553   - " {\n" +
554   - " \"type\": \"TIME_SERIES\",\n" +
555   - " \"key\": \"temperature\"\n" +
556   - " }\n" +
557   - " ],\n" +
558   - " \"pageLink\": {\n" +
559   - " \"page\": 0,\n" +
560   - " \"pageSize\": 10,\n" +
561   - " \"sortOrder\": {\n" +
562   - " \"key\": {\n" +
563   - " \"key\": \"name\",\n" +
564   - " \"type\": \"ENTITY_FIELD\"\n" +
565   - " },\n" +
566   - " \"direction\": \"ASC\"\n" +
567   - " }\n" +
568   - " }\n" +
569   - "}" +
570   - MARKDOWN_CODE_BLOCK_END +
571   - "\n\n Example mentioned above search all devices which have attribute 'active' set to 'true'. Now let's review available entity filters and key filters syntax:" +
572   - ENTITY_FILTERS +
573   - KEY_FILTERS +
574   - TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
575   -
576   -
577   - private static final String ALARM_DATA_QUERY_DESCRIPTION = "This method description defines how Alarm Data Query extends the Entity Data Query. " +
578   - "See method 'Find Entity Data by Query' first to get the info about 'Entity Data Query'." +
579   - "\n\n The platform will first search the entities that match the entity and key filters. Then, the platform will use 'Alarm Page Link' to filter the alarms related to those entities. " +
580   - "Finally, platform fetch the properties of alarm that are defined in the **'alarmFields'** and combine them with the other entity, attribute and latest time-series fields to return the result. " +
581   - "\n\n See example of the alarm query below. The query will search first 100 active alarms with type 'Temperature Alarm' or 'Fire Alarm' for any device with current temperature > 0. " +
582   - "The query will return combination of the entity fields: name of the device, device model and latest temperature reading and alarms fields: createdTime, type, severity and status: " +
583   - "\n\n" + MARKDOWN_CODE_BLOCK_START +
584   - "{\n" +
585   - " \"entityFilter\": {\n" +
586   - " \"type\": \"entityType\",\n" +
587   - " \"resolveMultiple\": true,\n" +
588   - " \"entityType\": \"DEVICE\"\n" +
589   - " },\n" +
590   - " \"pageLink\": {\n" +
591   - " \"page\": 0,\n" +
592   - " \"pageSize\": 100,\n" +
593   - " \"textSearch\": null,\n" +
594   - " \"searchPropagatedAlarms\": false,\n" +
595   - " \"statusList\": [\n" +
596   - " \"ACTIVE\"\n" +
597   - " ],\n" +
598   - " \"severityList\": [\n" +
599   - " \"CRITICAL\",\n" +
600   - " \"MAJOR\"\n" +
601   - " ],\n" +
602   - " \"typeList\": [\n" +
603   - " \"Temperature Alarm\",\n" +
604   - " \"Fire Alarm\"\n" +
605   - " ],\n" +
606   - " \"sortOrder\": {\n" +
607   - " \"key\": {\n" +
608   - " \"key\": \"createdTime\",\n" +
609   - " \"type\": \"ALARM_FIELD\"\n" +
610   - " },\n" +
611   - " \"direction\": \"DESC\"\n" +
612   - " },\n" +
613   - " \"timeWindow\": 86400000\n" +
614   - " },\n" +
615   - " \"keyFilters\": [\n" +
616   - " {\n" +
617   - " \"key\": {\n" +
618   - " \"type\": \"TIME_SERIES\",\n" +
619   - " \"key\": \"temperature\"\n" +
620   - " },\n" +
621   - " \"valueType\": \"NUMERIC\",\n" +
622   - " \"predicate\": {\n" +
623   - " \"operation\": \"GREATER\",\n" +
624   - " \"value\": {\n" +
625   - " \"defaultValue\": 0,\n" +
626   - " \"dynamicValue\": null\n" +
627   - " },\n" +
628   - " \"type\": \"NUMERIC\"\n" +
629   - " }\n" +
630   - " }\n" +
631   - " ],\n" +
632   - " \"alarmFields\": [\n" +
633   - " {\n" +
634   - " \"type\": \"ALARM_FIELD\",\n" +
635   - " \"key\": \"createdTime\"\n" +
636   - " },\n" +
637   - " {\n" +
638   - " \"type\": \"ALARM_FIELD\",\n" +
639   - " \"key\": \"type\"\n" +
640   - " },\n" +
641   - " {\n" +
642   - " \"type\": \"ALARM_FIELD\",\n" +
643   - " \"key\": \"severity\"\n" +
644   - " },\n" +
645   - " {\n" +
646   - " \"type\": \"ALARM_FIELD\",\n" +
647   - " \"key\": \"status\"\n" +
648   - " }\n" +
649   - " ],\n" +
650   - " \"entityFields\": [\n" +
651   - " {\n" +
652   - " \"type\": \"ENTITY_FIELD\",\n" +
653   - " \"key\": \"name\"\n" +
654   - " }\n" +
655   - " ],\n" +
656   - " \"latestValues\": [\n" +
657   - " {\n" +
658   - " \"type\": \"ATTRIBUTE\",\n" +
659   - " \"key\": \"model\"\n" +
660   - " },\n" +
661   - " {\n" +
662   - " \"type\": \"TIME_SERIES\",\n" +
663   - " \"key\": \"temperature\"\n" +
664   - " }\n" +
665   - " ]\n" +
666   - "}" +
667   - MARKDOWN_CODE_BLOCK_END +
668   - "";
669   -
670 51 @Autowired
671 52 private EntityQueryService entityQueryService;
672 53
... ...
... ... @@ -43,6 +43,11 @@ import org.thingsboard.server.service.security.permission.Operation;
43 43 import java.util.List;
44 44 import java.util.stream.Collectors;
45 45
  46 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_ID_PARAM_DESCRIPTION;
  47 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_TYPE_PARAM_DESCRIPTION;
  48 +import static org.thingsboard.server.controller.ControllerConstants.RELATION_INFO_DESCRIPTION;
  49 +import static org.thingsboard.server.controller.ControllerConstants.RELATION_TYPE_GROUP_PARAM_DESCRIPTION;
  50 +import static org.thingsboard.server.controller.ControllerConstants.RELATION_TYPE_PARAM_DESCRIPTION;
46 51
47 52 @RestController
48 53 @TbCoreComponent
... ...
... ... @@ -74,6 +74,11 @@ import java.util.concurrent.ExecutionException;
74 74 import java.util.stream.Collectors;
75 75
76 76 import static org.apache.commons.lang3.StringUtils.isBlank;
  77 +import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID;
  78 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION;
  79 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION;
  80 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION;
  81 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION;
77 82 import static org.thingsboard.server.controller.EdgeController.EDGE_ID;
78 83
79 84 /**
... ...
... ... @@ -40,6 +40,29 @@ import org.thingsboard.server.dao.model.ModelConstants;
40 40 import org.thingsboard.server.queue.util.TbCoreComponent;
41 41 import org.thingsboard.server.service.security.permission.Operation;
42 42
  43 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_ID;
  44 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_ID_PARAM_DESCRIPTION;
  45 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_TYPE;
  46 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_TYPE_PARAM_DESCRIPTION;
  47 +import static org.thingsboard.server.controller.ControllerConstants.EVENT_DEBUG_RULE_CHAIN_FILTER_OBJ;
  48 +import static org.thingsboard.server.controller.ControllerConstants.EVENT_DEBUG_RULE_NODE_FILTER_OBJ;
  49 +import static org.thingsboard.server.controller.ControllerConstants.EVENT_END_TIME_DESCRIPTION;
  50 +import static org.thingsboard.server.controller.ControllerConstants.EVENT_ERROR_FILTER_OBJ;
  51 +import static org.thingsboard.server.controller.ControllerConstants.EVENT_LC_EVENT_FILTER_OBJ;
  52 +import static org.thingsboard.server.controller.ControllerConstants.EVENT_SORT_PROPERTY_ALLOWABLE_VALUES;
  53 +import static org.thingsboard.server.controller.ControllerConstants.EVENT_START_TIME_DESCRIPTION;
  54 +import static org.thingsboard.server.controller.ControllerConstants.EVENT_STATS_FILTER_OBJ;
  55 +import static org.thingsboard.server.controller.ControllerConstants.EVENT_TEXT_SEARCH_DESCRIPTION;
  56 +import static org.thingsboard.server.controller.ControllerConstants.NEW_LINE;
  57 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  58 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  59 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  60 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  61 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  62 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  63 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_ID;
  64 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_ID_PARAM_DESCRIPTION;
  65 +
43 66 @RestController
44 67 @TbCoreComponent
45 68 @RequestMapping("/api")
... ...
... ... @@ -36,6 +36,9 @@ import org.thingsboard.server.service.security.permission.Resource;
36 36
37 37 import java.util.List;
38 38
  39 +import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_AUTHORITY_PARAGRAPH;
  40 +import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH;
  41 +
39 42 @RestController
40 43 @TbCoreComponent
41 44 @RequestMapping("/api/oauth2/config/template")
... ...
... ... @@ -43,6 +43,8 @@ import javax.servlet.http.HttpServletRequest;
43 43 import java.util.Enumeration;
44 44 import java.util.List;
45 45
  46 +import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_AUTHORITY_PARAGRAPH;
  47 +
46 48 @RestController
47 49 @TbCoreComponent
48 50 @RequestMapping("/api")
... ...
... ... @@ -49,6 +49,22 @@ import org.thingsboard.server.service.security.permission.Resource;
49 49
50 50 import java.nio.ByteBuffer;
51 51
  52 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_PROFILE_ID_PARAM_DESCRIPTION;
  53 +import static org.thingsboard.server.controller.ControllerConstants.OTA_PACKAGE_CHECKSUM_ALGORITHM_ALLOWABLE_VALUES;
  54 +import static org.thingsboard.server.controller.ControllerConstants.OTA_PACKAGE_DESCRIPTION;
  55 +import static org.thingsboard.server.controller.ControllerConstants.OTA_PACKAGE_ID_PARAM_DESCRIPTION;
  56 +import static org.thingsboard.server.controller.ControllerConstants.OTA_PACKAGE_INFO_DESCRIPTION;
  57 +import static org.thingsboard.server.controller.ControllerConstants.OTA_PACKAGE_SORT_PROPERTY_ALLOWABLE_VALUES;
  58 +import static org.thingsboard.server.controller.ControllerConstants.OTA_PACKAGE_TEXT_SEARCH_DESCRIPTION;
  59 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  60 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  61 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  62 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  63 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  64 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  65 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  66 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
  67 +
52 68 @Slf4j
53 69 @RestController
54 70 @TbCoreComponent
... ...
... ... @@ -32,6 +32,10 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
32 32
33 33 import java.util.Set;
34 34
  35 +import static org.thingsboard.server.controller.ControllerConstants.QUEUE_SERVICE_TYPE_ALLOWABLE_VALUES;
  36 +import static org.thingsboard.server.controller.ControllerConstants.QUEUE_SERVICE_TYPE_DESCRIPTION;
  37 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  38 +
35 39 @RestController
36 40 @TbCoreComponent
37 41 @RequestMapping("/api")
... ...
... ... @@ -34,6 +34,9 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
34 34
35 35 import java.util.UUID;
36 36
  37 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_ID_PARAM_DESCRIPTION;
  38 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
  39 +
37 40 @RestController
38 41 @TbCoreComponent
39 42 @RequestMapping(TbUrlConstants.RPC_V1_URL_PREFIX)
... ...
... ... @@ -53,6 +53,8 @@ import java.util.UUID;
53 53
54 54 import static org.thingsboard.server.common.data.DataConstants.RPC_DELETED;
55 55
  56 +import static org.thingsboard.server.controller.ControllerConstants.*;
  57 +
56 58 @RestController
57 59 @TbCoreComponent
58 60 @RequestMapping(TbUrlConstants.RPC_V2_URL_PREFIX)
... ...
... ... @@ -81,6 +81,25 @@ import java.util.concurrent.ConcurrentMap;
81 81 import java.util.concurrent.TimeUnit;
82 82 import java.util.stream.Collectors;
83 83
  84 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION;
  85 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION;
  86 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION;
  87 +import static org.thingsboard.server.controller.ControllerConstants.EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION;
  88 +import static org.thingsboard.server.controller.ControllerConstants.MARKDOWN_CODE_BLOCK_END;
  89 +import static org.thingsboard.server.controller.ControllerConstants.MARKDOWN_CODE_BLOCK_START;
  90 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  91 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  92 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  93 +import static org.thingsboard.server.controller.ControllerConstants.RULE_CHAIN_ID_PARAM_DESCRIPTION;
  94 +import static org.thingsboard.server.controller.ControllerConstants.RULE_CHAIN_SORT_PROPERTY_ALLOWABLE_VALUES;
  95 +import static org.thingsboard.server.controller.ControllerConstants.RULE_CHAIN_TEXT_SEARCH_DESCRIPTION;
  96 +import static org.thingsboard.server.controller.ControllerConstants.RULE_CHAIN_TYPES_ALLOWABLE_VALUES;
  97 +import static org.thingsboard.server.controller.ControllerConstants.RULE_CHAIN_TYPE_DESCRIPTION;
  98 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  99 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  100 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  101 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  102 +
84 103 @Slf4j
85 104 @RestController
86 105 @TbCoreComponent
... ...
... ... @@ -47,6 +47,22 @@ import org.thingsboard.server.service.security.permission.Resource;
47 47 import java.util.Base64;
48 48 import java.util.List;
49 49
  50 +import static org.thingsboard.server.controller.ControllerConstants.LWM2M_OBJECT_DESCRIPTION;
  51 +import static org.thingsboard.server.controller.ControllerConstants.LWM2M_OBJECT_SORT_PROPERTY_ALLOWABLE_VALUES;
  52 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  53 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  54 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  55 +import static org.thingsboard.server.controller.ControllerConstants.RESOURCE_DESCRIPTION;
  56 +import static org.thingsboard.server.controller.ControllerConstants.RESOURCE_ID_PARAM_DESCRIPTION;
  57 +import static org.thingsboard.server.controller.ControllerConstants.RESOURCE_INFO_DESCRIPTION;
  58 +import static org.thingsboard.server.controller.ControllerConstants.RESOURCE_SORT_PROPERTY_ALLOWABLE_VALUES;
  59 +import static org.thingsboard.server.controller.ControllerConstants.RESOURCE_TEXT_SEARCH_DESCRIPTION;
  60 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  61 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  62 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  63 +import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH;
  64 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;
  65 +
50 66 @Slf4j
51 67 @RestController
52 68 @TbCoreComponent
... ...
... ... @@ -103,6 +103,14 @@ import java.util.concurrent.Executors;
103 103 import java.util.concurrent.TimeUnit;
104 104 import java.util.stream.Collectors;
105 105
  106 +import static org.thingsboard.server.controller.ControllerConstants.DEVICE_ID_PARAM_DESCRIPTION;
  107 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_ID_PARAM_DESCRIPTION;
  108 +import static org.thingsboard.server.controller.ControllerConstants.ENTITY_TYPE_PARAM_DESCRIPTION;
  109 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  110 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  111 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
  112 +
  113 +
106 114 /**
107 115 * Created by ashvayka on 22.03.18.
108 116 */
... ...
... ... @@ -43,6 +43,21 @@ import org.thingsboard.server.service.install.InstallScripts;
43 43 import org.thingsboard.server.service.security.permission.Operation;
44 44 import org.thingsboard.server.service.security.permission.Resource;
45 45
  46 +import static org.thingsboard.server.controller.ControllerConstants.HOME_DASHBOARD;
  47 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_DATA_PARAMETERS;
  48 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
  49 +import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
  50 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
  51 +import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION;
  52 +import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION;
  53 +import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_AUTHORITY_PARAGRAPH;
  54 +import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH;
  55 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_ID;
  56 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_ID_PARAM_DESCRIPTION;
  57 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_INFO_SORT_PROPERTY_ALLOWABLE_VALUES;
  58 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_SORT_PROPERTY_ALLOWABLE_VALUES;
  59 +import static org.thingsboard.server.controller.ControllerConstants.TENANT_TEXT_SEARCH_DESCRIPTION;
  60 +
46 61 @RestController
47 62 @TbCoreComponent
48 63 @RequestMapping("/api")
... ...
... ... @@ -40,6 +40,8 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
40 40 import org.thingsboard.server.service.security.permission.Operation;
41 41 import org.thingsboard.server.service.security.permission.Resource;
42 42
  43 +import static org.thingsboard.server.controller.ControllerConstants.*;
  44 +
43 45 @RestController
44 46 @TbCoreComponent
45 47 @RequestMapping("/api")
... ...
... ... @@ -62,6 +62,8 @@ import org.thingsboard.server.service.security.system.SystemSecurityService;
62 62 import javax.servlet.http.HttpServletRequest;
63 63 import java.util.List;
64 64
  65 +import static org.thingsboard.server.controller.ControllerConstants.*;
  66 +
65 67 @RequiredArgsConstructor
66 68 @RestController
67 69 @TbCoreComponent
... ...
... ... @@ -28,7 +28,6 @@ import org.springframework.web.bind.annotation.RequestParam;
28 28 import org.springframework.web.bind.annotation.ResponseBody;
29 29 import org.springframework.web.bind.annotation.ResponseStatus;
30 30 import org.springframework.web.bind.annotation.RestController;
31   -import org.thingsboard.server.common.data.EntityType;
32 31 import org.thingsboard.server.common.data.edge.EdgeEventActionType;
33 32 import org.thingsboard.server.common.data.exception.ThingsboardException;
34 33 import org.thingsboard.server.common.data.id.TenantId;
... ... @@ -44,6 +43,8 @@ import org.thingsboard.server.service.security.permission.Resource;
44 43
45 44 import java.util.List;
46 45
  46 +import static org.thingsboard.server.controller.ControllerConstants.*;
  47 +
47 48 @Slf4j
48 49 @RestController
49 50 @TbCoreComponent
... ...
... ... @@ -41,6 +41,8 @@ import org.thingsboard.server.service.security.permission.Resource;
41 41
42 42 import java.util.List;
43 43
  44 +import static org.thingsboard.server.controller.ControllerConstants.*;
  45 +
44 46 @RestController
45 47 @TbCoreComponent
46 48 @RequestMapping("/api")
... ...