Commit 45d49153e253d10ec1cc63d4467fed8632c43d1f

Authored by Andrii Shvaika
1 parent 4ae4c7c3

Tenant and Tenant Profile Controllers

... ... @@ -169,6 +169,7 @@ public abstract class BaseController {
169 169 public static final String RPC_ID_PARAM_DESCRIPTION = "A string value representing the rpc id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
170 170 public static final String DEVICE_ID_PARAM_DESCRIPTION = "A string value representing the device id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
171 171 public static final String DEVICE_PROFILE_ID_PARAM_DESCRIPTION = "A string value representing the device profile id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
  172 + public static final String TENANT_PROFILE_ID_PARAM_DESCRIPTION = "A string value representing the tenant profile id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
172 173 public static final String TENANT_ID_PARAM_DESCRIPTION = "A string value representing the tenant id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
173 174 public static final String EDGE_ID_PARAM_DESCRIPTION = "A string value representing the edge id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
174 175 public static final String CUSTOMER_ID_PARAM_DESCRIPTION = "A string value representing the customer id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
... ... @@ -179,6 +180,8 @@ public abstract class BaseController {
179 180 public static final String ENTITY_TYPE_PARAM_DESCRIPTION = "A string value representing the entity type. For example, 'DEVICE'";
180 181 public static final String RULE_CHAIN_ID_PARAM_DESCRIPTION = "A string value representing the rule chain id. For example, '784f394c-42b6-435a-983c-b7beff2784f9'";
181 182
  183 + protected static final String SYSTEM_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'SYS_ADMIN' authority.";
  184 + protected static final String SYSTEM_AND_TENANT_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'SYS_ADMIN' or 'TENANT_ADMIN' authority.";
182 185 protected static final String TENANT_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'TENANT_ADMIN' authority.";
183 186 protected static final String TENANT_AND_USER_AUTHORITY_PARAGRAPH = "\n\nAvailable for users with 'TENANT_ADMIN' or 'CUSTOMER_USER' authority.";
184 187
... ... @@ -193,6 +196,8 @@ public abstract class BaseController {
193 196 protected static final String DASHBOARD_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the dashboard title.";
194 197 protected static final String RPC_TEXT_SEARCH_DESCRIPTION = "Not implemented. Leave empty.";
195 198 protected static final String DEVICE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device name.";
  199 + protected static final String TENANT_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the tenant name.";
  200 + protected static final String TENANT_PROFILE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the tenant profile name.";
196 201 protected static final String RULE_CHAIN_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the rule chain name.";
197 202 protected static final String DEVICE_PROFILE_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the device profile name.";
198 203 protected static final String CUSTOMER_TEXT_SEARCH_DESCRIPTION = "The case insensitive 'startsWith' filter based on the customer title.";
... ... @@ -204,6 +209,10 @@ public abstract class BaseController {
204 209 protected static final String CUSTOMER_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, email, country, city";
205 210 protected static final String RPC_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, expirationTime, request, response";
206 211 protected static final String DEVICE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, deviceProfileName, label, customerTitle";
  212 + protected static final String TENANT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, title, email, country, state, city, address, address2, zip, phone, email";
  213 + protected static final String TENANT_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, description, isDefault";
  214 + protected static final String TENANT_PROFILE_INFO_SORT_PROPERTY_ALLOWABLE_VALUES = "id, name";
  215 + protected static final String TENANT_INFO_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, tenantProfileName, title, email, country, state, city, address, address2, zip, phone, email";
207 216 protected static final String DEVICE_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, transportType, description, isDefault";
208 217 protected static final String ASSET_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle";
209 218 protected static final String ALARM_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, startTs, endTs, type, ackTs, clearTs, severity, status";
... ...
... ... @@ -373,7 +373,7 @@ public class DeviceController extends BaseController {
373 373
374 374 @ApiOperation(value = "Get Tenant Devices (getTenantDevices)",
375 375 notes = "Returns a page of devices owned by tenant. " +
376   - PAGE_DATA_PARAMETERS)
  376 + PAGE_DATA_PARAMETERS + TENANT_AUTHORITY_PARAGRAPH)
377 377 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
378 378 @RequestMapping(value = "/tenant/devices", params = {"pageSize", "page"}, method = RequestMethod.GET)
379 379 @ResponseBody
... ...
... ... @@ -16,6 +16,8 @@
16 16 package org.thingsboard.server.controller;
17 17
18 18 import com.fasterxml.jackson.databind.node.ObjectNode;
  19 +import io.swagger.annotations.ApiOperation;
  20 +import io.swagger.annotations.ApiParam;
19 21 import lombok.extern.slf4j.Slf4j;
20 22 import org.springframework.beans.factory.annotation.Autowired;
21 23 import org.springframework.http.HttpStatus;
... ... @@ -47,21 +49,26 @@ import org.thingsboard.server.service.security.permission.Resource;
47 49 @Slf4j
48 50 public class TenantController extends BaseController {
49 51
  52 + private static final String TENANT_INFO_DESCRIPTION = "The Tenant Info object extends regular Tenant object and includes Tenant Profile name. ";
50 53 @Autowired
51 54 private InstallScripts installScripts;
52 55
53 56 @Autowired
54 57 private TenantService tenantService;
55 58
  59 + @ApiOperation(value = "Get Tenant (getTenantById)",
  60 + notes = "Fetch the Tenant object based on the provided Tenant Id. " + SYSTEM_AND_TENANT_AUTHORITY_PARAGRAPH)
56 61 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
57 62 @RequestMapping(value = "/tenant/{tenantId}", method = RequestMethod.GET)
58 63 @ResponseBody
59   - public Tenant getTenantById(@PathVariable("tenantId") String strTenantId) throws ThingsboardException {
  64 + public Tenant getTenantById(
  65 + @ApiParam(value = TENANT_ID_PARAM_DESCRIPTION)
  66 + @PathVariable(TENANT_ID) String strTenantId) throws ThingsboardException {
60 67 checkParameter(TENANT_ID, strTenantId);
61 68 try {
62 69 TenantId tenantId = new TenantId(toUUID(strTenantId));
63 70 Tenant tenant = checkTenantId(tenantId, Operation.READ);
64   - if(!tenant.getAdditionalInfo().isNull()) {
  71 + if (!tenant.getAdditionalInfo().isNull()) {
65 72 processDashboardIdFromAdditionalInfo((ObjectNode) tenant.getAdditionalInfo(), HOME_DASHBOARD);
66 73 }
67 74 return tenant;
... ... @@ -70,10 +77,15 @@ public class TenantController extends BaseController {
70 77 }
71 78 }
72 79
  80 + @ApiOperation(value = "Get Tenant Info (getTenantInfoById)",
  81 + notes = "Fetch the Tenant Info object based on the provided Tenant Id. " +
  82 + TENANT_INFO_DESCRIPTION + SYSTEM_AND_TENANT_AUTHORITY_PARAGRAPH)
73 83 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
74 84 @RequestMapping(value = "/tenant/info/{tenantId}", method = RequestMethod.GET)
75 85 @ResponseBody
76   - public TenantInfo getTenantInfoById(@PathVariable("tenantId") String strTenantId) throws ThingsboardException {
  86 + public TenantInfo getTenantInfoById(
  87 + @ApiParam(value = TENANT_ID_PARAM_DESCRIPTION)
  88 + @PathVariable(TENANT_ID) String strTenantId) throws ThingsboardException {
77 89 checkParameter(TENANT_ID, strTenantId);
78 90 try {
79 91 TenantId tenantId = new TenantId(toUUID(strTenantId));
... ... @@ -83,10 +95,18 @@ public class TenantController extends BaseController {
83 95 }
84 96 }
85 97
  98 + @ApiOperation(value = "Create Or update Tenant (saveTenant)",
  99 + notes = "Create or update the Tenant. When creating tenant, platform generates Tenant Id as [time-based UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_(date-time_and_MAC_address). " +
  100 + "Default Rule Chain and Device profile are also generated for the new tenants automatically. " +
  101 + "The newly created Tenant Id will be present in the response. " +
  102 + "Specify existing Tenant Id id to update the Tenant. " +
  103 + "Referencing non-existing Tenant Id will cause 'Not Found' error." + SYSTEM_AUTHORITY_PARAGRAPH)
86 104 @PreAuthorize("hasAuthority('SYS_ADMIN')")
87 105 @RequestMapping(value = "/tenant", method = RequestMethod.POST)
88 106 @ResponseBody
89   - public Tenant saveTenant(@RequestBody Tenant tenant) throws ThingsboardException {
  107 + public Tenant saveTenant(
  108 + @ApiParam(value = "A JSON value representing the tenant.")
  109 + @RequestBody Tenant tenant) throws ThingsboardException {
90 110 try {
91 111 boolean newTenant = tenant.getId() == null;
92 112
... ... @@ -107,11 +127,15 @@ public class TenantController extends BaseController {
107 127 }
108 128 }
109 129
  130 + @ApiOperation(value = "Delete Tenant (deleteTenant)",
  131 + notes = "Deletes the tenant, it's customers, rule chains, devices and all other related entities. Referencing non-existing tenant Id will cause an error." + SYSTEM_AUTHORITY_PARAGRAPH)
110 132 @PreAuthorize("hasAuthority('SYS_ADMIN')")
111 133 @RequestMapping(value = "/tenant/{tenantId}", method = RequestMethod.DELETE)
112 134 @ResponseStatus(value = HttpStatus.OK)
113   - public void deleteTenant(@PathVariable("tenantId") String strTenantId) throws ThingsboardException {
114   - checkParameter("tenantId", strTenantId);
  135 + public void deleteTenant(
  136 + @ApiParam(value = TENANT_ID_PARAM_DESCRIPTION)
  137 + @PathVariable(TENANT_ID) String strTenantId) throws ThingsboardException {
  138 + checkParameter(TENANT_ID, strTenantId);
115 139 try {
116 140 TenantId tenantId = new TenantId(toUUID(strTenantId));
117 141 Tenant tenant = checkTenantId(tenantId, Operation.DELETE);
... ... @@ -124,14 +148,21 @@ public class TenantController extends BaseController {
124 148 }
125 149 }
126 150
  151 + @ApiOperation(value = "Get Tenants (getTenants)", notes = "Returns a page of tenants registered in the platform. " + PAGE_DATA_PARAMETERS + SYSTEM_AUTHORITY_PARAGRAPH)
127 152 @PreAuthorize("hasAuthority('SYS_ADMIN')")
128 153 @RequestMapping(value = "/tenants", params = {"pageSize", "page"}, method = RequestMethod.GET)
129 154 @ResponseBody
130   - public PageData<Tenant> getTenants(@RequestParam int pageSize,
131   - @RequestParam int page,
132   - @RequestParam(required = false) String textSearch,
133   - @RequestParam(required = false) String sortProperty,
134   - @RequestParam(required = false) String sortOrder) throws ThingsboardException {
  155 + public PageData<Tenant> getTenants(
  156 + @ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
  157 + @RequestParam int pageSize,
  158 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
  159 + @RequestParam int page,
  160 + @ApiParam(value = TENANT_TEXT_SEARCH_DESCRIPTION)
  161 + @RequestParam(required = false) String textSearch,
  162 + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = TENANT_SORT_PROPERTY_ALLOWABLE_VALUES)
  163 + @RequestParam(required = false) String sortProperty,
  164 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
  165 + @RequestParam(required = false) String sortOrder) throws ThingsboardException {
135 166 try {
136 167 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
137 168 return checkNotNull(tenantService.findTenants(pageLink));
... ... @@ -140,14 +171,23 @@ public class TenantController extends BaseController {
140 171 }
141 172 }
142 173
  174 + @ApiOperation(value = "Get Tenants Info (getTenants)", notes = "Returns a page of tenant info objects registered in the platform. "
  175 + + TENANT_INFO_DESCRIPTION + PAGE_DATA_PARAMETERS + SYSTEM_AUTHORITY_PARAGRAPH)
143 176 @PreAuthorize("hasAuthority('SYS_ADMIN')")
144 177 @RequestMapping(value = "/tenantInfos", params = {"pageSize", "page"}, method = RequestMethod.GET)
145 178 @ResponseBody
146   - public PageData<TenantInfo> getTenantInfos(@RequestParam int pageSize,
147   - @RequestParam int page,
148   - @RequestParam(required = false) String textSearch,
149   - @RequestParam(required = false) String sortProperty,
150   - @RequestParam(required = false) String sortOrder) throws ThingsboardException {
  179 + public PageData<TenantInfo> getTenantInfos(
  180 + @ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
  181 + @RequestParam int pageSize,
  182 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
  183 + @RequestParam int page,
  184 + @ApiParam(value = TENANT_TEXT_SEARCH_DESCRIPTION)
  185 + @RequestParam(required = false) String textSearch,
  186 + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = TENANT_INFO_SORT_PROPERTY_ALLOWABLE_VALUES)
  187 + @RequestParam(required = false) String sortProperty,
  188 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
  189 + @RequestParam(required = false) String sortOrder
  190 + ) throws ThingsboardException {
151 191 try {
152 192 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
153 193 return checkNotNull(tenantService.findTenantInfos(pageLink));
... ...
... ... @@ -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.http.HttpStatus;
20 22 import org.springframework.security.access.prepost.PreAuthorize;
... ... @@ -44,10 +46,16 @@ import org.thingsboard.server.service.security.permission.Resource;
44 46 @Slf4j
45 47 public class TenantProfileController extends BaseController {
46 48
  49 + private static final String TENANT_PROFILE_INFO_DESCRIPTION = "Tenant Profile Info is a lightweight object that contains only id and name of the profile. ";
  50 +
  51 + @ApiOperation(value = "Get Tenant Profile (getTenantProfileById)",
  52 + notes = "Fetch the Tenant Profile object based on the provided Tenant Profile Id. " + SYSTEM_AUTHORITY_PARAGRAPH)
47 53 @PreAuthorize("hasAnyAuthority('SYS_ADMIN')")
48 54 @RequestMapping(value = "/tenantProfile/{tenantProfileId}", method = RequestMethod.GET)
49 55 @ResponseBody
50   - public TenantProfile getTenantProfileById(@PathVariable("tenantProfileId") String strTenantProfileId) throws ThingsboardException {
  56 + public TenantProfile getTenantProfileById(
  57 + @ApiParam(value = TENANT_PROFILE_ID_PARAM_DESCRIPTION)
  58 + @PathVariable("tenantProfileId") String strTenantProfileId) throws ThingsboardException {
51 59 checkParameter("tenantProfileId", strTenantProfileId);
52 60 try {
53 61 TenantProfileId tenantProfileId = new TenantProfileId(toUUID(strTenantProfileId));
... ... @@ -57,10 +65,14 @@ public class TenantProfileController extends BaseController {
57 65 }
58 66 }
59 67
  68 + @ApiOperation(value = "Get Tenant Profile Info (getTenantProfileInfoById)",
  69 + notes = "Fetch the Tenant Profile Info object based on the provided Tenant Profile Id. " + TENANT_PROFILE_INFO_DESCRIPTION + SYSTEM_AUTHORITY_PARAGRAPH)
60 70 @PreAuthorize("hasAnyAuthority('SYS_ADMIN')")
61 71 @RequestMapping(value = "/tenantProfileInfo/{tenantProfileId}", method = RequestMethod.GET)
62 72 @ResponseBody
63   - public EntityInfo getTenantProfileInfoById(@PathVariable("tenantProfileId") String strTenantProfileId) throws ThingsboardException {
  73 + public EntityInfo getTenantProfileInfoById(
  74 + @ApiParam(value = TENANT_PROFILE_ID_PARAM_DESCRIPTION)
  75 + @PathVariable("tenantProfileId") String strTenantProfileId) throws ThingsboardException {
64 76 checkParameter("tenantProfileId", strTenantProfileId);
65 77 try {
66 78 TenantProfileId tenantProfileId = new TenantProfileId(toUUID(strTenantProfileId));
... ... @@ -70,6 +82,8 @@ public class TenantProfileController extends BaseController {
70 82 }
71 83 }
72 84
  85 + @ApiOperation(value = "Get default Tenant Profile Info (getDefaultTenantProfileInfo)",
  86 + notes = "Fetch the default Tenant Profile Info object based. " + TENANT_PROFILE_INFO_DESCRIPTION + SYSTEM_AUTHORITY_PARAGRAPH)
73 87 @PreAuthorize("hasAnyAuthority('SYS_ADMIN')")
74 88 @RequestMapping(value = "/tenantProfileInfo/default", method = RequestMethod.GET)
75 89 @ResponseBody
... ... @@ -81,10 +95,19 @@ public class TenantProfileController extends BaseController {
81 95 }
82 96 }
83 97
  98 + @ApiOperation(value = "Create Or update Tenant Profile (saveTenantProfile)",
  99 + notes = "Create or update the Tenant Profile. When creating tenant profile, platform generates Tenant Profile Id as [time-based UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_(date-time_and_MAC_address). " +
  100 + "The newly created Tenant Profile Id will be present in the response. " +
  101 + "Specify existing Tenant Profile Id id to update the Tenant Profile. " +
  102 + "Referencing non-existing Tenant Profile Id will cause 'Not Found' error. " +
  103 + "Update of the tenant profile configuration will cause immediate recalculation of API limits for all affected Tenants. " +
  104 + SYSTEM_AUTHORITY_PARAGRAPH)
84 105 @PreAuthorize("hasAuthority('SYS_ADMIN')")
85 106 @RequestMapping(value = "/tenantProfile", method = RequestMethod.POST)
86 107 @ResponseBody
87   - public TenantProfile saveTenantProfile(@RequestBody TenantProfile tenantProfile) throws ThingsboardException {
  108 + public TenantProfile saveTenantProfile(
  109 + @ApiParam(value = "A JSON value representing the tenant profile.")
  110 + @RequestBody TenantProfile tenantProfile) throws ThingsboardException {
88 111 try {
89 112 boolean newTenantProfile = tenantProfile.getId() == null;
90 113 if (newTenantProfile) {
... ... @@ -105,10 +128,14 @@ public class TenantProfileController extends BaseController {
105 128 }
106 129 }
107 130
  131 + @ApiOperation(value = "Delete Tenant Profile (deleteTenantProfile)",
  132 + notes = "Deletes the tenant profile. Referencing non-existing tenant profile Id will cause an error. Referencing profile that is used by the tenants will cause an error. " + SYSTEM_AUTHORITY_PARAGRAPH)
108 133 @PreAuthorize("hasAuthority('SYS_ADMIN')")
109 134 @RequestMapping(value = "/tenantProfile/{tenantProfileId}", method = RequestMethod.DELETE)
110 135 @ResponseStatus(value = HttpStatus.OK)
111   - public void deleteTenantProfile(@PathVariable("tenantProfileId") String strTenantProfileId) throws ThingsboardException {
  136 + public void deleteTenantProfile(
  137 + @ApiParam(value = TENANT_PROFILE_ID_PARAM_DESCRIPTION)
  138 + @PathVariable("tenantProfileId") String strTenantProfileId) throws ThingsboardException {
112 139 checkParameter("tenantProfileId", strTenantProfileId);
113 140 try {
114 141 TenantProfileId tenantProfileId = new TenantProfileId(toUUID(strTenantProfileId));
... ... @@ -120,10 +147,14 @@ public class TenantProfileController extends BaseController {
120 147 }
121 148 }
122 149
  150 + @ApiOperation(value = "Make tenant profile default (setDefaultTenantProfile)",
  151 + notes = "Makes specified tenant profile to be default. Referencing non-existing tenant profile Id will cause an error. " + SYSTEM_AUTHORITY_PARAGRAPH)
123 152 @PreAuthorize("hasAnyAuthority('SYS_ADMIN')")
124 153 @RequestMapping(value = "/tenantProfile/{tenantProfileId}/default", method = RequestMethod.POST)
125 154 @ResponseBody
126   - public TenantProfile setDefaultTenantProfile(@PathVariable("tenantProfileId") String strTenantProfileId) throws ThingsboardException {
  155 + public TenantProfile setDefaultTenantProfile(
  156 + @ApiParam(value = TENANT_PROFILE_ID_PARAM_DESCRIPTION)
  157 + @PathVariable("tenantProfileId") String strTenantProfileId) throws ThingsboardException {
127 158 checkParameter("tenantProfileId", strTenantProfileId);
128 159 try {
129 160 TenantProfileId tenantProfileId = new TenantProfileId(toUUID(strTenantProfileId));
... ... @@ -135,14 +166,21 @@ public class TenantProfileController extends BaseController {
135 166 }
136 167 }
137 168
  169 + @ApiOperation(value = "Get Tenant Profiles (getTenantProfiles)", notes = "Returns a page of tenant profiles registered in the platform. " + PAGE_DATA_PARAMETERS + SYSTEM_AUTHORITY_PARAGRAPH)
138 170 @PreAuthorize("hasAuthority('SYS_ADMIN')")
139 171 @RequestMapping(value = "/tenantProfiles", params = {"pageSize", "page"}, method = RequestMethod.GET)
140 172 @ResponseBody
141   - public PageData<TenantProfile> getTenantProfiles(@RequestParam int pageSize,
142   - @RequestParam int page,
143   - @RequestParam(required = false) String textSearch,
144   - @RequestParam(required = false) String sortProperty,
145   - @RequestParam(required = false) String sortOrder) throws ThingsboardException {
  173 + public PageData<TenantProfile> getTenantProfiles(
  174 + @ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
  175 + @RequestParam int pageSize,
  176 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
  177 + @RequestParam int page,
  178 + @ApiParam(value = TENANT_PROFILE_TEXT_SEARCH_DESCRIPTION)
  179 + @RequestParam(required = false) String textSearch,
  180 + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = TENANT_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES)
  181 + @RequestParam(required = false) String sortProperty,
  182 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
  183 + @RequestParam(required = false) String sortOrder) throws ThingsboardException {
146 184 try {
147 185 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
148 186 return checkNotNull(tenantProfileService.findTenantProfiles(getTenantId(), pageLink));
... ... @@ -151,14 +189,22 @@ public class TenantProfileController extends BaseController {
151 189 }
152 190 }
153 191
  192 + @ApiOperation(value = "Get Tenant Profiles Info (getTenantProfileInfos)", notes = "Returns a page of tenant profile info objects registered in the platform. "
  193 + + TENANT_PROFILE_INFO_DESCRIPTION + PAGE_DATA_PARAMETERS + SYSTEM_AUTHORITY_PARAGRAPH)
154 194 @PreAuthorize("hasAuthority('SYS_ADMIN')")
155 195 @RequestMapping(value = "/tenantProfileInfos", params = {"pageSize", "page"}, method = RequestMethod.GET)
156 196 @ResponseBody
157   - public PageData<EntityInfo> getTenantProfileInfos(@RequestParam int pageSize,
158   - @RequestParam int page,
159   - @RequestParam(required = false) String textSearch,
160   - @RequestParam(required = false) String sortProperty,
161   - @RequestParam(required = false) String sortOrder) throws ThingsboardException {
  197 + public PageData<EntityInfo> getTenantProfileInfos(
  198 + @ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
  199 + @RequestParam int pageSize,
  200 + @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
  201 + @RequestParam int page,
  202 + @ApiParam(value = TENANT_PROFILE_TEXT_SEARCH_DESCRIPTION)
  203 + @RequestParam(required = false) String textSearch,
  204 + @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = TENANT_PROFILE_INFO_SORT_PROPERTY_ALLOWABLE_VALUES)
  205 + @RequestParam(required = false) String sortProperty,
  206 + @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
  207 + @RequestParam(required = false) String sortOrder) throws ThingsboardException {
162 208 try {
163 209 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
164 210 return checkNotNull(tenantProfileService.findTenantProfileInfos(getTenantId(), pageLink));
... ...
... ... @@ -18,6 +18,8 @@ package org.thingsboard.server.common.data;
18 18 import com.fasterxml.jackson.annotation.JsonIgnore;
19 19 import com.fasterxml.jackson.annotation.JsonProperty;
20 20 import com.fasterxml.jackson.annotation.JsonProperty.Access;
  21 +import com.fasterxml.jackson.databind.JsonNode;
  22 +import io.swagger.annotations.ApiModelProperty;
21 23 import org.thingsboard.server.common.data.id.CustomerId;
22 24 import org.thingsboard.server.common.data.id.TenantId;
23 25 import org.thingsboard.server.common.data.validation.NoXss;
... ... @@ -27,7 +29,9 @@ public class Customer extends ContactBased<CustomerId> implements HasTenantId {
27 29 private static final long serialVersionUID = -1599722990298929275L;
28 30
29 31 @NoXss
  32 + @ApiModelProperty(position = 3, value = "Title of the customer", example = "Company A")
30 33 private String title;
  34 + @ApiModelProperty(position = 5, required = true, value = "JSON object with Tenant Id")
31 35 private TenantId tenantId;
32 36
33 37 public Customer() {
... ... @@ -51,7 +55,7 @@ public class Customer extends ContactBased<CustomerId> implements HasTenantId {
51 55 public void setTenantId(TenantId tenantId) {
52 56 this.tenantId = tenantId;
53 57 }
54   -
  58 +
55 59 public String getTitle() {
56 60 return title;
57 61 }
... ... @@ -60,6 +64,75 @@ public class Customer extends ContactBased<CustomerId> implements HasTenantId {
60 64 this.title = title;
61 65 }
62 66
  67 + @ApiModelProperty(position = 1, value = "JSON object with the customer Id. " +
  68 + "Specify this field to update the customer. " +
  69 + "Referencing non-existing customer Id will cause error. " +
  70 + "Omit this field to create new customer." )
  71 + @Override
  72 + public CustomerId getId() {
  73 + return super.getId();
  74 + }
  75 +
  76 + @ApiModelProperty(position = 2, value = "Timestamp of the customer creation, in milliseconds", example = "1609459200000", readOnly = true)
  77 + @Override
  78 + public long getCreatedTime() {
  79 + return super.getCreatedTime();
  80 + }
  81 +
  82 + @ApiModelProperty(position = 6, required = true, value = "Country", example = "US")
  83 + @Override
  84 + public String getCountry() {
  85 + return super.getCountry();
  86 + }
  87 +
  88 + @ApiModelProperty(position = 7, required = true, value = "State", example = "NY")
  89 + @Override
  90 + public String getState() {
  91 + return super.getState();
  92 + }
  93 +
  94 + @ApiModelProperty(position = 8, required = true, value = "City", example = "New York")
  95 + @Override
  96 + public String getCity() {
  97 + return super.getCity();
  98 + }
  99 +
  100 + @ApiModelProperty(position = 9, required = true, value = "Address Line 1", example = "42 Broadway Suite 12-400")
  101 + @Override
  102 + public String getAddress() {
  103 + return super.getAddress();
  104 + }
  105 +
  106 + @ApiModelProperty(position = 10, required = true, value = "Address Line 2", example = "")
  107 + @Override
  108 + public String getAddress2() {
  109 + return super.getAddress2();
  110 + }
  111 +
  112 + @ApiModelProperty(position = 11, required = true, value = "Zip code", example = "10004")
  113 + @Override
  114 + public String getZip() {
  115 + return super.getZip();
  116 + }
  117 +
  118 + @ApiModelProperty(position = 12, required = true, value = "Phone number", example = "+1(415)777-7777")
  119 + @Override
  120 + public String getPhone() {
  121 + return super.getPhone();
  122 + }
  123 +
  124 + @ApiModelProperty(position = 13, required = true, value = "Email", example = "example@company.com")
  125 + @Override
  126 + public String getEmail() {
  127 + return super.getEmail();
  128 + }
  129 +
  130 + @ApiModelProperty(position = 14, value = "Additional parameters of the device", dataType = "com.fasterxml.jackson.databind.JsonNode")
  131 + @Override
  132 + public JsonNode getAdditionalInfo() {
  133 + return super.getAdditionalInfo();
  134 + }
  135 +
63 136 @JsonIgnore
64 137 public boolean isPublic() {
65 138 if (getAdditionalInfo() != null && getAdditionalInfo().has("isPublic")) {
... ... @@ -76,6 +149,7 @@ public class Customer extends ContactBased<CustomerId> implements HasTenantId {
76 149
77 150 @Override
78 151 @JsonProperty(access = Access.READ_ONLY)
  152 + @ApiModelProperty(position = 4, value = "Name of the customer. Read-only, duplicated from title for backward compatibility", example = "Company A", readOnly = true)
79 153 public String getName() {
80 154 return title;
81 155 }
... ...
... ... @@ -17,6 +17,7 @@ package org.thingsboard.server.common.data;
17 17
18 18 import com.fasterxml.jackson.annotation.JsonCreator;
19 19 import com.fasterxml.jackson.annotation.JsonProperty;
  20 +import io.swagger.annotations.ApiModelProperty;
20 21 import lombok.EqualsAndHashCode;
21 22 import lombok.ToString;
22 23 import lombok.Value;
... ... @@ -31,9 +32,13 @@ import java.util.UUID;
31 32 @ToString(callSuper = true)
32 33 public class DeviceProfileInfo extends EntityInfo {
33 34
  35 + @ApiModelProperty(position = 3, value = "Either URL or Base64 data of the icon. Used in the mobile application to visualize set of device profiles in the grid view. ")
34 36 private final String image;
  37 + @ApiModelProperty(position = 4, value = "Reference to the dashboard. Used in the mobile application to open the default dashboard when user navigates to device details.")
35 38 private final DashboardId defaultDashboardId;
  39 + @ApiModelProperty(position = 5, value = "Type of the profile. Always 'DEFAULT' for now. Reserved for future use.")
36 40 private final DeviceProfileType type;
  41 + @ApiModelProperty(position = 6, value = "Type of the transport used to connect the device. Default transport supports HTTP, CoAP and MQTT.")
37 42 private final DeviceTransportType transportType;
38 43
39 44 @JsonCreator
... ...
... ... @@ -17,6 +17,8 @@ package org.thingsboard.server.common.data;
17 17
18 18 import com.fasterxml.jackson.annotation.JsonCreator;
19 19 import com.fasterxml.jackson.annotation.JsonProperty;
  20 +import io.swagger.annotations.ApiModel;
  21 +import io.swagger.annotations.ApiModelProperty;
20 22 import lombok.Data;
21 23 import org.thingsboard.server.common.data.id.EntityId;
22 24 import org.thingsboard.server.common.data.id.EntityIdFactory;
... ... @@ -24,10 +26,13 @@ import org.thingsboard.server.common.data.id.HasId;
24 26
25 27 import java.util.UUID;
26 28
  29 +@ApiModel
27 30 @Data
28 31 public class EntityInfo implements HasId<EntityId>, HasName {
29 32
  33 + @ApiModelProperty(position = 1, value = "JSON object with the entity Id. ")
30 34 private final EntityId id;
  35 + @ApiModelProperty(position = 2, value = "Entity Name")
31 36 private final String name;
32 37
33 38 @JsonCreator
... ...
... ... @@ -17,20 +17,28 @@ package org.thingsboard.server.common.data;
17 17
18 18 import com.fasterxml.jackson.annotation.JsonIgnore;
19 19 import com.fasterxml.jackson.annotation.JsonProperty;
  20 +import com.fasterxml.jackson.databind.JsonNode;
  21 +import io.swagger.annotations.ApiModel;
  22 +import io.swagger.annotations.ApiModelProperty;
20 23 import lombok.EqualsAndHashCode;
21 24 import org.thingsboard.server.common.data.id.TenantId;
22 25 import org.thingsboard.server.common.data.id.TenantProfileId;
23 26 import org.thingsboard.server.common.data.validation.NoXss;
24 27
  28 +@ApiModel
25 29 @EqualsAndHashCode(callSuper = true)
26 30 public class Tenant extends ContactBased<TenantId> implements HasTenantId {
27 31
28 32 private static final long serialVersionUID = 8057243243859922101L;
29 33
30 34 @NoXss
  35 + @ApiModelProperty(position = 3, value = "Title of the tenant", example = "Company A")
31 36 private String title;
32 37 @NoXss
  38 + @ApiModelProperty(position = 5, value = "Geo region of the tenant", example = "North America")
33 39 private String region;
  40 +
  41 + @ApiModelProperty(position = 6, required = true, value = "JSON object with Tenant Profile Id")
34 42 private TenantProfileId tenantProfileId;
35 43
36 44 public Tenant() {
... ... @@ -63,6 +71,7 @@ public class Tenant extends ContactBased<TenantId> implements HasTenantId {
63 71 }
64 72
65 73 @Override
  74 + @ApiModelProperty(position = 4, value = "Name of the tenant. Read-only, duplicated from title for backward compatibility", example = "Company A", readOnly = true)
66 75 @JsonProperty(access = JsonProperty.Access.READ_ONLY)
67 76 public String getName() {
68 77 return title;
... ... @@ -89,6 +98,75 @@ public class Tenant extends ContactBased<TenantId> implements HasTenantId {
89 98 return getTitle();
90 99 }
91 100
  101 + @ApiModelProperty(position = 1, value = "JSON object with the tenant Id. " +
  102 + "Specify this field to update the tenant. " +
  103 + "Referencing non-existing tenant Id will cause error. " +
  104 + "Omit this field to create new tenant." )
  105 + @Override
  106 + public TenantId getId() {
  107 + return super.getId();
  108 + }
  109 +
  110 + @ApiModelProperty(position = 2, value = "Timestamp of the tenant creation, in milliseconds", example = "1609459200000", readOnly = true)
  111 + @Override
  112 + public long getCreatedTime() {
  113 + return super.getCreatedTime();
  114 + }
  115 +
  116 + @ApiModelProperty(position = 7, required = true, value = "Country", example = "US")
  117 + @Override
  118 + public String getCountry() {
  119 + return super.getCountry();
  120 + }
  121 +
  122 + @ApiModelProperty(position = 8, required = true, value = "State", example = "NY")
  123 + @Override
  124 + public String getState() {
  125 + return super.getState();
  126 + }
  127 +
  128 + @ApiModelProperty(position = 9, required = true, value = "City", example = "New York")
  129 + @Override
  130 + public String getCity() {
  131 + return super.getCity();
  132 + }
  133 +
  134 + @ApiModelProperty(position = 10, required = true, value = "Address Line 1", example = "42 Broadway Suite 12-400")
  135 + @Override
  136 + public String getAddress() {
  137 + return super.getAddress();
  138 + }
  139 +
  140 + @ApiModelProperty(position = 11, required = true, value = "Address Line 2", example = "")
  141 + @Override
  142 + public String getAddress2() {
  143 + return super.getAddress2();
  144 + }
  145 +
  146 + @ApiModelProperty(position = 12, required = true, value = "Zip code", example = "10004")
  147 + @Override
  148 + public String getZip() {
  149 + return super.getZip();
  150 + }
  151 +
  152 + @ApiModelProperty(position = 13, required = true, value = "Phone number", example = "+1(415)777-7777")
  153 + @Override
  154 + public String getPhone() {
  155 + return super.getPhone();
  156 + }
  157 +
  158 + @ApiModelProperty(position = 14, required = true, value = "Email", example = "example@company.com")
  159 + @Override
  160 + public String getEmail() {
  161 + return super.getEmail();
  162 + }
  163 +
  164 + @ApiModelProperty(position = 15, value = "Additional parameters of the device", dataType = "com.fasterxml.jackson.databind.JsonNode")
  165 + @Override
  166 + public JsonNode getAdditionalInfo() {
  167 + return super.getAdditionalInfo();
  168 + }
  169 +
92 170 @Override
93 171 public String toString() {
94 172 StringBuilder builder = new StringBuilder();
... ...
... ... @@ -15,12 +15,15 @@
15 15 */
16 16 package org.thingsboard.server.common.data;
17 17
  18 +import io.swagger.annotations.ApiModel;
  19 +import io.swagger.annotations.ApiModelProperty;
18 20 import lombok.Data;
19 21 import org.thingsboard.server.common.data.id.TenantId;
20 22
  23 +@ApiModel
21 24 @Data
22 25 public class TenantInfo extends Tenant {
23   -
  26 + @ApiModelProperty(position = 15, value = "Tenant Profile name", example = "Default")
24 27 private String tenantProfileName;
25 28
26 29 public TenantInfo() {
... ...
... ... @@ -17,6 +17,8 @@ package org.thingsboard.server.common.data;
17 17
18 18 import com.fasterxml.jackson.annotation.JsonIgnore;
19 19 import com.fasterxml.jackson.core.JsonProcessingException;
  20 +import io.swagger.annotations.ApiModel;
  21 +import io.swagger.annotations.ApiModelProperty;
20 22 import lombok.Data;
21 23 import lombok.EqualsAndHashCode;
22 24 import lombok.extern.slf4j.Slf4j;
... ... @@ -31,18 +33,27 @@ import java.util.Optional;
31 33
32 34 import static org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo.mapper;
33 35
  36 +@ApiModel
34 37 @Data
35 38 @EqualsAndHashCode(callSuper = true)
36 39 @Slf4j
37 40 public class TenantProfile extends SearchTextBased<TenantProfileId> implements HasName {
38 41
39 42 @NoXss
  43 + @ApiModelProperty(position = 3, value = "Name of the tenant profile", example = "High Priority Tenants")
40 44 private String name;
41 45 @NoXss
  46 + @ApiModelProperty(position = 4, value = "Description of the tenant profile", example = "Any text")
42 47 private String description;
  48 + @ApiModelProperty(position = 5, value = "Default Tenant profile to be used.", example = "true")
43 49 private boolean isDefault;
  50 + @ApiModelProperty(position = 6, value = "If enabled, will push all messages related to this tenant and processed by core platform services into separate queue. " +
  51 + "Useful for complex microservices deployments, to isolate processing of the data for specific tenants", example = "true")
44 52 private boolean isolatedTbCore;
  53 + @ApiModelProperty(position = 7, value = "If enabled, will push all messages related to this tenant and processed by the rule engine into separate queue. " +
  54 + "Useful for complex microservices deployments, to isolate processing of the data for specific tenants", example = "true")
45 55 private boolean isolatedTbRuleEngine;
  56 + @ApiModelProperty(position = 8, value = "Complex JSON object that contains profile settings: max devices, max assets, rate limits, etc.")
46 57 private transient TenantProfileData profileData;
47 58 @JsonIgnore
48 59 private byte[] profileDataBytes;
... ... @@ -65,6 +76,21 @@ public class TenantProfile extends SearchTextBased<TenantProfileId> implements H
65 76 this.setProfileData(tenantProfile.getProfileData());
66 77 }
67 78
  79 + @ApiModelProperty(position = 1, value = "JSON object with the tenant profile Id. " +
  80 + "Specify this field to update the tenant profile. " +
  81 + "Referencing non-existing tenant profile Id will cause error. " +
  82 + "Omit this field to create new tenant profile." )
  83 + @Override
  84 + public TenantProfileId getId() {
  85 + return super.getId();
  86 + }
  87 +
  88 + @ApiModelProperty(position = 2, value = "Timestamp of the tenant profile creation, in milliseconds", example = "1609459200000", readOnly = true)
  89 + @Override
  90 + public long getCreatedTime() {
  91 + return super.getCreatedTime();
  92 + }
  93 +
68 94 @Override
69 95 public String getSearchText() {
70 96 return getName();
... ...
... ... @@ -15,6 +15,8 @@
15 15 */
16 16 package org.thingsboard.server.common.data.tenant.profile;
17 17
  18 +import io.swagger.annotations.ApiModel;
  19 +import io.swagger.annotations.ApiModelProperty;
18 20 import lombok.AllArgsConstructor;
19 21 import lombok.Builder;
20 22 import lombok.Data;
... ...
... ... @@ -19,6 +19,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
19 19 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
20 20 import com.fasterxml.jackson.annotation.JsonSubTypes;
21 21 import com.fasterxml.jackson.annotation.JsonTypeInfo;
  22 +import io.swagger.annotations.ApiModel;
22 23 import org.thingsboard.server.common.data.ApiUsageRecordKey;
23 24 import org.thingsboard.server.common.data.TenantProfileType;
24 25
... ...
... ... @@ -15,11 +15,15 @@
15 15 */
16 16 package org.thingsboard.server.common.data.tenant.profile;
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 TenantProfileData {
22 25
  26 + @ApiModelProperty(position = 1, value = "Complex JSON object that contains profile settings: max devices, max assets, rate limits, etc.")
23 27 private TenantProfileConfiguration configuration;
24 28
25 29 }
... ...