added resource delete validation
This commit is contained in:
		
							parent
							
								
									1d3a9a25b3
								
							
						
					
					
						commit
						9ddc5e5b8d
					
				@ -16,6 +16,7 @@
 | 
			
		||||
package org.thingsboard.server.service.entitiy;
 | 
			
		||||
 | 
			
		||||
import org.thingsboard.server.common.data.User;
 | 
			
		||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
 | 
			
		||||
 | 
			
		||||
public interface SimpleTbEntityService<T> {
 | 
			
		||||
 | 
			
		||||
@ -25,6 +26,6 @@ public interface SimpleTbEntityService<T> {
 | 
			
		||||
 | 
			
		||||
    T save(T entity, User user) throws Exception;
 | 
			
		||||
 | 
			
		||||
    void delete(T entity, User user);
 | 
			
		||||
    void delete(T entity, User user) throws ThingsboardException;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -27,14 +27,18 @@ import org.thingsboard.server.common.data.TbResourceInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.TbResourceInfoFilter;
 | 
			
		||||
import org.thingsboard.server.common.data.User;
 | 
			
		||||
import org.thingsboard.server.common.data.audit.ActionType;
 | 
			
		||||
import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
 | 
			
		||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TbResourceId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.lwm2m.LwM2mObject;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
import org.thingsboard.server.common.data.widget.BaseWidgetType;
 | 
			
		||||
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
 | 
			
		||||
import org.thingsboard.server.dao.exception.DataValidationException;
 | 
			
		||||
import org.thingsboard.server.dao.resource.ResourceService;
 | 
			
		||||
import org.thingsboard.server.dao.widget.WidgetTypeService;
 | 
			
		||||
import org.thingsboard.server.queue.util.TbCoreComponent;
 | 
			
		||||
import org.thingsboard.server.service.entitiy.AbstractTbEntityService;
 | 
			
		||||
 | 
			
		||||
@ -55,9 +59,11 @@ import static org.thingsboard.server.utils.LwM2mObjectModelUtils.toLwm2mResource
 | 
			
		||||
public class DefaultTbResourceService extends AbstractTbEntityService implements TbResourceService {
 | 
			
		||||
 | 
			
		||||
    private final ResourceService resourceService;
 | 
			
		||||
    private final WidgetTypeService widgetTypeService;
 | 
			
		||||
 | 
			
		||||
    public DefaultTbResourceService(ResourceService resourceService) {
 | 
			
		||||
    public DefaultTbResourceService(ResourceService resourceService, WidgetTypeService widgetTypeService) {
 | 
			
		||||
        this.resourceService = resourceService;
 | 
			
		||||
        this.widgetTypeService = widgetTypeService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@ -145,10 +151,15 @@ public class DefaultTbResourceService extends AbstractTbEntityService implements
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void delete(TbResource tbResource, User user) {
 | 
			
		||||
    public void delete(TbResource tbResource, User user) throws ThingsboardException {
 | 
			
		||||
        TbResourceId resourceId = tbResource.getId();
 | 
			
		||||
        TenantId tenantId = tbResource.getTenantId();
 | 
			
		||||
        try {
 | 
			
		||||
            List<WidgetTypeDetails> widgets = widgetTypeService.findWidgetTypesInfosByTenantIdAndResourceId(tenantId, resourceId);
 | 
			
		||||
            if (!widgets.isEmpty()) {
 | 
			
		||||
                List<String> widgetNames = widgets.stream().map(BaseWidgetType::getName).collect(Collectors.toList());
 | 
			
		||||
                throw new ThingsboardException(String.format("Following widget types uses current resource: %s", widgetNames), ThingsboardErrorCode.GENERAL);
 | 
			
		||||
            }
 | 
			
		||||
            resourceService.deleteResource(tenantId, resourceId);
 | 
			
		||||
            tbClusterService.onResourceDeleted(tbResource, null);
 | 
			
		||||
            notificationEntityService.logEntityAction(tenantId, resourceId, tbResource, ActionType.DELETED, user, resourceId.toString());
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.widget;
 | 
			
		||||
 | 
			
		||||
import org.thingsboard.server.common.data.id.TbResourceId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.WidgetTypeId;
 | 
			
		||||
import org.thingsboard.server.common.data.widget.WidgetType;
 | 
			
		||||
@ -40,6 +41,8 @@ public interface WidgetTypeService extends EntityDaoService {
 | 
			
		||||
 | 
			
		||||
    List<WidgetTypeInfo> findWidgetTypesInfosByTenantIdAndBundleAlias(TenantId tenantId, String bundleAlias);
 | 
			
		||||
 | 
			
		||||
    List<WidgetTypeDetails> findWidgetTypesInfosByTenantIdAndResourceId(TenantId tenantId, TbResourceId tbResourceId);
 | 
			
		||||
 | 
			
		||||
    WidgetType findWidgetTypeByTenantIdBundleAliasAndAlias(TenantId tenantId, String bundleAlias, String alias);
 | 
			
		||||
 | 
			
		||||
    void deleteWidgetTypesByTenantIdAndBundleAlias(TenantId tenantId, String bundleAlias);
 | 
			
		||||
 | 
			
		||||
@ -77,6 +77,11 @@ public class JpaWidgetTypeDao extends JpaAbstractDao<WidgetTypeDetailsEntity, Wi
 | 
			
		||||
        return DaoUtil.getData(widgetTypeRepository.findWidgetTypeByTenantIdAndBundleAliasAndAlias(tenantId, bundleAlias, alias));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<WidgetTypeDetails> findWidgetTypesInfosByTenantIdAndResourceId(UUID tenantId, UUID tbResourceId) {
 | 
			
		||||
        return DaoUtil.convertDataList(widgetTypeRepository.findWidgetTypesInfosByTenantIdAndResourceId(tenantId, tbResourceId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public EntityType getEntityType() {
 | 
			
		||||
        return EntityType.WIDGET_TYPE;
 | 
			
		||||
 | 
			
		||||
@ -46,4 +46,11 @@ public interface WidgetTypeRepository extends JpaRepository<WidgetTypeDetailsEnt
 | 
			
		||||
    WidgetTypeEntity findWidgetTypeByTenantIdAndBundleAliasAndAlias(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                                                          @Param("bundleAlias") String bundleAlias,
 | 
			
		||||
                                                          @Param("alias") String alias);
 | 
			
		||||
 | 
			
		||||
    @Query(value = "SELECT * FROM widget_type wt " +
 | 
			
		||||
            "WHERE wt.tenant_id = :tenantId AND cast(wt.descriptor as json) ->> 'resources' LIKE LOWER(CONCAT('%', :resourceId, '%'))",
 | 
			
		||||
    nativeQuery = true)
 | 
			
		||||
    List<WidgetTypeDetailsEntity> findWidgetTypesInfosByTenantIdAndResourceId(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                                                                    @Param("resourceId") UUID resourceId);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -83,4 +83,12 @@ public interface WidgetTypeDao extends Dao<WidgetTypeDetails> {
 | 
			
		||||
     */
 | 
			
		||||
    WidgetType findByTenantIdBundleAliasAndAlias(UUID tenantId, String bundleAlias, String alias);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Find widget types infos by tenantId and resourceId in descriptor.
 | 
			
		||||
     *
 | 
			
		||||
     * @param tenantId the tenantId
 | 
			
		||||
     * @param tbResourceId the resourceId
 | 
			
		||||
     * @return the list of widget types infos objects
 | 
			
		||||
     */
 | 
			
		||||
    List<WidgetTypeDetails> findWidgetTypesInfosByTenantIdAndResourceId(UUID tenantId, UUID tbResourceId);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,7 @@ import org.springframework.stereotype.Service;
 | 
			
		||||
import org.thingsboard.server.common.data.EntityType;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.HasId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TbResourceId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.WidgetTypeId;
 | 
			
		||||
import org.thingsboard.server.common.data.widget.WidgetType;
 | 
			
		||||
@ -37,6 +38,7 @@ import java.util.Optional;
 | 
			
		||||
public class WidgetTypeServiceImpl implements WidgetTypeService {
 | 
			
		||||
 | 
			
		||||
    public static final String INCORRECT_TENANT_ID = "Incorrect tenantId ";
 | 
			
		||||
    public static final String INCORRECT_RESOURCE_ID = "Incorrect resourceId ";
 | 
			
		||||
    public static final String INCORRECT_BUNDLE_ALIAS = "Incorrect bundleAlias ";
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private WidgetTypeDao widgetTypeDao;
 | 
			
		||||
@ -96,6 +98,14 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
 | 
			
		||||
        return widgetTypeDao.findWidgetTypesInfosByTenantIdAndBundleAlias(tenantId.getId(), bundleAlias);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<WidgetTypeDetails> findWidgetTypesInfosByTenantIdAndResourceId(TenantId tenantId, TbResourceId tbResourceId) {
 | 
			
		||||
        log.trace("Executing findWidgetTypesInfosByTenantIdAndResourceId, tenantId [{}], tbResourceId [{}]", tenantId, tbResourceId);
 | 
			
		||||
        Validator.validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
 | 
			
		||||
        Validator.validateId(tbResourceId, INCORRECT_RESOURCE_ID + tbResourceId);
 | 
			
		||||
        return widgetTypeDao.findWidgetTypesInfosByTenantIdAndResourceId(tenantId.getId(), tbResourceId.getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public WidgetType findWidgetTypeByTenantIdBundleAliasAndAlias(TenantId tenantId, String bundleAlias, String alias) {
 | 
			
		||||
        log.trace("Executing findWidgetTypeByTenantIdBundleAliasAndAlias, tenantId [{}], bundleAlias [{}], alias [{}]", tenantId, bundleAlias, alias);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user