AI rule node: publish save/delete events for AI settings

This commit is contained in:
Dmytro Skarzhynets 2025-05-23 14:47:08 +03:00
parent 255ab3b391
commit b902c0029d
No known key found for this signature in database
GPG Key ID: 2B51652F224037DF
4 changed files with 65 additions and 13 deletions

View File

@ -27,7 +27,9 @@ public interface AiSettingsDao extends Dao<AiSettings>, TenantEntityDao<AiSettin
Optional<AiSettings> 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);

View File

@ -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<AiSettings> 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<AiSettings> 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<AiSettings> 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

View File

@ -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<AiSettingsEntity, UUID> {
@ -40,11 +41,16 @@ public interface AiSettingsRepository extends JpaRepository<AiSettingsEntity, UU
long countByTenantId(UUID tenantId);
@Transactional
void deleteByTenantId(UUID tenantId);
@Modifying
@Query("DELETE FROM AiSettingsEntity ai WHERE ai.id IN (:ids)")
int deleteByIdIn(@Param("ids") Set<UUID> 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<UUID> ids);
}

View File

@ -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<AiSettingsEntity, AiSettings> 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