Showing
7 changed files
with
115 additions
and
8 deletions
... | ... | @@ -182,6 +182,7 @@ public abstract class BaseController { |
182 | 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 | 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 | 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 | 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 | 249 | protected static final String OTA_PACKAGE_CHECKSUM_ALGORITHM_ALLOWABLE_VALUES = "MD5, SHA256, SHA384, SHA512, CRC32, MURMUR3_32, MURMUR3_128"; |
249 | 250 | protected static final String OTA_PACKAGE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the ota package title."; |
250 | 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 | 259 | protected static final String DEVICE_NAME_DESCRIPTION = "A string value representing the Device name."; |
253 | 260 | protected static final String ASSET_NAME_DESCRIPTION = "A string value representing the Asset name."; | ... | ... |
... | ... | @@ -15,6 +15,8 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.controller; |
17 | 17 | |
18 | +import io.swagger.annotations.ApiOperation; | |
19 | +import io.swagger.annotations.ApiParam; | |
18 | 20 | import lombok.extern.slf4j.Slf4j; |
19 | 21 | import org.springframework.core.io.ByteArrayResource; |
20 | 22 | import org.springframework.http.HttpHeaders; |
... | ... | @@ -53,10 +55,12 @@ public class TbResourceController extends BaseController { |
53 | 55 | |
54 | 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 | 59 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
57 | 60 | @RequestMapping(value = "/resource/{resourceId}/download", method = RequestMethod.GET) |
58 | 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 | 64 | checkParameter(RESOURCE_ID, strResourceId); |
61 | 65 | try { |
62 | 66 | TbResourceId resourceId = new TbResourceId(toUUID(strResourceId)); |
... | ... | @@ -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 | 85 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
78 | 86 | @RequestMapping(value = "/resource/info/{resourceId}", method = RequestMethod.GET) |
79 | 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 | 90 | checkParameter(RESOURCE_ID, strResourceId); |
82 | 91 | try { |
83 | 92 | TbResourceId resourceId = new TbResourceId(toUUID(strResourceId)); |
... | ... | @@ -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 | 103 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
91 | 104 | @RequestMapping(value = "/resource/{resourceId}", method = RequestMethod.GET) |
92 | 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 | 108 | checkParameter(RESOURCE_ID, strResourceId); |
95 | 109 | try { |
96 | 110 | TbResourceId resourceId = new TbResourceId(toUUID(strResourceId)); |
... | ... | @@ -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 | 125 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
104 | 126 | @RequestMapping(value = "/resource", method = RequestMethod.POST) |
105 | 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 | 130 | boolean created = resource.getId() == null; |
108 | 131 | try { |
109 | 132 | resource.setTenantId(getTenantId()); |
... | ... | @@ -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 | 150 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
124 | 151 | @RequestMapping(value = "/resource", method = RequestMethod.GET) |
125 | 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 | 156 | @RequestParam int page, |
157 | + @ApiParam(value = RESOURCE_TEXT_SEARCH_DESCRIPTION) | |
128 | 158 | @RequestParam(required = false) String textSearch, |
159 | + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = RESOURCE_SORT_PROPERTY_ALLOWABLE_VALUES) | |
129 | 160 | @RequestParam(required = false) String sortProperty, |
161 | + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES) | |
130 | 162 | @RequestParam(required = false) String sortOrder) throws ThingsboardException { |
131 | 163 | try { |
132 | 164 | PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); |
... | ... | @@ -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 | 179 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") |
144 | 180 | @RequestMapping(value = "/resource/lwm2m/page", method = RequestMethod.GET) |
145 | 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 | 185 | @RequestParam int page, |
186 | + @ApiParam(value = RESOURCE_TEXT_SEARCH_DESCRIPTION) | |
148 | 187 | @RequestParam(required = false) String textSearch, |
188 | + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = LWM2M_OBJECT_SORT_PROPERTY_ALLOWABLE_VALUES) | |
149 | 189 | @RequestParam(required = false) String sortProperty, |
190 | + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES) | |
150 | 191 | @RequestParam(required = false) String sortOrder) throws ThingsboardException { |
151 | 192 | try { |
152 | 193 | PageLink pageLink = new PageLink(pageSize, page, textSearch); |
... | ... | @@ -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 | 204 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") |
160 | 205 | @RequestMapping(value = "/resource/lwm2m", method = RequestMethod.GET) |
161 | 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 | 210 | @RequestParam String sortProperty, |
211 | + @ApiParam(value = "LwM2M Object ids.", required = true) | |
164 | 212 | @RequestParam(required = false) String[] objectIds) throws ThingsboardException { |
165 | 213 | try { |
166 | 214 | return checkNotNull(resourceService.findLwM2mObject(getTenantId(), sortOrder, sortProperty, objectIds)); |
... | ... | @@ -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 | 222 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
173 | 223 | @RequestMapping(value = "/resource/{resourceId}", method = RequestMethod.DELETE) |
174 | 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 | 227 | checkParameter(RESOURCE_ID, strResourceId); |
177 | 228 | try { |
178 | 229 | TbResourceId resourceId = new TbResourceId(toUUID(strResourceId)); | ... | ... |
... | ... | @@ -15,6 +15,7 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.common.data; |
17 | 17 | |
18 | +import io.swagger.annotations.ApiModelProperty; | |
18 | 19 | import lombok.Data; |
19 | 20 | import lombok.EqualsAndHashCode; |
20 | 21 | import lombok.extern.slf4j.Slf4j; |
... | ... | @@ -29,8 +30,10 @@ public class TbResource extends TbResourceInfo { |
29 | 30 | private static final long serialVersionUID = 7379609705527272306L; |
30 | 31 | |
31 | 32 | @NoXss |
33 | + @ApiModelProperty(position = 8, value = "Resource file name.", example = "19.xml", readOnly = true) | |
32 | 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 | 37 | private String data; |
35 | 38 | |
36 | 39 | public TbResource() { | ... | ... |
... | ... | @@ -16,6 +16,8 @@ |
16 | 16 | package org.thingsboard.server.common.data; |
17 | 17 | |
18 | 18 | import com.fasterxml.jackson.annotation.JsonIgnore; |
19 | +import io.swagger.annotations.ApiModel; | |
20 | +import io.swagger.annotations.ApiModelProperty; | |
19 | 21 | import lombok.Data; |
20 | 22 | import lombok.EqualsAndHashCode; |
21 | 23 | import lombok.extern.slf4j.Slf4j; |
... | ... | @@ -23,6 +25,7 @@ import org.thingsboard.server.common.data.id.TbResourceId; |
23 | 25 | import org.thingsboard.server.common.data.id.TenantId; |
24 | 26 | import org.thingsboard.server.common.data.validation.NoXss; |
25 | 27 | |
28 | +@ApiModel | |
26 | 29 | @Slf4j |
27 | 30 | @Data |
28 | 31 | @EqualsAndHashCode(callSuper = true) |
... | ... | @@ -30,11 +33,16 @@ public class TbResourceInfo extends SearchTextBased<TbResourceId> implements Has |
30 | 33 | |
31 | 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 | 37 | private TenantId tenantId; |
34 | 38 | @NoXss |
39 | + @ApiModelProperty(position = 4, value = "Resource title.", example = "BinaryAppDataContainer id=19 v1.0") | |
35 | 40 | private String title; |
41 | + @ApiModelProperty(position = 5, value = "Resource type.", example = "LWM2M_MODEL", readOnly = true) | |
36 | 42 | private ResourceType resourceType; |
43 | + @ApiModelProperty(position = 6, value = "Resource key.", example = "19_1.0", readOnly = true) | |
37 | 44 | private String resourceKey; |
45 | + @ApiModelProperty(position = 7, value = "Resource search text.", example = "19_1.0:binaryappdatacontainer", readOnly = true) | |
38 | 46 | private String searchText; |
39 | 47 | |
40 | 48 | public TbResourceInfo() { |
... | ... | @@ -54,6 +62,21 @@ public class TbResourceInfo extends SearchTextBased<TbResourceId> implements Has |
54 | 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 | 80 | @Override |
58 | 81 | @JsonIgnore |
59 | 82 | public String getName() { | ... | ... |
... | ... | @@ -15,11 +15,16 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.common.data.lwm2m; |
17 | 17 | |
18 | +import io.swagger.annotations.ApiModel; | |
19 | +import io.swagger.annotations.ApiModelProperty; | |
18 | 20 | import lombok.Data; |
19 | 21 | |
22 | +@ApiModel | |
20 | 23 | @Data |
21 | 24 | public class LwM2mInstance { |
25 | + @ApiModelProperty(position = 1, value = "LwM2M Instance id.", example = "0") | |
22 | 26 | int id; |
27 | + @ApiModelProperty(position = 2, value = "LwM2M Resource observe.") | |
23 | 28 | LwM2mResourceObserve[] resources; |
24 | 29 | |
25 | 30 | } | ... | ... |
... | ... | @@ -15,14 +15,23 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.common.data.lwm2m; |
17 | 17 | |
18 | +import io.swagger.annotations.ApiModel; | |
19 | +import io.swagger.annotations.ApiModelProperty; | |
18 | 20 | import lombok.Data; |
19 | 21 | |
22 | +@ApiModel | |
20 | 23 | @Data |
21 | 24 | public class LwM2mObject { |
25 | + @ApiModelProperty(position = 1, value = "LwM2M Object id.", example = "19") | |
22 | 26 | int id; |
27 | + @ApiModelProperty(position = 2, value = "LwM2M Object key id.", example = "19_1.0") | |
23 | 28 | String keyId; |
29 | + @ApiModelProperty(position = 3, value = "LwM2M Object name.", example = "BinaryAppDataContainer") | |
24 | 30 | String name; |
31 | + @ApiModelProperty(position = 4, value = "LwM2M Object multiple.", example = "true") | |
25 | 32 | boolean multiple; |
33 | + @ApiModelProperty(position = 5, value = "LwM2M Object mandatory.", example = "false") | |
26 | 34 | boolean mandatory; |
35 | + @ApiModelProperty(position = 6, value = "LwM2M Object instances.") | |
27 | 36 | LwM2mInstance [] instances; |
28 | 37 | } | ... | ... |
... | ... | @@ -15,19 +15,28 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.common.data.lwm2m; |
17 | 17 | |
18 | +import io.swagger.annotations.ApiModel; | |
19 | +import io.swagger.annotations.ApiModelProperty; | |
18 | 20 | import lombok.AllArgsConstructor; |
19 | 21 | import lombok.Data; |
20 | 22 | |
21 | 23 | import java.util.stream.Stream; |
22 | 24 | |
25 | +@ApiModel | |
23 | 26 | @Data |
24 | 27 | @AllArgsConstructor |
25 | 28 | public class LwM2mResourceObserve { |
29 | + @ApiModelProperty(position = 1, value = "LwM2M Resource Observe id.", example = "0") | |
26 | 30 | int id; |
31 | + @ApiModelProperty(position = 2, value = "LwM2M Resource Observe name.", example = "Data") | |
27 | 32 | String name; |
33 | + @ApiModelProperty(position = 3, value = "LwM2M Resource Observe observe.", example = "false") | |
28 | 34 | boolean observe; |
35 | + @ApiModelProperty(position = 4, value = "LwM2M Resource Observe attribute.", example = "false") | |
29 | 36 | boolean attribute; |
37 | + @ApiModelProperty(position = 5, value = "LwM2M Resource Observe telemetry.", example = "false") | |
30 | 38 | boolean telemetry; |
39 | + @ApiModelProperty(position = 6, value = "LwM2M Resource Observe key name.", example = "data") | |
31 | 40 | String keyName; |
32 | 41 | |
33 | 42 | public LwM2mResourceObserve(int id, String name, boolean observe, boolean attribute, boolean telemetry) { | ... | ... |