diff --git a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java index 698dcfb3f3..7ab4ab07a9 100644 --- a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java +++ b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java @@ -82,7 +82,8 @@ public class DeviceController extends BaseController { @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") @RequestMapping(value = "/device", method = RequestMethod.POST) @ResponseBody - public Device saveDevice(@RequestBody Device device) throws ThingsboardException { + public Device saveDevice(@RequestBody Device device, + @RequestParam(name = "accessToken", required = false) String accessToken) throws ThingsboardException { try { device.setTenantId(getCurrentUser().getTenantId()); @@ -91,7 +92,7 @@ public class DeviceController extends BaseController { accessControlService.checkPermission(getCurrentUser(), Resource.DEVICE, operation, device.getId(), device); - Device savedDevice = checkNotNull(deviceService.saveDevice(device)); + Device savedDevice = checkNotNull(deviceService.saveDeviceWithAccessToken(device, accessToken)); actorService .onDeviceNameOrTypeUpdate( diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceService.java index 793bb9829b..b9940d73e3 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceService.java @@ -37,6 +37,8 @@ public interface DeviceService { Device saveDevice(Device device); + Device saveDeviceWithAccessToken(Device device, String accessToken); + Device assignDeviceToCustomer(TenantId tenantId, DeviceId deviceId, CustomerId customerId); Device unassignDeviceFromCustomer(TenantId tenantId, DeviceId deviceId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java index a26e275a96..0618d3fcf8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java @@ -119,9 +119,19 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe return deviceOpt.orElse(null); } + @CacheEvict(cacheNames = DEVICE_CACHE, key = "{#device.tenantId, #device.name}") + @Override + public Device saveDeviceWithAccessToken(Device device, String accessToken) { + return doSaveDevice(device, accessToken); + } + @CacheEvict(cacheNames = DEVICE_CACHE, key = "{#device.tenantId, #device.name}") @Override public Device saveDevice(Device device) { + return doSaveDevice(device, null); + } + + private Device doSaveDevice(Device device, String accessToken) { log.trace("Executing saveDevice [{}]", device); deviceValidator.validate(device, Device::getTenantId); Device savedDevice; @@ -143,7 +153,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe DeviceCredentials deviceCredentials = new DeviceCredentials(); deviceCredentials.setDeviceId(new DeviceId(savedDevice.getUuidId())); deviceCredentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN); - deviceCredentials.setCredentialsId(RandomStringUtils.randomAlphanumeric(20)); + deviceCredentials.setCredentialsId(!StringUtils.isEmpty(accessToken) ? accessToken : RandomStringUtils.randomAlphanumeric(20)); deviceCredentialsService.createDeviceCredentials(device.getTenantId(), deviceCredentials); } return savedDevice; diff --git a/tools/src/main/java/org/thingsboard/client/tools/RestClient.java b/tools/src/main/java/org/thingsboard/client/tools/RestClient.java index 97ce718cc8..180e7f6f57 100644 --- a/tools/src/main/java/org/thingsboard/client/tools/RestClient.java +++ b/tools/src/main/java/org/thingsboard/client/tools/RestClient.java @@ -225,13 +225,6 @@ public class RestClient implements ClientHttpRequestInterceptor { return restTemplate.postForEntity(baseURL + "/api/customer", customer, Customer.class).getBody(); } - public Device createDevice(String name, String type) { - Device device = new Device(); - device.setName(name); - device.setType(type); - return restTemplate.postForEntity(baseURL + "/api/device", device, Device.class).getBody(); - } - public DeviceCredentials updateDeviceCredentials(DeviceId deviceId, String token) { DeviceCredentials deviceCredentials = getCredentials(deviceId); deviceCredentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN); @@ -239,10 +232,30 @@ public class RestClient implements ClientHttpRequestInterceptor { return saveDeviceCredentials(deviceCredentials); } - public Device createDevice(Device device) { - return restTemplate.postForEntity(baseURL + "/api/device", device, Device.class).getBody(); + public Device createDevice(String name, String type) { + Device device = new Device(); + device.setName(name); + device.setType(type); + return doCreateDevice(device, null); } + public Device createDevice(Device device) { + return doCreateDevice(device, null); + } + + public Device createDevice(Device device, String accessToken) { + return doCreateDevice(device, accessToken); + } + + private Device doCreateDevice(Device device, String accessToken) { + Map params = new HashMap<>(); + String deviceCreationUrl = "/api/device"; + if (!StringUtils.isEmpty(accessToken)) { + deviceCreationUrl = deviceCreationUrl + "?accessToken={accessToken}"; + params.put("accessToken", accessToken); + } + return restTemplate.postForEntity(baseURL + deviceCreationUrl, device, Device.class, params).getBody(); + } public Asset createAsset(Asset asset) { return restTemplate.postForEntity(baseURL + "/api/asset", asset, Asset.class).getBody(); }