From b902c0029da8d0c19607b9ba6891e76547e6ca68 Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Fri, 23 May 2025 14:47:08 +0300 Subject: [PATCH] AI rule node: publish save/delete events for AI settings --- .../server/dao/ai/AiSettingsDao.java | 4 +- .../server/dao/ai/AiSettingsServiceImpl.java | 50 ++++++++++++++++--- .../dao/sql/ai/AiSettingsRepository.java | 12 +++-- .../server/dao/sql/ai/JpaAiSettingsDao.java | 12 +++-- 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsDao.java b/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsDao.java index a94131a642..94a096d679 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsDao.java @@ -27,7 +27,9 @@ public interface AiSettingsDao extends Dao, TenantEntityDao findByTenantIdAndId(TenantId tenantId, AiSettingsId aiSettingsId); - void deleteByTenantId(TenantId tenantId); + boolean deleteById(TenantId tenantId, AiSettingsId aiSettingsId); + + int deleteByTenantId(TenantId tenantId); boolean deleteByTenantIdAndId(TenantId tenantId, AiSettingsId aiSettingsId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsServiceImpl.java index 24571458ec..281efbefc1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsServiceImpl.java @@ -16,7 +16,9 @@ package org.thingsboard.server.dao.ai; import lombok.RequiredArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.ai.AiSettings; import org.thingsboard.server.common.data.id.AiSettingsId; @@ -25,8 +27,11 @@ import org.thingsboard.server.common.data.id.HasId; 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.eventsourcing.DeleteEntityEvent; +import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; import org.thingsboard.server.dao.service.DataValidator; +import java.util.List; import java.util.Optional; import static org.thingsboard.server.dao.entity.AbstractEntityService.checkConstraintViolation; @@ -36,19 +41,33 @@ import static org.thingsboard.server.dao.service.Validator.validatePageLink; @RequiredArgsConstructor class AiSettingsServiceImpl implements AiSettingsService { - private final AiSettingsDao aiSettingsDao; - + private final ApplicationEventPublisher eventPublisher; private final DataValidator aiSettingsValidator; + private final AiSettingsDao aiSettingsDao; + @Override public AiSettings save(AiSettings aiSettings) { - aiSettingsValidator.validate(aiSettings, AiSettings::getTenantId); + AiSettings oldSettings = aiSettingsValidator.validate(aiSettings, AiSettings::getTenantId); + + AiSettings savedSettings; try { - return aiSettingsDao.saveAndFlush(aiSettings.getTenantId(), aiSettings); + savedSettings = aiSettingsDao.saveAndFlush(aiSettings.getTenantId(), aiSettings); } catch (Exception e) { checkConstraintViolation(e, "ai_settings_name_unq_key", "AI settings record with such name already exists!"); throw e; } + + eventPublisher.publishEvent(SaveEntityEvent.builder() + .tenantId(savedSettings.getTenantId()) + .entity(savedSettings) + .oldEntity(oldSettings) + .entityId(savedSettings.getId()) + .created(oldSettings == null) + .broadcastEvent(true) + .build()); + + return savedSettings; } @Override @@ -69,7 +88,15 @@ class AiSettingsServiceImpl implements AiSettingsService { @Override public boolean deleteByTenantIdAndId(TenantId tenantId, AiSettingsId aiSettingsId) { - return aiSettingsDao.deleteByTenantIdAndId(tenantId, aiSettingsId); + Optional aiSettingsOpt = aiSettingsDao.findByTenantIdAndId(tenantId, aiSettingsId); + if (aiSettingsOpt.isEmpty()) { + return false; + } + boolean deleted = aiSettingsDao.deleteByTenantIdAndId(tenantId, aiSettingsId); + if (deleted) { + publishDeleteEvent(aiSettingsOpt.get()); + } + return deleted; } @Override @@ -84,12 +111,23 @@ class AiSettingsServiceImpl implements AiSettingsService { @Override public void deleteEntity(TenantId tenantId, EntityId id, boolean force) { - aiSettingsDao.removeById(tenantId, id.getId()); + deleteByTenantIdAndId(tenantId, new AiSettingsId(id.getId())); } @Override + @Transactional public void deleteByTenantId(TenantId tenantId) { + List deletedSettings = aiSettingsDao.findAllByTenantId(tenantId, new PageLink(Integer.MAX_VALUE)).getData(); aiSettingsDao.deleteByTenantId(tenantId); + deletedSettings.forEach(this::publishDeleteEvent); + } + + private void publishDeleteEvent(AiSettings settings) { + eventPublisher.publishEvent(DeleteEntityEvent.builder() + .tenantId(settings.getTenantId()) + .entityId(settings.getId()) + .entity(settings) + .build()); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/ai/AiSettingsRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/ai/AiSettingsRepository.java index e52177d247..691709f8b8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/ai/AiSettingsRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/ai/AiSettingsRepository.java @@ -25,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional; import org.thingsboard.server.dao.model.sql.AiSettingsEntity; import java.util.Optional; +import java.util.Set; import java.util.UUID; public interface AiSettingsRepository extends JpaRepository { @@ -40,11 +41,16 @@ public interface AiSettingsRepository extends JpaRepository ids); + + @Transactional + int deleteByTenantId(UUID tenantId); @Transactional @Modifying - @Query("DELETE FROM AiSettingsEntity ai WHERE ai.tenantId = :tenantId AND ai.id = :id") - int deleteByTenantIdAndId(@Param("tenantId") UUID tenantId, @Param("id") UUID id); + @Query("DELETE FROM AiSettingsEntity ai WHERE ai.tenantId = :tenantId AND ai.id IN (:ids)") + int deleteByTenantIdAndIdIn(@Param("tenantId") UUID tenantId, @Param("ids") Set ids); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/ai/JpaAiSettingsDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/ai/JpaAiSettingsDao.java index 14e43cb095..c56c29b835 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/ai/JpaAiSettingsDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/ai/JpaAiSettingsDao.java @@ -32,6 +32,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractDao; import org.thingsboard.server.dao.util.SqlDao; import java.util.Optional; +import java.util.Set; import java.util.UUID; @SqlDao @@ -59,13 +60,18 @@ class JpaAiSettingsDao extends JpaAbstractDao impl } @Override - public void deleteByTenantId(TenantId tenantId) { - aiSettingsRepository.deleteByTenantId(tenantId.getId()); + public boolean deleteById(TenantId tenantId, AiSettingsId aiSettingsId) { + return aiSettingsRepository.deleteByIdIn(Set.of(aiSettingsId.getId())) > 0; + } + + @Override + public int deleteByTenantId(TenantId tenantId) { + return aiSettingsRepository.deleteByTenantId(tenantId.getId()); } @Override public boolean deleteByTenantIdAndId(TenantId tenantId, AiSettingsId aiSettingsId) { - return aiSettingsRepository.deleteByTenantIdAndId(tenantId.getId(), aiSettingsId.getId()) > 0; + return aiSettingsRepository.deleteByTenantIdAndIdIn(tenantId.getId(), Set.of(aiSettingsId.getId())) > 0; } @Override