Browse Source

Refactor entities deletion

pull/10201/head
ViacheslavKlimov 2 years ago
parent
commit
0b18de1482
  1. 6
      application/src/main/java/org/thingsboard/server/service/housekeeper/processor/AlarmsDeletionTaskProcessor.java
  2. 9
      application/src/main/java/org/thingsboard/server/service/housekeeper/processor/EntitiesDeletionTaskProcessor.java
  3. 2
      application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/DefaultExportableEntitiesService.java
  4. 2
      common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityDaoService.java
  5. 2
      common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java
  6. 2
      common/queue/src/main/java/org/thingsboard/server/queue/housekeeper/DefaultHousekeeperClient.java
  7. 21
      dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileServiceImpl.java
  8. 19
      dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java
  9. 19
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java
  10. 12
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java
  11. 21
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java
  12. 26
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java
  13. 12
      dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java
  14. 2
      dao/src/main/java/org/thingsboard/server/dao/entity/EntityDaoRegistry.java
  15. 9
      dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java
  16. 10
      dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRequestService.java
  17. 10
      dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRuleService.java
  18. 15
      dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTargetService.java
  19. 12
      dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTemplateService.java
  20. 5
      dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java
  21. 5
      dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueService.java
  22. 6
      dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueStatsService.java
  23. 10
      dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java
  24. 5
      dao/src/main/java/org/thingsboard/server/dao/rpc/BaseRpcService.java
  25. 17
      dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java
  26. 9
      dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java
  27. 8
      dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueStatsDao.java
  28. 7
      dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java
  29. 2
      dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java
  30. 10
      dao/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateServiceImpl.java
  31. 7
      dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java
  32. 5
      dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java
  33. 22
      dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java
  34. 55
      dao/src/test/java/org/thingsboard/server/dao/service/EntityDaoRegistryTest.java

6
application/src/main/java/org/thingsboard/server/service/housekeeper/processor/AlarmsDeletionTaskProcessor.java

@ -64,10 +64,10 @@ public class AlarmsDeletionTaskProcessor extends HousekeeperTaskProcessor<Alarms
}
log.debug("[{}][{}][{}] Deleted {} alarms", tenantId, entityType, entityId, task.getAlarms().size());
}
} else {
int count = alarmService.deleteEntityAlarmRecords(tenantId, entityId);
log.debug("[{}][{}][{}] Deleted {} entity alarms", tenantId, entityType, entityId, count);
}
int count = alarmService.deleteEntityAlarmRecords(tenantId, entityId);
log.debug("[{}][{}][{}] Deleted {} entity alarms", tenantId, entityType, entityId, count);
}
@Override

9
application/src/main/java/org/thingsboard/server/service/housekeeper/processor/EntitiesDeletionTaskProcessor.java

@ -55,19 +55,16 @@ public class EntitiesDeletionTaskProcessor extends HousekeeperTaskProcessor<Enti
break;
}
housekeeperClient.submitTask(new EntitiesDeletionHousekeeperTask(tenantId, entityType, task.getEntities()));
housekeeperClient.submitTask(new EntitiesDeletionHousekeeperTask(tenantId, entityType, entities));
last = entities.get(entities.size() - 1);
log.debug("[{}] Submitted task for deleting {} {}s", tenantId, entities.size(), entityType.getNormalName().toLowerCase());
}
} else {
for (UUID entityUuid : task.getEntities()) {
EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, entityUuid);
// Optional<HasId<?>> entity = entityService.findEntity(tenantId, entityId);
// if (entity.isEmpty()) {
// continue;
// }
entityService.deleteEntity(tenantId, entityId);
entityService.deleteEntity(tenantId, entityId, true);
}
log.debug("[{}] Deleted {} {}s", tenantId, task.getEntities().size(), entityType.getNormalName().toLowerCase());
}
}

2
application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/DefaultExportableEntitiesService.java

