Commit 26c54f7a35170310645d8b35c2a29130e5b08dc9

Authored by Andrii Shvaika
2 parents 2c0f0136 2e6b839a

Audit log improvement

@@ -65,8 +65,8 @@ public class AlarmController extends BaseController { @@ -65,8 +65,8 @@ public class AlarmController extends BaseController {
65 private static final String ALARM_QUERY_STATUS_DESCRIPTION = "A string value representing one of the AlarmStatus enumeration value"; 65 private static final String ALARM_QUERY_STATUS_DESCRIPTION = "A string value representing one of the AlarmStatus enumeration value";
66 private static final String ALARM_QUERY_STATUS_ALLOWABLE_VALUES = "ACTIVE_UNACK, ACTIVE_ACK, CLEARED_UNACK, CLEARED_ACK"; 66 private static final String ALARM_QUERY_STATUS_ALLOWABLE_VALUES = "ACTIVE_UNACK, ACTIVE_ACK, CLEARED_UNACK, CLEARED_ACK";
67 private static final String ALARM_QUERY_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on of next alarm fields: type, severity or status"; 67 private static final String ALARM_QUERY_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on of next alarm fields: type, severity or status";
68 - private static final String ALARM_QUERY_START_TIME_DESCRIPTION = "The start timestamp(milliseconds) of the search time range over the alarm object field: 'createdTime'.";  
69 - private static final String ALARM_QUERY_END_TIME_DESCRIPTION = "The end timestamp(milliseconds) of the search time range over the alarm object field: 'createdTime'."; 68 + private static final String ALARM_QUERY_START_TIME_DESCRIPTION = "The start timestamp in milliseconds of the search time range over the Alarm class field: 'createdTime'.";
  69 + private static final String ALARM_QUERY_END_TIME_DESCRIPTION = "The end timestamp in milliseconds of the search time range over the Alarm class field: 'createdTime'.";
70 private static final String ALARM_QUERY_FETCH_ORIGINATOR_DESCRIPTION = "A boolean value to specify if the alarm originator name will be " + 70 private static final String ALARM_QUERY_FETCH_ORIGINATOR_DESCRIPTION = "A boolean value to specify if the alarm originator name will be " +
71 "filled in the AlarmInfo object field: 'originatorName' or will returns as null."; 71 "filled in the AlarmInfo object field: 'originatorName' or will returns as null.";
72 72
@@ -15,7 +15,10 @@ @@ -15,7 +15,10 @@
15 */ 15 */
16 package org.thingsboard.server.controller; 16 package org.thingsboard.server.controller;
17 17
  18 +import io.swagger.annotations.ApiOperation;
  19 +import io.swagger.annotations.ApiParam;
18 import org.apache.commons.lang3.StringUtils; 20 import org.apache.commons.lang3.StringUtils;
  21 +import org.springframework.http.MediaType;
19 import org.springframework.security.access.prepost.PreAuthorize; 22 import org.springframework.security.access.prepost.PreAuthorize;
20 import org.springframework.web.bind.annotation.PathVariable; 23 import org.springframework.web.bind.annotation.PathVariable;
21 import org.springframework.web.bind.annotation.RequestMapping; 24 import org.springframework.web.bind.annotation.RequestMapping;
@@ -44,18 +47,42 @@ import java.util.stream.Collectors; @@ -44,18 +47,42 @@ import java.util.stream.Collectors;
44 @RequestMapping("/api") 47 @RequestMapping("/api")
45 public class AuditLogController extends BaseController { 48 public class AuditLogController extends BaseController {
46 49
  50 + private static final String AUDIT_LOG_QUERY_START_TIME_DESCRIPTION = "The start timestamp in milliseconds of the search time range over the AuditLog class field: 'createdTime'.";
  51 + private static final String AUDIT_LOG_QUERY_END_TIME_DESCRIPTION = "The end timestamp in milliseconds of the search time range over the AuditLog class field: 'createdTime'.";
  52 + private static final String AUDIT_LOG_QUERY_ACTION_TYPES_DESCRIPTION = "A String value representing comma-separated list of action types. " +
  53 + "This parameter is optional, but it can be used to filter results to fetch only audit logs of specific action types. " +
  54 + "For example, 'LOGIN', 'LOGOUT'. See the 'Model' tab of the Response Class for more details.";
  55 + private static final String AUDIT_LOG_SORT_PROPERTY_DESCRIPTION = "Property of audit log to sort by. " +
  56 + "See the 'Model' tab of the Response Class for more details. " +
  57 + "Note: entityType sort property is not defined in the AuditLog class, however, it can be used to sort audit logs by types of entities that were logged.";
  58 +
  59 +
  60 + @ApiOperation(value = "Get audit logs by customer id (getAuditLogsByCustomerId)",
  61 + notes = "Returns a page of audit logs related to the targeted customer entities (devices, assets, etc.), " +
  62 + "and users actions (login, logout, etc.) that belong to this customer. " +
  63 + PAGE_DATA_PARAMETERS + ADMINISTRATOR_AUTHORITY_ONLY,
  64 + produces = MediaType.APPLICATION_JSON_VALUE)
47 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 65 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
48 @RequestMapping(value = "/audit/logs/customer/{customerId}", params = {"pageSize", "page"}, method = RequestMethod.GET) 66 @RequestMapping(value = "/audit/logs/customer/{customerId}", params = {"pageSize", "page"}, method = RequestMethod.GET)
49 @ResponseBody 67 @ResponseBody
50 public PageData<AuditLog> getAuditLogsByCustomerId( 68 public PageData<AuditLog> getAuditLogsByCustomerId(
  69 + @ApiParam(value = CUSTOMER_ID_PARAM_DESCRIPTION)
51 @PathVariable("customerId") String strCustomerId, 70 @PathVariable("customerId") String strCustomerId,
  71 + @ApiParam(value = PAGE_SIZE_DESCRIPTION)
52 @RequestParam int pageSize, 72 @RequestParam int pageSize,
  73 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION)
53 @RequestParam int page, 74 @RequestParam int page,
  75 + @ApiParam(value = AUDIT_LOG_TEXT_SEARCH_DESCRIPTION)
54 @RequestParam(required = false) String textSearch, 76 @RequestParam(required = false) String textSearch,
  77 + @ApiParam(value = AUDIT_LOG_SORT_PROPERTY_DESCRIPTION, allowableValues = AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES)
55 @RequestParam(required = false) String sortProperty, 78 @RequestParam(required = false) String sortProperty,
  79 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
56 @RequestParam(required = false) String sortOrder, 80 @RequestParam(required = false) String sortOrder,
  81 + @ApiParam(value = AUDIT_LOG_QUERY_START_TIME_DESCRIPTION)
57 @RequestParam(required = false) Long startTime, 82 @RequestParam(required = false) Long startTime,
  83 + @ApiParam(value = AUDIT_LOG_QUERY_END_TIME_DESCRIPTION)
58 @RequestParam(required = false) Long endTime, 84 @RequestParam(required = false) Long endTime,
  85 + @ApiParam(value = AUDIT_LOG_QUERY_ACTION_TYPES_DESCRIPTION)
59 @RequestParam(name = "actionTypes", required = false) String actionTypesStr) throws ThingsboardException { 86 @RequestParam(name = "actionTypes", required = false) String actionTypesStr) throws ThingsboardException {
60 try { 87 try {
61 checkParameter("CustomerId", strCustomerId); 88 checkParameter("CustomerId", strCustomerId);
@@ -68,18 +95,32 @@ public class AuditLogController extends BaseController { @@ -68,18 +95,32 @@ public class AuditLogController extends BaseController {
68 } 95 }
69 } 96 }
70 97
  98 + @ApiOperation(value = "Get audit logs by user id (getAuditLogsByUserId)",
  99 + notes = "Returns a page of audit logs related to the actions of targeted user. " +
  100 + "For example, RPC call to a particular device, or alarm acknowledgment for a specific device, etc. " +
  101 + PAGE_DATA_PARAMETERS + ADMINISTRATOR_AUTHORITY_ONLY,
  102 + produces = MediaType.APPLICATION_JSON_VALUE)
71 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 103 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
72 @RequestMapping(value = "/audit/logs/user/{userId}", params = {"pageSize", "page"}, method = RequestMethod.GET) 104 @RequestMapping(value = "/audit/logs/user/{userId}", params = {"pageSize", "page"}, method = RequestMethod.GET)
73 @ResponseBody 105 @ResponseBody
74 public PageData<AuditLog> getAuditLogsByUserId( 106 public PageData<AuditLog> getAuditLogsByUserId(
  107 + @ApiParam(value = USER_ID_PARAM_DESCRIPTION)
75 @PathVariable("userId") String strUserId, 108 @PathVariable("userId") String strUserId,
  109 + @ApiParam(value = PAGE_SIZE_DESCRIPTION)
76 @RequestParam int pageSize, 110 @RequestParam int pageSize,
  111 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION)
77 @RequestParam int page, 112 @RequestParam int page,
  113 + @ApiParam(value = AUDIT_LOG_TEXT_SEARCH_DESCRIPTION)
78 @RequestParam(required = false) String textSearch, 114 @RequestParam(required = false) String textSearch,
  115 + @ApiParam(value = AUDIT_LOG_SORT_PROPERTY_DESCRIPTION, allowableValues = AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES)
79 @RequestParam(required = false) String sortProperty, 116 @RequestParam(required = false) String sortProperty,
  117 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
80 @RequestParam(required = false) String sortOrder, 118 @RequestParam(required = false) String sortOrder,
  119 + @ApiParam(value = AUDIT_LOG_QUERY_START_TIME_DESCRIPTION)
81 @RequestParam(required = false) Long startTime, 120 @RequestParam(required = false) Long startTime,
  121 + @ApiParam(value = AUDIT_LOG_QUERY_END_TIME_DESCRIPTION)
82 @RequestParam(required = false) Long endTime, 122 @RequestParam(required = false) Long endTime,
  123 + @ApiParam(value = AUDIT_LOG_QUERY_ACTION_TYPES_DESCRIPTION)
83 @RequestParam(name = "actionTypes", required = false) String actionTypesStr) throws ThingsboardException { 124 @RequestParam(name = "actionTypes", required = false) String actionTypesStr) throws ThingsboardException {
84 try { 125 try {
85 checkParameter("UserId", strUserId); 126 checkParameter("UserId", strUserId);
@@ -92,19 +133,35 @@ public class AuditLogController extends BaseController { @@ -92,19 +133,35 @@ public class AuditLogController extends BaseController {
92 } 133 }
93 } 134 }
94 135
  136 + @ApiOperation(value = "Get audit logs by entity id (getAuditLogsByEntityId)",
  137 + notes = "Returns a page of audit logs related to the actions on the targeted entity. " +
  138 + "Basically, this API call is used to get the full lifecycle of some specific entity. " +
  139 + "For example to see when a device was created, updated, assigned to some customer, or even deleted from the system. " +
  140 + PAGE_DATA_PARAMETERS + ADMINISTRATOR_AUTHORITY_ONLY,
  141 + produces = MediaType.APPLICATION_JSON_VALUE)
95 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 142 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
96 @RequestMapping(value = "/audit/logs/entity/{entityType}/{entityId}", params = {"pageSize", "page"}, method = RequestMethod.GET) 143 @RequestMapping(value = "/audit/logs/entity/{entityType}/{entityId}", params = {"pageSize", "page"}, method = RequestMethod.GET)
97 @ResponseBody 144 @ResponseBody
98 public PageData<AuditLog> getAuditLogsByEntityId( 145 public PageData<AuditLog> getAuditLogsByEntityId(
  146 + @ApiParam(value = ENTITY_TYPE_PARAM_DESCRIPTION)
99 @PathVariable("entityType") String strEntityType, 147 @PathVariable("entityType") String strEntityType,
  148 + @ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION)
100 @PathVariable("entityId") String strEntityId, 149 @PathVariable("entityId") String strEntityId,
  150 + @ApiParam(value = PAGE_SIZE_DESCRIPTION)
101 @RequestParam int pageSize, 151 @RequestParam int pageSize,
  152 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION)
102 @RequestParam int page, 153 @RequestParam int page,
  154 + @ApiParam(value = AUDIT_LOG_TEXT_SEARCH_DESCRIPTION)
103 @RequestParam(required = false) String textSearch, 155 @RequestParam(required = false) String textSearch,
  156 + @ApiParam(value = AUDIT_LOG_SORT_PROPERTY_DESCRIPTION, allowableValues = AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES)
104 @RequestParam(required = false) String sortProperty, 157 @RequestParam(required = false) String sortProperty,
  158 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
105 @RequestParam(required = false) String sortOrder, 159 @RequestParam(required = false) String sortOrder,
  160 + @ApiParam(value = AUDIT_LOG_QUERY_START_TIME_DESCRIPTION)
106 @RequestParam(required = false) Long startTime, 161 @RequestParam(required = false) Long startTime,
  162 + @ApiParam(value = AUDIT_LOG_QUERY_END_TIME_DESCRIPTION)
107 @RequestParam(required = false) Long endTime, 163 @RequestParam(required = false) Long endTime,
  164 + @ApiParam(value = AUDIT_LOG_QUERY_ACTION_TYPES_DESCRIPTION)
108 @RequestParam(name = "actionTypes", required = false) String actionTypesStr) throws ThingsboardException { 165 @RequestParam(name = "actionTypes", required = false) String actionTypesStr) throws ThingsboardException {
109 try { 166 try {
110 checkParameter("EntityId", strEntityId); 167 checkParameter("EntityId", strEntityId);
@@ -118,17 +175,29 @@ public class AuditLogController extends BaseController { @@ -118,17 +175,29 @@ public class AuditLogController extends BaseController {
118 } 175 }
119 } 176 }
120 177
  178 + @ApiOperation(value = "Get all audit logs (getAuditLogs)",
  179 + notes = "Returns a page of audit logs related to all entities in the scope of the current user's Tenant. " +
  180 + PAGE_DATA_PARAMETERS + ADMINISTRATOR_AUTHORITY_ONLY,
  181 + produces = MediaType.APPLICATION_JSON_VALUE)
121 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 182 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
122 @RequestMapping(value = "/audit/logs", params = {"pageSize", "page"}, method = RequestMethod.GET) 183 @RequestMapping(value = "/audit/logs", params = {"pageSize", "page"}, method = RequestMethod.GET)
123 @ResponseBody 184 @ResponseBody
124 public PageData<AuditLog> getAuditLogs( 185 public PageData<AuditLog> getAuditLogs(
  186 + @ApiParam(value = PAGE_SIZE_DESCRIPTION)
125 @RequestParam int pageSize, 187 @RequestParam int pageSize,
  188 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION)
126 @RequestParam int page, 189 @RequestParam int page,
  190 + @ApiParam(value = AUDIT_LOG_TEXT_SEARCH_DESCRIPTION)
127 @RequestParam(required = false) String textSearch, 191 @RequestParam(required = false) String textSearch,
  192 + @ApiParam(value = AUDIT_LOG_SORT_PROPERTY_DESCRIPTION, allowableValues = AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES)
128 @RequestParam(required = false) String sortProperty, 193 @RequestParam(required = false) String sortProperty,
  194 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
129 @RequestParam(required = false) String sortOrder, 195 @RequestParam(required = false) String sortOrder,
  196 + @ApiParam(value = AUDIT_LOG_QUERY_START_TIME_DESCRIPTION)
130 @RequestParam(required = false) Long startTime, 197 @RequestParam(required = false) Long startTime,
  198 + @ApiParam(value = AUDIT_LOG_QUERY_END_TIME_DESCRIPTION)
131 @RequestParam(required = false) Long endTime, 199 @RequestParam(required = false) Long endTime,
  200 + @ApiParam(value = AUDIT_LOG_QUERY_ACTION_TYPES_DESCRIPTION)
132 @RequestParam(name = "actionTypes", required = false) String actionTypesStr) throws ThingsboardException { 201 @RequestParam(name = "actionTypes", required = false) String actionTypesStr) throws ThingsboardException {
133 try { 202 try {
134 TenantId tenantId = getCurrentUser().getTenantId(); 203 TenantId tenantId = getCurrentUser().getTenantId();
@@ -169,63 +169,69 @@ public abstract class BaseController { @@ -169,63 +169,69 @@ public abstract class BaseController {
169 public static final String TENANT_ID_PARAM_DESCRIPTION = "A string value representing the tenant id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 169 public static final String TENANT_ID_PARAM_DESCRIPTION = "A string value representing the tenant id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
170 public static final String EDGE_ID_PARAM_DESCRIPTION = "A string value representing the edge id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 170 public static final String EDGE_ID_PARAM_DESCRIPTION = "A string value representing the edge id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
171 public static final String CUSTOMER_ID_PARAM_DESCRIPTION = "A string value representing the customer id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 171 public static final String CUSTOMER_ID_PARAM_DESCRIPTION = "A string value representing the customer id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  172 + public static final String USER_ID_PARAM_DESCRIPTION = "A string value representing the user id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
172 public static final String ASSET_ID_PARAM_DESCRIPTION = "A string value representing the asset id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 173 public static final String ASSET_ID_PARAM_DESCRIPTION = "A string value representing the asset id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
173 public static final String ALARM_ID_PARAM_DESCRIPTION = "A string value representing the alarm id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 174 public static final String ALARM_ID_PARAM_DESCRIPTION = "A string value representing the alarm id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
174 public static final String ENTITY_ID_PARAM_DESCRIPTION = "A string value representing the entity id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 175 public static final String ENTITY_ID_PARAM_DESCRIPTION = "A string value representing the entity id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
175 public static final String ENTITY_TYPE_PARAM_DESCRIPTION = "A string value representing the entity type. For example, 'DEVICE'"; 176 public static final String ENTITY_TYPE_PARAM_DESCRIPTION = "A string value representing the entity type. For example, 'DEVICE'";
176 public static final String RULE_CHAIN_ID_PARAM_DESCRIPTION = "A string value representing the rule chain id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 177 public static final String RULE_CHAIN_ID_PARAM_DESCRIPTION = "A string value representing the rule chain id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
177 178
178 - protected final String PAGE_SIZE_DESCRIPTION = "Maximum amount of entities in a one page";  
179 - protected final String PAGE_NUMBER_DESCRIPTION = "Sequence number of page starting from 0";  
180 - protected final String DEVICE_TYPE_DESCRIPTION = "Device type as the name of the device profile";  
181 - protected final String ASSET_TYPE_DESCRIPTION = "Asset type";  
182 - protected final String EDGE_TYPE_DESCRIPTION = "A string value representing the edge type. For example, 'default'";  
183 -  
184 - protected final String ASSET_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the asset name.";  
185 - protected final String DASHBOARD_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the dashboard title.";  
186 - protected final String DEVICE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device name.";  
187 - protected final String CUSTOMER_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the customer title.";  
188 - protected final String EDGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the edge name.";  
189 - protected final String EVENT_TEXT_SEARCH_DESCRIPTION = "The value is not used in searching.";  
190 - protected final String SORT_PROPERTY_DESCRIPTION = "Property of entity to sort by";  
191 - protected final String DASHBOARD_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title";  
192 - protected final String CUSTOMER_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, email, country, city";  
193 - protected final String DEVICE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, deviceProfileName, label, customerTitle";  
194 - protected final String ASSET_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle";  
195 - protected final String ALARM_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, startTs, endTs, type, ackTs, clearTs, severity, status";  
196 - protected final String EVENT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, id";  
197 - protected final String EDGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle";  
198 - protected final String SORT_ORDER_DESCRIPTION = "Sort order. ASC (ASCENDING) or DESC (DESCENDING)";  
199 - protected final String SORT_ORDER_ALLOWABLE_VALUES = "ASC, DESC";  
200 - protected 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. ";  
201 - protected final String ASSET_INFO_DESCRIPTION = "Asset Info is an extension of the default Asset object that contains information about the assigned customer name. ";  
202 - protected final String ALARM_INFO_DESCRIPTION = "Alarm Info is an extension of the default Alarm object that also contains name of the alarm originator.";  
203 - protected 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. ";  
204 - protected final String EDGE_INFO_DESCRIPTION = "Edge Info is an extension of the default Edge object that contains information about the assigned customer name. ";  
205 -  
206 - protected final String DEVICE_NAME_DESCRIPTION = "A string value representing the Device name.";  
207 - protected final String ASSET_NAME_DESCRIPTION = "A string value representing the Asset name.";  
208 -  
209 - protected final String EVENT_START_TIME_DESCRIPTION = "Timestamp. Events with creation time before it won't be queried.";  
210 - protected final String EVENT_END_TIME_DESCRIPTION = "Timestamp. Events with creation time after it won't be queried.";  
211 -  
212 - protected final String MARKDOWN_CODE_BLOCK_START = "```json\n";  
213 - protected final String MARKDOWN_CODE_BLOCK_END = "\n```";  
214 - protected final String EVENT_ERROR_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"ERROR\", \"server\": \"ip-172-31-24-152\", " + 179 +
  180 + protected static final String PAGE_SIZE_DESCRIPTION = "Maximum amount of entities in a one page";
  181 + protected static final String PAGE_NUMBER_DESCRIPTION = "Sequence number of page starting from 0";
  182 + protected static final String DEVICE_TYPE_DESCRIPTION = "Device type as the name of the device profile";
  183 + protected static final String ASSET_TYPE_DESCRIPTION = "Asset type";
  184 + protected static final String EDGE_TYPE_DESCRIPTION = "A string value representing the edge type. For example, 'default'";
  185 +
  186 + protected static final String ASSET_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the asset name.";
  187 + protected static final String DASHBOARD_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the dashboard title.";
  188 + protected static final String DEVICE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device name.";
  189 + protected static final String CUSTOMER_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the customer title.";
  190 + protected static final String EDGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the edge name.";
  191 + protected static final String EVENT_TEXT_SEARCH_DESCRIPTION = "The value is not used in searching.";
  192 + 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.";
  193 + protected static final String SORT_PROPERTY_DESCRIPTION = "Property of entity to sort by";
  194 + protected static final String DASHBOARD_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title";
  195 + protected static final String CUSTOMER_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, email, country, city";
  196 + protected static final String DEVICE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, deviceProfileName, label, customerTitle";
  197 + protected static final String ASSET_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle";
  198 + protected static final String ALARM_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, startTs, endTs, type, ackTs, clearTs, severity, status";
  199 + protected static final String EVENT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, id";
  200 + protected static final String EDGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle";
  201 + protected static final String AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, entityType, entityName, userName, actionType, actionStatus";
  202 + protected static final String SORT_ORDER_DESCRIPTION = "Sort order. ASC (ASCENDING) or DESC (DESCENDING)";
  203 + protected static final String SORT_ORDER_ALLOWABLE_VALUES = "ASC, DESC";
  204 + 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. ";
  205 + 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. ";
  206 + 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.";
  207 + 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. ";
  208 + 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. ";
  209 +
  210 + protected static final String DEVICE_NAME_DESCRIPTION = "A string value representing the Device name.";
  211 + protected static final String ASSET_NAME_DESCRIPTION = "A string value representing the Asset name.";
  212 +
  213 + protected static final String EVENT_START_TIME_DESCRIPTION = "Timestamp. Events with creation time before it won't be queried.";
  214 + protected static final String EVENT_END_TIME_DESCRIPTION = "Timestamp. Events with creation time after it won't be queried.";
  215 +
  216 + protected static final String MARKDOWN_CODE_BLOCK_START = "```json\n";
  217 + protected static final String MARKDOWN_CODE_BLOCK_END = "\n```";
  218 + protected static final String EVENT_ERROR_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"ERROR\", \"server\": \"ip-172-31-24-152\", " +
215 "\"method\": \"onClusterEventMsg\", \"error\": \"Error Message\" }" + MARKDOWN_CODE_BLOCK_END; 219 "\"method\": \"onClusterEventMsg\", \"error\": \"Error Message\" }" + MARKDOWN_CODE_BLOCK_END;
216 - protected final String EVENT_LC_EVENT_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"LC_EVENT\", \"server\": \"ip-172-31-24-152\", \"event\":" + 220 + protected static final String EVENT_LC_EVENT_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"LC_EVENT\", \"server\": \"ip-172-31-24-152\", \"event\":" +
217 " \"STARTED\", \"status\": \"Success\", \"error\": \"Error Message\" }" + MARKDOWN_CODE_BLOCK_END; 221 " \"STARTED\", \"status\": \"Success\", \"error\": \"Error Message\" }" + MARKDOWN_CODE_BLOCK_END;
218 - protected 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;  
219 - protected final String DEBUG_FILTER_OBJ = "\"msgDirectionType\": \"IN\", \"server\": \"ip-172-31-24-152\", \"dataSearch\": \"humidity\", " + 222 + 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;
  223 + protected static final String DEBUG_FILTER_OBJ = "\"msgDirectionType\": \"IN\", \"server\": \"ip-172-31-24-152\", \"dataSearch\": \"humidity\", " +
220 "\"metadataSearch\": \"deviceName\", \"entityName\": \"DEVICE\", \"relationType\": \"Success\"," + 224 "\"metadataSearch\": \"deviceName\", \"entityName\": \"DEVICE\", \"relationType\": \"Success\"," +
221 " \"entityId\": \"de9d54a0-2b7a-11ec-a3cc-23386423d98f\", \"msgType\": \"POST_TELEMETRY_REQUEST\"," + 225 " \"entityId\": \"de9d54a0-2b7a-11ec-a3cc-23386423d98f\", \"msgType\": \"POST_TELEMETRY_REQUEST\"," +
222 " \"isError\": \"false\", \"error\": \"Error Message\" }"; 226 " \"isError\": \"false\", \"error\": \"Error Message\" }";
223 - protected final String EVENT_DEBUG_RULE_NODE_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"DEBUG_RULE_NODE\"," + DEBUG_FILTER_OBJ + MARKDOWN_CODE_BLOCK_END;  
224 - protected final String EVENT_DEBUG_RULE_CHAIN_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"DEBUG_RULE_CHAIN\"," + DEBUG_FILTER_OBJ + MARKDOWN_CODE_BLOCK_END; 227 + 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;
  228 + 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;
225 229
226 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."; 230 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.";
227 protected static final String RELATION_TYPE_GROUP_PARAM_DESCRIPTION = "A string value representing relation type group. For example, 'COMMON'"; 231 protected static final String RELATION_TYPE_GROUP_PARAM_DESCRIPTION = "A string value representing relation type group. For example, 'COMMON'";
228 232
  233 + protected static final String ADMINISTRATOR_AUTHORITY_ONLY = "Available for users with 'Tenant Administrator' authority only.";
  234 +
229 public static final String INCORRECT_TENANT_ID = "Incorrect tenantId "; 235 public static final String INCORRECT_TENANT_ID = "Incorrect tenantId ";
230 protected static final String DEFAULT_DASHBOARD = "defaultDashboardId"; 236 protected static final String DEFAULT_DASHBOARD = "defaultDashboardId";
231 protected static final String HOME_DASHBOARD = "homeDashboardId"; 237 protected static final String HOME_DASHBOARD = "homeDashboardId";
@@ -212,7 +212,7 @@ public class CustomerController extends BaseController { @@ -212,7 +212,7 @@ public class CustomerController extends BaseController {
212 } 212 }
213 213
214 @ApiOperation(value = "Get Tenant Customer by Customer title (getTenantCustomer)", 214 @ApiOperation(value = "Get Tenant Customer by Customer title (getTenantCustomer)",
215 - notes = "Get the Customer using Customer Title. Available for users with 'Tenant Administrator' authority only.") 215 + notes = "Get the Customer using Customer Title. " + ADMINISTRATOR_AUTHORITY_ONLY)
216 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 216 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
217 @RequestMapping(value = "/tenant/customers", params = {"customerTitle"}, method = RequestMethod.GET) 217 @RequestMapping(value = "/tenant/customers", params = {"customerTitle"}, method = RequestMethod.GET)
218 @ResponseBody 218 @ResponseBody
@@ -16,24 +16,37 @@ @@ -16,24 +16,37 @@
16 package org.thingsboard.server.common.data.audit; 16 package org.thingsboard.server.common.data.audit;
17 17
18 import com.fasterxml.jackson.databind.JsonNode; 18 import com.fasterxml.jackson.databind.JsonNode;
  19 +import io.swagger.annotations.ApiModel;
  20 +import io.swagger.annotations.ApiModelProperty;
19 import lombok.Data; 21 import lombok.Data;
20 import lombok.EqualsAndHashCode; 22 import lombok.EqualsAndHashCode;
21 import org.thingsboard.server.common.data.BaseData; 23 import org.thingsboard.server.common.data.BaseData;
22 import org.thingsboard.server.common.data.id.*; 24 import org.thingsboard.server.common.data.id.*;
23 25
  26 +@ApiModel
24 @EqualsAndHashCode(callSuper = true) 27 @EqualsAndHashCode(callSuper = true)
25 @Data 28 @Data
26 public class AuditLog extends BaseData<AuditLogId> { 29 public class AuditLog extends BaseData<AuditLogId> {
27 30
  31 + @ApiModelProperty(position = 3, value = "JSON object with Tenant Id", readOnly = true)
28 private TenantId tenantId; 32 private TenantId tenantId;
  33 + @ApiModelProperty(position = 4, value = "JSON object with Customer Id", readOnly = true)
29 private CustomerId customerId; 34 private CustomerId customerId;
  35 + @ApiModelProperty(position = 5, value = "JSON object with Entity id", readOnly = true)
30 private EntityId entityId; 36 private EntityId entityId;
  37 + @ApiModelProperty(position = 6, value = "Name of the logged entity", example = "Thermometer", readOnly = true)
31 private String entityName; 38 private String entityName;
  39 + @ApiModelProperty(position = 7, value = "JSON object with User id.", readOnly = true)
32 private UserId userId; 40 private UserId userId;
  41 + @ApiModelProperty(position = 8, value = "Unique user name(email) of the user that performed some action on logged entity", example = "tenant@thingsboard.org", readOnly = true)
33 private String userName; 42 private String userName;
  43 + @ApiModelProperty(position = 9, value = "String represented Action type", example = "ADDED", readOnly = true)
34 private ActionType actionType; 44 private ActionType actionType;
  45 + @ApiModelProperty(position = 10, value = "JsonNode represented action data", readOnly = true)
35 private JsonNode actionData; 46 private JsonNode actionData;
  47 + @ApiModelProperty(position = 11, value = "String represented Action status", example = "SUCCESS", allowableValues = "SUCCESS,FAILURE", readOnly = true)
36 private ActionStatus actionStatus; 48 private ActionStatus actionStatus;
  49 + @ApiModelProperty(position = 12, value = "Failure action details info. An empty string in case of action status type 'SUCCESS', otherwise includes stack trace of the caused exception.", readOnly = true)
37 private String actionFailureDetails; 50 private String actionFailureDetails;
38 51
39 public AuditLog() { 52 public AuditLog() {
@@ -57,4 +70,17 @@ public class AuditLog extends BaseData<AuditLogId> { @@ -57,4 +70,17 @@ public class AuditLog extends BaseData<AuditLogId> {
57 this.actionStatus = auditLog.getActionStatus(); 70 this.actionStatus = auditLog.getActionStatus();
58 this.actionFailureDetails = auditLog.getActionFailureDetails(); 71 this.actionFailureDetails = auditLog.getActionFailureDetails();
59 } 72 }
  73 +
  74 + @ApiModelProperty(position = 2, value = "Timestamp of the auditLog creation, in milliseconds", example = "1609459200000", readOnly = true)
  75 + @Override
  76 + public long getCreatedTime() {
  77 + return super.getCreatedTime();
  78 + }
  79 +
  80 + @ApiModelProperty(position = 1, value = "JSON object with the auditLog Id")
  81 + @Override
  82 + public AuditLogId getId() {
  83 + return super.getId();
  84 + }
  85 +
60 } 86 }