name conflict strategy: initial implementation
This commit is contained in:
parent
86436b174e
commit
b3147e8219
@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
|
|||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
import org.thingsboard.server.common.data.asset.Asset;
|
||||||
import org.thingsboard.server.common.data.asset.AssetInfo;
|
import org.thingsboard.server.common.data.asset.AssetInfo;
|
||||||
import org.thingsboard.server.common.data.asset.AssetSearchQuery;
|
import org.thingsboard.server.common.data.asset.AssetSearchQuery;
|
||||||
@ -137,10 +138,14 @@ public class AssetController extends BaseController {
|
|||||||
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/asset", method = RequestMethod.POST)
|
@RequestMapping(value = "/asset", method = RequestMethod.POST)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Asset saveAsset(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "A JSON value representing the asset.") @RequestBody Asset asset) throws Exception {
|
public Asset saveAsset(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "A JSON value representing the asset.") @RequestBody Asset asset,
|
||||||
|
@Parameter(description = "Optional value of name conflict strategy. Possible values: FAIL or UNIQUIFY. " +
|
||||||
|
"If omitted, FAIL strategy is applied. FAIL strategy implies exception will be thrown if an entity with the same name already exists. " +
|
||||||
|
"UNIQUIFY strategy appends a numerical suffix to the entity name, if a name conflict occurs.")
|
||||||
|
@RequestParam(name = "nameConflictStrategy", defaultValue = "FAIL") NameConflictStrategy nameConflictStrategy) throws Exception {
|
||||||
asset.setTenantId(getTenantId());
|
asset.setTenantId(getTenantId());
|
||||||
checkEntity(asset.getId(), asset, Resource.ASSET);
|
checkEntity(asset.getId(), asset, Resource.ASSET);
|
||||||
return tbAssetService.save(asset, getCurrentUser());
|
return tbAssetService.save(asset, nameConflictStrategy, getCurrentUser());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "Delete asset (deleteAsset)",
|
@ApiOperation(value = "Delete asset (deleteAsset)",
|
||||||
|
|||||||
@ -32,6 +32,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
|
|||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
@ -128,7 +129,11 @@ public class CustomerController extends BaseController {
|
|||||||
@PreAuthorize("hasAuthority('TENANT_ADMIN')")
|
@PreAuthorize("hasAuthority('TENANT_ADMIN')")
|
||||||
@RequestMapping(value = "/customer", method = RequestMethod.POST)
|
@RequestMapping(value = "/customer", method = RequestMethod.POST)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Customer saveCustomer(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "A JSON value representing the customer.") @RequestBody Customer customer) throws Exception {
|
public Customer saveCustomer(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "A JSON value representing the customer.") @RequestBody Customer customer,
|
||||||
|
@Parameter(description = "Optional value of name conflict strategy. Possible values: FAIL or UNIQUIFY. " +
|
||||||
|
"If omitted, FAIL strategy is applied. FAIL strategy implies exception will be thrown if an entity with the same name already exists. " +
|
||||||
|
"UNIQUIFY strategy appends a numerical suffix to the entity name, if a name conflict occurs.")
|
||||||
|
@RequestParam(name = "nameConflictStrategy", defaultValue = "FAIL") NameConflictStrategy nameConflictStrategy) throws Exception {
|
||||||
customer.setTenantId(getTenantId());
|
customer.setTenantId(getTenantId());
|
||||||
checkEntity(customer.getId(), customer, Resource.CUSTOMER);
|
checkEntity(customer.getId(), customer, Resource.CUSTOMER);
|
||||||
return tbCustomerService.save(customer, getCurrentUser());
|
return tbCustomerService.save(customer, getCurrentUser());
|
||||||
|
|||||||
@ -46,6 +46,7 @@ import org.thingsboard.server.common.data.Device;
|
|||||||
import org.thingsboard.server.common.data.DeviceInfo;
|
import org.thingsboard.server.common.data.DeviceInfo;
|
||||||
import org.thingsboard.server.common.data.DeviceInfoFilter;
|
import org.thingsboard.server.common.data.DeviceInfoFilter;
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest;
|
import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest;
|
||||||
import org.thingsboard.server.common.data.Tenant;
|
import org.thingsboard.server.common.data.Tenant;
|
||||||
import org.thingsboard.server.common.data.device.DeviceSearchQuery;
|
import org.thingsboard.server.common.data.device.DeviceSearchQuery;
|
||||||
@ -177,14 +178,19 @@ public class DeviceController extends BaseController {
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Device saveDevice(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "A JSON value representing the device.") @RequestBody Device device,
|
public Device saveDevice(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "A JSON value representing the device.") @RequestBody Device device,
|
||||||
@Parameter(description = "Optional value of the device credentials to be used during device creation. " +
|
@Parameter(description = "Optional value of the device credentials to be used during device creation. " +
|
||||||
"If omitted, access token will be auto-generated.") @RequestParam(name = "accessToken", required = false) String accessToken) throws Exception {
|
"If omitted, access token will be auto-generated.")
|
||||||
|
@RequestParam(name = "accessToken", required = false) String accessToken,
|
||||||
|
@Parameter(description = "Optional value of name conflict strategy. Possible values: FAIL or UNIQUIFY. " +
|
||||||
|
"If omitted, FAIL strategy is applied. FAIL strategy implies exception will be thrown if an entity with the same name already exists. " +
|
||||||
|
"UNIQUIFY strategy appends a numerical suffix to the entity name, if a name conflict occurs.")
|
||||||
|
@RequestParam(name = "nameConflictStrategy", defaultValue = "FAIL") NameConflictStrategy nameConflictStrategy) throws Exception {
|
||||||
device.setTenantId(getCurrentUser().getTenantId());
|
device.setTenantId(getCurrentUser().getTenantId());
|
||||||
if (device.getId() != null) {
|
if (device.getId() != null) {
|
||||||
checkDeviceId(device.getId(), Operation.WRITE);
|
checkDeviceId(device.getId(), Operation.WRITE);
|
||||||
} else {
|
} else {
|
||||||
checkEntity(null, device, Resource.DEVICE);
|
checkEntity(null, device, Resource.DEVICE);
|
||||||
}
|
}
|
||||||
return tbDeviceService.save(device, accessToken, getCurrentUser());
|
return tbDeviceService.save(device, accessToken, nameConflictStrategy, getCurrentUser());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "Create Device (saveDevice) with credentials ",
|
@ApiOperation(value = "Create Device (saveDevice) with credentials ",
|
||||||
@ -209,12 +215,16 @@ public class DeviceController extends BaseController {
|
|||||||
@RequestMapping(value = "/device-with-credentials", method = RequestMethod.POST)
|
@RequestMapping(value = "/device-with-credentials", method = RequestMethod.POST)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Device saveDeviceWithCredentials(@Parameter(description = "The JSON object with device and credentials. See method description above for example.")
|
public Device saveDeviceWithCredentials(@Parameter(description = "The JSON object with device and credentials. See method description above for example.")
|
||||||
@Valid @RequestBody SaveDeviceWithCredentialsRequest deviceAndCredentials) throws ThingsboardException {
|
@Valid @RequestBody SaveDeviceWithCredentialsRequest deviceAndCredentials,
|
||||||
|
@Parameter(description = "Optional value of name conflict strategy. Possible values: FAIL or UNIQUIFY. " +
|
||||||
|
"If omitted, FAIL strategy is applied. FAIL strategy implies exception will be thrown if an entity with the same name already exists. " +
|
||||||
|
"UNIQUIFY strategy appends a numerical suffix to the entity name, if a name conflict occurs.")
|
||||||
|
@RequestParam(name = "nameConflictStrategy", defaultValue = "FAIL") NameConflictStrategy nameConflictStrategy) throws ThingsboardException {
|
||||||
Device device = deviceAndCredentials.getDevice();
|
Device device = deviceAndCredentials.getDevice();
|
||||||
DeviceCredentials credentials = deviceAndCredentials.getCredentials();
|
DeviceCredentials credentials = deviceAndCredentials.getCredentials();
|
||||||
device.setTenantId(getCurrentUser().getTenantId());
|
device.setTenantId(getCurrentUser().getTenantId());
|
||||||
checkEntity(device.getId(), device, Resource.DEVICE);
|
checkEntity(device.getId(), device, Resource.DEVICE);
|
||||||
return tbDeviceService.saveDeviceWithCredentials(device, credentials, getCurrentUser());
|
return tbDeviceService.saveDeviceWithCredentials(device, credentials, nameConflictStrategy, getCurrentUser());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "Delete device (deleteDevice)",
|
@ApiOperation(value = "Delete device (deleteDevice)",
|
||||||
|
|||||||
@ -34,6 +34,7 @@ import org.thingsboard.server.common.data.Customer;
|
|||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
import org.thingsboard.server.common.data.EntityView;
|
import org.thingsboard.server.common.data.EntityView;
|
||||||
import org.thingsboard.server.common.data.EntityViewInfo;
|
import org.thingsboard.server.common.data.EntityViewInfo;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery;
|
import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery;
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
@ -128,7 +129,11 @@ public class EntityViewController extends BaseController {
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public EntityView saveEntityView(
|
public EntityView saveEntityView(
|
||||||
@Parameter(description = "A JSON object representing the entity view.")
|
@Parameter(description = "A JSON object representing the entity view.")
|
||||||
@RequestBody EntityView entityView) throws Exception {
|
@RequestBody EntityView entityView,
|
||||||
|
@Parameter(description = "Optional value of name conflict strategy. Possible values: FAIL or UNIQUIFY. " +
|
||||||
|
"If omitted, FAIL strategy is applied. FAIL strategy implies exception will be thrown if an entity with the same name already exists. " +
|
||||||
|
"UNIQUIFY strategy appends a numerical suffix to the entity name, if a name conflict occurs.")
|
||||||
|
@RequestParam(name = "nameConflictStrategy", defaultValue = "FAIL") NameConflictStrategy nameConflictStrategy) throws Exception {
|
||||||
entityView.setTenantId(getCurrentUser().getTenantId());
|
entityView.setTenantId(getCurrentUser().getTenantId());
|
||||||
EntityView existingEntityView = null;
|
EntityView existingEntityView = null;
|
||||||
if (entityView.getId() == null) {
|
if (entityView.getId() == null) {
|
||||||
@ -137,7 +142,7 @@ public class EntityViewController extends BaseController {
|
|||||||
} else {
|
} else {
|
||||||
existingEntityView = checkEntityViewId(entityView.getId(), Operation.WRITE);
|
existingEntityView = checkEntityViewId(entityView.getId(), Operation.WRITE);
|
||||||
}
|
}
|
||||||
return tbEntityViewService.save(entityView, existingEntityView, getCurrentUser());
|
return tbEntityViewService.save(entityView, existingEntityView, nameConflictStrategy, getCurrentUser());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "Delete entity view (deleteEntityView)",
|
@ApiOperation(value = "Delete entity view (deleteEntityView)",
|
||||||
|
|||||||
@ -27,6 +27,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
|||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest;
|
import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest;
|
||||||
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MServerSecurityConfigDefault;
|
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MServerSecurityConfigDefault;
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
@ -73,6 +74,6 @@ public class Lwm2mController extends BaseController {
|
|||||||
public Device saveDeviceWithCredentials(@RequestBody Map<Class<?>, Object> deviceWithDeviceCredentials) throws ThingsboardException {
|
public Device saveDeviceWithCredentials(@RequestBody Map<Class<?>, Object> deviceWithDeviceCredentials) throws ThingsboardException {
|
||||||
Device device = checkNotNull(JacksonUtil.convertValue(deviceWithDeviceCredentials.get(Device.class), Device.class));
|
Device device = checkNotNull(JacksonUtil.convertValue(deviceWithDeviceCredentials.get(Device.class), Device.class));
|
||||||
DeviceCredentials credentials = checkNotNull(JacksonUtil.convertValue(deviceWithDeviceCredentials.get(DeviceCredentials.class), DeviceCredentials.class));
|
DeviceCredentials credentials = checkNotNull(JacksonUtil.convertValue(deviceWithDeviceCredentials.get(DeviceCredentials.class), DeviceCredentials.class));
|
||||||
return deviceController.saveDeviceWithCredentials(new SaveDeviceWithCredentialsRequest(device, credentials));
|
return deviceController.saveDeviceWithCredentials(new SaveDeviceWithCredentialsRequest(device, credentials), NameConflictStrategy.FAIL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,6 +29,7 @@ import org.thingsboard.server.common.data.DeviceProfileProvisionType;
|
|||||||
import org.thingsboard.server.common.data.DeviceProfileType;
|
import org.thingsboard.server.common.data.DeviceProfileType;
|
||||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.StringUtils;
|
import org.thingsboard.server.common.data.StringUtils;
|
||||||
import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials;
|
import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials;
|
||||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MClientCredential;
|
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MClientCredential;
|
||||||
@ -128,7 +129,7 @@ public class DeviceBulkImportService extends AbstractBulkImportService<Device> {
|
|||||||
}
|
}
|
||||||
device.setDeviceProfileId(deviceProfile.getId());
|
device.setDeviceProfileId(deviceProfile.getId());
|
||||||
|
|
||||||
return tbDeviceService.saveDeviceWithCredentials(device, deviceCredentials, user);
|
return tbDeviceService.saveDeviceWithCredentials(device, deviceCredentials, NameConflictStrategy.FAIL, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -20,6 +20,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.User;
|
import org.thingsboard.server.common.data.User;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
import org.thingsboard.server.common.data.asset.Asset;
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
@ -39,11 +40,11 @@ public class DefaultTbAssetService extends AbstractTbEntityService implements Tb
|
|||||||
private final AssetService assetService;
|
private final AssetService assetService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Asset save(Asset asset, User user) throws Exception {
|
public Asset save(Asset asset, NameConflictStrategy nameConflictStrategy, User user) throws Exception {
|
||||||
ActionType actionType = asset.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
ActionType actionType = asset.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
||||||
TenantId tenantId = asset.getTenantId();
|
TenantId tenantId = asset.getTenantId();
|
||||||
try {
|
try {
|
||||||
Asset savedAsset = checkNotNull(assetService.saveAsset(asset));
|
Asset savedAsset = checkNotNull(assetService.saveAsset(asset, nameConflictStrategy));
|
||||||
autoCommit(user, savedAsset.getId());
|
autoCommit(user, savedAsset.getId());
|
||||||
logEntityActionService.logEntityAction(tenantId, savedAsset.getId(), savedAsset, asset.getCustomerId(),
|
logEntityActionService.logEntityAction(tenantId, savedAsset.getId(), savedAsset, asset.getCustomerId(),
|
||||||
actionType, user);
|
actionType, user);
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
package org.thingsboard.server.service.entitiy.asset;
|
package org.thingsboard.server.service.entitiy.asset;
|
||||||
|
|
||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.User;
|
import org.thingsboard.server.common.data.User;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
import org.thingsboard.server.common.data.asset.Asset;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
@ -25,7 +26,7 @@ import org.thingsboard.server.common.data.id.TenantId;
|
|||||||
|
|
||||||
public interface TbAssetService {
|
public interface TbAssetService {
|
||||||
|
|
||||||
Asset save(Asset asset, User user) throws Exception;
|
Asset save(Asset asset, NameConflictStrategy nameConflictStrategy, User user) throws Exception;
|
||||||
|
|
||||||
void delete(Asset asset, User user);
|
void delete(Asset asset, User user);
|
||||||
|
|
||||||
|
|||||||
@ -25,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.Tenant;
|
import org.thingsboard.server.common.data.Tenant;
|
||||||
import org.thingsboard.server.common.data.User;
|
import org.thingsboard.server.common.data.User;
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
@ -55,11 +56,11 @@ public class DefaultTbDeviceService extends AbstractTbEntityService implements T
|
|||||||
private final ClaimDevicesService claimDevicesService;
|
private final ClaimDevicesService claimDevicesService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Device save(Device device, String accessToken, User user) throws Exception {
|
public Device save(Device device, String accessToken, NameConflictStrategy nameConflictStrategy, User user) throws Exception {
|
||||||
ActionType actionType = device.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
ActionType actionType = device.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
||||||
TenantId tenantId = device.getTenantId();
|
TenantId tenantId = device.getTenantId();
|
||||||
try {
|
try {
|
||||||
Device savedDevice = checkNotNull(deviceService.saveDeviceWithAccessToken(device, accessToken));
|
Device savedDevice = checkNotNull(deviceService.saveDeviceWithAccessToken(device, accessToken, nameConflictStrategy));
|
||||||
autoCommit(user, savedDevice.getId());
|
autoCommit(user, savedDevice.getId());
|
||||||
logEntityActionService.logEntityAction(tenantId, savedDevice.getId(), savedDevice, savedDevice.getCustomerId(),
|
logEntityActionService.logEntityAction(tenantId, savedDevice.getId(), savedDevice, savedDevice.getCustomerId(),
|
||||||
actionType, user);
|
actionType, user);
|
||||||
@ -72,11 +73,11 @@ public class DefaultTbDeviceService extends AbstractTbEntityService implements T
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Device saveDeviceWithCredentials(Device device, DeviceCredentials credentials, User user) throws ThingsboardException {
|
public Device saveDeviceWithCredentials(Device device, DeviceCredentials credentials, NameConflictStrategy nameConflictStrategy, User user) throws ThingsboardException {
|
||||||
ActionType actionType = device.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
ActionType actionType = device.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
||||||
TenantId tenantId = device.getTenantId();
|
TenantId tenantId = device.getTenantId();
|
||||||
try {
|
try {
|
||||||
Device savedDevice = checkNotNull(deviceService.saveDeviceWithCredentials(device, credentials));
|
Device savedDevice = checkNotNull(deviceService.saveDeviceWithCredentials(device, credentials, nameConflictStrategy));
|
||||||
logEntityActionService.logEntityAction(tenantId, savedDevice.getId(), savedDevice, savedDevice.getCustomerId(),
|
logEntityActionService.logEntityAction(tenantId, savedDevice.getId(), savedDevice, savedDevice.getCustomerId(),
|
||||||
actionType, user);
|
actionType, user);
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,7 @@ package org.thingsboard.server.service.entitiy.device;
|
|||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.Tenant;
|
import org.thingsboard.server.common.data.Tenant;
|
||||||
import org.thingsboard.server.common.data.User;
|
import org.thingsboard.server.common.data.User;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
@ -31,9 +32,9 @@ import org.thingsboard.server.dao.device.claim.ReclaimResult;
|
|||||||
|
|
||||||
public interface TbDeviceService {
|
public interface TbDeviceService {
|
||||||
|
|
||||||
Device save(Device device, String accessToken, User user) throws Exception;
|
Device save(Device device, String accessToken, NameConflictStrategy nameConflictStrategy, User user) throws Exception;
|
||||||
|
|
||||||
Device saveDeviceWithCredentials(Device device, DeviceCredentials deviceCredentials, User user) throws ThingsboardException;
|
Device saveDeviceWithCredentials(Device device, DeviceCredentials deviceCredentials, NameConflictStrategy nameConflictStrategy, User user) throws ThingsboardException;
|
||||||
|
|
||||||
void delete(Device device, User user);
|
void delete(Device device, User user);
|
||||||
|
|
||||||
|
|||||||
@ -33,6 +33,7 @@ import org.thingsboard.server.common.data.AttributeScope;
|
|||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.EntityView;
|
import org.thingsboard.server.common.data.EntityView;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.User;
|
import org.thingsboard.server.common.data.User;
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
@ -79,11 +80,11 @@ public class DefaultTbEntityViewService extends AbstractTbEntityService implemen
|
|||||||
final Map<TenantId, Map<EntityId, List<EntityView>>> localCache = new ConcurrentHashMap<>();
|
final Map<TenantId, Map<EntityId, List<EntityView>>> localCache = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EntityView save(EntityView entityView, EntityView existingEntityView, User user) throws Exception {
|
public EntityView save(EntityView entityView, EntityView existingEntityView, NameConflictStrategy nameConflictStrategy, User user) throws Exception {
|
||||||
ActionType actionType = entityView.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
ActionType actionType = entityView.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
||||||
TenantId tenantId = entityView.getTenantId();
|
TenantId tenantId = entityView.getTenantId();
|
||||||
try {
|
try {
|
||||||
EntityView savedEntityView = checkNotNull(entityViewService.saveEntityView(entityView));
|
EntityView savedEntityView = checkNotNull(entityViewService.saveEntityView(entityView, nameConflictStrategy));
|
||||||
this.updateEntityViewAttributes(tenantId, savedEntityView, existingEntityView, user);
|
this.updateEntityViewAttributes(tenantId, savedEntityView, existingEntityView, user);
|
||||||
autoCommit(user, savedEntityView.getId());
|
autoCommit(user, savedEntityView.getId());
|
||||||
logEntityActionService.logEntityAction(savedEntityView.getTenantId(), savedEntityView.getId(), savedEntityView,
|
logEntityActionService.logEntityAction(savedEntityView.getTenantId(), savedEntityView.getId(), savedEntityView,
|
||||||
|
|||||||
@ -18,6 +18,7 @@ package org.thingsboard.server.service.entitiy.entityview;
|
|||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.EntityView;
|
import org.thingsboard.server.common.data.EntityView;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.User;
|
import org.thingsboard.server.common.data.User;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
@ -31,7 +32,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public interface TbEntityViewService extends ComponentLifecycleListener {
|
public interface TbEntityViewService extends ComponentLifecycleListener {
|
||||||
|
|
||||||
EntityView save(EntityView entityView, EntityView existingEntityView, User user) throws Exception;
|
EntityView save(EntityView entityView, EntityView existingEntityView, NameConflictStrategy nameConflictStrategy, User user) throws Exception;
|
||||||
|
|
||||||
void updateEntityViewAttributes(TenantId tenantId, EntityView savedEntityView, EntityView oldEntityView, User user) throws ThingsboardException;
|
void updateEntityViewAttributes(TenantId tenantId, EntityView savedEntityView, EntityView oldEntityView, User user) throws ThingsboardException;
|
||||||
|
|
||||||
|
|||||||
@ -17,6 +17,7 @@ package org.thingsboard.server.dao.asset;
|
|||||||
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
import org.thingsboard.server.common.data.asset.Asset;
|
||||||
import org.thingsboard.server.common.data.asset.AssetInfo;
|
import org.thingsboard.server.common.data.asset.AssetInfo;
|
||||||
@ -25,12 +26,15 @@ import org.thingsboard.server.common.data.id.AssetId;
|
|||||||
import org.thingsboard.server.common.data.id.AssetProfileId;
|
import org.thingsboard.server.common.data.id.AssetProfileId;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.EdgeId;
|
import org.thingsboard.server.common.data.id.EdgeId;
|
||||||
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
|
import org.thingsboard.server.common.data.id.HasId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.page.PageData;
|
import org.thingsboard.server.common.data.page.PageData;
|
||||||
import org.thingsboard.server.common.data.page.PageLink;
|
import org.thingsboard.server.common.data.page.PageLink;
|
||||||
import org.thingsboard.server.dao.entity.EntityDaoService;
|
import org.thingsboard.server.dao.entity.EntityDaoService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public interface AssetService extends EntityDaoService {
|
public interface AssetService extends EntityDaoService {
|
||||||
|
|
||||||
@ -48,6 +52,8 @@ public interface AssetService extends EntityDaoService {
|
|||||||
|
|
||||||
Asset saveAsset(Asset asset);
|
Asset saveAsset(Asset asset);
|
||||||
|
|
||||||
|
Asset saveAsset(Asset asset, NameConflictStrategy nameConflictStrategy);
|
||||||
|
|
||||||
Asset assignAssetToCustomer(TenantId tenantId, AssetId assetId, CustomerId customerId);
|
Asset assignAssetToCustomer(TenantId tenantId, AssetId assetId, CustomerId customerId);
|
||||||
|
|
||||||
Asset unassignAssetFromCustomer(TenantId tenantId, AssetId assetId);
|
Asset unassignAssetFromCustomer(TenantId tenantId, AssetId assetId);
|
||||||
|
|||||||
@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.DeviceInfoFilter;
|
|||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
||||||
import org.thingsboard.server.common.data.device.DeviceSearchQuery;
|
import org.thingsboard.server.common.data.device.DeviceSearchQuery;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
@ -58,8 +59,12 @@ public interface DeviceService extends EntityDaoService {
|
|||||||
|
|
||||||
Device saveDeviceWithAccessToken(Device device, String accessToken);
|
Device saveDeviceWithAccessToken(Device device, String accessToken);
|
||||||
|
|
||||||
|
Device saveDeviceWithAccessToken(Device device, String accessToken, NameConflictStrategy nameConflictStrategy);
|
||||||
|
|
||||||
Device saveDeviceWithCredentials(Device device, DeviceCredentials deviceCredentials);
|
Device saveDeviceWithCredentials(Device device, DeviceCredentials deviceCredentials);
|
||||||
|
|
||||||
|
Device saveDeviceWithCredentials(Device device, DeviceCredentials deviceCredentials, NameConflictStrategy nameConflictStrategy);
|
||||||
|
|
||||||
Device saveDevice(ProvisionRequest provisionRequest, DeviceProfile profile);
|
Device saveDevice(ProvisionRequest provisionRequest, DeviceProfile profile);
|
||||||
|
|
||||||
Device assignDeviceToCustomer(TenantId tenantId, DeviceId deviceId, CustomerId customerId);
|
Device assignDeviceToCustomer(TenantId tenantId, DeviceId deviceId, CustomerId customerId);
|
||||||
|
|||||||
@ -19,6 +19,7 @@ import com.google.common.util.concurrent.ListenableFuture;
|
|||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
import org.thingsboard.server.common.data.EntityView;
|
import org.thingsboard.server.common.data.EntityView;
|
||||||
import org.thingsboard.server.common.data.EntityViewInfo;
|
import org.thingsboard.server.common.data.EntityViewInfo;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery;
|
import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.EdgeId;
|
import org.thingsboard.server.common.data.id.EdgeId;
|
||||||
@ -38,6 +39,8 @@ public interface EntityViewService extends EntityDaoService {
|
|||||||
|
|
||||||
EntityView saveEntityView(EntityView entityView);
|
EntityView saveEntityView(EntityView entityView);
|
||||||
|
|
||||||
|
EntityView saveEntityView(EntityView entityView, NameConflictStrategy nameConflictStrategy);
|
||||||
|
|
||||||
EntityView saveEntityView(EntityView entityView, boolean doValidate);
|
EntityView saveEntityView(EntityView entityView, boolean doValidate);
|
||||||
|
|
||||||
EntityView assignEntityViewToCustomer(TenantId tenantId, EntityViewId entityViewId, CustomerId customerId);
|
EntityView assignEntityViewToCustomer(TenantId tenantId, EntityViewId entityViewId, CustomerId customerId);
|
||||||
|
|||||||
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2025 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.thingsboard.server.common.data;
|
||||||
|
|
||||||
|
public enum NameConflictStrategy {
|
||||||
|
|
||||||
|
FAIL,
|
||||||
|
UNIQUIFY;
|
||||||
|
|
||||||
|
}
|
||||||
@ -16,6 +16,7 @@
|
|||||||
package org.thingsboard.server.dao;
|
package org.thingsboard.server.dao;
|
||||||
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.edqs.fields.EntityFields;
|
import org.thingsboard.server.common.data.edqs.fields.EntityFields;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
@ -32,6 +33,8 @@ public interface Dao<T> {
|
|||||||
|
|
||||||
ListenableFuture<T> findByIdAsync(TenantId tenantId, UUID id);
|
ListenableFuture<T> findByIdAsync(TenantId tenantId, UUID id);
|
||||||
|
|
||||||
|
EntityInfo findEntityInfoByName(TenantId tenantId, String name);
|
||||||
|
|
||||||
boolean existsById(TenantId tenantId, UUID id);
|
boolean existsById(TenantId tenantId, UUID id);
|
||||||
|
|
||||||
ListenableFuture<Boolean> existsByIdAsync(TenantId tenantId, UUID id);
|
ListenableFuture<Boolean> existsByIdAsync(TenantId tenantId, UUID id);
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
package org.thingsboard.server.dao.asset;
|
package org.thingsboard.server.dao.asset;
|
||||||
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
import org.thingsboard.server.common.data.asset.Asset;
|
||||||
@ -242,4 +243,5 @@ public interface AssetDao extends Dao<Asset>, TenantEntityDao<Asset>, Exportable
|
|||||||
|
|
||||||
PageData<ProfileEntityIdInfo> findProfileEntityIdInfosByTenantId(UUID tenantId, PageLink pageLink);
|
PageData<ProfileEntityIdInfo> findProfileEntityIdInfosByTenantId(UUID tenantId, PageLink pageLink);
|
||||||
|
|
||||||
|
EntityInfo findEntityInfoByName(TenantId tenantId, String name);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.springframework.transaction.event.TransactionalEventListener;
|
import org.springframework.transaction.event.TransactionalEventListener;
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
||||||
import org.thingsboard.server.common.data.StringUtils;
|
import org.thingsboard.server.common.data.StringUtils;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
import org.thingsboard.server.common.data.asset.Asset;
|
||||||
@ -146,8 +147,17 @@ public class BaseAssetService extends AbstractCachedEntityService<AssetCacheKey,
|
|||||||
return saveAsset(asset, true);
|
return saveAsset(asset, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Asset saveAsset(Asset asset, NameConflictStrategy nameConflictStrategy) {
|
||||||
|
return saveAsset(asset, true, nameConflictStrategy);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Asset saveAsset(Asset asset, boolean doValidate) {
|
public Asset saveAsset(Asset asset, boolean doValidate) {
|
||||||
|
return saveAsset(asset, doValidate, NameConflictStrategy.FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Asset saveAsset(Asset asset, boolean doValidate, NameConflictStrategy nameConflictStrategy) {
|
||||||
log.trace("Executing saveAsset [{}]", asset);
|
log.trace("Executing saveAsset [{}]", asset);
|
||||||
Asset oldAsset = null;
|
Asset oldAsset = null;
|
||||||
if (doValidate) {
|
if (doValidate) {
|
||||||
@ -155,6 +165,9 @@ public class BaseAssetService extends AbstractCachedEntityService<AssetCacheKey,
|
|||||||
} else if (asset.getId() != null) {
|
} else if (asset.getId() != null) {
|
||||||
oldAsset = findAssetById(asset.getTenantId(), asset.getId());
|
oldAsset = findAssetById(asset.getTenantId(), asset.getId());
|
||||||
}
|
}
|
||||||
|
if (nameConflictStrategy == NameConflictStrategy.UNIQUIFY) {
|
||||||
|
uniquifyEntityName(asset, oldAsset, asset::setName, EntityType.ASSET);
|
||||||
|
}
|
||||||
AssetCacheEvictEvent evictEvent = new AssetCacheEvictEvent(asset.getTenantId(), asset.getName(), oldAsset != null ? oldAsset.getName() : null);
|
AssetCacheEvictEvent evictEvent = new AssetCacheEvictEvent(asset.getTenantId(), asset.getName(), oldAsset != null ? oldAsset.getName() : null);
|
||||||
Asset savedAsset;
|
Asset savedAsset;
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import org.thingsboard.server.common.data.DeviceIdInfo;
|
|||||||
import org.thingsboard.server.common.data.DeviceInfo;
|
import org.thingsboard.server.common.data.DeviceInfo;
|
||||||
import org.thingsboard.server.common.data.DeviceInfoFilter;
|
import org.thingsboard.server.common.data.DeviceInfoFilter;
|
||||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
||||||
import org.thingsboard.server.common.data.id.DeviceId;
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
@ -235,4 +236,5 @@ public interface DeviceDao extends Dao<Device>, TenantEntityDao<Device>, Exporta
|
|||||||
|
|
||||||
PageData<DeviceInfo> findDeviceInfosByFilter(DeviceInfoFilter filter, PageLink pageLink);
|
PageData<DeviceInfo> findDeviceInfosByFilter(DeviceInfoFilter filter, PageLink pageLink);
|
||||||
|
|
||||||
|
EntityInfo findEntityInfoByName(TenantId tenantId, String name);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,9 +36,11 @@ import org.thingsboard.server.common.data.DeviceInfoFilter;
|
|||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.common.data.DeviceProfileType;
|
import org.thingsboard.server.common.data.DeviceProfileType;
|
||||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.EntityView;
|
import org.thingsboard.server.common.data.EntityView;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
||||||
import org.thingsboard.server.common.data.StringUtils;
|
import org.thingsboard.server.common.data.StringUtils;
|
||||||
import org.thingsboard.server.common.data.Tenant;
|
import org.thingsboard.server.common.data.Tenant;
|
||||||
@ -88,6 +90,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import static org.thingsboard.server.dao.DaoUtil.toUUIDs;
|
import static org.thingsboard.server.dao.DaoUtil.toUUIDs;
|
||||||
import static org.thingsboard.server.dao.service.Validator.validateId;
|
import static org.thingsboard.server.dao.service.Validator.validateId;
|
||||||
@ -167,6 +170,12 @@ public class DeviceServiceImpl extends CachedVersionedEntityService<DeviceCacheK
|
|||||||
return doSaveDevice(device, accessToken, true);
|
return doSaveDevice(device, accessToken, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@Override
|
||||||
|
public Device saveDeviceWithAccessToken(Device device, String accessToken, NameConflictStrategy nameConflictStrategy) {
|
||||||
|
return doSaveDevice(device, accessToken, true, nameConflictStrategy);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Device saveDevice(Device device, boolean doValidate) {
|
public Device saveDevice(Device device, boolean doValidate) {
|
||||||
return doSaveDevice(device, null, doValidate);
|
return doSaveDevice(device, null, doValidate);
|
||||||
@ -181,7 +190,13 @@ public class DeviceServiceImpl extends CachedVersionedEntityService<DeviceCacheK
|
|||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public Device saveDeviceWithCredentials(Device device, DeviceCredentials deviceCredentials) {
|
public Device saveDeviceWithCredentials(Device device, DeviceCredentials deviceCredentials) {
|
||||||
Device savedDevice = this.saveDeviceWithoutCredentials(device, true);
|
return this.saveDeviceWithCredentials(device, deviceCredentials, NameConflictStrategy.FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@Override
|
||||||
|
public Device saveDeviceWithCredentials(Device device, DeviceCredentials deviceCredentials, NameConflictStrategy nameConflictStrategy) {
|
||||||
|
Device savedDevice = this.saveDeviceWithoutCredentials(device, true, nameConflictStrategy);
|
||||||
deviceCredentials.setDeviceId(savedDevice.getId());
|
deviceCredentials.setDeviceId(savedDevice.getId());
|
||||||
if (device.getId() == null) {
|
if (device.getId() == null) {
|
||||||
deviceCredentialsService.createDeviceCredentials(savedDevice.getTenantId(), deviceCredentials);
|
deviceCredentialsService.createDeviceCredentials(savedDevice.getTenantId(), deviceCredentials);
|
||||||
@ -198,7 +213,11 @@ public class DeviceServiceImpl extends CachedVersionedEntityService<DeviceCacheK
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Device doSaveDevice(Device device, String accessToken, boolean doValidate) {
|
private Device doSaveDevice(Device device, String accessToken, boolean doValidate) {
|
||||||
Device savedDevice = this.saveDeviceWithoutCredentials(device, doValidate);
|
return doSaveDevice(device, accessToken, doValidate, NameConflictStrategy.FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Device doSaveDevice(Device device, String accessToken, boolean doValidate, NameConflictStrategy nameConflictStrategy) {
|
||||||
|
Device savedDevice = this.saveDeviceWithoutCredentials(device, doValidate, nameConflictStrategy);
|
||||||
if (device.getId() == null) {
|
if (device.getId() == null) {
|
||||||
DeviceCredentials deviceCredentials = new DeviceCredentials();
|
DeviceCredentials deviceCredentials = new DeviceCredentials();
|
||||||
deviceCredentials.setDeviceId(new DeviceId(savedDevice.getUuidId()));
|
deviceCredentials.setDeviceId(new DeviceId(savedDevice.getUuidId()));
|
||||||
@ -209,7 +228,7 @@ public class DeviceServiceImpl extends CachedVersionedEntityService<DeviceCacheK
|
|||||||
return savedDevice;
|
return savedDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Device saveDeviceWithoutCredentials(Device device, boolean doValidate) {
|
private Device saveDeviceWithoutCredentials(Device device, boolean doValidate, NameConflictStrategy nameConflictStrategy) {
|
||||||
log.trace("Executing saveDevice [{}]", device);
|
log.trace("Executing saveDevice [{}]", device);
|
||||||
Device oldDevice = null;
|
Device oldDevice = null;
|
||||||
if (doValidate) {
|
if (doValidate) {
|
||||||
@ -217,6 +236,9 @@ public class DeviceServiceImpl extends CachedVersionedEntityService<DeviceCacheK
|
|||||||
} else if (device.getId() != null) {
|
} else if (device.getId() != null) {
|
||||||
oldDevice = findDeviceById(device.getTenantId(), device.getId());
|
oldDevice = findDeviceById(device.getTenantId(), device.getId());
|
||||||
}
|
}
|
||||||
|
if (nameConflictStrategy == NameConflictStrategy.UNIQUIFY) {
|
||||||
|
uniquifyEntityName(device, oldDevice, device::setName, EntityType.DEVICE);
|
||||||
|
}
|
||||||
DeviceCacheEvictEvent deviceCacheEvictEvent = new DeviceCacheEvictEvent(device.getTenantId(), device.getId(), device.getName(), oldDevice != null ? oldDevice.getName() : null);
|
DeviceCacheEvictEvent deviceCacheEvictEvent = new DeviceCacheEvictEvent(device.getTenantId(), device.getId(), device.getName(), oldDevice != null ? oldDevice.getName() : null);
|
||||||
try {
|
try {
|
||||||
DeviceProfile deviceProfile;
|
DeviceProfile deviceProfile;
|
||||||
|
|||||||
@ -22,15 +22,24 @@ import org.springframework.beans.factory.annotation.Value;
|
|||||||
import org.springframework.context.ApplicationEventPublisher;
|
import org.springframework.context.ApplicationEventPublisher;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.thingsboard.common.util.DebugModeUtil;
|
import org.thingsboard.common.util.DebugModeUtil;
|
||||||
|
import org.thingsboard.server.common.data.BaseData;
|
||||||
|
import org.thingsboard.server.common.data.Device;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.EntityView;
|
import org.thingsboard.server.common.data.EntityView;
|
||||||
import org.thingsboard.server.common.data.HasDebugSettings;
|
import org.thingsboard.server.common.data.HasDebugSettings;
|
||||||
|
import org.thingsboard.server.common.data.HasName;
|
||||||
|
import org.thingsboard.server.common.data.HasTenantId;
|
||||||
import org.thingsboard.server.common.data.StringUtils;
|
import org.thingsboard.server.common.data.StringUtils;
|
||||||
import org.thingsboard.server.common.data.debug.DebugSettings;
|
import org.thingsboard.server.common.data.debug.DebugSettings;
|
||||||
import org.thingsboard.server.common.data.id.EdgeId;
|
import org.thingsboard.server.common.data.id.EdgeId;
|
||||||
import org.thingsboard.server.common.data.id.EntityId;
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
|
import org.thingsboard.server.common.data.id.HasId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
import org.thingsboard.server.common.data.id.UUIDBased;
|
||||||
import org.thingsboard.server.common.data.relation.EntityRelation;
|
import org.thingsboard.server.common.data.relation.EntityRelation;
|
||||||
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
|
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
|
||||||
|
import org.thingsboard.server.dao.Dao;
|
||||||
import org.thingsboard.server.dao.alarm.AlarmService;
|
import org.thingsboard.server.dao.alarm.AlarmService;
|
||||||
import org.thingsboard.server.dao.cf.CalculatedFieldService;
|
import org.thingsboard.server.dao.cf.CalculatedFieldService;
|
||||||
import org.thingsboard.server.dao.edge.EdgeService;
|
import org.thingsboard.server.dao.edge.EdgeService;
|
||||||
@ -45,6 +54,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public abstract class AbstractEntityService {
|
public abstract class AbstractEntityService {
|
||||||
@ -83,6 +93,9 @@ public abstract class AbstractEntityService {
|
|||||||
@Lazy
|
@Lazy
|
||||||
protected TbTenantProfileCache tbTenantProfileCache;
|
protected TbTenantProfileCache tbTenantProfileCache;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
protected EntityDaoRegistry entityDaoRegistry;
|
||||||
|
|
||||||
@Value("${debug.settings.default_duration:15}")
|
@Value("${debug.settings.default_duration:15}")
|
||||||
private int defaultDebugDurationMinutes;
|
private int defaultDebugDurationMinutes;
|
||||||
|
|
||||||
@ -155,4 +168,21 @@ public abstract class AbstractEntityService {
|
|||||||
private long getMaxDebugAllUntil(TenantId tenantId, long now) {
|
private long getMaxDebugAllUntil(TenantId tenantId, long now) {
|
||||||
return now + TimeUnit.MINUTES.toMillis(DebugModeUtil.getMaxDebugAllDuration(tbTenantProfileCache.get(tenantId).getDefaultProfileConfiguration().getMaxDebugModeDurationMinutes(), defaultDebugDurationMinutes));
|
return now + TimeUnit.MINUTES.toMillis(DebugModeUtil.getMaxDebugAllDuration(tbTenantProfileCache.get(tenantId).getDefaultProfileConfiguration().getMaxDebugModeDurationMinutes(), defaultDebugDurationMinutes));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected <E extends HasId<?> & HasTenantId & HasName> void uniquifyEntityName(E entity, E oldEntity, Consumer<String> setName, EntityType entityType) {
|
||||||
|
Dao<?> dao = entityDaoRegistry.getDao(entityType);
|
||||||
|
EntityInfo existingEntity = dao.findEntityInfoByName(entity.getTenantId(), entity.getName());
|
||||||
|
if (existingEntity != null && (oldEntity == null || !existingEntity.getId().equals(oldEntity.getId()))) {
|
||||||
|
int suffix = 1;
|
||||||
|
while (true) {
|
||||||
|
String newName = entity.getName() + "-" + suffix;
|
||||||
|
if (dao.findEntityInfoByName(entity.getTenantId(), newName) == null) {
|
||||||
|
setName.accept(newName);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
suffix++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,6 +29,7 @@ import org.thingsboard.server.common.data.EntitySubtype;
|
|||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.EntityView;
|
import org.thingsboard.server.common.data.EntityView;
|
||||||
import org.thingsboard.server.common.data.EntityViewInfo;
|
import org.thingsboard.server.common.data.EntityViewInfo;
|
||||||
|
import org.thingsboard.server.common.data.NameConflictStrategy;
|
||||||
import org.thingsboard.server.common.data.StringUtils;
|
import org.thingsboard.server.common.data.StringUtils;
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
@ -110,8 +111,17 @@ public class EntityViewServiceImpl extends CachedVersionedEntityService<EntityVi
|
|||||||
return saveEntityView(entityView, true);
|
return saveEntityView(entityView, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityView saveEntityView(EntityView entityView, NameConflictStrategy nameConflictStrategy) {
|
||||||
|
return saveEntityView(entityView, true, nameConflictStrategy);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EntityView saveEntityView(EntityView entityView, boolean doValidate) {
|
public EntityView saveEntityView(EntityView entityView, boolean doValidate) {
|
||||||
|
return saveEntityView(entityView, doValidate, NameConflictStrategy.FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
private EntityView saveEntityView(EntityView entityView, boolean doValidate, NameConflictStrategy nameConflictStrategy) {
|
||||||
log.trace("Executing save entity view [{}]", entityView);
|
log.trace("Executing save entity view [{}]", entityView);
|
||||||
EntityView old = null;
|
EntityView old = null;
|
||||||
if (doValidate) {
|
if (doValidate) {
|
||||||
@ -119,6 +129,9 @@ public class EntityViewServiceImpl extends CachedVersionedEntityService<EntityVi
|
|||||||
} else if (entityView.getId() != null) {
|
} else if (entityView.getId() != null) {
|
||||||
old = findEntityViewById(entityView.getTenantId(), entityView.getId(), false);
|
old = findEntityViewById(entityView.getTenantId(), entityView.getId(), false);
|
||||||
}
|
}
|
||||||
|
if (nameConflictStrategy == NameConflictStrategy.FAIL) {
|
||||||
|
uniquifyEntityName(entityView, old, entityView::setName, EntityType.ENTITY_VIEW);
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
EntityView saved = entityViewDao.save(entityView.getTenantId(), entityView);
|
EntityView saved = entityViewDao.save(entityView.getTenantId(), entityView);
|
||||||
publishEvictEvent(new EntityViewEvictEvent(saved.getTenantId(), saved.getId(), saved.getEntityId(), old != null ? old.getEntityId() : null, saved.getName(), old != null ? old.getName() : null, saved));
|
publishEvictEvent(new EntityViewEvictEvent(saved.getTenantId(), saved.getId(), saved.getEntityId(), old != null ? old.getEntityId() : null, saved.getName(), old != null ? old.getName() : null, saved));
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import org.springframework.data.domain.Pageable;
|
|||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.data.repository.query.Param;
|
import org.springframework.data.repository.query.Param;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
import org.thingsboard.server.common.data.edqs.fields.AssetFields;
|
import org.thingsboard.server.common.data.edqs.fields.AssetFields;
|
||||||
import org.thingsboard.server.common.data.util.TbPair;
|
import org.thingsboard.server.common.data.util.TbPair;
|
||||||
import org.thingsboard.server.dao.ExportableEntityRepository;
|
import org.thingsboard.server.dao.ExportableEntityRepository;
|
||||||
@ -103,6 +104,10 @@ public interface AssetRepository extends JpaRepository<AssetEntity, UUID>, Expor
|
|||||||
|
|
||||||
AssetEntity findByTenantIdAndName(UUID tenantId, String name);
|
AssetEntity findByTenantIdAndName(UUID tenantId, String name);
|
||||||
|
|
||||||
|
@Query("SELECT new org.thingsboard.server.common.data.EntityInfo(a.id, 'ASSET', a.name) " +
|
||||||
|
"FROM AssetEntity a WHERE a.tenantId = :tenantId AND a.name = :name")
|
||||||
|
EntityInfo findEntityInfoByName(UUID tenantId, String name);
|
||||||
|
|
||||||
@Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
|
@Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
|
||||||
"AND a.type = :type " +
|
"AND a.type = :type " +
|
||||||
"AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true " +
|
"AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true " +
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.data.domain.Limit;
|
import org.springframework.data.domain.Limit;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
||||||
@ -267,6 +268,12 @@ public class JpaAssetDao extends JpaAbstractDao<AssetEntity, Asset> implements A
|
|||||||
return nativeAssetRepository.findProfileEntityIdInfosByTenantId(tenantId, DaoUtil.toPageable(pageLink));
|
return nativeAssetRepository.findProfileEntityIdInfosByTenantId(tenantId, DaoUtil.toPageable(pageLink));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityInfo findEntityInfoByName(TenantId tenantId, String name) {
|
||||||
|
log.debug("Find asset entity info by name [{}]", name);
|
||||||
|
return assetRepository.findEntityInfoByName(tenantId.getId(), name);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long countByTenantId(TenantId tenantId) {
|
public Long countByTenantId(TenantId tenantId) {
|
||||||
return assetRepository.countByTenantId(tenantId.getId());
|
return assetRepository.countByTenantId(tenantId.getId());
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import org.springframework.data.domain.Pageable;
|
|||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.data.repository.query.Param;
|
import org.springframework.data.repository.query.Param;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
import org.thingsboard.server.common.data.edqs.fields.CustomerFields;
|
import org.thingsboard.server.common.data.edqs.fields.CustomerFields;
|
||||||
import org.thingsboard.server.dao.ExportableEntityRepository;
|
import org.thingsboard.server.dao.ExportableEntityRepository;
|
||||||
import org.thingsboard.server.dao.model.sql.CustomerEntity;
|
import org.thingsboard.server.dao.model.sql.CustomerEntity;
|
||||||
@ -41,6 +42,10 @@ public interface CustomerRepository extends JpaRepository<CustomerEntity, UUID>,
|
|||||||
|
|
||||||
CustomerEntity findByTenantIdAndTitle(UUID tenantId, String title);
|
CustomerEntity findByTenantIdAndTitle(UUID tenantId, String title);
|
||||||
|
|
||||||
|
@Query("SELECT new org.thingsboard.server.common.data.EntityInfo(a.id, 'CUSTOMER', a.title) " +
|
||||||
|
"FROM CustomerEntity a WHERE a.tenantId = :tenantId AND a.title = :name")
|
||||||
|
EntityInfo findEntityInfoByName(UUID tenantId, String name);
|
||||||
|
|
||||||
@Query(value = "SELECT * FROM customer c WHERE c.tenant_id = :tenantId " +
|
@Query(value = "SELECT * FROM customer c WHERE c.tenant_id = :tenantId " +
|
||||||
"AND c.is_public IS TRUE ORDER BY c.id ASC LIMIT 1", nativeQuery = true)
|
"AND c.is_public IS TRUE ORDER BY c.id ASC LIMIT 1", nativeQuery = true)
|
||||||
CustomerEntity findPublicCustomerByTenantId(@Param("tenantId") UUID tenantId);
|
CustomerEntity findPublicCustomerByTenantId(@Param("tenantId") UUID tenantId);
|
||||||
|
|||||||
@ -22,6 +22,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
|
|||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.data.repository.query.Param;
|
import org.springframework.data.repository.query.Param;
|
||||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
import org.thingsboard.server.common.data.edqs.fields.DeviceFields;
|
import org.thingsboard.server.common.data.edqs.fields.DeviceFields;
|
||||||
import org.thingsboard.server.dao.ExportableEntityRepository;
|
import org.thingsboard.server.dao.ExportableEntityRepository;
|
||||||
import org.thingsboard.server.dao.model.sql.DeviceEntity;
|
import org.thingsboard.server.dao.model.sql.DeviceEntity;
|
||||||
@ -151,6 +152,10 @@ public interface DeviceRepository extends JpaRepository<DeviceEntity, UUID>, Exp
|
|||||||
|
|
||||||
DeviceEntity findByTenantIdAndName(UUID tenantId, String name);
|
DeviceEntity findByTenantIdAndName(UUID tenantId, String name);
|
||||||
|
|
||||||
|
@Query("SELECT new org.thingsboard.server.common.data.EntityInfo(a.id, 'DEVICE', a.name) " +
|
||||||
|
"FROM DeviceEntity a WHERE a.tenantId = :tenantId AND a.name = :name")
|
||||||
|
EntityInfo findEntityInfoByName(UUID tenantId, String name);
|
||||||
|
|
||||||
List<DeviceEntity> findDevicesByTenantIdAndCustomerIdAndIdIn(UUID tenantId, UUID customerId, List<UUID> deviceIds);
|
List<DeviceEntity> findDevicesByTenantIdAndCustomerIdAndIdIn(UUID tenantId, UUID customerId, List<UUID> deviceIds);
|
||||||
|
|
||||||
List<DeviceEntity> findDevicesByTenantIdAndIdIn(UUID tenantId, List<UUID> deviceIds);
|
List<DeviceEntity> findDevicesByTenantIdAndIdIn(UUID tenantId, List<UUID> deviceIds);
|
||||||
|
|||||||
@ -28,6 +28,7 @@ import org.thingsboard.server.common.data.DeviceIdInfo;
|
|||||||
import org.thingsboard.server.common.data.DeviceInfo;
|
import org.thingsboard.server.common.data.DeviceInfo;
|
||||||
import org.thingsboard.server.common.data.DeviceInfoFilter;
|
import org.thingsboard.server.common.data.DeviceInfoFilter;
|
||||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
import org.thingsboard.server.common.data.ProfileEntityIdInfo;
|
||||||
@ -114,6 +115,11 @@ public class JpaDeviceDao extends JpaAbstractDao<DeviceEntity, Device> implement
|
|||||||
DaoUtil.toPageable(pageLink)));
|
DaoUtil.toPageable(pageLink)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityInfo findEntityInfoByName(TenantId tenantId, String name) {
|
||||||
|
return deviceRepository.findEntityInfoByName(tenantId.getId(), name);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<List<Device>> findDevicesByTenantIdAndIdsAsync(UUID tenantId, List<UUID> deviceIds) {
|
public ListenableFuture<List<Device>> findDevicesByTenantIdAndIdsAsync(UUID tenantId, List<UUID> deviceIds) {
|
||||||
return service.submit(() -> DaoUtil.convertDataList(deviceRepository.findDevicesByTenantIdAndIdIn(tenantId, deviceIds)));
|
return service.submit(() -> DaoUtil.convertDataList(deviceRepository.findDevicesByTenantIdAndIdIn(tenantId, deviceIds)));
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import org.springframework.data.domain.Pageable;
|
|||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.data.repository.query.Param;
|
import org.springframework.data.repository.query.Param;
|
||||||
|
import org.thingsboard.server.common.data.EntityInfo;
|
||||||
import org.thingsboard.server.common.data.edqs.fields.EntityViewFields;
|
import org.thingsboard.server.common.data.edqs.fields.EntityViewFields;
|
||||||
import org.thingsboard.server.dao.ExportableEntityRepository;
|
import org.thingsboard.server.dao.ExportableEntityRepository;
|
||||||
import org.thingsboard.server.dao.model.sql.EntityViewEntity;
|
import org.thingsboard.server.dao.model.sql.EntityViewEntity;
|
||||||
@ -118,6 +119,10 @@ public interface EntityViewRepository extends JpaRepository<EntityViewEntity, UU
|
|||||||
|
|
||||||
EntityViewEntity findByTenantIdAndName(UUID tenantId, String name);
|
EntityViewEntity findByTenantIdAndName(UUID tenantId, String name);
|
||||||
|
|
||||||
|
@Query("SELECT new org.thingsboard.server.common.data.EntityInfo(a.id, 'ENTITY_VIEW', a.name) " +
|
||||||
|
"FROM EntityViewEntity a WHERE a.tenantId = :tenantId AND a.name = :name")
|
||||||
|
EntityInfo findEntityInfoByName(UUID tenantId, String name);
|
||||||
|
|
||||||
List<EntityViewEntity> findAllByTenantIdAndEntityId(UUID tenantId, UUID entityId);
|
List<EntityViewEntity> findAllByTenantIdAndEntityId(UUID tenantId, UUID entityId);
|
||||||
|
|
||||||
boolean existsByTenantIdAndEntityId(UUID tenantId, UUID entityId);
|
boolean existsByTenantIdAndEntityId(UUID tenantId, UUID entityId);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user