@ -147,7 +147,7 @@ public class DefaultExportableEntitiesService implements ExportableEntitiesServi
public <I extends EntityId> void removeById(TenantId tenantId, I id) {
EntityType entityType = id.getEntityType();
EntityDaoService entityService = entityServiceRegistry.getServiceByEntityType(entityType);
entityService.deleteEntity(tenantId, id);
entityService.deleteEntity(tenantId, id, false);
}
private <I extends EntityId, E extends ExportableEntity<I>> ExportableEntityDao<I, E> getExportableEntityDao(EntityType entityType) {

2
common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityDaoService.java

@ -30,7 +30,7 @@ public interface EntityDaoService {
throw new IllegalArgumentException("Not implemented for " + getEntityType());
}
default void deleteEntity(TenantId tenantId, EntityId id) {
default void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
throw new IllegalArgumentException(getEntityType().getNormalName() + " deletion not supported");
}

2
common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java

@ -77,6 +77,8 @@ public interface UserService extends EntityDaoService {
void deleteTenantAdmins(TenantId tenantId);
void deleteAllByTenantId(TenantId tenantId);
PageData<User> findCustomerUsers(TenantId tenantId, CustomerId customerId, PageLink pageLink);
PageData<User> findUsersByCustomerIds(TenantId tenantId, List<CustomerId> customerIds, PageLink pageLink);

2
common/queue/src/main/java/org/thingsboard/server/queue/housekeeper/DefaultHousekeeperClient.java

@ -65,7 +65,7 @@ public class DefaultHousekeeperClient implements HousekeeperClient {
return;
}
log.debug("[{}][{}][{}] Submitting task: {}", task.getTenantId(), task.getEntityId().getEntityType(), task.getEntityId(), taskType);
log.debug("[{}][{}][{}] Submitting task: {}", task.getTenantId(), task.getEntityId().getEntityType(), task.getEntityId(), task);
/*
* using msg key as entity id so that msgs related to certain entity are pushed to same partition,
* e.g. on tenant deletion (entity id is tenant id), we need to clean up tenant entities in certain order

21
dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileServiceImpl.java

@ -180,11 +180,20 @@ public class AssetProfileServiceImpl extends AbstractCachedEntityService<AssetPr
public void deleteAssetProfile(TenantId tenantId, AssetProfileId assetProfileId) {
log.trace("Executing deleteAssetProfile [{}]", assetProfileId);
Validator.validateId(assetProfileId, id -> INCORRECT_ASSET_PROFILE_ID + id);
AssetProfile assetProfile = assetProfileDao.findById(tenantId, assetProfileId.getId());
if (assetProfile != null && assetProfile.isDefault()) {
deleteEntity(tenantId, assetProfileId, false);
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
AssetProfile assetProfile = assetProfileDao.findById(tenantId, id.getId());
if (assetProfile == null) {
return;
}
if (!force && assetProfile.isDefault()) {
throw new DataValidationException("Deletion of Default Asset Profile is prohibited!");
}
this.removeAssetProfile(tenantId, assetProfile);
removeAssetProfile(tenantId, assetProfile);
}
private void removeAssetProfile(TenantId tenantId, AssetProfile assetProfile) {
@ -312,12 +321,6 @@ public class AssetProfileServiceImpl extends AbstractCachedEntityService<AssetPr
return Optional.ofNullable(findAssetProfileById(tenantId, new AssetProfileId(entityId.getId())));
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteAssetProfile(tenantId, (AssetProfileId) id);
}
@Override
public EntityType getEntityType() {
return EntityType.ASSET_PROFILE;

19
dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java

@ -199,11 +199,20 @@ public class BaseAssetService extends AbstractCachedEntityService<AssetCacheKey,
@Transactional
public void deleteAsset(TenantId tenantId, AssetId assetId) {
validateId(assetId, id -> INCORRECT_ASSET_ID + id);
if (entityViewService.existsByTenantIdAndEntityId(tenantId, assetId)) {
deleteEntity(tenantId, assetId, false);
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
if (!force && entityViewService.existsByTenantIdAndEntityId(tenantId, id)) {
throw new DataValidationException("Can't delete asset that has entity views!");
}
Asset asset = assetDao.findById(tenantId, assetId.getId());
Asset asset = assetDao.findById(tenantId, id.getId());
if (asset == null) {
return;
}
deleteAsset(tenantId, asset);
}
@ -473,12 +482,6 @@ public class BaseAssetService extends AbstractCachedEntityService<AssetCacheKey,
return assetDao.countByTenantId(tenantId);
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteAsset(tenantId, (AssetId) id);
}
@Override
public EntityType getEntityType() {
return EntityType.ASSET;

19
dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java

@ -127,9 +127,20 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom
public void deleteCustomer(TenantId tenantId, CustomerId customerId) {
log.trace("Executing deleteCustomer [{}]", customerId);
Validator.validateId(customerId, id -> INCORRECT_CUSTOMER_ID + id);
deleteEntity(tenantId, customerId, false);
}
@Transactional
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
CustomerId customerId = (CustomerId) id;
Customer customer = findCustomerById(tenantId, customerId);
if (customer == null) {
throw new IncorrectParameterException("Unable to delete non-existent customer.");
if (force) {
return;
} else {
throw new IncorrectParameterException("Unable to delete non-existent customer.");
}
}
dashboardService.unassignCustomerDashboards(tenantId, customerId);
entityViewService.unassignCustomerEntityViews(customer.getTenantId(), customerId);
@ -204,12 +215,6 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom
return Optional.ofNullable(findCustomerById(tenantId, new CustomerId(entityId.getId())));
}
@Transactional
@Override
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteCustomer(tenantId, (CustomerId) id);
}
@Override
public long countByTenantId(TenantId tenantId) {
return customerDao.countByTenantId(tenantId);

12
dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java

@ -245,6 +245,12 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb
}
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
deleteDashboard(tenantId, (DashboardId) id);
}
@Override
public PageData<DashboardInfo> findDashboardsByTenantId(TenantId tenantId, PageLink pageLink) {
log.trace("Executing findDashboardsByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
@ -394,12 +400,6 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb
return dashboardDao.countByTenantId(tenantId);
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteDashboard(tenantId, (DashboardId) id);
}
@Override
public EntityType getEntityType() {
return EntityType.DASHBOARD;

21
dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java

@ -217,11 +217,20 @@ public class DeviceProfileServiceImpl extends AbstractCachedEntityService<Device
public void deleteDeviceProfile(TenantId tenantId, DeviceProfileId deviceProfileId) {
log.trace("Executing deleteDeviceProfile [{}]", deviceProfileId);
validateId(deviceProfileId, id -> INCORRECT_DEVICE_PROFILE_ID + id);
DeviceProfile deviceProfile = deviceProfileDao.findById(tenantId, deviceProfileId.getId());
if (deviceProfile != null && deviceProfile.isDefault()) {
deleteEntity(tenantId, deviceProfileId, false);
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
DeviceProfile deviceProfile = deviceProfileDao.findById(tenantId, id.getId());
if (deviceProfile == null) {
return;
}
if (!force && deviceProfile.isDefault()) {
throw new DataValidationException("Deletion of Default Device Profile is prohibited!");
}
this.removeDeviceProfile(tenantId, deviceProfile);
removeDeviceProfile(tenantId, deviceProfile);
}
private void removeDeviceProfile(TenantId tenantId, DeviceProfile deviceProfile) {
@ -361,12 +370,6 @@ public class DeviceProfileServiceImpl extends AbstractCachedEntityService<Device
return Optional.ofNullable(findDeviceProfileById(tenantId, new DeviceProfileId(entityId.getId())));
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteDeviceProfile(tenantId, (DeviceProfileId) id);
}
@Override
public EntityType getEntityType() {
return EntityType.DEVICE_PROFILE;

26
dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java

@ -322,11 +322,20 @@ public class DeviceServiceImpl extends AbstractCachedEntityService<DeviceCacheKe
@Override
public void deleteDevice(final TenantId tenantId, final DeviceId deviceId) {
validateId(deviceId, id -> INCORRECT_DEVICE_ID + id);
if (entityViewService.existsByTenantIdAndEntityId(tenantId, deviceId)) {
deleteEntity(tenantId, deviceId, false);
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
if (!force && entityViewService.existsByTenantIdAndEntityId(tenantId, id)) {
throw new DataValidationException("Can't delete device that has entity views!");
}
Device device = deviceDao.findById(tenantId, deviceId.getId());
Device device = deviceDao.findById(tenantId, id.getId());
if (device == null) {
return;
}
deleteDevice(tenantId, device);
}
@ -344,12 +353,11 @@ public class DeviceServiceImpl extends AbstractCachedEntityService<DeviceCacheKe
@Override
public PageData<Device> findDevicesByTenantId(TenantId tenantId, PageLink pageLink) {
log.trace("Executing findDevicesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
validateId(tenantId, id ->INCORRECT_TENANT_ID + id);
validateId(tenantId, id -> INCORRECT_TENANT_ID + id);
validatePageLink(pageLink);
return deviceDao.findDevicesByTenantId(tenantId.getId(), pageLink);
}
@Override
public PageData<DeviceInfo> findDeviceInfosByFilter(DeviceInfoFilter filter, PageLink pageLink) {
log.trace("Executing findDeviceInfosByFilter, filter [{}], pageLink [{}]", filter, pageLink);
@ -410,14 +418,14 @@ public class DeviceServiceImpl extends AbstractCachedEntityService<DeviceCacheKe
@Override
public List<Device> findDevicesByIds(List<DeviceId> deviceIds) {
log.trace("Executing findDevicesByIdsAsync, deviceIds [{}]", deviceIds);
validateIds(deviceIds, ids-> "Incorrect deviceIds " + ids);
validateIds(deviceIds, ids -> "Incorrect deviceIds " + ids);
return deviceDao.findDevicesByIds(toUUIDs(deviceIds));
}
@Override
public ListenableFuture<List<Device>> findDevicesByIdsAsync(List<DeviceId> deviceIds) {
log.trace("Executing findDevicesByIdsAsync, deviceIds [{}]", deviceIds);
validateIds(deviceIds, ids-> "Incorrect deviceIds " + ids);
validateIds(deviceIds, ids -> "Incorrect deviceIds " + ids);
return deviceDao.findDevicesByIdsAsync(toUUIDs(deviceIds));
}
@ -651,12 +659,6 @@ public class DeviceServiceImpl extends AbstractCachedEntityService<DeviceCacheKe
return deviceDao.countByTenantId(tenantId);
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteDevice(tenantId, (DeviceId) id);
}
private final PaginatedRemover<TenantId, Device> tenantDevicesRemover = new PaginatedRemover<>() {
@Override

12
dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java

@ -21,6 +21,7 @@ import com.google.common.base.Function;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import jakarta.annotation.Nullable;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.exception.ConstraintViolationException;
@ -61,7 +62,6 @@ import org.thingsboard.server.dao.attributes.AttributesService;
import org.thingsboard.server.dao.entity.AbstractCachedEntityService;
import org.thingsboard.server.dao.eventsourcing.ActionEntityEvent;
import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent;
import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent;
import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.relation.RelationService;
@ -72,7 +72,6 @@ import org.thingsboard.server.dao.service.Validator;
import org.thingsboard.server.dao.timeseries.TimeseriesService;
import org.thingsboard.server.dao.user.UserService;
import jakarta.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@ -225,6 +224,9 @@ public class EdgeServiceImpl extends AbstractCachedEntityService<EdgeCacheKey, E
validateId(edgeId, id -> INCORRECT_EDGE_ID + id);
Edge edge = edgeDao.findById(tenantId, edgeId.getId());
if (edge == null) {
return;
}
edgeDao.removeById(tenantId, edgeId.getId());
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(edgeId).build());
@ -232,6 +234,12 @@ public class EdgeServiceImpl extends AbstractCachedEntityService<EdgeCacheKey, E
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(edgeId).build());
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
deleteEdge(tenantId, (EdgeId) id);
}
@Override
public PageData<Edge> findEdgesByTenantId(TenantId tenantId, PageLink pageLink) {
log.trace("Executing findEdgesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);

2
dao/src/main/java/org/thingsboard/server/dao/entity/EntityDaoRegistry.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.entity;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.EntityType;
@ -26,7 +25,6 @@ import java.util.Map;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@Slf4j
public class EntityDaoRegistry {

9
dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java

@ -328,11 +328,20 @@ public class EntityViewServiceImpl extends AbstractCachedEntityService<EntityVie
log.trace("Executing deleteEntityView [{}]", entityViewId);
validateId(entityViewId, id -> INCORRECT_ENTITY_VIEW_ID + id);
EntityView entityView = entityViewDao.findById(tenantId, entityViewId.getId());
if (entityView == null) {
return;
}
entityViewDao.removeById(tenantId, entityViewId.getId());
publishEvictEvent(new EntityViewEvictEvent(entityView.getTenantId(), entityView.getId(), entityView.getEntityId(), null, entityView.getName(), null));
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(entityViewId).build());
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
deleteEntityView(tenantId, (EntityViewId) id);
}
@Override
public void deleteEntityViewsByTenantId(TenantId tenantId) {
log.trace("Executing deleteEntityViewsByTenantId, tenantId [{}]", tenantId);

10
dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRequestService.java

@ -93,6 +93,16 @@ public class DefaultNotificationRequestService implements NotificationRequestSer
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entity(request).entityId(request.getId()).build());
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
if (force) {
notificationRequestDao.removeById(tenantId, id.getId());
} else {
NotificationRequest notificationRequest = findNotificationRequestById(tenantId, (NotificationRequestId) id);
deleteNotificationRequest(tenantId, notificationRequest);
}
}
@Override
public PageData<NotificationRequest> findScheduledNotificationRequests(PageLink pageLink) {
return notificationRequestDao.findAllByStatus(NotificationRequestStatus.SCHEDULED, pageLink);

10
dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationRuleService.java

@ -94,6 +94,11 @@ public class DefaultNotificationRuleService extends AbstractEntityService implem
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(id).build());
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
deleteNotificationRuleById(tenantId, (NotificationRuleId) id);
}
@Override
public void deleteNotificationRulesByTenantId(TenantId tenantId) {
notificationRuleDao.removeByTenantId(tenantId);
@ -109,11 +114,6 @@ public class DefaultNotificationRuleService extends AbstractEntityService implem
return Optional.ofNullable(findNotificationRuleById(tenantId, new NotificationRuleId(entityId.getId())));
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteNotificationRuleById(tenantId, (NotificationRuleId) id);
}
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_RULE;

15
dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTargetService.java

@ -187,10 +187,16 @@ public class DefaultNotificationTargetService extends AbstractEntityService impl
@Override
public void deleteNotificationTargetById(TenantId tenantId, NotificationTargetId id) {
if (notificationRequestDao.existsByTenantIdAndStatusAndTargetId(tenantId, NotificationRequestStatus.SCHEDULED, id)) {
deleteEntity(tenantId, id, false);
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
NotificationTargetId targetId = (NotificationTargetId) id;
if (!force && notificationRequestDao.existsByTenantIdAndStatusAndTargetId(tenantId, NotificationRequestStatus.SCHEDULED, targetId)) {
throw new IllegalArgumentException("Recipients group is referenced by scheduled notification request");
}
if (notificationRuleDao.existsByTenantIdAndTargetId(tenantId, id)) {
if (!force && notificationRuleDao.existsByTenantIdAndTargetId(tenantId, targetId)) {
throw new IllegalArgumentException("Recipients group is being used in notification rule");
}
notificationTargetDao.removeById(tenantId, id.getId());
@ -216,11 +222,6 @@ public class DefaultNotificationTargetService extends AbstractEntityService impl
return Optional.ofNullable(findNotificationTargetById(tenantId, new NotificationTargetId(entityId.getId())));
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteNotificationTargetById(tenantId, (NotificationTargetId) id);
}
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_TARGET;

12
dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotificationTemplateService.java

@ -76,7 +76,12 @@ public class DefaultNotificationTemplateService extends AbstractEntityService im
@Override
public void deleteNotificationTemplateById(TenantId tenantId, NotificationTemplateId id) {
if (notificationRequestDao.existsByTenantIdAndStatusAndTemplateId(tenantId, NotificationRequestStatus.SCHEDULED, id)) {
deleteEntity(tenantId, id, false);
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
if (!force && notificationRequestDao.existsByTenantIdAndStatusAndTemplateId(tenantId, NotificationRequestStatus.SCHEDULED, (NotificationTemplateId) id)) {
throw new IllegalArgumentException("Notification template is referenced by scheduled notification request");
}
try {
@ -104,11 +109,6 @@ public class DefaultNotificationTemplateService extends AbstractEntityService im
return Optional.ofNullable(findNotificationTemplateById(tenantId, new NotificationTemplateId(entityId.getId())));
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteNotificationTemplateById(tenantId, (NotificationTemplateId) id);
}
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_TEMPLATE;

5
dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java

@ -218,6 +218,11 @@ public class BaseOtaPackageService extends AbstractCachedEntityService<OtaPackag
}
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
deleteOtaPackage(tenantId, (OtaPackageId) id);
}
@Override
public long sumDataSizeByTenantId(TenantId tenantId) {
return otaPackageDao.sumDataSizeByTenantId(tenantId);

5
dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueService.java

@ -83,6 +83,11 @@ public class BaseQueueService extends AbstractEntityService implements QueueServ
}
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
deleteQueue(tenantId, (QueueId) id);
}
@Override
public List<Queue> findQueuesByTenantId(TenantId tenantId) {
log.trace("Executing findQueues, tenantId: [{}]", tenantId);

6
dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueStatsService.java

@ -78,6 +78,11 @@ public class BaseQueueStatsService extends AbstractEntityService implements Queu
queueStatsDao.deleteByTenantId(tenantId);
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
queueStatsDao.removeById(tenantId, id.getId());
}
@Override
public Optional<HasId<?>> findEntity(TenantId tenantId, EntityId entityId) {
return Optional.ofNullable(findQueueStatsById(tenantId, new QueueStatsId(entityId.getId())));
@ -87,4 +92,5 @@ public class BaseQueueStatsService extends AbstractEntityService implements Queu
public EntityType getEntityType() {
return EntityType.QUEUE_STATS;
}
}

10
dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java

@ -159,6 +159,11 @@ public class BaseResourceService extends AbstractCachedEntityService<ResourceInf
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entity(resource).entityId(resourceId).build());
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
deleteResource(tenantId, (TbResourceId) id, force);
}
@Override
public PageData<TbResourceInfo> findAllTenantResourcesByTenantId(TbResourceInfoFilter filter, PageLink pageLink) {
TenantId tenantId = filter.getTenantId();
@ -213,11 +218,6 @@ public class BaseResourceService extends AbstractCachedEntityService<ResourceInf
return Optional.ofNullable(findResourceInfoById(tenantId, new TbResourceId(entityId.getId())));
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteResource(tenantId, (TbResourceId) id);
}
@Override
public EntityType getEntityType() {
return EntityType.TB_RESOURCE;

5
dao/src/main/java/org/thingsboard/server/dao/rpc/BaseRpcService.java

@ -59,6 +59,11 @@ public class BaseRpcService implements RpcService {
rpcDao.removeById(tenantId, rpcId.getId());
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
deleteRpc(tenantId, (RpcId) id);
}
@Override
public void deleteAllRpcByTenantId(TenantId tenantId) {
log.trace("Executing deleteAllRpcByTenantId, tenantId [{}]", tenantId);

17
dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java

@ -451,6 +451,17 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
checkRuleNodesAndDelete(tenantId, ruleChain, referencingRuleChainIds);
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
if (force) {
RuleChain ruleChain = findRuleChainById(tenantId, (RuleChainId) id);
checkRuleNodesAndDelete(tenantId, ruleChain, null);
} else {
deleteRuleChainById(tenantId, (RuleChainId) id);
}
}
@Transactional
@Override
public void deleteRuleChainsByTenantId(TenantId tenantId) {
@ -824,12 +835,6 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
return ruleChainDao.countByTenantId(tenantId);
}
@Override
@Transactional
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteRuleChainById(tenantId, (RuleChainId) id);
}
@Override
public EntityType getEntityType() {
return EntityType.RULE_CHAIN;

9
dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java

@ -21,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
@ -86,4 +87,10 @@ public class JpaQueueDao extends JpaAbstractDao<QueueEntity, Queue> implements Q
return DaoUtil.toPageData(queueRepository
.findByTenantId(tenantId.getId(), pageLink.getTextSearch(), DaoUtil.toPageable(pageLink)));
}
}
@Override
public EntityType getEntityType() {
return EntityType.QUEUE;
}
}

8
dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueStatsDao.java

@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.queue.QueueStats;
import org.thingsboard.server.dao.DaoUtil;
@ -63,4 +64,9 @@ public class JpaQueueStatsDao extends JpaAbstractDao<QueueStatsEntity, QueueStat
queueStatsRepository.deleteByTenantId(tenantId.getId());
}
}
@Override
public EntityType getEntityType() {
return EntityType.QUEUE_STATS;
}
}

7
dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java

@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.EntityInfo;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
@ -31,7 +32,6 @@ import org.thingsboard.server.dao.util.SqlDao;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
@Component
@ -87,4 +87,9 @@ public class JpaTenantProfileDao extends JpaAbstractDao<TenantProfileEntity, Ten
return DaoUtil.convertDataList(tenantProfileRepository.findByIdIn(Arrays.asList(ids)));
}
@Override
public EntityType getEntityType() {
return EntityType.TENANT_PROFILE;
}
}

2
dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java

@ -156,7 +156,7 @@ public class TenantServiceImpl extends AbstractCachedEntityService<TenantId, Ten
Tenant tenant = findTenantById(tenantId);
Validator.validateId(tenantId, id -> INCORRECT_TENANT_ID + id);
userService.deleteByTenantId(tenantId);
userService.deleteAllByTenantId(tenantId);
adminSettingsService.deleteAdminSettingsByTenantId(tenantId);
notificationSettingsService.deleteNotificationSettings(tenantId);
tenantDao.removeById(tenantId, tenantId.getId());

10
dao/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateServiceImpl.java

@ -77,12 +77,22 @@ public class ApiUsageStateServiceImpl extends AbstractEntityService implements A
log.trace("Executing deleteApiUsageStateByEntityId [{}]", entityId);
validateId(entityId.getId(), id -> "Invalid entity id " + id);
ApiUsageState apiUsageState = findApiUsageStateByEntityId(entityId);
deleteApiUsageState(apiUsageState);
}
private void deleteApiUsageState(ApiUsageState apiUsageState) {
if (apiUsageState != null) {
apiUsageStateDao.removeById(apiUsageState.getTenantId(), apiUsageState.getUuidId());
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(apiUsageState.getTenantId()).entityId(apiUsageState.getId()).build());
}
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
ApiUsageState apiUsageState = findApiUsageStateById(tenantId, (ApiUsageStateId) id);
deleteApiUsageState(apiUsageState);
}
@Override
public ApiUsageState createDefaultApiUsageState(TenantId tenantId, EntityId entityId) {
entityId = Objects.requireNonNullElse(entityId, tenantId);

7
dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java

@ -322,11 +322,16 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic
}
@Override
public void deleteByTenantId(TenantId tenantId) {
public void deleteAllByTenantId(TenantId tenantId) {
log.trace("Executing deleteByTenantId, tenantId [{}]", tenantId);
usersRemover.removeEntities(tenantId, tenantId);
}
@Override
public void deleteByTenantId(TenantId tenantId) {
deleteAllByTenantId(tenantId);
}
@Override
public PageData<User> findCustomerUsers(TenantId tenantId, CustomerId customerId, PageLink pageLink) {
log.trace("Executing findCustomerUsers, tenantId [{}], customerId [{}], pageLink [{}]", tenantId, customerId, pageLink);

5
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java

@ -115,6 +115,11 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(widgetTypeId).build());
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
deleteWidgetType(tenantId, (WidgetTypeId) id);
}
@Override
public PageData<WidgetTypeInfo> findSystemWidgetTypesByPageLink(TenantId tenantId, boolean fullSearch, DeprecatedFilter deprecatedFilter, List<String> widgetTypes, PageLink pageLink) {
log.trace("Executing findSystemWidgetTypesByPageLink, fullSearch [{}], deprecatedFilter [{}], widgetTypes [{}], pageLink [{}]", fullSearch, deprecatedFilter, widgetTypes, pageLink);

22
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java

@ -92,12 +92,21 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
public void deleteWidgetsBundle(TenantId tenantId, WidgetsBundleId widgetsBundleId) {
log.trace("Executing deleteWidgetsBundle [{}]", widgetsBundleId);
Validator.validateId(widgetsBundleId, id -> "Incorrect widgetsBundleId " + id);
WidgetsBundle widgetsBundle = findWidgetsBundleById(tenantId, widgetsBundleId);
deleteEntity(tenantId, widgetsBundleId, false);
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
WidgetsBundle widgetsBundle = findWidgetsBundleById(tenantId, (WidgetsBundleId) id);
if (widgetsBundle == null) {
throw new IncorrectParameterException("Unable to delete non-existent widgets bundle.");
if (force) {
return;
} else {
throw new IncorrectParameterException("Unable to delete non-existent widgets bundle.");
}
}
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(widgetsBundleId).build());
widgetsBundleDao.removeById(tenantId, widgetsBundleId.getId());
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(id).build());
widgetsBundleDao.removeById(tenantId, id.getId());
}
@Override
@ -189,11 +198,6 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
return Optional.ofNullable(findWidgetsBundleById(tenantId, new WidgetsBundleId(entityId.getId())));
}
@Override
public void deleteEntity(TenantId tenantId, EntityId id) {
deleteWidgetsBundle(tenantId, (WidgetsBundleId) id);
}
@Override
public EntityType getEntityType() {
return EntityType.WIDGETS_BUNDLE;

55
dao/src/test/java/org/thingsboard/server/dao/service/EntityDaoRegistryTest.java

@ -0,0 +1,55 @@
/**
* Copyright © 2016-2024 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.dao.service;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.entity.EntityDaoRegistry;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
@Slf4j
@DaoSqlTest
public class EntityDaoRegistryTest extends AbstractServiceTest {
@Autowired
EntityDaoRegistry entityDaoRegistry;
@Test
public void givenAllEntityTypes_whenGetDao_thenAllPresent() {
for (EntityType entityType : EntityType.values()) {
Dao<?> dao = assertDoesNotThrow(() -> entityDaoRegistry.getDao(entityType));
assertThat(dao).isNotNull();
}
}
@Test
public void givenAllDaos_whenFindById_thenOk() {
for (EntityType entityType : EntityType.values()) {
assertDoesNotThrow(() -> {
entityDaoRegistry.getDao(entityType).findById(TenantId.SYS_TENANT_ID, UUID.randomUUID());
});
}
}
}
Loading…
Cancel
Save