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);