Commit 36bb7f36a5efe6b1e9a9df4fde6ac233796032ac

Authored by YevhenBondarenko
1 parent 3103f596

Resource controller description

@@ -182,6 +182,7 @@ public abstract class BaseController { @@ -182,6 +182,7 @@ public abstract class BaseController {
182 public static final String RULE_CHAIN_ID_PARAM_DESCRIPTION = "A string value representing the rule chain id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 182 public static final String RULE_CHAIN_ID_PARAM_DESCRIPTION = "A string value representing the rule chain id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
183 public static final String WIDGET_BUNDLE_ID_PARAM_DESCRIPTION = "A string value representing the widget bundle id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 183 public static final String WIDGET_BUNDLE_ID_PARAM_DESCRIPTION = "A string value representing the widget bundle id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
184 public static final String WIDGET_TYPE_ID_PARAM_DESCRIPTION = "A string value representing the widget type id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 184 public static final String WIDGET_TYPE_ID_PARAM_DESCRIPTION = "A string value representing the widget type id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  185 + public static final String RESOURCE_ID_PARAM_DESCRIPTION = "A string value representing the resource id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
185 186
186 187
187 protected static final String SYSTEM_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'SYS_ADMIN' authority."; 188 protected static final String SYSTEM_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'SYS_ADMIN' authority.";
@@ -248,6 +249,12 @@ public abstract class BaseController { @@ -248,6 +249,12 @@ public abstract class BaseController {
248 protected static final String OTA_PACKAGE_CHECKSUM_ALGORITHM_ALLOWABLE_VALUES = "MD5, SHA256, SHA384, SHA512, CRC32, MURMUR3_32, MURMUR3_128"; 249 protected static final String OTA_PACKAGE_CHECKSUM_ALGORITHM_ALLOWABLE_VALUES = "MD5, SHA256, SHA384, SHA512, CRC32, MURMUR3_32, MURMUR3_128";
249 protected static final String OTA_PACKAGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the ota package title."; 250 protected static final String OTA_PACKAGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the ota package title.";
250 protected static final String OTA_PACKAGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, type, title, version, tag, url, fileName, dataSize, checksum"; 251 protected static final String OTA_PACKAGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, type, title, version, tag, url, fileName, dataSize, checksum";
  252 + protected static final String RESOURCE_INFO_DESCRIPTION = "Resource Info is a lightweight object that includes main information about the Resource excluding the heavyweight data. ";
  253 + protected static final String RESOURCE_DESCRIPTION = "Resource is a heavyweight object that includes main information about the Resource and also data. ";
  254 + protected static final String RESOURCE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the resource title.";
  255 + protected static final String RESOURCE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, resourceType, tenantId";
  256 + 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. ";
  257 + protected static final String LWM2M_OBJECT_SORT_PROPERTY_ALLOWABLE_VALUES = "id, name";
251 258
252 protected static final String DEVICE_NAME_DESCRIPTION = "A string value representing the Device name."; 259 protected static final String DEVICE_NAME_DESCRIPTION = "A string value representing the Device name.";
253 protected static final String ASSET_NAME_DESCRIPTION = "A string value representing the Asset name."; 260 protected static final String ASSET_NAME_DESCRIPTION = "A string value representing the Asset name.";
@@ -15,6 +15,8 @@ @@ -15,6 +15,8 @@
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 lombok.extern.slf4j.Slf4j; 20 import lombok.extern.slf4j.Slf4j;
19 import org.springframework.core.io.ByteArrayResource; 21 import org.springframework.core.io.ByteArrayResource;
20 import org.springframework.http.HttpHeaders; 22 import org.springframework.http.HttpHeaders;
@@ -53,10 +55,12 @@ public class TbResourceController extends BaseController { @@ -53,10 +55,12 @@ public class TbResourceController extends BaseController {
53 55
54 public static final String RESOURCE_ID = "resourceId"; 56 public static final String RESOURCE_ID = "resourceId";
55 57
  58 + @ApiOperation(value = "Download Resource (downloadResource)", notes = "Download Resource based on the provided Resource Id." + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH)
56 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") 59 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
57 @RequestMapping(value = "/resource/{resourceId}/download", method = RequestMethod.GET) 60 @RequestMapping(value = "/resource/{resourceId}/download", method = RequestMethod.GET)
58 @ResponseBody 61 @ResponseBody
59 - public ResponseEntity<org.springframework.core.io.Resource> downloadResource(@PathVariable(RESOURCE_ID) String strResourceId) throws ThingsboardException { 62 + public ResponseEntity<org.springframework.core.io.Resource> downloadResource(@ApiParam(value = RESOURCE_ID_PARAM_DESCRIPTION)
  63 + @PathVariable(RESOURCE_ID) String strResourceId) throws ThingsboardException {
60 checkParameter(RESOURCE_ID, strResourceId); 64 checkParameter(RESOURCE_ID, strResourceId);
61 try { 65 try {
62 TbResourceId resourceId = new TbResourceId(toUUID(strResourceId)); 66 TbResourceId resourceId = new TbResourceId(toUUID(strResourceId));
@@ -74,10 +78,15 @@ public class TbResourceController extends BaseController { @@ -74,10 +78,15 @@ public class TbResourceController extends BaseController {
74 } 78 }
75 } 79 }
76 80
  81 + @ApiOperation(value = "Get Resource Info (getResourceInfoById)",
  82 + notes = "Fetch the Resource Info object based on the provided Resource Id. " +
  83 + RESOURCE_INFO_DESCRIPTION + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH,
  84 + produces = "application/json")
77 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") 85 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
78 @RequestMapping(value = "/resource/info/{resourceId}", method = RequestMethod.GET) 86 @RequestMapping(value = "/resource/info/{resourceId}", method = RequestMethod.GET)
79 @ResponseBody 87 @ResponseBody
80 - public TbResourceInfo getResourceInfoById(@PathVariable(RESOURCE_ID) String strResourceId) throws ThingsboardException { 88 + public TbResourceInfo getResourceInfoById(@ApiParam(value = RESOURCE_ID_PARAM_DESCRIPTION)
  89 + @PathVariable(RESOURCE_ID) String strResourceId) throws ThingsboardException {
81 checkParameter(RESOURCE_ID, strResourceId); 90 checkParameter(RESOURCE_ID, strResourceId);
82 try { 91 try {
83 TbResourceId resourceId = new TbResourceId(toUUID(strResourceId)); 92 TbResourceId resourceId = new TbResourceId(toUUID(strResourceId));
@@ -87,10 +96,15 @@ public class TbResourceController extends BaseController { @@ -87,10 +96,15 @@ public class TbResourceController extends BaseController {
87 } 96 }
88 } 97 }
89 98
  99 + @ApiOperation(value = "Get Resource (getResourceById)",
  100 + notes = "Fetch the Resource object based on the provided Resource Id. " +
  101 + RESOURCE_DESCRIPTION + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH,
  102 + produces = "application/json")
90 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") 103 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
91 @RequestMapping(value = "/resource/{resourceId}", method = RequestMethod.GET) 104 @RequestMapping(value = "/resource/{resourceId}", method = RequestMethod.GET)
92 @ResponseBody 105 @ResponseBody
93 - public TbResource getResourceById(@PathVariable(RESOURCE_ID) String strResourceId) throws ThingsboardException { 106 + public TbResource getResourceById(@ApiParam(value = RESOURCE_ID_PARAM_DESCRIPTION)
  107 + @PathVariable(RESOURCE_ID) String strResourceId) throws ThingsboardException {
94 checkParameter(RESOURCE_ID, strResourceId); 108 checkParameter(RESOURCE_ID, strResourceId);
95 try { 109 try {
96 TbResourceId resourceId = new TbResourceId(toUUID(strResourceId)); 110 TbResourceId resourceId = new TbResourceId(toUUID(strResourceId));
@@ -100,10 +114,19 @@ public class TbResourceController extends BaseController { @@ -100,10 +114,19 @@ public class TbResourceController extends BaseController {
100 } 114 }
101 } 115 }
102 116
  117 + @ApiOperation(value = "Create Or Update Resource (saveResource)",
  118 + notes = "Create or update the Resource. When creating the Resource, platform generates Resource id as [time-based UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_(date-time_and_MAC_address). " +
  119 + "The newly created Resource id will be present in the response. " +
  120 + "Specify existing Resource id to update the Resource. " +
  121 + "Referencing non-existing Resource Id will cause 'Not Found' error. " +
  122 + "\n\nResource combination of the title with the key is unique in the scope of tenant. " + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH,
  123 + produces = "application/json",
  124 + consumes = "application/json")
103 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") 125 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
104 @RequestMapping(value = "/resource", method = RequestMethod.POST) 126 @RequestMapping(value = "/resource", method = RequestMethod.POST)
105 @ResponseBody 127 @ResponseBody
106 - public TbResource saveResource(@RequestBody TbResource resource) throws ThingsboardException { 128 + public TbResource saveResource(@ApiParam(value = "A JSON value representing the Resource.")
  129 + @RequestBody TbResource resource) throws ThingsboardException {
107 boolean created = resource.getId() == null; 130 boolean created = resource.getId() == null;
108 try { 131 try {
109 resource.setTenantId(getTenantId()); 132 resource.setTenantId(getTenantId());
@@ -120,13 +143,22 @@ public class TbResourceController extends BaseController { @@ -120,13 +143,22 @@ public class TbResourceController extends BaseController {
120 } 143 }
121 } 144 }
122 145
  146 + @ApiOperation(value = "Get Resource Infos (getResources)",
  147 + notes = "Returns a page of Resource Info objects owned by tenant or sysadmin. " +
  148 + PAGE_DATA_PARAMETERS + RESOURCE_INFO_DESCRIPTION + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH,
  149 + produces = "application/json")
123 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") 150 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
124 @RequestMapping(value = "/resource", method = RequestMethod.GET) 151 @RequestMapping(value = "/resource", method = RequestMethod.GET)
125 @ResponseBody 152 @ResponseBody
126 - public PageData<TbResourceInfo> getResources(@RequestParam int pageSize, 153 + public PageData<TbResourceInfo> getResources(@ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
  154 + @RequestParam int pageSize,
  155 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
127 @RequestParam int page, 156 @RequestParam int page,
  157 + @ApiParam(value = RESOURCE_TEXT_SEARCH_DESCRIPTION)
128 @RequestParam(required = false) String textSearch, 158 @RequestParam(required = false) String textSearch,
  159 + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = RESOURCE_SORT_PROPERTY_ALLOWABLE_VALUES)
129 @RequestParam(required = false) String sortProperty, 160 @RequestParam(required = false) String sortProperty,
  161 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
130 @RequestParam(required = false) String sortOrder) throws ThingsboardException { 162 @RequestParam(required = false) String sortOrder) throws ThingsboardException {
131 try { 163 try {
132 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); 164 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
@@ -140,13 +172,22 @@ public class TbResourceController extends BaseController { @@ -140,13 +172,22 @@ public class TbResourceController extends BaseController {
140 } 172 }
141 } 173 }
142 174
  175 + @ApiOperation(value = "Get LwM2M Objects (getLwm2mListObjectsPage)",
  176 + notes = "Returns a page of LwM2M objects parsed from Resources with type 'LWM2M_MODEL' owned by tenant or sysadmin. " +
  177 + PAGE_DATA_PARAMETERS + LWM2M_OBJECT_DESCRIPTION + TENANT_AUTHORITY_PARAGRAPH,
  178 + produces = "application/json")
143 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 179 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
144 @RequestMapping(value = "/resource/lwm2m/page", method = RequestMethod.GET) 180 @RequestMapping(value = "/resource/lwm2m/page", method = RequestMethod.GET)
145 @ResponseBody 181 @ResponseBody
146 - public List<LwM2mObject> getLwm2mListObjectsPage(@RequestParam int pageSize, 182 + public List<LwM2mObject> getLwm2mListObjectsPage(@ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
  183 + @RequestParam int pageSize,
  184 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
147 @RequestParam int page, 185 @RequestParam int page,
  186 + @ApiParam(value = RESOURCE_TEXT_SEARCH_DESCRIPTION)
148 @RequestParam(required = false) String textSearch, 187 @RequestParam(required = false) String textSearch,
  188 + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = LWM2M_OBJECT_SORT_PROPERTY_ALLOWABLE_VALUES)
149 @RequestParam(required = false) String sortProperty, 189 @RequestParam(required = false) String sortProperty,
  190 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
150 @RequestParam(required = false) String sortOrder) throws ThingsboardException { 191 @RequestParam(required = false) String sortOrder) throws ThingsboardException {
151 try { 192 try {
152 PageLink pageLink = new PageLink(pageSize, page, textSearch); 193 PageLink pageLink = new PageLink(pageSize, page, textSearch);
@@ -156,11 +197,18 @@ public class TbResourceController extends BaseController { @@ -156,11 +197,18 @@ public class TbResourceController extends BaseController {
156 } 197 }
157 } 198 }
158 199
  200 + @ApiOperation(value = "Get LwM2M Objects (getLwm2mListObjects)",
  201 + notes = "Returns a page of LwM2M objects parsed from Resources with type 'LWM2M_MODEL' owned by tenant or sysadmin. " +
  202 + "You can specify parameters to filter the results. " + LWM2M_OBJECT_DESCRIPTION + TENANT_AUTHORITY_PARAGRAPH,
  203 + produces = "application/json")
159 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 204 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
160 @RequestMapping(value = "/resource/lwm2m", method = RequestMethod.GET) 205 @RequestMapping(value = "/resource/lwm2m", method = RequestMethod.GET)
161 @ResponseBody 206 @ResponseBody
162 - public List<LwM2mObject> getLwm2mListObjects(@RequestParam String sortOrder, 207 + public List<LwM2mObject> getLwm2mListObjects(@ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES, required = true)
  208 + @RequestParam String sortOrder,
  209 + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = LWM2M_OBJECT_SORT_PROPERTY_ALLOWABLE_VALUES, required = true)
163 @RequestParam String sortProperty, 210 @RequestParam String sortProperty,
  211 + @ApiParam(value = "LwM2M Object ids.", required = true)
164 @RequestParam(required = false) String[] objectIds) throws ThingsboardException { 212 @RequestParam(required = false) String[] objectIds) throws ThingsboardException {
165 try { 213 try {
166 return checkNotNull(resourceService.findLwM2mObject(getTenantId(), sortOrder, sortProperty, objectIds)); 214 return checkNotNull(resourceService.findLwM2mObject(getTenantId(), sortOrder, sortProperty, objectIds));
@@ -169,10 +217,13 @@ public class TbResourceController extends BaseController { @@ -169,10 +217,13 @@ public class TbResourceController extends BaseController {
169 } 217 }
170 } 218 }
171 219
  220 + @ApiOperation(value = "Delete Resource (deleteResource)",
  221 + notes = "Deletes the Resource. Referencing non-existing Resource Id will cause an error." + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH)
172 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") 222 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
173 @RequestMapping(value = "/resource/{resourceId}", method = RequestMethod.DELETE) 223 @RequestMapping(value = "/resource/{resourceId}", method = RequestMethod.DELETE)
174 @ResponseBody 224 @ResponseBody
175 - public void deleteResource(@PathVariable("resourceId") String strResourceId) throws ThingsboardException { 225 + public void deleteResource(@ApiParam(value = RESOURCE_ID_PARAM_DESCRIPTION)
  226 + @PathVariable("resourceId") String strResourceId) throws ThingsboardException {
176 checkParameter(RESOURCE_ID, strResourceId); 227 checkParameter(RESOURCE_ID, strResourceId);
177 try { 228 try {
178 TbResourceId resourceId = new TbResourceId(toUUID(strResourceId)); 229 TbResourceId resourceId = new TbResourceId(toUUID(strResourceId));
@@ -15,6 +15,7 @@ @@ -15,6 +15,7 @@
15 */ 15 */
16 package org.thingsboard.server.common.data; 16 package org.thingsboard.server.common.data;
17 17
  18 +import io.swagger.annotations.ApiModelProperty;
18 import lombok.Data; 19 import lombok.Data;
19 import lombok.EqualsAndHashCode; 20 import lombok.EqualsAndHashCode;
20 import lombok.extern.slf4j.Slf4j; 21 import lombok.extern.slf4j.Slf4j;
@@ -29,8 +30,10 @@ public class TbResource extends TbResourceInfo { @@ -29,8 +30,10 @@ public class TbResource extends TbResourceInfo {
29 private static final long serialVersionUID = 7379609705527272306L; 30 private static final long serialVersionUID = 7379609705527272306L;
30 31
31 @NoXss 32 @NoXss
  33 + @ApiModelProperty(position = 8, value = "Resource file name.", example = "19.xml", readOnly = true)
32 private String fileName; 34 private String fileName;
33 35
  36 + @ApiModelProperty(position = 9, value = "Resource data.", example = "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLQpGSUxFIElORk9STUFUSU9OCgpPTUEgUGVybWFuZW50IERvY3VtZW50CiAgIEZpbGU6IE9NQS1TVVAtTHdNMk1fQmluYXJ5QXBwRGF0YUNvbnRhaW5lci1WMV8wXzEtMjAxOTAyMjEtQQogICBUeXBlOiB4bWwKClB1YmxpYyBSZWFjaGFibGUgSW5mb3JtYXRpb24KICAgUGF0aDogaHR0cDovL3d3dy5vcGVubW9iaWxlYWxsaWFuY2Uub3JnL3RlY2gvcHJvZmlsZXMKICAgTmFtZTogTHdNMk1fQmluYXJ5QXBwRGF0YUNvbnRhaW5lci12MV8wXzEueG1sCgpOT1JNQVRJVkUgSU5GT1JNQVRJT04KCiAgSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBmaWxlIGNhbiBiZSBmb3VuZCBpbiB0aGUgbGF0ZXN0IHJldmlzaW9uIG9mCgogIE9NQS1UUy1MV00yTV9CaW5hcnlBcHBEYXRhQ29udGFpbmVyLVYxXzBfMQoKICBUaGlzIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvCgogIFNlbmQgY29tbWVudHMgdG8gaHR0cHM6Ly9naXRodWIuY29tL09wZW5Nb2JpbGVBbGxpYW5jZS9PTUFfTHdNMk1fZm9yX0RldmVsb3BlcnMvaXNzdWVzCgpDSEFOR0UgSElTVE9SWQoKMTUwNjIwMTggU3RhdHVzIGNoYW5nZWQgdG8gQXBwcm92ZWQgYnkgRE0sIERvYyBSZWYgIyBPTUEtRE0mU0UtMjAxOC0wMDYxLUlOUF9MV00yTV9BUFBEQVRBX1YxXzBfRVJQX2Zvcl9maW5hbF9BcHByb3ZhbAoyMTAyMjAxOSBTdGF0dXMgY2hhbmdlZCB0byBBcHByb3ZlZCBieSBJUFNPLCBEb2MgUmVmICMgT01BLUlQU08tMjAxOS0wMDI1LUlOUF9Md00yTV9PYmplY3RfQXBwX0RhdGFfQ29udGFpbmVyXzFfMF8xX2Zvcl9GaW5hbF9BcHByb3ZhbAoKTEVHQUwgRElTQ0xBSU1FUgoKQ29weXJpZ2h0IDIwMTkgT3BlbiBNb2JpbGUgQWxsaWFuY2UuCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCmFyZSBtZXQ6CgoxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodApub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCjIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cm5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cwpjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwoiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVApMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULApJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLApCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CkxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCkxJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCkFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQpQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KClRoZSBhYm92ZSBsaWNlbnNlIGlzIHVzZWQgYXMgYSBsaWNlbnNlIHVuZGVyIGNvcHlyaWdodCBvbmx5LiBQbGVhc2UKcmVmZXJlbmNlIHRoZSBPTUEgSVBSIFBvbGljeSBmb3IgcGF0ZW50IGxpY2Vuc2luZyB0ZXJtczoKaHR0cHM6Ly93d3cub21hc3BlY3dvcmtzLm9yZy9hYm91dC9pbnRlbGxlY3R1YWwtcHJvcGVydHktcmlnaHRzLwoKLS0+CjxMV00yTSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iaHR0cDovL29wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9wcm9maWxlcy9MV00yTS54c2QiPgoJPE9iamVjdCBPYmplY3RUeXBlPSJNT0RlZmluaXRpb24iPgoJCTxOYW1lPkJpbmFyeUFwcERhdGFDb250YWluZXI8L05hbWU+CgkJPERlc2NyaXB0aW9uMT48IVtDREFUQVtUaGlzIEx3TTJNIE9iamVjdHMgcHJvdmlkZXMgdGhlIGFwcGxpY2F0aW9uIHNlcnZpY2UgZGF0YSByZWxhdGVkIHRvIGEgTHdNMk0gU2VydmVyLCBlZy4gV2F0ZXIgbWV0ZXIgZGF0YS4gClRoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHMgdG8gY3JlYXRlIGluc3RhbmNlIHRvIGluZGljYXRlIHRoZSBtZXNzYWdlIGRpcmVjdGlvbiBiYXNlZCBvbiB0aGUgbmVnb3RpYXRpb24gYmV0d2VlbiBBcHBsaWNhdGlvbiBhbmQgTHdNMk0uIFRoZSBDbGllbnQgYW5kIFNlcnZlciBzaG91bGQgbmVnb3RpYXRlIHRoZSBpbnN0YW5jZShzKSB1c2VkIHRvIGV4Y2hhbmdlIHRoZSBkYXRhLiBGb3IgZXhhbXBsZToKIC0gVXNpbmcgYSBzaW5nbGUgaW5zdGFuY2UgZm9yIGJvdGggZGlyZWN0aW9ucyBjb21tdW5pY2F0aW9uLCBmcm9tIENsaWVudCB0byBTZXJ2ZXIgYW5kIGZyb20gU2VydmVyIHRvIENsaWVudC4KIC0gVXNpbmcgYW4gaW5zdGFuY2UgZm9yIGNvbW11bmljYXRpb24gZnJvbSBDbGllbnQgdG8gU2VydmVyIGFuZCBhbm90aGVyIG9uZSBmb3IgY29tbXVuaWNhdGlvbiBmcm9tIFNlcnZlciB0byBDbGllbnQKIC0gVXNpbmcgc2V2ZXJhbCBpbnN0YW5jZXMKXV0+PC9EZXNjcmlwdGlvbjE+CgkJPE9iamVjdElEPjE5PC9PYmplY3RJRD4KCQk8T2JqZWN0VVJOPnVybjpvbWE6bHdtMm06b21hOjE5PC9PYmplY3RVUk4+CgkJPExXTTJNVmVyc2lvbj4xLjA8L0xXTTJNVmVyc2lvbj4KCQk8T2JqZWN0VmVyc2lvbj4xLjA8L09iamVjdFZlcnNpb24+CgkJPE11bHRpcGxlSW5zdGFuY2VzPk11bHRpcGxlPC9NdWx0aXBsZUluc3RhbmNlcz4KCQk8TWFuZGF0b3J5Pk9wdGlvbmFsPC9NYW5kYXRvcnk+CgkJPFJlc291cmNlcz4KCQkJPEl0ZW0gSUQ9IjAiPjxOYW1lPkRhdGE8L05hbWU+CgkJCQk8T3BlcmF0aW9ucz5SVzwvT3BlcmF0aW9ucz4KCQkJCTxNdWx0aXBsZUluc3RhbmNlcz5NdWx0aXBsZTwvTXVsdGlwbGVJbnN0YW5jZXM+CgkJCQk8TWFuZGF0b3J5Pk1hbmRhdG9yeTwvTWFuZGF0b3J5PgoJCQkJPFR5cGU+T3BhcXVlPC9UeXBlPgoJCQkJPFJhbmdlRW51bWVyYXRpb24gLz4KCQkJCTxVbml0cyAvPgoJCQkJPERlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlcyB0aGUgYXBwbGljYXRpb24gZGF0YSBjb250ZW50Ll1dPjwvRGVzY3JpcHRpb24+CgkJCTwvSXRlbT4KCQkJPEl0ZW0gSUQ9IjEiPjxOYW1lPkRhdGEgUHJpb3JpdHk8L05hbWU+CgkJCQk8T3BlcmF0aW9ucz5SVzwvT3BlcmF0aW9ucz4KCQkJCTxNdWx0aXBsZUluc3RhbmNlcz5TaW5nbGU8L011bHRpcGxlSW5zdGFuY2VzPgoJCQkJPE1hbmRhdG9yeT5PcHRpb25hbDwvTWFuZGF0b3J5PgoJCQkJPFR5cGU+SW50ZWdlcjwvVHlwZT4KCQkJCTxSYW5nZUVudW1lcmF0aW9uPjEgYnl0ZXM8L1JhbmdlRW51bWVyYXRpb24+CgkJCQk8VW5pdHMgLz4KCQkJCTxEZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgdGhlIEFwcGxpY2F0aW9uIGRhdGEgcHJpb3JpdHk6CjA6SW1tZWRpYXRlCjE6QmVzdEVmZm9ydAoyOkxhdGVzdAozLTEwMDogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCjEwMS0yNTQ6IFByb3ByaWV0YXJ5IG1vZGUuXV0+PC9EZXNjcmlwdGlvbj4KCQkJPC9JdGVtPgoJCQk8SXRlbSBJRD0iMiI+PE5hbWU+RGF0YSBDcmVhdGlvbiBUaW1lPC9OYW1lPgoJCQkJPE9wZXJhdGlvbnM+Ulc8L09wZXJhdGlvbnM+CgkJCQk8TXVsdGlwbGVJbnN0YW5jZXM+U2luZ2xlPC9NdWx0aXBsZUluc3RhbmNlcz4KCQkJCTxNYW5kYXRvcnk+T3B0aW9uYWw8L01hbmRhdG9yeT4KCQkJCTxUeXBlPlRpbWU8L1R5cGU+CgkJCQk8UmFuZ2VFbnVtZXJhdGlvbiAvPgoJCQkJPFVuaXRzIC8+CgkJCQk8RGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHRoZSBEYXRhIGluc3RhbmNlIGNyZWF0aW9uIHRpbWVzdGFtcC5dXT48L0Rlc2NyaXB0aW9uPgoJCQk8L0l0ZW0+CgkJCTxJdGVtIElEPSIzIj48TmFtZT5EYXRhIERlc2NyaXB0aW9uPC9OYW1lPgoJCQkJPE9wZXJhdGlvbnM+Ulc8L09wZXJhdGlvbnM+CgkJCQk8TXVsdGlwbGVJbnN0YW5jZXM+U2luZ2xlPC9NdWx0aXBsZUluc3RhbmNlcz4KCQkJCTxNYW5kYXRvcnk+T3B0aW9uYWw8L01hbmRhdG9yeT4KCQkJCTxUeXBlPlN0cmluZzwvVHlwZT4KCQkJCTxSYW5nZUVudW1lcmF0aW9uPjMyIGJ5dGVzPC9SYW5nZUVudW1lcmF0aW9uPgoJCQkJPFVuaXRzIC8+CgkJCQk8RGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHRoZSBkYXRhIGRlc2NyaXB0aW9uLgplLmcuICJtZXRlciByZWFkaW5nIi5dXT48L0Rlc2NyaXB0aW9uPgoJCQk8L0l0ZW0+CgkJCTxJdGVtIElEPSI0Ij48TmFtZT5EYXRhIEZvcm1hdDwvTmFtZT4KCQkJCTxPcGVyYXRpb25zPlJXPC9PcGVyYXRpb25zPgoJCQkJPE11bHRpcGxlSW5zdGFuY2VzPlNpbmdsZTwvTXVsdGlwbGVJbnN0YW5jZXM+CgkJCQk8TWFuZGF0b3J5Pk9wdGlvbmFsPC9NYW5kYXRvcnk+CgkJCQk8VHlwZT5TdHJpbmc8L1R5cGU+CgkJCQk8UmFuZ2VFbnVtZXJhdGlvbj4zMiBieXRlczwvUmFuZ2VFbnVtZXJhdGlvbj4KCQkJCTxVbml0cyAvPgoJCQkJPERlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlcyB0aGUgZm9ybWF0IG9mIHRoZSBBcHBsaWNhdGlvbiBEYXRhLgplLmcuIFlHLU1ldGVyLVdhdGVyLVJlYWRpbmcKVVRGOC1zdHJpbmcKXV0+PC9EZXNjcmlwdGlvbj4KCQkJPC9JdGVtPgoJCQk8SXRlbSBJRD0iNSI+PE5hbWU+QXBwIElEPC9OYW1lPgoJCQkJPE9wZXJhdGlvbnM+Ulc8L09wZXJhdGlvbnM+CgkJCQk8TXVsdGlwbGVJbnN0YW5jZXM+U2luZ2xlPC9NdWx0aXBsZUluc3RhbmNlcz4KCQkJCTxNYW5kYXRvcnk+T3B0aW9uYWw8L01hbmRhdG9yeT4KCQkJCTxUeXBlPkludGVnZXI8L1R5cGU+CgkJCQk8UmFuZ2VFbnVtZXJhdGlvbj4yIGJ5dGVzPC9SYW5nZUVudW1lcmF0aW9uPgoJCQkJPFVuaXRzIC8+CgkJCQk8RGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHRoZSBkZXN0aW5hdGlvbiBBcHBsaWNhdGlvbiBJRC5dXT48L0Rlc2NyaXB0aW9uPgoJCQk8L0l0ZW0+PC9SZXNvdXJjZXM+CgkJPERlc2NyaXB0aW9uMj48IVtDREFUQVtdXT48L0Rlc2NyaXB0aW9uMj4KCTwvT2JqZWN0Pgo8L0xXTTJNPgo=", readOnly = true)
34 private String data; 37 private String data;
35 38
36 public TbResource() { 39 public TbResource() {
@@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
16 package org.thingsboard.server.common.data; 16 package org.thingsboard.server.common.data;
17 17
18 import com.fasterxml.jackson.annotation.JsonIgnore; 18 import com.fasterxml.jackson.annotation.JsonIgnore;
  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 lombok.extern.slf4j.Slf4j; 23 import lombok.extern.slf4j.Slf4j;
@@ -23,6 +25,7 @@ import org.thingsboard.server.common.data.id.TbResourceId; @@ -23,6 +25,7 @@ import org.thingsboard.server.common.data.id.TbResourceId;
23 import org.thingsboard.server.common.data.id.TenantId; 25 import org.thingsboard.server.common.data.id.TenantId;
24 import org.thingsboard.server.common.data.validation.NoXss; 26 import org.thingsboard.server.common.data.validation.NoXss;
25 27
  28 +@ApiModel
26 @Slf4j 29 @Slf4j
27 @Data 30 @Data
28 @EqualsAndHashCode(callSuper = true) 31 @EqualsAndHashCode(callSuper = true)
@@ -30,11 +33,16 @@ public class TbResourceInfo extends SearchTextBased<TbResourceId> implements Has @@ -30,11 +33,16 @@ public class TbResourceInfo extends SearchTextBased<TbResourceId> implements Has
30 33
31 private static final long serialVersionUID = 7282664529021651736L; 34 private static final long serialVersionUID = 7282664529021651736L;
32 35
  36 + @ApiModelProperty(position = 3, value = "JSON object with Tenant Id. Tenant Id of the resource can't be changed.", readOnly = true)
33 private TenantId tenantId; 37 private TenantId tenantId;
34 @NoXss 38 @NoXss
  39 + @ApiModelProperty(position = 4, value = "Resource title.", example = "BinaryAppDataContainer id=19 v1.0")
35 private String title; 40 private String title;
  41 + @ApiModelProperty(position = 5, value = "Resource type.", example = "LWM2M_MODEL", readOnly = true)
36 private ResourceType resourceType; 42 private ResourceType resourceType;
  43 + @ApiModelProperty(position = 6, value = "Resource key.", example = "19_1.0", readOnly = true)
37 private String resourceKey; 44 private String resourceKey;
  45 + @ApiModelProperty(position = 7, value = "Resource search text.", example = "19_1.0:binaryappdatacontainer", readOnly = true)
38 private String searchText; 46 private String searchText;
39 47
40 public TbResourceInfo() { 48 public TbResourceInfo() {
@@ -54,6 +62,21 @@ public class TbResourceInfo extends SearchTextBased<TbResourceId> implements Has @@ -54,6 +62,21 @@ public class TbResourceInfo extends SearchTextBased<TbResourceId> implements Has
54 this.searchText = resourceInfo.getSearchText(); 62 this.searchText = resourceInfo.getSearchText();
55 } 63 }
56 64
  65 + @ApiModelProperty(position = 1, value = "JSON object with the Resource Id. " +
  66 + "Specify this field to update the Resource. " +
  67 + "Referencing non-existing Resource Id will cause error. " +
  68 + "Omit this field to create new Resource." )
  69 + @Override
  70 + public TbResourceId getId() {
  71 + return super.getId();
  72 + }
  73 +
  74 + @ApiModelProperty(position = 2, value = "Timestamp of the resource creation, in milliseconds", example = "1609459200000", readOnly = true)
  75 + @Override
  76 + public long getCreatedTime() {
  77 + return super.getCreatedTime();
  78 + }
  79 +
57 @Override 80 @Override
58 @JsonIgnore 81 @JsonIgnore
59 public String getName() { 82 public String getName() {
@@ -15,11 +15,16 @@ @@ -15,11 +15,16 @@
15 */ 15 */
16 package org.thingsboard.server.common.data.lwm2m; 16 package org.thingsboard.server.common.data.lwm2m;
17 17
  18 +import io.swagger.annotations.ApiModel;
  19 +import io.swagger.annotations.ApiModelProperty;
18 import lombok.Data; 20 import lombok.Data;
19 21
  22 +@ApiModel
20 @Data 23 @Data
21 public class LwM2mInstance { 24 public class LwM2mInstance {
  25 + @ApiModelProperty(position = 1, value = "LwM2M Instance id.", example = "0")
22 int id; 26 int id;
  27 + @ApiModelProperty(position = 2, value = "LwM2M Resource observe.")
23 LwM2mResourceObserve[] resources; 28 LwM2mResourceObserve[] resources;
24 29
25 } 30 }
@@ -15,14 +15,23 @@ @@ -15,14 +15,23 @@
15 */ 15 */
16 package org.thingsboard.server.common.data.lwm2m; 16 package org.thingsboard.server.common.data.lwm2m;
17 17
  18 +import io.swagger.annotations.ApiModel;
  19 +import io.swagger.annotations.ApiModelProperty;
18 import lombok.Data; 20 import lombok.Data;
19 21
  22 +@ApiModel
20 @Data 23 @Data
21 public class LwM2mObject { 24 public class LwM2mObject {
  25 + @ApiModelProperty(position = 1, value = "LwM2M Object id.", example = "19")
22 int id; 26 int id;
  27 + @ApiModelProperty(position = 2, value = "LwM2M Object key id.", example = "19_1.0")
23 String keyId; 28 String keyId;
  29 + @ApiModelProperty(position = 3, value = "LwM2M Object name.", example = "BinaryAppDataContainer")
24 String name; 30 String name;
  31 + @ApiModelProperty(position = 4, value = "LwM2M Object multiple.", example = "true")
25 boolean multiple; 32 boolean multiple;
  33 + @ApiModelProperty(position = 5, value = "LwM2M Object mandatory.", example = "false")
26 boolean mandatory; 34 boolean mandatory;
  35 + @ApiModelProperty(position = 6, value = "LwM2M Object instances.")
27 LwM2mInstance [] instances; 36 LwM2mInstance [] instances;
28 } 37 }
@@ -15,19 +15,28 @@ @@ -15,19 +15,28 @@
15 */ 15 */
16 package org.thingsboard.server.common.data.lwm2m; 16 package org.thingsboard.server.common.data.lwm2m;
17 17
  18 +import io.swagger.annotations.ApiModel;
  19 +import io.swagger.annotations.ApiModelProperty;
18 import lombok.AllArgsConstructor; 20 import lombok.AllArgsConstructor;
19 import lombok.Data; 21 import lombok.Data;
20 22
21 import java.util.stream.Stream; 23 import java.util.stream.Stream;
22 24
  25 +@ApiModel
23 @Data 26 @Data
24 @AllArgsConstructor 27 @AllArgsConstructor
25 public class LwM2mResourceObserve { 28 public class LwM2mResourceObserve {
  29 + @ApiModelProperty(position = 1, value = "LwM2M Resource Observe id.", example = "0")
26 int id; 30 int id;
  31 + @ApiModelProperty(position = 2, value = "LwM2M Resource Observe name.", example = "Data")
27 String name; 32 String name;
  33 + @ApiModelProperty(position = 3, value = "LwM2M Resource Observe observe.", example = "false")
28 boolean observe; 34 boolean observe;
  35 + @ApiModelProperty(position = 4, value = "LwM2M Resource Observe attribute.", example = "false")
29 boolean attribute; 36 boolean attribute;
  37 + @ApiModelProperty(position = 5, value = "LwM2M Resource Observe telemetry.", example = "false")
30 boolean telemetry; 38 boolean telemetry;
  39 + @ApiModelProperty(position = 6, value = "LwM2M Resource Observe key name.", example = "data")
31 String keyName; 40 String keyName;
32 41
33 public LwM2mResourceObserve(int id, String name, boolean observe, boolean attribute, boolean telemetry) { 42 public LwM2mResourceObserve(int id, String name, boolean observe, boolean attribute, boolean telemetry) {