Commit f47de8cfa60220c12f1eef357f132b0e1a8173af

Authored by Andrii Shvaika
1 parent 26c54f7a

Device Profile controller

@@ -165,7 +165,7 @@ public abstract class BaseController { @@ -165,7 +165,7 @@ public abstract class BaseController {
165 "See the 'Model' tab of the Response Class for more details. "; 165 "See the 'Model' tab of the Response Class for more details. ";
166 public static final String DASHBOARD_ID_PARAM_DESCRIPTION = "A string value representing the device id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 166 public static final String DASHBOARD_ID_PARAM_DESCRIPTION = "A string value representing the device id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
167 public static final String DEVICE_ID_PARAM_DESCRIPTION = "A string value representing the device id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 167 public static final String DEVICE_ID_PARAM_DESCRIPTION = "A string value representing the device id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
168 - public static final String DEVICE_PROFILE_ID_DESCRIPTION = "A string value representing the device profile id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'"; 168 + public static final String DEVICE_PROFILE_ID_PARAM_DESCRIPTION = "A string value representing the device profile 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'"; 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'";
@@ -176,6 +176,8 @@ public abstract class BaseController { @@ -176,6 +176,8 @@ public abstract class BaseController {
176 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'";
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 public static final String RULE_CHAIN_ID_PARAM_DESCRIPTION = "A string value representing the rule chain id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
178 178
  179 + protected static final String TENANT_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'TENANT_ADMIN' authority.";
  180 + protected static final String TENANT_AND_USER_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'TENANT_ADMIN' or 'CUSTOMER_USER' authority.";
179 181
180 protected static final String PAGE_SIZE_DESCRIPTION = "Maximum amount of entities in a one page"; 182 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"; 183 protected static final String PAGE_NUMBER_DESCRIPTION = "Sequence number of page starting from 0";
@@ -186,6 +188,7 @@ public abstract class BaseController { @@ -186,6 +188,7 @@ public abstract class BaseController {
186 protected static final String ASSET_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the asset name."; 188 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."; 189 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."; 190 protected static final String DEVICE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device name.";
  191 + protected static final String DEVICE_PROFILE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device profile name.";
189 protected static final String CUSTOMER_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the customer title."; 192 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."; 193 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."; 194 protected static final String EVENT_TEXT_SEARCH_DESCRIPTION = "The value is not used in searching.";
@@ -194,6 +197,7 @@ public abstract class BaseController { @@ -194,6 +197,7 @@ public abstract class BaseController {
194 protected static final String DASHBOARD_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title"; 197 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"; 198 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"; 199 protected static final String DEVICE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, deviceProfileName, label, customerTitle";
  200 + protected static final String DEVICE_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, transportType, description, isDefault";
197 protected static final String ASSET_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle"; 201 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"; 202 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"; 203 protected static final String EVENT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, id";
@@ -201,11 +205,13 @@ public abstract class BaseController { @@ -201,11 +205,13 @@ public abstract class BaseController {
201 protected static final String AUDIT_LOG_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, entityType, entityName, userName, actionType, actionStatus"; 205 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)"; 206 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"; 207 protected static final String SORT_ORDER_ALLOWABLE_VALUES = "ASC, DESC";
  208 + protected static final String TRANSPORT_TYPE_ALLOWABLE_VALUES = "DEFAULT, MQTT, COAP, LWM2M, SNMP";
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. "; 209 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. "; 210 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."; 211 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. "; 212 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. "; 213 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. ";
  214 + protected static final String DEVICE_PROFILE_INFO_DESCRIPTION = "Device Profile Info is a lightweight object that includes main information about Device Profile excluding the heavyweight configuration object. ";
209 215
210 protected static final String DEVICE_NAME_DESCRIPTION = "A string value representing the Device name."; 216 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."; 217 protected static final String ASSET_NAME_DESCRIPTION = "A string value representing the Asset name.";
@@ -415,7 +415,7 @@ public class DeviceController extends BaseController { @@ -415,7 +415,7 @@ public class DeviceController extends BaseController {
415 @RequestParam int page, 415 @RequestParam int page,
416 @ApiParam(value = DEVICE_TYPE_DESCRIPTION) 416 @ApiParam(value = DEVICE_TYPE_DESCRIPTION)
417 @RequestParam(required = false) String type, 417 @RequestParam(required = false) String type,
418 - @ApiParam(value = DEVICE_PROFILE_ID_DESCRIPTION) 418 + @ApiParam(value = DEVICE_PROFILE_ID_PARAM_DESCRIPTION)
419 @RequestParam(required = false) String deviceProfileId, 419 @RequestParam(required = false) String deviceProfileId,
420 @ApiParam(value = DEVICE_TEXT_SEARCH_DESCRIPTION) 420 @ApiParam(value = DEVICE_TEXT_SEARCH_DESCRIPTION)
421 @RequestParam(required = false) String textSearch, 421 @RequestParam(required = false) String textSearch,
@@ -509,7 +509,7 @@ public class DeviceController extends BaseController { @@ -509,7 +509,7 @@ public class DeviceController extends BaseController {
509 @RequestParam int page, 509 @RequestParam int page,
510 @ApiParam(value = DEVICE_TYPE_DESCRIPTION) 510 @ApiParam(value = DEVICE_TYPE_DESCRIPTION)
511 @RequestParam(required = false) String type, 511 @RequestParam(required = false) String type,
512 - @ApiParam(value = DEVICE_PROFILE_ID_DESCRIPTION) 512 + @ApiParam(value = DEVICE_PROFILE_ID_PARAM_DESCRIPTION)
513 @RequestParam(required = false) String deviceProfileId, 513 @RequestParam(required = false) String deviceProfileId,
514 @ApiParam(value = DEVICE_TEXT_SEARCH_DESCRIPTION) 514 @ApiParam(value = DEVICE_TEXT_SEARCH_DESCRIPTION)
515 @RequestParam(required = false) String textSearch, 515 @RequestParam(required = false) String textSearch,
@@ -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.apache.commons.lang3.StringUtils; 21 import org.apache.commons.lang3.StringUtils;
20 import org.springframework.beans.factory.annotation.Autowired; 22 import org.springframework.beans.factory.annotation.Autowired;
@@ -58,10 +60,16 @@ public class DeviceProfileController extends BaseController { @@ -58,10 +60,16 @@ public class DeviceProfileController extends BaseController {
58 @Autowired 60 @Autowired
59 private TimeseriesService timeseriesService; 61 private TimeseriesService timeseriesService;
60 62
  63 + @ApiOperation(value = "Get Device Profile (getDeviceProfileById)",
  64 + notes = "Fetch the Device Profile object based on the provided Device Profile Id. " +
  65 + "The server checks that the device profile is owned by the same tenant. " + TENANT_AUTHORITY_PARAGRAPH,
  66 + produces = "application/json")
61 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 67 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
62 @RequestMapping(value = "/deviceProfile/{deviceProfileId}", method = RequestMethod.GET) 68 @RequestMapping(value = "/deviceProfile/{deviceProfileId}", method = RequestMethod.GET)
63 @ResponseBody 69 @ResponseBody
64 - public DeviceProfile getDeviceProfileById(@PathVariable(DEVICE_PROFILE_ID) String strDeviceProfileId) throws ThingsboardException { 70 + public DeviceProfile getDeviceProfileById(
  71 + @ApiParam(value = DEVICE_PROFILE_ID_PARAM_DESCRIPTION)
  72 + @PathVariable(DEVICE_PROFILE_ID) String strDeviceProfileId) throws ThingsboardException {
65 checkParameter(DEVICE_PROFILE_ID, strDeviceProfileId); 73 checkParameter(DEVICE_PROFILE_ID, strDeviceProfileId);
66 try { 74 try {
67 DeviceProfileId deviceProfileId = new DeviceProfileId(toUUID(strDeviceProfileId)); 75 DeviceProfileId deviceProfileId = new DeviceProfileId(toUUID(strDeviceProfileId));
@@ -71,10 +79,16 @@ public class DeviceProfileController extends BaseController { @@ -71,10 +79,16 @@ public class DeviceProfileController extends BaseController {
71 } 79 }
72 } 80 }
73 81
  82 + @ApiOperation(value = "Get Device Profile Info (getDeviceProfileInfoById)",
  83 + notes = "Fetch the Device Profile Info object based on the provided Device Profile Id. "
  84 + + DEVICE_PROFILE_INFO_DESCRIPTION + TENANT_AND_USER_AUTHORITY_PARAGRAPH,
  85 + produces = "application/json")
74 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") 86 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
75 @RequestMapping(value = "/deviceProfileInfo/{deviceProfileId}", method = RequestMethod.GET) 87 @RequestMapping(value = "/deviceProfileInfo/{deviceProfileId}", method = RequestMethod.GET)
76 @ResponseBody 88 @ResponseBody
77 - public DeviceProfileInfo getDeviceProfileInfoById(@PathVariable(DEVICE_PROFILE_ID) String strDeviceProfileId) throws ThingsboardException { 89 + public DeviceProfileInfo getDeviceProfileInfoById(
  90 + @ApiParam(value = DEVICE_PROFILE_ID_PARAM_DESCRIPTION)
  91 + @PathVariable(DEVICE_PROFILE_ID) String strDeviceProfileId) throws ThingsboardException {
78 checkParameter(DEVICE_PROFILE_ID, strDeviceProfileId); 92 checkParameter(DEVICE_PROFILE_ID, strDeviceProfileId);
79 try { 93 try {
80 DeviceProfileId deviceProfileId = new DeviceProfileId(toUUID(strDeviceProfileId)); 94 DeviceProfileId deviceProfileId = new DeviceProfileId(toUUID(strDeviceProfileId));
@@ -84,6 +98,10 @@ public class DeviceProfileController extends BaseController { @@ -84,6 +98,10 @@ public class DeviceProfileController extends BaseController {
84 } 98 }
85 } 99 }
86 100
  101 + @ApiOperation(value = "Get Default Device Profile (getDefaultDeviceProfileInfo)",
  102 + notes = "Fetch the Default Device Profile Info object. " +
  103 + DEVICE_PROFILE_INFO_DESCRIPTION + TENANT_AND_USER_AUTHORITY_PARAGRAPH,
  104 + produces = "application/json")
87 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") 105 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
88 @RequestMapping(value = "/deviceProfileInfo/default", method = RequestMethod.GET) 106 @RequestMapping(value = "/deviceProfileInfo/default", method = RequestMethod.GET)
89 @ResponseBody 107 @ResponseBody
@@ -95,10 +113,18 @@ public class DeviceProfileController extends BaseController { @@ -95,10 +113,18 @@ public class DeviceProfileController extends BaseController {
95 } 113 }
96 } 114 }
97 115
  116 + @ApiOperation(value = "Get time-series keys (getTimeseriesKeys)",
  117 + notes = "Get a set of unique time-series keys used by devices that belong to specified profile. " +
  118 + "If profile is not set returns a list of unique keys among all profiles. " +
  119 + "The call is used for auto-complete in the UI forms. " +
  120 + "The implementation limits the number of devices that participate in search to 100 as a trade of between accurate results and time-consuming queries. " +
  121 + TENANT_AUTHORITY_PARAGRAPH,
  122 + produces = "application/json")
98 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 123 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
99 @RequestMapping(value = "/deviceProfile/devices/keys/timeseries", method = RequestMethod.GET) 124 @RequestMapping(value = "/deviceProfile/devices/keys/timeseries", method = RequestMethod.GET)
100 @ResponseBody 125 @ResponseBody
101 public List<String> getTimeseriesKeys( 126 public List<String> getTimeseriesKeys(
  127 + @ApiParam(value = DEVICE_PROFILE_ID_PARAM_DESCRIPTION)
102 @RequestParam(name = DEVICE_PROFILE_ID, required = false) String deviceProfileIdStr) throws ThingsboardException { 128 @RequestParam(name = DEVICE_PROFILE_ID, required = false) String deviceProfileIdStr) throws ThingsboardException {
103 DeviceProfileId deviceProfileId; 129 DeviceProfileId deviceProfileId;
104 if (StringUtils.isNotEmpty(deviceProfileIdStr)) { 130 if (StringUtils.isNotEmpty(deviceProfileIdStr)) {
@@ -115,10 +141,18 @@ public class DeviceProfileController extends BaseController { @@ -115,10 +141,18 @@ public class DeviceProfileController extends BaseController {
115 } 141 }
116 } 142 }
117 143
  144 + @ApiOperation(value = "Get attribute keys (getAttributesKeys)",
  145 + notes = "Get a set of unique attribute keys used by devices that belong to specified profile. " +
  146 + "If profile is not set returns a list of unique keys among all profiles. " +
  147 + "The call is used for auto-complete in the UI forms. " +
  148 + "The implementation limits the number of devices that participate in search to 100 as a trade of between accurate results and time-consuming queries. " +
  149 + TENANT_AUTHORITY_PARAGRAPH,
  150 + produces = "application/json")
118 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 151 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
119 @RequestMapping(value = "/deviceProfile/devices/keys/attributes", method = RequestMethod.GET) 152 @RequestMapping(value = "/deviceProfile/devices/keys/attributes", method = RequestMethod.GET)
120 @ResponseBody 153 @ResponseBody
121 public List<String> getAttributesKeys( 154 public List<String> getAttributesKeys(
  155 + @ApiParam(value = DEVICE_PROFILE_ID_PARAM_DESCRIPTION)
122 @RequestParam(name = DEVICE_PROFILE_ID, required = false) String deviceProfileIdStr) throws ThingsboardException { 156 @RequestParam(name = DEVICE_PROFILE_ID, required = false) String deviceProfileIdStr) throws ThingsboardException {
123 DeviceProfileId deviceProfileId; 157 DeviceProfileId deviceProfileId;
124 if (StringUtils.isNotEmpty(deviceProfileIdStr)) { 158 if (StringUtils.isNotEmpty(deviceProfileIdStr)) {
@@ -135,10 +169,20 @@ public class DeviceProfileController extends BaseController { @@ -135,10 +169,20 @@ public class DeviceProfileController extends BaseController {
135 } 169 }
136 } 170 }
137 171
  172 + @ApiOperation(value = "Create Or Update Device Profile (saveDevice)",
  173 + notes = "Create or update the Device Profile. When creating device profile, platform generates device profile id as [time-based UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_(date-time_and_MAC_address). " +
  174 + "The newly created device profile id will be present in the response. " +
  175 + "Specify existing device profile id to update the device profile. " +
  176 + "Referencing non-existing device profile Id will cause 'Not Found' error. " +
  177 + "\n\nDevice profile name is unique in the scope of tenant. Only one 'default' device profile may exist in scope of tenant." + TENANT_AUTHORITY_PARAGRAPH,
  178 + produces = "application/json",
  179 + consumes = "application/json")
138 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 180 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
139 @RequestMapping(value = "/deviceProfile", method = RequestMethod.POST) 181 @RequestMapping(value = "/deviceProfile", method = RequestMethod.POST)
140 @ResponseBody 182 @ResponseBody
141 - public DeviceProfile saveDeviceProfile(@RequestBody DeviceProfile deviceProfile) throws ThingsboardException { 183 + public DeviceProfile saveDeviceProfile(
  184 + @ApiParam(value = "A JSON value representing the device profile.")
  185 + @RequestBody DeviceProfile deviceProfile) throws ThingsboardException {
142 try { 186 try {
143 boolean created = deviceProfile.getId() == null; 187 boolean created = deviceProfile.getId() == null;
144 deviceProfile.setTenantId(getTenantId()); 188 deviceProfile.setTenantId(getTenantId());
@@ -180,10 +224,16 @@ public class DeviceProfileController extends BaseController { @@ -180,10 +224,16 @@ public class DeviceProfileController extends BaseController {
180 } 224 }
181 } 225 }
182 226
  227 + @ApiOperation(value = "Delete device profile (deleteDeviceProfile)",
  228 + notes = "Deletes the device profile. Referencing non-existing device profile Id will cause an error. " +
  229 + "Can't delete the device profile if it is referenced by existing devices." + TENANT_AUTHORITY_PARAGRAPH,
  230 + produces = "application/json")
183 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 231 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
184 @RequestMapping(value = "/deviceProfile/{deviceProfileId}", method = RequestMethod.DELETE) 232 @RequestMapping(value = "/deviceProfile/{deviceProfileId}", method = RequestMethod.DELETE)
185 @ResponseStatus(value = HttpStatus.OK) 233 @ResponseStatus(value = HttpStatus.OK)
186 - public void deleteDeviceProfile(@PathVariable(DEVICE_PROFILE_ID) String strDeviceProfileId) throws ThingsboardException { 234 + public void deleteDeviceProfile(
  235 + @ApiParam(value = DEVICE_PROFILE_ID_PARAM_DESCRIPTION)
  236 + @PathVariable(DEVICE_PROFILE_ID) String strDeviceProfileId) throws ThingsboardException {
187 checkParameter(DEVICE_PROFILE_ID, strDeviceProfileId); 237 checkParameter(DEVICE_PROFILE_ID, strDeviceProfileId);
188 try { 238 try {
189 DeviceProfileId deviceProfileId = new DeviceProfileId(toUUID(strDeviceProfileId)); 239 DeviceProfileId deviceProfileId = new DeviceProfileId(toUUID(strDeviceProfileId));
@@ -207,10 +257,15 @@ public class DeviceProfileController extends BaseController { @@ -207,10 +257,15 @@ public class DeviceProfileController extends BaseController {
207 } 257 }
208 } 258 }
209 259
  260 + @ApiOperation(value = "Make Device Profile Default (setDefaultDeviceProfile)",
  261 + notes = "Marks device profile as default within a tenant scope." + TENANT_AUTHORITY_PARAGRAPH,
  262 + produces = "application/json")
210 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") 263 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
211 @RequestMapping(value = "/deviceProfile/{deviceProfileId}/default", method = RequestMethod.POST) 264 @RequestMapping(value = "/deviceProfile/{deviceProfileId}/default", method = RequestMethod.POST)
212 @ResponseBody 265 @ResponseBody
213 - public DeviceProfile setDefaultDeviceProfile(@PathVariable(DEVICE_PROFILE_ID) String strDeviceProfileId) throws ThingsboardException { 266 + public DeviceProfile setDefaultDeviceProfile(
  267 + @ApiParam(value = DEVICE_PROFILE_ID_PARAM_DESCRIPTION)
  268 + @PathVariable(DEVICE_PROFILE_ID) String strDeviceProfileId) throws ThingsboardException {
214 checkParameter(DEVICE_PROFILE_ID, strDeviceProfileId); 269 checkParameter(DEVICE_PROFILE_ID, strDeviceProfileId);
215 try { 270 try {
216 DeviceProfileId deviceProfileId = new DeviceProfileId(toUUID(strDeviceProfileId)); 271 DeviceProfileId deviceProfileId = new DeviceProfileId(toUUID(strDeviceProfileId));
@@ -238,14 +293,24 @@ public class DeviceProfileController extends BaseController { @@ -238,14 +293,24 @@ public class DeviceProfileController extends BaseController {
238 } 293 }
239 } 294 }
240 295
  296 + @ApiOperation(value = "Get Device Profiles (getDeviceProfiles)",
  297 + notes = "Returns a page of devices profile objects owned by tenant. " +
  298 + PAGE_DATA_PARAMETERS + TENANT_AUTHORITY_PARAGRAPH,
  299 + produces = "application/json")
241 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 300 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
242 @RequestMapping(value = "/deviceProfiles", params = {"pageSize", "page"}, method = RequestMethod.GET) 301 @RequestMapping(value = "/deviceProfiles", params = {"pageSize", "page"}, method = RequestMethod.GET)
243 @ResponseBody 302 @ResponseBody
244 - public PageData<DeviceProfile> getDeviceProfiles(@RequestParam int pageSize,  
245 - @RequestParam int page,  
246 - @RequestParam(required = false) String textSearch,  
247 - @RequestParam(required = false) String sortProperty,  
248 - @RequestParam(required = false) String sortOrder) throws ThingsboardException { 303 + public PageData<DeviceProfile> getDeviceProfiles(
  304 + @ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
  305 + @RequestParam int pageSize,
  306 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
  307 + @RequestParam int page,
  308 + @ApiParam(value = DEVICE_PROFILE_TEXT_SEARCH_DESCRIPTION)
  309 + @RequestParam(required = false) String textSearch,
  310 + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = DEVICE_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES)
  311 + @RequestParam(required = false) String sortProperty,
  312 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
  313 + @RequestParam(required = false) String sortOrder) throws ThingsboardException {
249 try { 314 try {
250 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); 315 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
251 return checkNotNull(deviceProfileService.findDeviceProfiles(getTenantId(), pageLink)); 316 return checkNotNull(deviceProfileService.findDeviceProfiles(getTenantId(), pageLink));
@@ -254,15 +319,26 @@ public class DeviceProfileController extends BaseController { @@ -254,15 +319,26 @@ public class DeviceProfileController extends BaseController {
254 } 319 }
255 } 320 }
256 321
  322 + @ApiOperation(value = "Get Device Profiles for transport type (getDeviceProfileInfos)",
  323 + notes = "Returns a page of devices profile info objects owned by tenant. " +
  324 + PAGE_DATA_PARAMETERS + DEVICE_PROFILE_INFO_DESCRIPTION + TENANT_AND_USER_AUTHORITY_PARAGRAPH,
  325 + produces = "application/json")
257 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") 326 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
258 @RequestMapping(value = "/deviceProfileInfos", params = {"pageSize", "page"}, method = RequestMethod.GET) 327 @RequestMapping(value = "/deviceProfileInfos", params = {"pageSize", "page"}, method = RequestMethod.GET)
259 @ResponseBody 328 @ResponseBody
260 - public PageData<DeviceProfileInfo> getDeviceProfileInfos(@RequestParam int pageSize,  
261 - @RequestParam int page,  
262 - @RequestParam(required = false) String textSearch,  
263 - @RequestParam(required = false) String sortProperty,  
264 - @RequestParam(required = false) String sortOrder,  
265 - @RequestParam(required = false) String transportType) throws ThingsboardException { 329 + public PageData<DeviceProfileInfo> getDeviceProfileInfos(
  330 + @ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
  331 + @RequestParam int pageSize,
  332 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
  333 + @RequestParam int page,
  334 + @ApiParam(value = DEVICE_PROFILE_TEXT_SEARCH_DESCRIPTION)
  335 + @RequestParam(required = false) String textSearch,
  336 + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = DEVICE_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES)
  337 + @RequestParam(required = false) String sortProperty,
  338 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
  339 + @RequestParam(required = false) String sortOrder,
  340 + @ApiParam(value = "Type of the transport", allowableValues = TRANSPORT_TYPE_ALLOWABLE_VALUES)
  341 + @RequestParam(required = false) String transportType) throws ThingsboardException {
266 try { 342 try {
267 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); 343 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
268 return checkNotNull(deviceProfileService.findDeviceProfileInfos(getTenantId(), pageLink, transportType)); 344 return checkNotNull(deviceProfileService.findDeviceProfileInfos(getTenantId(), pageLink, transportType));
@@ -17,6 +17,8 @@ package org.thingsboard.server.common.data; @@ -17,6 +17,8 @@ package org.thingsboard.server.common.data;
17 17
18 import com.fasterxml.jackson.annotation.JsonIgnore; 18 import com.fasterxml.jackson.annotation.JsonIgnore;
19 import com.fasterxml.jackson.core.JsonProcessingException; 19 import com.fasterxml.jackson.core.JsonProcessingException;
  20 +import io.swagger.annotations.ApiModel;
  21 +import io.swagger.annotations.ApiModelProperty;
20 import lombok.Data; 22 import lombok.Data;
21 import lombok.EqualsAndHashCode; 23 import lombok.EqualsAndHashCode;
22 import lombok.extern.slf4j.Slf4j; 24 import lombok.extern.slf4j.Slf4j;
@@ -34,34 +36,51 @@ import java.io.IOException; @@ -34,34 +36,51 @@ import java.io.IOException;
34 36
35 import static org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo.mapper; 37 import static org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo.mapper;
36 38
  39 +@ApiModel
37 @Data 40 @Data
38 @EqualsAndHashCode(callSuper = true) 41 @EqualsAndHashCode(callSuper = true)
39 @Slf4j 42 @Slf4j
40 public class DeviceProfile extends SearchTextBased<DeviceProfileId> implements HasName, HasTenantId, HasOtaPackage { 43 public class DeviceProfile extends SearchTextBased<DeviceProfileId> implements HasName, HasTenantId, HasOtaPackage {
41 44
  45 + @ApiModelProperty(position = 3, value = "JSON object with Tenant Id that owns the profile.", readOnly = true)
42 private TenantId tenantId; 46 private TenantId tenantId;
43 @NoXss 47 @NoXss
  48 + @ApiModelProperty(position = 4, value = "Unique Device Profile Name in scope of Tenant.", example = "Moisture Sensor")
44 private String name; 49 private String name;
45 @NoXss 50 @NoXss
  51 + @ApiModelProperty(position = 11, value = "Device Profile description. ")
46 private String description; 52 private String description;
  53 + @ApiModelProperty(position = 12, value = "Either URL or Base64 data of the icon. Used in the mobile application to visualize set of device profiles in the grid view. ")
47 private String image; 54 private String image;
48 private boolean isDefault; 55 private boolean isDefault;
  56 + @ApiModelProperty(position = 16, value = "Type of the profile. Always 'DEFAULT' for now. Reserved for future use.")
49 private DeviceProfileType type; 57 private DeviceProfileType type;
  58 + @ApiModelProperty(position = 14, value = "Type of the transport used to connect the device. Default transport supports HTTP, CoAP and MQTT.")
50 private DeviceTransportType transportType; 59 private DeviceTransportType transportType;
  60 + @ApiModelProperty(position = 15, value = "Provisioning strategy.")
51 private DeviceProfileProvisionType provisionType; 61 private DeviceProfileProvisionType provisionType;
  62 + @ApiModelProperty(position = 7, value = "Reference to the rule chain. " +
  63 + "If present, the specified rule chain will be used to process all messages related to device, including telemetry, attribute updates, etc. " +
  64 + "Otherwise, the root rule chain will be used to process those messages.")
52 private RuleChainId defaultRuleChainId; 65 private RuleChainId defaultRuleChainId;
  66 + @ApiModelProperty(position = 6, value = "Reference to the dashboard. Used in the mobile application to open the default dashboard when user navigates to device details.")
53 private DashboardId defaultDashboardId; 67 private DashboardId defaultDashboardId;
54 @NoXss 68 @NoXss
  69 + @ApiModelProperty(position = 8, value = "Reference to the rule engine queue. " +
  70 + "If present, the specified queue will be used to store all unprocessed messages related to device, including telemetry, attribute updates, etc. " +
  71 + "Otherwise, the 'Main' queue will be used to store those messages.")
55 private String defaultQueueName; 72 private String defaultQueueName;
56 @Valid 73 @Valid
57 private transient DeviceProfileData profileData; 74 private transient DeviceProfileData profileData;
58 @JsonIgnore 75 @JsonIgnore
59 private byte[] profileDataBytes; 76 private byte[] profileDataBytes;
60 @NoXss 77 @NoXss
  78 + @ApiModelProperty(position = 13, value = "Unique provisioning key used by 'Device Provisioning' feature.")
61 private String provisionDeviceKey; 79 private String provisionDeviceKey;
62 80
  81 + @ApiModelProperty(position = 9, value = "Reference to the firmware OTA package. If present, the specified package will be used as default device firmware. ")
63 private OtaPackageId firmwareId; 82 private OtaPackageId firmwareId;
64 - 83 + @ApiModelProperty(position = 10, value = "Reference to the software OTA package. If present, the specified package will be used as default device software. ")
65 private OtaPackageId softwareId; 84 private OtaPackageId softwareId;
66 85
67 public DeviceProfile() { 86 public DeviceProfile() {
@@ -88,16 +107,32 @@ public class DeviceProfile extends SearchTextBased<DeviceProfileId> implements H @@ -88,16 +107,32 @@ public class DeviceProfile extends SearchTextBased<DeviceProfileId> implements H
88 this.softwareId = deviceProfile.getSoftwareId(); 107 this.softwareId = deviceProfile.getSoftwareId();
89 } 108 }
90 109
  110 + @ApiModelProperty(position = 1, value = "JSON object with the device profile Id. " +
  111 + "Specify this field to update the device profile. " +
  112 + "Referencing non-existing device profile Id will cause error. " +
  113 + "Omit this field to create new device profile.")
  114 + @Override
  115 + public DeviceProfileId getId() {
  116 + return super.getId();
  117 + }
  118 +
  119 + @ApiModelProperty(position = 2, value = "Timestamp of the profile creation, in milliseconds", example = "1609459200000", readOnly = true)
  120 + @Override
  121 + public long getCreatedTime() {
  122 + return super.getCreatedTime();
  123 + }
  124 +
91 @Override 125 @Override
92 public String getSearchText() { 126 public String getSearchText() {
93 return getName(); 127 return getName();
94 } 128 }
95 129
96 - @Override  
97 - public String getName() {  
98 - return name; 130 + @ApiModelProperty(position = 5, value = "Used to mark the default profile. Default profile is used when the device profile is not specified during device creation.")
  131 + public boolean isDefault(){
  132 + return isDefault;
99 } 133 }
100 134
  135 + @ApiModelProperty(position = 16, value = "Complex JSON object that includes addition device profile configuration (transport, alarm rules, etc).")
101 public DeviceProfileData getProfileData() { 136 public DeviceProfileData getProfileData() {
102 if (profileData != null) { 137 if (profileData != null) {
103 return profileData; 138 return profileData;