AI rule node: publish save/delete events for AI settings
This commit is contained in:
		
							parent
							
								
									255ab3b391
								
							
						
					
					
						commit
						b902c0029d
					
				@ -27,7 +27,9 @@ public interface AiSettingsDao extends Dao<AiSettings>, TenantEntityDao<AiSettin
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Optional<AiSettings> findByTenantIdAndId(TenantId tenantId, AiSettingsId aiSettingsId);
 | 
					    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);
 | 
					    boolean deleteByTenantIdAndId(TenantId tenantId, AiSettingsId aiSettingsId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,9 @@
 | 
				
			|||||||
package org.thingsboard.server.dao.ai;
 | 
					package org.thingsboard.server.dao.ai;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import lombok.RequiredArgsConstructor;
 | 
					import lombok.RequiredArgsConstructor;
 | 
				
			||||||
 | 
					import org.springframework.context.ApplicationEventPublisher;
 | 
				
			||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
 | 
					import org.springframework.transaction.annotation.Transactional;
 | 
				
			||||||
import org.thingsboard.server.common.data.EntityType;
 | 
					import org.thingsboard.server.common.data.EntityType;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.AiSettings;
 | 
					import org.thingsboard.server.common.data.ai.AiSettings;
 | 
				
			||||||
import org.thingsboard.server.common.data.id.AiSettingsId;
 | 
					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.id.TenantId;
 | 
				
			||||||
import org.thingsboard.server.common.data.page.PageData;
 | 
					import org.thingsboard.server.common.data.page.PageData;
 | 
				
			||||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
					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 org.thingsboard.server.dao.service.DataValidator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Optional;
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static org.thingsboard.server.dao.entity.AbstractEntityService.checkConstraintViolation;
 | 
					import static org.thingsboard.server.dao.entity.AbstractEntityService.checkConstraintViolation;
 | 
				
			||||||
@ -36,19 +41,33 @@ import static org.thingsboard.server.dao.service.Validator.validatePageLink;
 | 
				
			|||||||
@RequiredArgsConstructor
 | 
					@RequiredArgsConstructor
 | 
				
			||||||
class AiSettingsServiceImpl implements AiSettingsService {
 | 
					class AiSettingsServiceImpl implements AiSettingsService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final AiSettingsDao aiSettingsDao;
 | 
					    private final ApplicationEventPublisher eventPublisher;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    private final DataValidator<AiSettings> aiSettingsValidator;
 | 
					    private final DataValidator<AiSettings> aiSettingsValidator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final AiSettingsDao aiSettingsDao;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public AiSettings save(AiSettings aiSettings) {
 | 
					    public AiSettings save(AiSettings aiSettings) {
 | 
				
			||||||
        aiSettingsValidator.validate(aiSettings, AiSettings::getTenantId);
 | 
					        AiSettings oldSettings = aiSettingsValidator.validate(aiSettings, AiSettings::getTenantId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        AiSettings savedSettings;
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            return aiSettingsDao.saveAndFlush(aiSettings.getTenantId(), aiSettings);
 | 
					            savedSettings = aiSettingsDao.saveAndFlush(aiSettings.getTenantId(), aiSettings);
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            checkConstraintViolation(e, "ai_settings_name_unq_key", "AI settings record with such name already exists!");
 | 
					            checkConstraintViolation(e, "ai_settings_name_unq_key", "AI settings record with such name already exists!");
 | 
				
			||||||
            throw e;
 | 
					            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
 | 
					    @Override
 | 
				
			||||||
@ -69,7 +88,15 @@ class AiSettingsServiceImpl implements AiSettingsService {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public boolean deleteByTenantIdAndId(TenantId tenantId, AiSettingsId aiSettingsId) {
 | 
					    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
 | 
					    @Override
 | 
				
			||||||
@ -84,12 +111,23 @@ class AiSettingsServiceImpl implements AiSettingsService {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
 | 
					    public void deleteEntity(TenantId tenantId, EntityId id, boolean force) {
 | 
				
			||||||
        aiSettingsDao.removeById(tenantId, id.getId());
 | 
					        deleteByTenantIdAndId(tenantId, new AiSettingsId(id.getId()));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
 | 
					    @Transactional
 | 
				
			||||||
    public void deleteByTenantId(TenantId tenantId) {
 | 
					    public void deleteByTenantId(TenantId tenantId) {
 | 
				
			||||||
 | 
					        List<AiSettings> deletedSettings = aiSettingsDao.findAllByTenantId(tenantId, new PageLink(Integer.MAX_VALUE)).getData();
 | 
				
			||||||
        aiSettingsDao.deleteByTenantId(tenantId);
 | 
					        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
 | 
					    @Override
 | 
				
			||||||
 | 
				
			|||||||
@ -25,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
 | 
				
			|||||||
import org.thingsboard.server.dao.model.sql.AiSettingsEntity;
 | 
					import org.thingsboard.server.dao.model.sql.AiSettingsEntity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Optional;
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					import java.util.Set;
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public interface AiSettingsRepository extends JpaRepository<AiSettingsEntity, UUID> {
 | 
					public interface AiSettingsRepository extends JpaRepository<AiSettingsEntity, UUID> {
 | 
				
			||||||
@ -40,11 +41,16 @@ public interface AiSettingsRepository extends JpaRepository<AiSettingsEntity, UU
 | 
				
			|||||||
    long countByTenantId(UUID tenantId);
 | 
					    long countByTenantId(UUID tenantId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Transactional
 | 
					    @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
 | 
					    @Transactional
 | 
				
			||||||
    @Modifying
 | 
					    @Modifying
 | 
				
			||||||
    @Query("DELETE FROM AiSettingsEntity ai WHERE ai.tenantId = :tenantId AND ai.id = :id")
 | 
					    @Query("DELETE FROM AiSettingsEntity ai WHERE ai.tenantId = :tenantId AND ai.id IN (:ids)")
 | 
				
			||||||
    int deleteByTenantIdAndId(@Param("tenantId") UUID tenantId, @Param("id") UUID id);
 | 
					    int deleteByTenantIdAndIdIn(@Param("tenantId") UUID tenantId, @Param("ids") Set<UUID> ids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -32,6 +32,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractDao;
 | 
				
			|||||||
import org.thingsboard.server.dao.util.SqlDao;
 | 
					import org.thingsboard.server.dao.util.SqlDao;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Optional;
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					import java.util.Set;
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@SqlDao
 | 
					@SqlDao
 | 
				
			||||||
@ -59,13 +60,18 @@ class JpaAiSettingsDao extends JpaAbstractDao<AiSettingsEntity, AiSettings> impl
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void deleteByTenantId(TenantId tenantId) {
 | 
					    public boolean deleteById(TenantId tenantId, AiSettingsId aiSettingsId) {
 | 
				
			||||||
        aiSettingsRepository.deleteByTenantId(tenantId.getId());
 | 
					        return aiSettingsRepository.deleteByIdIn(Set.of(aiSettingsId.getId())) > 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int deleteByTenantId(TenantId tenantId) {
 | 
				
			||||||
 | 
					        return aiSettingsRepository.deleteByTenantId(tenantId.getId());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public boolean deleteByTenantIdAndId(TenantId tenantId, AiSettingsId aiSettingsId) {
 | 
					    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
 | 
					    @Override
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user