From 79d655eedce0891b2b4c78238208f81fa706ce11 Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Fri, 6 Oct 2023 21:46:08 +0200 Subject: [PATCH 1/5] removed deprecadted methods --- .../server/controller/AlarmController.java | 12 +- .../server/controller/AssetController.java | 2 +- .../server/controller/DeviceController.java | 2 +- .../entitiy/AbstractTbEntityService.java | 20 +-- .../entitiy/asset/DefaultTbAssetService.java | 7 +- .../service/entitiy/asset/TbAssetService.java | 3 +- .../device/DefaultTbDeviceService.java | 7 +- .../entitiy/device/TbDeviceService.java | 2 +- .../DefaultAlarmSubscriptionService.java | 80 ++--------- .../controller/AlarmControllerTest.java | 65 ++++++++- .../controller/AssetControllerTest.java | 36 +++++ .../controller/DeviceControllerTest.java | 37 +++++ .../notification/NotificationRuleApiTest.java | 8 +- .../dao/alarm/AlarmOperationResult.java | 64 --------- .../server/dao/alarm/AlarmService.java | 29 +--- .../server/dao/alarm/BaseAlarmService.java | 133 ++---------------- .../dao/service/AlarmCommentServiceTest.java | 11 +- .../server/dao/service/AlarmServiceTest.java | 52 +++---- .../engine/api/RuleEngineAlarmService.java | 26 +--- 19 files changed, 224 insertions(+), 372 deletions(-) delete mode 100644 common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmOperationResult.java diff --git a/application/src/main/java/org/thingsboard/server/controller/AlarmController.java b/application/src/main/java/org/thingsboard/server/controller/AlarmController.java index 4e6e1d5824..6192a88e51 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AlarmController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AlarmController.java @@ -286,7 +286,7 @@ public class AlarmController extends BaseController { } TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime); - return checkNotNull(alarmService.findAlarms(getCurrentUser().getTenantId(), new AlarmQuery(entityId, pageLink, alarmSearchStatus, alarmStatus, assigneeUserId, fetchOriginator)).get()); + return checkNotNull(alarmService.findAlarms(getCurrentUser().getTenantId(), new AlarmQuery(entityId, pageLink, alarmSearchStatus, alarmStatus, assigneeUserId, fetchOriginator))); } @ApiOperation(value = "Get All Alarms (getAllAlarms)", @@ -335,9 +335,9 @@ public class AlarmController extends BaseController { TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime); if (getCurrentUser().isCustomerUser()) { - return checkNotNull(alarmService.findCustomerAlarms(getCurrentUser().getTenantId(), getCurrentUser().getCustomerId(), new AlarmQuery(null, pageLink, alarmSearchStatus, alarmStatus, assigneeUserId, fetchOriginator)).get()); + return checkNotNull(alarmService.findCustomerAlarms(getCurrentUser().getTenantId(), getCurrentUser().getCustomerId(), new AlarmQuery(null, pageLink, alarmSearchStatus, alarmStatus, assigneeUserId, fetchOriginator))); } else { - return checkNotNull(alarmService.findAlarms(getCurrentUser().getTenantId(), new AlarmQuery(null, pageLink, alarmSearchStatus, alarmStatus, assigneeUserId, fetchOriginator)).get()); + return checkNotNull(alarmService.findAlarms(getCurrentUser().getTenantId(), new AlarmQuery(null, pageLink, alarmSearchStatus, alarmStatus, assigneeUserId, fetchOriginator))); } } @@ -402,7 +402,7 @@ public class AlarmController extends BaseController { } TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime); - return checkNotNull(alarmService.findAlarmsV2(getCurrentUser().getTenantId(), new AlarmQueryV2(entityId, pageLink, alarmTypeList, alarmStatusList, alarmSeverityList, assigneeUserId)).get()); + return checkNotNull(alarmService.findAlarmsV2(getCurrentUser().getTenantId(), new AlarmQueryV2(entityId, pageLink, alarmTypeList, alarmStatusList, alarmSeverityList, assigneeUserId))); } @ApiOperation(value = "Get All Alarms (getAllAlarmsV2)", @@ -461,9 +461,9 @@ public class AlarmController extends BaseController { TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime); if (getCurrentUser().isCustomerUser()) { - return checkNotNull(alarmService.findCustomerAlarmsV2(getCurrentUser().getTenantId(), getCurrentUser().getCustomerId(), new AlarmQueryV2(null, pageLink, alarmTypeList, alarmStatusList, alarmSeverityList, assigneeUserId)).get()); + return checkNotNull(alarmService.findCustomerAlarmsV2(getCurrentUser().getTenantId(), getCurrentUser().getCustomerId(), new AlarmQueryV2(null, pageLink, alarmTypeList, alarmStatusList, alarmSeverityList, assigneeUserId))); } else { - return checkNotNull(alarmService.findAlarmsV2(getCurrentUser().getTenantId(), new AlarmQueryV2(null, pageLink, alarmTypeList, alarmStatusList, alarmSeverityList, assigneeUserId)).get()); + return checkNotNull(alarmService.findAlarmsV2(getCurrentUser().getTenantId(), new AlarmQueryV2(null, pageLink, alarmTypeList, alarmStatusList, alarmSeverityList, assigneeUserId))); } } diff --git a/application/src/main/java/org/thingsboard/server/controller/AssetController.java b/application/src/main/java/org/thingsboard/server/controller/AssetController.java index 510fefe305..7e64ec428a 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AssetController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AssetController.java @@ -153,7 +153,7 @@ public class AssetController extends BaseController { checkParameter(ASSET_ID, strAssetId); AssetId assetId = new AssetId(toUUID(strAssetId)); Asset asset = checkAssetId(assetId, Operation.DELETE); - tbAssetService.delete(asset, getCurrentUser()).get(); + tbAssetService.delete(asset, getCurrentUser()); } @ApiOperation(value = "Assign asset to customer (assignAssetToCustomer)", diff --git a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java index d73915b617..c05cf5cd6c 100644 --- a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java +++ b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java @@ -229,7 +229,7 @@ public class DeviceController extends BaseController { checkParameter(DEVICE_ID, strDeviceId); DeviceId deviceId = new DeviceId(toUUID(strDeviceId)); Device device = checkDeviceId(deviceId, Operation.DELETE); - tbDeviceService.delete(device, getCurrentUser()).get(); + tbDeviceService.delete(device, getCurrentUser()); } @ApiOperation(value = "Assign device to customer (assignDeviceToCustomer)", diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/AbstractTbEntityService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/AbstractTbEntityService.java index 11ff6a3321..9f724261a4 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/AbstractTbEntityService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/AbstractTbEntityService.java @@ -29,7 +29,6 @@ import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.alarm.AlarmQuery; import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; import org.thingsboard.server.common.data.exception.ThingsboardException; -import org.thingsboard.server.common.data.id.AlarmId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityIdFactory; import org.thingsboard.server.common.data.id.TenantId; @@ -46,7 +45,6 @@ import org.thingsboard.server.service.telemetry.AlarmSubscriptionService; import java.util.List; import java.util.Optional; import java.util.UUID; -import java.util.stream.Collectors; @Slf4j public abstract class AbstractTbEntityService { @@ -63,26 +61,22 @@ public abstract class AbstractTbEntityService { protected EdgeService edgeService; @Autowired protected AlarmService alarmService; - @Autowired @Lazy + @Autowired + @Lazy protected AlarmSubscriptionService alarmSubscriptionService; @Autowired protected CustomerService customerService; @Autowired protected TbClusterService tbClusterService; - @Autowired(required = false) @Lazy + @Autowired(required = false) + @Lazy private EntitiesVersionControlService vcService; - protected ListenableFuture removeAlarmsByEntityId(TenantId tenantId, EntityId entityId) { - ListenableFuture> alarmsFuture = + protected void removeAlarmsByEntityId(TenantId tenantId, EntityId entityId) { + PageData alarms = alarmService.findAlarms(tenantId, new AlarmQuery(entityId, new TimePageLink(Integer.MAX_VALUE), null, null, null, false)); - ListenableFuture> alarmIdsFuture = Futures.transform(alarmsFuture, page -> - page.getData().stream().map(AlarmInfo::getId).collect(Collectors.toList()), dbExecutor); - - return Futures.transform(alarmIdsFuture, ids -> { - ids.stream().map(alarmId -> alarmService.deleteAlarm(tenantId, alarmId)).collect(Collectors.toList()); - return null; - }, dbExecutor); + alarms.getData().stream().map(AlarmInfo::getId).forEach(alarmId -> alarmService.delAlarm(tenantId, alarmId)); } protected T checkNotNull(T reference) throws ThingsboardException { diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/asset/DefaultTbAssetService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/asset/DefaultTbAssetService.java index 6510ecfb7f..5e49a315c3 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/asset/DefaultTbAssetService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/asset/DefaultTbAssetService.java @@ -15,9 +15,9 @@ */ package org.thingsboard.server.service.entitiy.asset; -import com.google.common.util.concurrent.ListenableFuture; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.User; @@ -72,15 +72,16 @@ public class DefaultTbAssetService extends AbstractTbEntityService implements Tb } @Override - public ListenableFuture delete(Asset asset, User user) { + @Transactional + public void delete(Asset asset, User user) { ActionType actionType = ActionType.DELETED; TenantId tenantId = asset.getTenantId(); AssetId assetId = asset.getId(); try { + removeAlarmsByEntityId(tenantId, assetId); assetService.deleteAsset(tenantId, assetId); notificationEntityService.logEntityAction(tenantId, assetId, asset, asset.getCustomerId(), actionType, user, assetId.toString()); tbClusterService.broadcastEntityStateChangeEvent(tenantId, assetId, ComponentLifecycleEvent.DELETED); - return removeAlarmsByEntityId(tenantId, assetId); } catch (Exception e) { notificationEntityService.logEntityAction(tenantId, emptyId(EntityType.ASSET), actionType, user, e, assetId.toString()); diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/asset/TbAssetService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/asset/TbAssetService.java index b966eb8c6a..8b175599cf 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/asset/TbAssetService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/asset/TbAssetService.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.service.entitiy.asset; -import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.asset.Asset; @@ -28,7 +27,7 @@ public interface TbAssetService { Asset save(Asset asset, User user) throws Exception; - ListenableFuture delete(Asset asset, User user); + void delete(Asset asset, User user); Asset assignAssetToCustomer(TenantId tenantId, AssetId assetId, Customer customer, User user) throws ThingsboardException; diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/device/DefaultTbDeviceService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/device/DefaultTbDeviceService.java index 544a199498..ac2d656ba6 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/device/DefaultTbDeviceService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/device/DefaultTbDeviceService.java @@ -21,6 +21,7 @@ import com.google.common.util.concurrent.MoreExecutors; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EntityType; @@ -91,15 +92,15 @@ public class DefaultTbDeviceService extends AbstractTbEntityService implements T } @Override - public ListenableFuture delete(Device device, User user) { + @Transactional + public void delete(Device device, User user) { TenantId tenantId = device.getTenantId(); DeviceId deviceId = device.getId(); try { + removeAlarmsByEntityId(tenantId, deviceId); deviceService.deleteDevice(tenantId, deviceId); notificationEntityService.notifyDeleteDevice(tenantId, deviceId, device.getCustomerId(), device, user, deviceId.toString()); - - return removeAlarmsByEntityId(tenantId, deviceId); } catch (Exception e) { notificationEntityService.logEntityAction(tenantId, emptyId(EntityType.DEVICE), ActionType.DELETED, user, e, deviceId.toString()); diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/device/TbDeviceService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/device/TbDeviceService.java index e9665c6e3e..ef44b3679e 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/device/TbDeviceService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/device/TbDeviceService.java @@ -35,7 +35,7 @@ public interface TbDeviceService { Device saveDeviceWithCredentials(Device device, DeviceCredentials deviceCredentials, User user) throws ThingsboardException; - ListenableFuture delete(Device device, User user); + void delete(Device device, User user); Device assignDeviceToCustomer(TenantId tenantId, DeviceId deviceId, Customer customer, User user) throws ThingsboardException; diff --git a/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultAlarmSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultAlarmSubscriptionService.java index 005ebd268a..cc2c8966e5 100644 --- a/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultAlarmSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultAlarmSubscriptionService.java @@ -53,7 +53,6 @@ import org.thingsboard.server.common.data.query.AlarmDataQuery; import org.thingsboard.server.common.msg.notification.NotificationRuleProcessor; import org.thingsboard.server.common.msg.queue.TbCallback; import org.thingsboard.server.common.stats.TbApiUsageReportClient; -import org.thingsboard.server.dao.alarm.AlarmOperationResult; import org.thingsboard.server.dao.alarm.AlarmService; import org.thingsboard.server.service.apiusage.TbApiUsageStateService; import org.thingsboard.server.service.entitiy.alarm.TbAlarmCommentService; @@ -115,31 +114,6 @@ public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService return withWsCallback(alarmService.unassignAlarm(tenantId, alarmId, assignTs)); } - @Override - public Alarm createOrUpdateAlarm(Alarm alarm) { - AlarmOperationResult result = alarmService.createOrUpdateAlarm(alarm, apiUsageStateService.getApiUsageState(alarm.getTenantId()).isAlarmCreationEnabled()); - if (result.isSuccessful()) { - onAlarmUpdated(result); - AlarmSeverity oldSeverity = result.getOldSeverity(); - if (oldSeverity != null && !oldSeverity.equals(result.getAlarm().getSeverity())) { - AlarmComment alarmComment = AlarmComment.builder() - .alarmId(alarm.getId()) - .type(AlarmCommentType.SYSTEM) - .comment(JacksonUtil.newObjectNode().put("text", String.format("Alarm severity was updated from %s to %s", oldSeverity, result.getAlarm().getSeverity()))) - .build(); - try { - alarmCommentService.saveAlarmComment(alarm, alarmComment, null); - } catch (ThingsboardException e) { - log.error("Failed to save alarm comment", e); - } - } - } - if (result.isCreated()) { - apiUsageClient.report(alarm.getTenantId(), null, ApiUsageRecordKey.CREATED_ALARMS_COUNT); - } - return result.getAlarm(); - } - @Override public Boolean deleteAlarm(TenantId tenantId, AlarmId alarmId) { AlarmApiCallResult result = alarmService.delAlarm(tenantId, alarmId); @@ -147,26 +121,6 @@ public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService return result.isSuccessful(); } - @Override - public ListenableFuture ackAlarm(TenantId tenantId, AlarmId alarmId, long ackTs) { - ListenableFuture result = Futures.immediateFuture(alarmService.acknowledgeAlarm(tenantId, alarmId, ackTs)); - Futures.addCallback(result, new AlarmUpdateCallback(), wsCallBackExecutor); - return Futures.transform(result, AlarmApiCallResult::isSuccessful, wsCallBackExecutor); - } - - @Override - public ListenableFuture clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs) { - AlarmApiCallResult result = alarmService.clearAlarm(tenantId, alarmId, clearTs, details); - return Futures.transform(Futures.immediateFuture(result), AlarmApiCallResult::isSuccessful, wsCallBackExecutor); - } - - @Override - public ListenableFuture clearAlarmForResult(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs) { - AlarmApiCallResult result = alarmService.clearAlarm(tenantId, alarmId, clearTs, details); - Futures.addCallback(Futures.immediateFuture(result), new AlarmUpdateCallback(), wsCallBackExecutor); - return Futures.immediateFuture(new AlarmOperationResult(result)); - } - @Override public ListenableFuture findAlarmByIdAsync(TenantId tenantId, AlarmId alarmId) { return alarmService.findAlarmByIdAsync(tenantId, alarmId); @@ -183,22 +137,22 @@ public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService } @Override - public ListenableFuture> findAlarms(TenantId tenantId, AlarmQuery query) { + public PageData findAlarms(TenantId tenantId, AlarmQuery query) { return alarmService.findAlarms(tenantId, query); } @Override - public ListenableFuture> findCustomerAlarms(TenantId tenantId, CustomerId customerId, AlarmQuery query) { + public PageData findCustomerAlarms(TenantId tenantId, CustomerId customerId, AlarmQuery query) { return alarmService.findCustomerAlarms(tenantId, customerId, query); } @Override - public ListenableFuture> findAlarmsV2(TenantId tenantId, AlarmQueryV2 query) { + public PageData findAlarmsV2(TenantId tenantId, AlarmQueryV2 query) { return alarmService.findAlarmsV2(tenantId, query); } @Override - public ListenableFuture> findCustomerAlarmsV2(TenantId tenantId, CustomerId customerId, AlarmQueryV2 query) { + public PageData findCustomerAlarmsV2(TenantId tenantId, CustomerId customerId, AlarmQueryV2 query) { return alarmService.findCustomerAlarmsV2(tenantId, customerId, query); } @@ -218,23 +172,8 @@ public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService } @Override - public ListenableFuture findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { - return alarmService.findLatestByOriginatorAndType(tenantId, originator, type); - } - - @Deprecated - private void onAlarmUpdated(AlarmOperationResult result) { - wsCallBackExecutor.submit(() -> { - AlarmInfo alarm = new AlarmInfo(result.getAlarm()); - TenantId tenantId = alarm.getTenantId(); - for (EntityId entityId : result.getPropagatedEntitiesList()) { - forwardToSubscriptionManagerService(tenantId, entityId, subscriptionManagerService -> { - subscriptionManagerService.onAlarmUpdate(tenantId, entityId, alarm, TbCallback.EMPTY); - }, () -> { - return TbSubscriptionUtils.toAlarmUpdateProto(tenantId, entityId, alarm); - }); - } - }); + public Alarm findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { + return alarmService.findLatestActiveByOriginatorAndType(tenantId, originator, type); } @Override @@ -248,10 +187,9 @@ public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService TenantId tenantId = alarm.getTenantId(); for (EntityId entityId : result.getPropagatedEntitiesList()) { forwardToSubscriptionManagerService(tenantId, entityId, subscriptionManagerService -> { - subscriptionManagerService.onAlarmUpdate(tenantId, entityId, alarm, TbCallback.EMPTY); - }, () -> { - return TbSubscriptionUtils.toAlarmUpdateProto(tenantId, entityId, alarm); - }); + subscriptionManagerService.onAlarmUpdate(tenantId, entityId, alarm, TbCallback.EMPTY); + }, () -> TbSubscriptionUtils.toAlarmUpdateProto(tenantId, entityId, alarm) + ); } notificationRuleProcessor.process(AlarmTrigger.builder() .tenantId(tenantId) diff --git a/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java index 0e6eb16713..e865f8e115 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java @@ -41,6 +41,8 @@ import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmStatus; import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.id.AlarmId; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.dao.alarm.AlarmDao; @@ -48,6 +50,7 @@ import org.thingsboard.server.dao.service.DaoSqlTest; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; @@ -806,10 +809,14 @@ public class AlarmControllerTest extends AbstractControllerTest { } private AlarmInfo createAlarm(String type) throws Exception { + return createAlarm(type, customerDevice.getId(), customerId); + } + + private AlarmInfo createAlarm(String type, EntityId originatorId, CustomerId customerId) throws Exception { Alarm alarm = Alarm.builder() .tenantId(tenantId) .customerId(customerId) - .originator(customerDevice.getId()) + .originator(originatorId) .severity(AlarmSeverity.CRITICAL) .type(type) .build(); @@ -963,4 +970,60 @@ public class AlarmControllerTest extends AbstractControllerTest { Assert.assertTrue(foundTypes.isEmpty()); } + @Test + public void testDeleteAlarmTypesAfterDeletingAlarmOriginator() throws Exception { + loginTenantAdmin(); + + List devices = new ArrayList<>(); + List types = new ArrayList<>(); + + for (int i = 0; i < 13; i++) { + Device device = new Device(); + device.setName("Test_device_" + i); + devices.add(device = doPost("/api/device", device, Device.class)); + types.add(createAlarm(TEST_ALARM_TYPE + i, device.getId(), null).getType()); + } + + devices.sort(Comparator.comparing(Device::getName)); + Collections.sort(types); + + List foundTypes = doGetTyped("/api/alarm/types?pageSize=1024&page=0", new TypeReference>() { + }) + .getData() + .stream() + .map(EntitySubtype::getType) + .sorted() + .collect(Collectors.toList()); + + Assert.assertEquals(13, foundTypes.size()); + Assert.assertEquals(types, foundTypes); + + for (int i = 0; i < 12; i++) { + doDelete("/api/device/" + devices.remove(0).getId()).andExpect(status().isOk()); + types.remove(0); + } + + foundTypes = doGetTyped("/api/alarm/types?pageSize=1024&page=0", new TypeReference>() { + }) + .getData() + .stream() + .map(EntitySubtype::getType) + .collect(Collectors.toList()); + + Assert.assertEquals(types.size(), foundTypes.size()); + Assert.assertEquals(types, foundTypes); + + doDelete("/api/device/" + devices.get(0).getId()).andExpect(status().isOk()); + + foundTypes = doGetTyped("/api/alarm/types?pageSize=1024&page=0", new TypeReference>() { + }) + .getData() + .stream() + .map(EntitySubtype::getType) + .sorted() + .collect(Collectors.toList()); + + Assert.assertTrue(foundTypes.isEmpty()); + } + } diff --git a/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java index 88a8b939b8..ae60bfee3b 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java @@ -34,6 +34,9 @@ import org.thingsboard.server.common.data.EntityView; import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.User; +import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmInfo; +import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.AssetProfile; import org.thingsboard.server.common.data.audit.ActionType; @@ -291,6 +294,39 @@ public class AssetControllerTest extends AbstractControllerTest { .andExpect(statusReason(containsString(msgErrorNoFound("Asset", assetIdStr)))); } + @Test + public void testDeleteAssetWithAlarmsAndAlarmTypes() throws Exception { + Asset asset = new Asset(); + asset.setName("My asset"); + asset.setType("default"); + Asset savedAsset = doPost("/api/asset", asset, Asset.class); + + Alarm alarm = Alarm.builder() + .tenantId(tenantId) + .originator(savedAsset.getId()) + .severity(AlarmSeverity.CRITICAL) + .type("test_type") + .build(); + + alarm = doPost("/api/alarm", alarm, Alarm.class); + Assert.assertNotNull(alarm); + + AlarmInfo foundAlarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class); + Assert.assertNotNull(foundAlarm); + + doDelete("/api/asset/" + savedAsset.getId().getId().toString()) + .andExpect(status().isOk()); + + String assetIdStr = savedAsset.getId().getId().toString(); + doGet("/api/asset/" + assetIdStr) + .andExpect(status().isNotFound()) + .andExpect(statusReason(containsString(msgErrorNoFound("Asset", assetIdStr)))); + + doGet("/api/alarm/info/" + alarm.getId()) + .andExpect(status().isNotFound()) + .andExpect(statusReason(containsString(msgErrorNoFound("Alarm", alarm.getId().getId().toString())))); + } + @Test public void testDeleteAssetAssignedToEntityView() throws Exception { Asset asset1 = new Asset(); diff --git a/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java index 5cc9c3dc91..70fffad837 100644 --- a/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java @@ -48,6 +48,10 @@ import org.thingsboard.server.common.data.SaveOtaPackageInfoRequest; import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.User; +import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmInfo; +import org.thingsboard.server.common.data.alarm.AlarmSeverity; +import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.id.CustomerId; @@ -504,6 +508,39 @@ public class DeviceControllerTest extends AbstractControllerTest { .andExpect(statusReason(containsString(msgErrorNoFound("Device", savedDeviceId.getId().toString())))); } + @Test + public void testDeleteDeviceWithAlarmsAndAlarmTypes() throws Exception { + Device device = new Device(); + device.setName("My device"); + device.setType("default"); + Device savedDevice = doPost("/api/device", device, Device.class); + + Alarm alarm = Alarm.builder() + .tenantId(tenantId) + .originator(savedDevice.getId()) + .severity(AlarmSeverity.CRITICAL) + .type("test_type") + .build(); + + alarm = doPost("/api/alarm", alarm, Alarm.class); + Assert.assertNotNull(alarm); + + AlarmInfo foundAlarm = doGet("/api/alarm/info/" + alarm.getId(), AlarmInfo.class); + Assert.assertNotNull(foundAlarm); + + doDelete("/api/device/" + savedDevice.getId().getId().toString()) + .andExpect(status().isOk()); + + String DeviceIdStr = savedDevice.getId().getId().toString(); + doGet("/api/device/" + DeviceIdStr) + .andExpect(status().isNotFound()) + .andExpect(statusReason(containsString(msgErrorNoFound("Device", DeviceIdStr)))); + + doGet("/api/device/info/" + alarm.getId()) + .andExpect(status().isNotFound()) + .andExpect(statusReason(containsString(msgErrorNoFound("Alarm", alarm.getId().getId().toString())))); + } + @Test public void testSaveDeviceWithEmptyType() throws Exception { Device device = new Device(); diff --git a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java index 0a2854a28d..f2531a2561 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java @@ -230,8 +230,8 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { doPost("/api/plugins/telemetry/" + device.getId() + "/" + DataConstants.SHARED_SCOPE, attr); await().atMost(10, TimeUnit.SECONDS) - .until(() -> alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType).get() != null); - Alarm alarm = alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType).get(); + .until(() -> alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType) != null); + Alarm alarm = alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType); long ts = System.currentTimeMillis(); await().atMost(15, TimeUnit.SECONDS) @@ -313,8 +313,8 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { doPost("/api/plugins/telemetry/" + device.getId() + "/" + DataConstants.SHARED_SCOPE, attr); await().atMost(10, TimeUnit.SECONDS) - .until(() -> alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType).get() != null); - Alarm alarm = alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType).get(); + .until(() -> alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType) != null); + Alarm alarm = alarmSubscriptionService.findLatestByOriginatorAndType(tenantId, device.getId(), alarmType); getWsClient().waitForUpdate(true); Notification notification = getWsClient().getLastDataUpdate().getUpdate(); diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmOperationResult.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmOperationResult.java deleted file mode 100644 index bae7c52ee7..0000000000 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmOperationResult.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright © 2016-2023 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.alarm; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import org.thingsboard.server.common.data.alarm.Alarm; -import org.thingsboard.server.common.data.alarm.AlarmApiCallResult; -import org.thingsboard.server.common.data.alarm.AlarmSeverity; -import org.thingsboard.server.common.data.id.EntityId; - -import java.util.Collections; -import java.util.List; - -@Builder -@Data -@AllArgsConstructor -@Deprecated -public class AlarmOperationResult { - private final Alarm alarm; - private final boolean successful; - private final boolean created; - private final AlarmSeverity oldSeverity; - private final List propagatedEntitiesList; - - public AlarmOperationResult(Alarm alarm, boolean successful) { - this(alarm, successful, Collections.emptyList()); - } - - public AlarmOperationResult(Alarm alarm, boolean successful, List propagatedEntitiesList) { - this(alarm, successful, false, null, propagatedEntitiesList); - } - - public AlarmOperationResult(Alarm alarm, boolean successful, boolean created, List propagatedEntitiesList) { - this.alarm = alarm; - this.successful = successful; - this.created = created; - this.propagatedEntitiesList = propagatedEntitiesList; - this.oldSeverity = null; - } - - //Temporary while we have not removed the AlarmOperationResult. - public AlarmOperationResult(AlarmApiCallResult result) { - this.alarm = result.getAlarm() != null ? new Alarm(result.getAlarm()) : null; - this.successful = result.isSuccessful() && (result.isCreated() || result.isModified()); - this.created = result.isCreated(); - this.oldSeverity = result.getOldSeverity(); - this.propagatedEntitiesList = result.getPropagatedEntitiesList(); - } -} diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java index 5c8b88e4b8..05007f42a7 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java @@ -81,27 +81,6 @@ public interface AlarmService extends EntityDaoService { void delAlarmTypes(TenantId tenantId, Set types); - /* - * Legacy API, before 3.5. - */ - @Deprecated(since = "3.5.0", forRemoval = true) - AlarmOperationResult createOrUpdateAlarm(Alarm alarm); - - @Deprecated(since = "3.5.0", forRemoval = true) - AlarmOperationResult createOrUpdateAlarm(Alarm alarm, boolean alarmCreationEnabled); - - @Deprecated(since = "3.5.0", forRemoval = true) - ListenableFuture ackAlarm(TenantId tenantId, AlarmId alarmId, long ackTs); - - @Deprecated(since = "3.5.0", forRemoval = true) - ListenableFuture clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs); - - @Deprecated(since = "3.5.0", forRemoval = true) - AlarmOperationResult deleteAlarm(TenantId tenantId, AlarmId alarmId); - - @Deprecated(since = "3.5.0", forRemoval = true) - ListenableFuture findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type); - // Other API Alarm findAlarmById(TenantId tenantId, AlarmId alarmId); @@ -109,13 +88,13 @@ public interface AlarmService extends EntityDaoService { AlarmInfo findAlarmInfoById(TenantId tenantId, AlarmId alarmId); - ListenableFuture> findAlarms(TenantId tenantId, AlarmQuery query); + PageData findAlarms(TenantId tenantId, AlarmQuery query); - ListenableFuture> findCustomerAlarms(TenantId tenantId, CustomerId customerId, AlarmQuery query); + PageData findCustomerAlarms(TenantId tenantId, CustomerId customerId, AlarmQuery query); - ListenableFuture> findAlarmsV2(TenantId tenantId, AlarmQueryV2 query); + PageData findAlarmsV2(TenantId tenantId, AlarmQueryV2 query); - ListenableFuture> findCustomerAlarmsV2(TenantId tenantId, CustomerId customerId, AlarmQueryV2 query); + PageData findCustomerAlarmsV2(TenantId tenantId, CustomerId customerId, AlarmQueryV2 query); AlarmSeverity findHighestAlarmSeverity(TenantId tenantId, EntityId entityId, AlarmSearchStatus alarmSearchStatus, AlarmStatus alarmStatus, String assigneeId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index 33f6ac0265..4d085c8e3f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.alarm; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.base.Function; -import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -162,51 +161,11 @@ public class BaseAlarmService extends AbstractCachedEntityService findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { - return alarmDao.findLatestByOriginatorAndTypeAsync(tenantId, originator, type); - } - @Override public PageData findAlarmDataByQueryForEntities(TenantId tenantId, AlarmDataQuery query, Collection orderedEntityIds) { @@ -248,27 +207,6 @@ public class BaseAlarmService extends AbstractCachedEntityService(getPropagationEntityIds(alarm))); - deleteEntityRelations(tenantId, alarm.getId()); - alarmDao.removeById(tenantId, alarm.getUuidId()); - return result; - } - - private AlarmOperationResult createAlarm(Alarm alarm) throws InterruptedException, ExecutionException { - log.debug("New Alarm : {}", alarm); - Alarm saved = alarmDao.save(alarm.getTenantId(), alarm); - List propagatedEntitiesList = createEntityAlarmRecords(saved); - return new AlarmOperationResult(saved, true, true, propagatedEntitiesList); - } - private List createEntityAlarmRecords(Alarm alarm) throws ExecutionException, InterruptedException { Set propagatedEntitiesSet = new LinkedHashSet<>(); propagatedEntitiesSet.add(alarm.getOriginator()); @@ -299,61 +237,6 @@ public class BaseAlarmService extends AbstractCachedEntityService alarm == null ? null : updateAlarm(alarm, update)); - } - - private AlarmOperationResult updateAlarm(Alarm oldAlarm, Alarm newAlarm) { - boolean propagationEnabled = !oldAlarm.isPropagate() && newAlarm.isPropagate(); - boolean propagationToOwnerEnabled = !oldAlarm.isPropagateToOwner() && newAlarm.isPropagateToOwner(); - boolean propagationToTenantEnabled = !oldAlarm.isPropagateToTenant() && newAlarm.isPropagateToTenant(); - AlarmSeverity oldAlarmSeverity = oldAlarm.getSeverity(); - Alarm result = alarmDao.save(newAlarm.getTenantId(), merge(oldAlarm, newAlarm)); - List propagatedEntitiesList; - if (propagationEnabled || propagationToOwnerEnabled || propagationToTenantEnabled) { - try { - propagatedEntitiesList = createEntityAlarmRecords(result); - } catch (InterruptedException | ExecutionException e) { - log.warn("Failed to update alarm relations [{}]", result, e); - throw new RuntimeException(e); - } - } else { - propagatedEntitiesList = new ArrayList<>(getPropagationEntityIds(result)); - } - return new AlarmOperationResult(result, true, false, oldAlarmSeverity, propagatedEntitiesList); - } - - @Override - public ListenableFuture ackAlarm(TenantId tenantId, AlarmId alarmId, long ackTime) { - Alarm alarm = alarmDao.findAlarmById(tenantId, alarmId.getId()); - if (alarm == null || alarm.getStatus().isAck()) { - return Futures.immediateFuture(new AlarmOperationResult(alarm, false)); - } else { - alarm.setAcknowledged(true); - alarm.setAckTs(ackTime); - alarm = alarmDao.save(alarm.getTenantId(), alarm); - return Futures.immediateFuture(new AlarmOperationResult(alarm, true, new ArrayList<>(getPropagationEntityIds(alarm)))); - } - } - - @Override - public ListenableFuture clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTime) { - Alarm alarm = alarmDao.findAlarmById(tenantId, alarmId.getId()); - if (alarm == null || alarm.getStatus().isCleared()) { - return Futures.immediateFuture(new AlarmOperationResult(alarm, false)); - } else { - alarm.setCleared(true); - alarm.setClearTs(clearTime); - if (details != null) { - alarm.setDetails(details); - } - alarm = alarmDao.save(alarm.getTenantId(), alarm); - return Futures.immediateFuture(new AlarmOperationResult(alarm, true, new ArrayList<>(getPropagationEntityIds(alarm)))); - } - } - @Override public AlarmApiCallResult assignAlarm(TenantId tenantId, AlarmId alarmId, UserId assigneeId, long assignTime) { var result = withPropagated(alarmDao.assignAlarm(tenantId, alarmId, assigneeId, assignTime)); @@ -396,23 +279,23 @@ public class BaseAlarmService extends AbstractCachedEntityService> findAlarms(TenantId tenantId, AlarmQuery query) { - return Futures.immediateFuture(alarmDao.findAlarms(tenantId, query)); + public PageData findAlarms(TenantId tenantId, AlarmQuery query) { + return alarmDao.findAlarms(tenantId, query); } @Override - public ListenableFuture> findCustomerAlarms(TenantId tenantId, CustomerId customerId, AlarmQuery query) { - return Futures.immediateFuture(alarmDao.findCustomerAlarms(tenantId, customerId, query)); + public PageData findCustomerAlarms(TenantId tenantId, CustomerId customerId, AlarmQuery query) { + return alarmDao.findCustomerAlarms(tenantId, customerId, query); } @Override - public ListenableFuture> findAlarmsV2(TenantId tenantId, AlarmQueryV2 query) { - return Futures.immediateFuture(alarmDao.findAlarmsV2(tenantId, query)); + public PageData findAlarmsV2(TenantId tenantId, AlarmQueryV2 query) { + return alarmDao.findAlarmsV2(tenantId, query); } @Override - public ListenableFuture> findCustomerAlarmsV2(TenantId tenantId, CustomerId customerId, AlarmQueryV2 query) { - return Futures.immediateFuture(alarmDao.findCustomerAlarmsV2(tenantId, customerId, query)); + public PageData findCustomerAlarmsV2(TenantId tenantId, CustomerId customerId, AlarmQueryV2 query) { + return alarmDao.findCustomerAlarmsV2(tenantId, customerId, query); } @Override diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/AlarmCommentServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/AlarmCommentServiceTest.java index 8aa3eeb125..341eb69583 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/AlarmCommentServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/AlarmCommentServiceTest.java @@ -28,6 +28,7 @@ import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmComment; import org.thingsboard.server.common.data.alarm.AlarmCommentInfo; import org.thingsboard.server.common.data.alarm.AlarmCommentType; +import org.thingsboard.server.common.data.alarm.AlarmCreateOrUpdateActiveRequest; import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.TenantId; @@ -60,11 +61,12 @@ public class AlarmCommentServiceTest extends AbstractServiceTest { @Before public void before() { - alarm = Alarm.builder().tenantId(tenantId).originator(new AssetId(Uuids.timeBased())) + alarm = alarmService.createAlarm(AlarmCreateOrUpdateActiveRequest.builder() + .tenantId(tenantId) + .originator(new AssetId(Uuids.timeBased())) .type(TEST_ALARM) .severity(AlarmSeverity.CRITICAL) - .startTs(System.currentTimeMillis()).build(); - alarm = alarmService.createOrUpdateAlarm(alarm).getAlarm(); + .startTs(System.currentTimeMillis()).build()).getAlarm(); user = new User(); user.setAuthority(Authority.TENANT_ADMIN); @@ -77,10 +79,9 @@ public class AlarmCommentServiceTest extends AbstractServiceTest { @After public void after() { - alarmService.deleteAlarm(tenantId, alarm.getId()); + alarmService.delAlarm(tenantId, alarm.getId()); } - @Test public void testCreateAndFetchAlarmComment() throws ExecutionException, InterruptedException { AlarmComment alarmComment = AlarmComment.builder().alarmId(alarm.getId()) diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/AlarmServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/AlarmServiceTest.java index 412056855e..9d42635d3d 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/AlarmServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/AlarmServiceTest.java @@ -146,7 +146,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -157,7 +157,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(0, alarms.getData().size()); @@ -171,7 +171,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -182,7 +182,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -195,7 +195,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_ACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -206,7 +206,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(0, alarms.getData().size()); @@ -218,7 +218,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.CLEARED_ACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -245,11 +245,11 @@ public class AlarmServiceTest extends AbstractServiceTest { // Check child relation PageData alarms = alarmService.findAlarmsV2(tenantId, AlarmQueryV2.builder() .affectedEntityId(childId) - .severityList(Arrays.asList(AlarmSeverity.CRITICAL)) - .statusList(Arrays.asList(AlarmSearchStatus.ACTIVE, AlarmSearchStatus.UNACK)).pageLink( + .severityList(Arrays.asList(AlarmSeverity.CRITICAL)) + .statusList(Arrays.asList(AlarmSearchStatus.ACTIVE, AlarmSearchStatus.UNACK)).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -261,7 +261,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .statusList(Arrays.asList(AlarmSearchStatus.ACTIVE, AlarmSearchStatus.UNACK)).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(0, alarms.getData().size()); @@ -276,7 +276,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .statusList(Arrays.asList(AlarmSearchStatus.ACTIVE, AlarmSearchStatus.UNACK)).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -288,7 +288,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .statusList(Arrays.asList(AlarmSearchStatus.ACTIVE, AlarmSearchStatus.UNACK)).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -302,7 +302,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .statusList(Arrays.asList(AlarmSearchStatus.ACTIVE, AlarmSearchStatus.ACK)).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -314,7 +314,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .statusList(Arrays.asList(AlarmSearchStatus.ACTIVE, AlarmSearchStatus.UNACK)).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(0, alarms.getData().size()); @@ -327,7 +327,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .statusList(Arrays.asList(AlarmSearchStatus.CLEARED, AlarmSearchStatus.ACK)).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -371,7 +371,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .fetchOriginator(true) .pageLink(new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, alarms.getData().get(0)); @@ -466,7 +466,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(10, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(tenantAlarm, new AlarmInfo(alarms.getData().get(0))); @@ -752,7 +752,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(10, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarmsInfoData.getData()); Assert.assertEquals(1, alarmsInfoData.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarmsInfoData.getData().get(0))); @@ -763,7 +763,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(10, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarmsInfoData.getData()); Assert.assertEquals(1, alarmsInfoData.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarmsInfoData.getData().get(0))); @@ -774,7 +774,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(10, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarmsInfoData.getData()); Assert.assertEquals(1, alarmsInfoData.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarmsInfoData.getData().get(0))); @@ -899,7 +899,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); @@ -910,12 +910,12 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(1, alarms.getData().size()); Assert.assertEquals(created, new AlarmInfo(alarms.getData().get(0))); - Assert.assertTrue("Alarm was not deleted when expected", alarmService.deleteAlarm(tenantId, created.getId()).isSuccessful()); + Assert.assertTrue("Alarm was not deleted when expected", alarmService.delAlarm(tenantId, created.getId()).isSuccessful()); Alarm fetched = alarmService.findAlarmByIdAsync(tenantId, created.getId()).get(); @@ -926,7 +926,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(0, alarms.getData().size()); @@ -936,7 +936,7 @@ public class AlarmServiceTest extends AbstractServiceTest { .status(AlarmStatus.ACTIVE_UNACK).pageLink( new TimePageLink(1, 0, "", new SortOrder("createdTime", SortOrder.Direction.DESC), 0L, System.currentTimeMillis()) - ).build()).get(); + ).build()); Assert.assertNotNull(alarms.getData()); Assert.assertEquals(0, alarms.getData().size()); diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/RuleEngineAlarmService.java b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/RuleEngineAlarmService.java index ebaff2bfaf..c3955733ed 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/RuleEngineAlarmService.java +++ b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/RuleEngineAlarmService.java @@ -38,7 +38,6 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.query.AlarmData; import org.thingsboard.server.common.data.query.AlarmDataQuery; -import org.thingsboard.server.dao.alarm.AlarmOperationResult; import java.util.Collection; @@ -70,21 +69,6 @@ public interface RuleEngineAlarmService { AlarmApiCallResult unassignAlarm(TenantId tenantId, AlarmId alarmId, long assignTs); - /* - * Legacy API, before 3.5. - */ - @Deprecated(since = "3.5", forRemoval = true) - Alarm createOrUpdateAlarm(Alarm alarm); - - @Deprecated(since = "3.5", forRemoval = true) - ListenableFuture ackAlarm(TenantId tenantId, AlarmId alarmId, long ackTs); - - @Deprecated(since = "3.5", forRemoval = true) - ListenableFuture clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs); - - @Deprecated(since = "3.5", forRemoval = true) - ListenableFuture clearAlarmForResult(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs); - // Other API Boolean deleteAlarm(TenantId tenantId, AlarmId alarmId); @@ -94,7 +78,7 @@ public interface RuleEngineAlarmService { Alarm findLatestActiveByOriginatorAndType(TenantId tenantId, EntityId originator, String type); - ListenableFuture findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type); + Alarm findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type); AlarmInfo findAlarmInfoById(TenantId tenantId, AlarmId alarmId); @@ -102,13 +86,13 @@ public interface RuleEngineAlarmService { return Futures.immediateFuture(findAlarmInfoById(tenantId, alarmId)); } - ListenableFuture> findAlarms(TenantId tenantId, AlarmQuery query); + PageData findAlarms(TenantId tenantId, AlarmQuery query); - ListenableFuture> findCustomerAlarms(TenantId tenantId, CustomerId customerId, AlarmQuery query); + PageData findCustomerAlarms(TenantId tenantId, CustomerId customerId, AlarmQuery query); - ListenableFuture> findAlarmsV2(TenantId tenantId, AlarmQueryV2 query); + PageData findAlarmsV2(TenantId tenantId, AlarmQueryV2 query); - ListenableFuture> findCustomerAlarmsV2(TenantId tenantId, CustomerId customerId, AlarmQueryV2 query); + PageData findCustomerAlarmsV2(TenantId tenantId, CustomerId customerId, AlarmQueryV2 query); AlarmSeverity findHighestAlarmSeverity(TenantId tenantId, EntityId entityId, AlarmSearchStatus alarmSearchStatus, AlarmStatus alarmStatus, String assigneeId); From 6ed6cc298c6cc37aeeb5cd23a1e3876194bda2ec Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Thu, 5 Oct 2023 20:42:27 +0300 Subject: [PATCH 2/5] Refactoring for deletion of devices, assets, dashboards, users --- .../server/dao/alarm/AlarmService.java | 2 + .../dao/entityview/EntityViewService.java | 2 + .../server/dao/alarm/AlarmDao.java | 2 + .../server/dao/alarm/BaseAlarmService.java | 6 +++ .../server/dao/asset/BaseAssetService.java | 43 +++++++++--------- .../server/dao/dashboard/DashboardDao.java | 4 ++ .../dao/dashboard/DashboardServiceImpl.java | 25 +++++------ .../server/dao/device/DeviceServiceImpl.java | 45 ++++++++++--------- .../dao/entity/AbstractEntityService.java | 2 - .../server/dao/entityview/EntityViewDao.java | 2 + .../dao/entityview/EntityViewServiceImpl.java | 5 +++ .../server/dao/service/PaginatedRemover.java | 3 +- .../dao/sql/alarm/EntityAlarmRepository.java | 4 ++ .../server/dao/sql/alarm/JpaAlarmDao.java | 6 ++- .../sql/dashboard/DashboardRepository.java | 3 ++ .../dao/sql/dashboard/JpaDashboardDao.java | 5 +++ .../device/DeviceCredentialsRepository.java | 1 + .../sql/device/JpaDeviceCredentialsDao.java | 1 + .../sql/entityview/EntityViewRepository.java | 2 + .../dao/sql/entityview/JpaEntityViewDao.java | 5 +++ .../dao/sql/user/JpaUserCredentialsDao.java | 7 +++ .../sql/user/UserCredentialsRepository.java | 5 +++ .../server/dao/tenant/TenantServiceImpl.java | 3 +- .../server/dao/user/UserCredentialsDao.java | 3 ++ .../server/dao/user/UserServiceImpl.java | 8 ++-- 25 files changed, 130 insertions(+), 64 deletions(-) diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java index 5c8b88e4b8..838eeb83b2 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java @@ -129,6 +129,8 @@ public interface AlarmService extends EntityDaoService { void deleteEntityAlarmRelations(TenantId tenantId, EntityId entityId); + void deleteEntityAlarmRecordsByTenantId(TenantId tenantId); + long countAlarmsByQuery(TenantId tenantId, CustomerId customerId, AlarmCountQuery query); PageData findAlarmTypesByTenantId(TenantId tenantId, PageLink pageLink); diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java index ea9dc31b45..09bad2b48d 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java @@ -76,6 +76,8 @@ public interface EntityViewService extends EntityDaoService { List findEntityViewsByTenantIdAndEntityId(TenantId tenantId, EntityId entityId); + boolean existsByTenantIdAndEntityId(TenantId tenantId, EntityId entityId); + void deleteEntityView(TenantId tenantId, EntityViewId entityViewId); void deleteEntityViewsByTenantId(TenantId tenantId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java index 2b6594a831..9028bf33d4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java @@ -86,6 +86,8 @@ public interface AlarmDao extends Dao { void deleteEntityAlarmRecords(TenantId tenantId, EntityId entityId); + void deleteEntityAlarmRecordsByTenantId(TenantId tenantId); + AlarmApiCallResult createOrUpdateActiveAlarm(AlarmCreateOrUpdateActiveRequest request, boolean alarmCreationEnabled); AlarmApiCallResult updateAlarm(AlarmUpdateRequest request); diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index 33f6ac0265..34dd9625dc 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -440,9 +440,15 @@ public class BaseAlarmService extends AbstractCachedEntityService entityViews = entityViewService.findEntityViewsByTenantIdAndEntityId(asset.getTenantId(), assetId); - if (entityViews != null && !entityViews.isEmpty()) { + if (entityViewService.existsByTenantIdAndEntityId(tenantId, assetId)) { throw new DataValidationException("Can't delete asset that has entity views!"); } + Asset asset = assetDao.findById(tenantId, assetId.getId()); + alarmService.deleteEntityAlarmRelations(tenantId, assetId); + deleteAsset(tenantId, asset); + } + + private void deleteAsset(TenantId tenantId, Asset asset) { + relationService.deleteEntityRelations(tenantId, asset.getAssetProfileId()); + + assetDao.removeById(tenantId, asset.getUuidId()); + publishEvictEvent(new AssetCacheEvictEvent(asset.getTenantId(), asset.getName(), null)); countService.publishCountEntityEvictEvent(tenantId, EntityType.ASSET); - eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(assetId).build()); - - assetDao.removeById(tenantId, assetId.getId()); + eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(asset.getId()).build()); } @Override @@ -273,6 +276,7 @@ public class BaseAssetService extends AbstractCachedEntityService tenantAssetsRemover = - new PaginatedRemover() { + private final PaginatedRemover tenantAssetsRemover = new PaginatedRemover<>() { - @Override - protected PageData findEntities(TenantId tenantId, TenantId id, PageLink pageLink) { - return assetDao.findAssetsByTenantId(id.getId(), pageLink); - } + @Override + protected PageData findEntities(TenantId tenantId, TenantId id, PageLink pageLink) { + return assetDao.findAssetsByTenantId(id.getId(), pageLink); + } - @Override - protected void removeEntity(TenantId tenantId, Asset entity) { - deleteAsset(tenantId, new AssetId(entity.getId().getId())); - } + @Override + protected void removeEntity(TenantId tenantId, Asset asset) { + deleteAsset(tenantId, asset); + } }; - private PaginatedRemover customerAssetsUnasigner = new PaginatedRemover() { + private final PaginatedRemover customerAssetsUnasigner = new PaginatedRemover() { @Override protected PageData findEntities(TenantId tenantId, CustomerId id, PageLink pageLink) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardDao.java b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardDao.java index 387dc96554..b23bc516bb 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardDao.java @@ -18,6 +18,8 @@ package org.thingsboard.server.dao.dashboard; import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.ExportableEntityDao; import org.thingsboard.server.dao.TenantEntityDao; @@ -40,4 +42,6 @@ public interface DashboardDao extends Dao, TenantEntityDao, Exportabl List findByTenantIdAndTitle(UUID tenantId, String title); + PageData findIdsByTenantId(TenantId tenantId, PageLink pageLink); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java index c74aba5d5c..be1739bc7a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java @@ -364,19 +364,18 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb return dashboardDao.findByTenantIdAndTitle(tenantId.getId(), title); } - private PaginatedRemover tenantDashboardsRemover = - new PaginatedRemover() { - - @Override - protected PageData findEntities(TenantId tenantId, TenantId id, PageLink pageLink) { - return dashboardInfoDao.findDashboardsByTenantId(id.getId(), pageLink); - } - - @Override - protected void removeEntity(TenantId tenantId, DashboardInfo entity) { - deleteDashboard(tenantId, new DashboardId(entity.getUuidId())); - } - }; + private final PaginatedRemover tenantDashboardsRemover = new PaginatedRemover<>() { + + @Override + protected PageData findEntities(TenantId tenantId, TenantId id, PageLink pageLink) { + return dashboardDao.findIdsByTenantId(id, pageLink); + } + + @Override + protected void removeEntity(TenantId tenantId, DashboardId dashboardId) { + deleteDashboard(tenantId, dashboardId); + } + }; @Override public Optional> findEntity(TenantId tenantId, EntityId entityId) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java index 57b4c9dbe8..59d70b9ed0 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java @@ -318,24 +318,28 @@ public class DeviceServiceImpl extends AbstractCachedEntityService entityViews = entityViewService.findEntityViewsByTenantIdAndEntityId(device.getTenantId(), deviceId); - if (entityViews != null && !entityViews.isEmpty()) { + if (entityViewService.existsByTenantIdAndEntityId(tenantId, deviceId)) { throw new DataValidationException("Can't delete device that has entity views!"); } - DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, deviceId); + + Device device = deviceDao.findById(tenantId, deviceId.getId()); + alarmService.deleteEntityAlarmRelations(tenantId, deviceId); + deleteDevice(tenantId, device); + } + + private void deleteDevice(TenantId tenantId, Device device) { + DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId()); if (deviceCredentials != null) { deviceCredentialsService.deleteDeviceCredentials(tenantId, deviceCredentials); } - deleteEntityRelations(tenantId, deviceId); + relationService.deleteEntityRelations(tenantId, device.getId()); - deviceDao.removeById(tenantId, deviceId.getId()); + deviceDao.removeById(tenantId, device.getUuidId()); + DeviceCacheEvictEvent deviceCacheEvictEvent = new DeviceCacheEvictEvent(device.getTenantId(), device.getId(), device.getName(), null); publishEvictEvent(deviceCacheEvictEvent); countService.publishCountEntityEvictEvent(tenantId, EntityType.DEVICE); - eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(deviceId).build()); + eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(device.getId()).build()); } @Override @@ -650,21 +654,20 @@ public class DeviceServiceImpl extends AbstractCachedEntityService tenantDevicesRemover = - new PaginatedRemover<>() { + private final PaginatedRemover tenantDevicesRemover = new PaginatedRemover<>() { - @Override - protected PageData findEntities(TenantId tenantId, TenantId id, PageLink pageLink) { - return deviceDao.findDevicesByTenantId(id.getId(), pageLink); - } + @Override + protected PageData findEntities(TenantId tenantId, TenantId id, PageLink pageLink) { + return deviceDao.findDevicesByTenantId(id.getId(), pageLink); + } - @Override - protected void removeEntity(TenantId tenantId, Device entity) { - deleteDevice(tenantId, new DeviceId(entity.getUuidId())); - } - }; + @Override + protected void removeEntity(TenantId tenantId, Device device) { + deleteDevice(tenantId, device); + } + }; - private PaginatedRemover customerDeviceUnasigner = new PaginatedRemover() { + private final PaginatedRemover customerDeviceUnasigner = new PaginatedRemover() { @Override protected PageData findEntities(TenantId tenantId, CustomerId id, PageLink pageLink) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java b/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java index 17cd7a15d4..7c77f48710 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java @@ -74,9 +74,7 @@ public abstract class AbstractEntityService { } protected void deleteEntityRelations(TenantId tenantId, EntityId entityId) { - log.trace("Executing deleteEntityRelations [{}]", entityId); relationService.deleteEntityRelations(tenantId, entityId); - log.trace("Executing deleteEntityAlarms [{}]", entityId); alarmService.deleteEntityAlarmRelations(tenantId, entityId); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java index 132d26a406..7ce2c6fabf 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java @@ -148,6 +148,8 @@ public interface EntityViewDao extends Dao, ExportableEntityDao findEntityViewsByTenantIdAndEntityId(UUID tenantId, UUID entityId); + boolean existsByTenantIdAndEntityId(UUID tenantId, UUID entityId); + /** * Find tenants entity view types. * diff --git a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java index 4335fa5f1c..5006a2ff55 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java @@ -316,6 +316,11 @@ public class EntityViewServiceImpl extends AbstractCachedEntityService new EntityViewCacheValue(null, v), true); } + @Override + public boolean existsByTenantIdAndEntityId(TenantId tenantId, EntityId entityId) { + return entityViewDao.existsByTenantIdAndEntityId(tenantId.getId(), entityId.getId()); + } + @Override @Transactional public void deleteEntityView(TenantId tenantId, EntityViewId entityViewId) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java b/dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java index fb98a01178..c7b1173c58 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java @@ -15,12 +15,11 @@ */ package org.thingsboard.server.dao.service; -import org.thingsboard.server.common.data.id.IdBased; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; -public abstract class PaginatedRemover> { +public abstract class PaginatedRemover { private static final int DEFAULT_LIMIT = 100; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/EntityAlarmRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/EntityAlarmRepository.java index ac27435df1..f6250e98f0 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/EntityAlarmRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/EntityAlarmRepository.java @@ -34,4 +34,8 @@ public interface EntityAlarmRepository extends JpaRepository implements A @Override public void deleteEntityAlarmRecords(TenantId tenantId, EntityId entityId) { - log.trace("[{}] Try to delete entity alarm records using [{}]", tenantId, entityId); entityAlarmRepository.deleteByEntityId(entityId.getId()); } + @Override + public void deleteEntityAlarmRecordsByTenantId(TenantId tenantId) { + entityAlarmRepository.deleteByTenantId(tenantId.getId()); + } + @Override public AlarmApiCallResult createOrUpdateActiveAlarm(AlarmCreateOrUpdateActiveRequest request, boolean alarmCreationEnabled) { AlarmPropagationInfo ap = getSafePropagationInfo(request.getPropagation()); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java index 1ee316bb7d..ee6b59e30b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java @@ -40,4 +40,7 @@ public interface DashboardRepository extends JpaRepository findIdsByTenantId(@Param("tenantId") UUID tenantId, Pageable pageable); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java index 35e746bc05..9353a4dbde 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java @@ -80,6 +80,11 @@ public class JpaDashboardDao extends JpaAbstractDao return DaoUtil.convertDataList(dashboardRepository.findByTenantIdAndTitle(tenantId, title)); } + @Override + public PageData findIdsByTenantId(TenantId tenantId, PageLink pageLink) { + return DaoUtil.pageToPageData(dashboardRepository.findIdsByTenantId(tenantId.getId(), DaoUtil.toPageable(pageLink)).map(DashboardId::new)); + } + @Override public EntityType getEntityType() { return EntityType.DASHBOARD; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceCredentialsRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceCredentialsRepository.java index 16bde4178c..8eb334ae61 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceCredentialsRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceCredentialsRepository.java @@ -28,4 +28,5 @@ public interface DeviceCredentialsRepository extends JpaRepository findAllByTenantIdAndEntityId(UUID tenantId, UUID entityId); + boolean existsByTenantIdAndEntityId(UUID tenantId, UUID entityId); + @Query("SELECT DISTINCT ev.type FROM EntityViewEntity ev WHERE ev.tenantId = :tenantId") List findTenantEntityViewTypes(@Param("tenantId") UUID tenantId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java index e3e9edf80d..1f15318d45 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java @@ -165,6 +165,11 @@ public class JpaEntityViewDao extends JpaAbstractDao> findTenantEntityViewTypesAsync(UUID tenantId) { return service.submit(() -> convertTenantEntityTypesToDto(tenantId, EntityType.ENTITY_VIEW, entityViewRepository.findTenantEntityViewTypes(tenantId))); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java index e5fcd5bbf8..8ac3c1cf55 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDao.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.id.TenantId; +import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.model.sql.UserCredentialsEntity; @@ -62,4 +63,10 @@ public class JpaUserCredentialsDao extends JpaAbstractDao { */ UserCredentials findByResetToken(TenantId tenantId, String resetToken); + void removeByUserId(TenantId tenantId, UserId userId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java index 9776e5fe51..4db1eb668a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java @@ -252,10 +252,10 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic UserId userId = user.getId(); log.trace("[{}] Executing deleteUser [{}]", tenantId, userId); validateId(userId, INCORRECT_USER_ID + userId); - UserCredentials userCredentials = userCredentialsDao.findByUserId(tenantId, userId.getId()); - userCredentialsDao.removeById(tenantId, userCredentials.getUuidId()); + userCredentialsDao.removeByUserId(tenantId, userId); userAuthSettingsDao.removeByUserId(userId); deleteEntityRelations(tenantId, userId); + userDao.removeById(tenantId, userId.getId()); eventPublisher.publishEvent(new UserCredentialsInvalidationEvent(userId)); countService.publishCountEntityEvictEvent(tenantId, EntityType.USER); @@ -446,8 +446,8 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic } @Override - protected void removeEntity(TenantId tenantId, User entity) { - deleteUser(tenantId, entity); + protected void removeEntity(TenantId tenantId, User user) { + deleteUser(tenantId, user); } }; From 1b8e4800d008aa105725bf7d35e2ff7934400e56 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Mon, 9 Oct 2023 11:10:28 +0300 Subject: [PATCH 3/5] Improvements for deletion by tenantId --- .../server/dao/device/DeviceCredentialsService.java | 2 ++ .../thingsboard/server/dao/asset/BaseAssetService.java | 5 ++--- .../server/dao/device/DeviceCredentialsDao.java | 3 +++ .../server/dao/device/DeviceCredentialsServiceImpl.java | 9 +++++++++ .../thingsboard/server/dao/device/DeviceServiceImpl.java | 8 ++------ .../dao/sql/device/DeviceCredentialsRepository.java | 7 +++++++ .../server/dao/sql/device/JpaDeviceCredentialsDao.java | 6 ++++++ 7 files changed, 31 insertions(+), 9 deletions(-) diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsService.java index c57b316a44..c2c2f23a43 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsService.java @@ -36,4 +36,6 @@ public interface DeviceCredentialsService { void deleteDeviceCredentials(TenantId tenantId, DeviceCredentials deviceCredentials); + void deleteDeviceCredentialsByDeviceId(TenantId tenantId, DeviceId deviceId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java b/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java index 24a31e2579..0431b48cea 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java @@ -204,7 +204,6 @@ public class BaseAssetService extends AbstractCachedEntityService customerAssetsUnasigner = new PaginatedRemover() { diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsDao.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsDao.java index 30796934fb..36fe0cc70f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsDao.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.device; +import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.dao.Dao; @@ -53,4 +54,6 @@ public interface DeviceCredentialsDao extends Dao { */ DeviceCredentials findByCredentialsId(TenantId tenantId, String credentialsId); + DeviceCredentials removeByDeviceId(TenantId tenantId, DeviceId deviceId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java index 13865950ed..36850c7b7a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java @@ -400,4 +400,13 @@ public class DeviceCredentialsServiceImpl extends AbstractCachedEntityService Date: Mon, 9 Oct 2023 14:06:03 +0300 Subject: [PATCH 4/5] Add Transactional back to deleteDevicesByTenantId --- .../java/org/thingsboard/server/dao/alarm/BaseAlarmService.java | 1 + .../org/thingsboard/server/dao/device/DeviceServiceImpl.java | 1 + 2 files changed, 2 insertions(+) diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index 34dd9625dc..3b0d329ddf 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -446,6 +446,7 @@ public class BaseAlarmService extends AbstractCachedEntityService Date: Mon, 9 Oct 2023 15:27:01 +0200 Subject: [PATCH 5/5] fixed tests --- .../org/thingsboard/server/controller/DeviceControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java index 70fffad837..778a11a552 100644 --- a/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java @@ -538,7 +538,7 @@ public class DeviceControllerTest extends AbstractControllerTest { doGet("/api/device/info/" + alarm.getId()) .andExpect(status().isNotFound()) - .andExpect(statusReason(containsString(msgErrorNoFound("Alarm", alarm.getId().getId().toString())))); + .andExpect(statusReason(containsString(msgErrorNoFound("Device", alarm.getId().getId().toString())))); } @Test