From d4784b30960d59475cef7fe18eaf15f37946c4f0 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Wed, 26 Jan 2022 12:11:52 +0200 Subject: [PATCH] Prohibit deletion of device profiles that are referenced by OTA packages --- .../org/thingsboard/server/dao/ota/OtaPackageService.java | 3 +++ .../server/dao/device/DeviceProfileServiceImpl.java | 3 +++ .../thingsboard/server/dao/ota/BaseOtaPackageService.java | 5 +++++ .../java/org/thingsboard/server/dao/ota/OtaPackageDao.java | 5 ++++- .../thingsboard/server/dao/sql/ota/JpaOtaPackageDao.java | 7 +++++++ .../server/dao/sql/ota/OtaPackageRepository.java | 4 +++- .../server/dao/service/BaseOtaPackageServiceTest.java | 4 +++- 7 files changed, 28 insertions(+), 3 deletions(-) diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java index b14653b1d0..638851f05d 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java @@ -51,4 +51,7 @@ public interface OtaPackageService { void deleteOtaPackagesByTenantId(TenantId tenantId); long sumDataSizeByTenantId(TenantId tenantId); + + boolean existsByDeviceProfileId(DeviceProfileId deviceProfileId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java index 18a8a1ecde..c80834bfb6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java @@ -218,6 +218,9 @@ public class DeviceProfileServiceImpl extends AbstractEntityService implements D if (deviceProfile != null && deviceProfile.isDefault()) { throw new DataValidationException("Deletion of Default Device Profile is prohibited!"); } + if (otaPackageService.existsByDeviceProfileId(deviceProfileId)) { + throw new DataValidationException("The device profile is referenced by OTA update package"); + } this.removeDeviceProfile(tenantId, deviceProfile); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java b/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java index 205b2c447b..c879fe6fdd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java @@ -223,6 +223,11 @@ public class BaseOtaPackageService implements OtaPackageService { return otaPackageDao.sumDataSizeByTenantId(tenantId); } + @Override + public boolean existsByDeviceProfileId(DeviceProfileId deviceProfileId) { + return otaPackageDao.existsByDeviceProfileId(deviceProfileId); + } + @Override public void deleteOtaPackagesByTenantId(TenantId tenantId) { log.trace("Executing deleteOtaPackagesByTenantId, tenantId [{}]", tenantId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/ota/OtaPackageDao.java b/dao/src/main/java/org/thingsboard/server/dao/ota/OtaPackageDao.java index ef8740030c..a4ad6dc8c1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/ota/OtaPackageDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/ota/OtaPackageDao.java @@ -16,11 +16,14 @@ package org.thingsboard.server.dao.ota; import org.thingsboard.server.common.data.OtaPackage; +import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.Dao; -import org.thingsboard.server.dao.TenantEntityDao; import org.thingsboard.server.dao.TenantEntityWithDataDao; public interface OtaPackageDao extends Dao, TenantEntityWithDataDao { Long sumDataSizeByTenantId(TenantId tenantId); + + boolean existsByDeviceProfileId(DeviceProfileId deviceProfileId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageDao.java index 98309b9e51..969fe0ec54 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageDao.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.OtaPackage; +import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.ota.OtaPackageDao; import org.thingsboard.server.dao.model.sql.OtaPackageEntity; @@ -48,4 +49,10 @@ public class JpaOtaPackageDao extends JpaAbstractSearchTextDao { @Query(value = "SELECT COALESCE(SUM(ota.data_size), 0) FROM ota_package ota WHERE ota.tenant_id = :tenantId AND ota.data IS NOT NULL", nativeQuery = true) Long sumDataSizeByTenantId(@Param("tenantId") UUID tenantId); + + boolean existsByDeviceProfileId(UUID deviceProfileId); + } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseOtaPackageServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseOtaPackageServiceTest.java index 8fcadcd812..0df2d9e6b6 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseOtaPackageServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseOtaPackageServiceTest.java @@ -487,8 +487,10 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest { thrown.expectMessage("The otaPackage referenced by the device profile cannot be deleted!"); otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()); } finally { - deviceProfileService.deleteDeviceProfile(tenantId, savedDeviceProfile.getId()); + savedDeviceProfile.setFirmwareId(null); + deviceProfileService.saveDeviceProfile(savedDeviceProfile); otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()); + deviceProfileService.deleteDeviceProfile(tenantId, savedDeviceProfile.getId()); } }