Fix invalid resource info caching

This commit is contained in:
ViacheslavKlimov 2025-06-24 11:11:02 +03:00
parent 8d45f09869
commit 815ac9fef2
3 changed files with 62 additions and 6 deletions

View File

@ -202,6 +202,60 @@ public class TbResourceControllerTest extends AbstractControllerTest {
Assert.assertEquals(savedResource.getFileName(), foundResource.getFileName()); Assert.assertEquals(savedResource.getFileName(), foundResource.getFileName());
} }
@Test
public void testFindSystemResourceInfoById() throws Exception {
loginSysAdmin();
TbResource resource = new TbResource();
resource.setResourceType(ResourceType.JS_MODULE);
resource.setTitle("My system resource");
resource.setFileName(DEFAULT_FILE_NAME);
resource.setEncodedData(TEST_DATA);
TbResourceInfo savedResourceInfo = save(resource);
assertThat(savedResourceInfo.getFileName()).isEqualTo(DEFAULT_FILE_NAME);
TbResourceInfo resourceInfo = findResourceInfo(savedResourceInfo.getId());
assertThat(resourceInfo).isEqualTo(savedResourceInfo);
loginTenantAdmin();
resourceInfo = findResourceInfo(savedResourceInfo.getId());
assertThat(resourceInfo).isEqualTo(savedResourceInfo);
loginSysAdmin();
resource = new TbResource(savedResourceInfo);
resource.setFileName(DEFAULT_FILE_NAME_2);
resource.setEncodedData(TEST_DATA);
savedResourceInfo = save(resource);
assertThat(savedResourceInfo.getFileName()).isEqualTo(DEFAULT_FILE_NAME_2);
resourceInfo = findResourceInfo(savedResourceInfo.getId());
assertThat(resourceInfo).isEqualTo(savedResourceInfo);
loginTenantAdmin();
resourceInfo = findResourceInfo(savedResourceInfo.getId());
assertThat(resourceInfo).isEqualTo(savedResourceInfo);
}
@Test
public void testFindTenantResourceInfoById() throws Exception {
TbResource resource = new TbResource();
resource.setResourceType(ResourceType.JS_MODULE);
resource.setTitle("My tenant resource");
resource.setFileName(DEFAULT_FILE_NAME);
resource.setEncodedData(TEST_DATA);
TbResourceInfo savedResourceInfo = save(resource);
assertThat(savedResourceInfo.getFileName()).isEqualTo(DEFAULT_FILE_NAME);
TbResourceInfo resourceInfo = findResourceInfo(savedResourceInfo.getId());
assertThat(resourceInfo).isEqualTo(savedResourceInfo);
resource = new TbResource(savedResourceInfo);
resource.setFileName(DEFAULT_FILE_NAME_2);
resource.setEncodedData(TEST_DATA);
savedResourceInfo = save(resource);
assertThat(savedResourceInfo.getFileName()).isEqualTo(DEFAULT_FILE_NAME_2);
resourceInfo = findResourceInfo(savedResourceInfo.getId());
assertThat(resourceInfo).isEqualTo(savedResourceInfo);
}
@Test @Test
public void testDeleteTbResource() throws Exception { public void testDeleteTbResource() throws Exception {
TbResource resource = new TbResource(); TbResource resource = new TbResource();
@ -878,6 +932,10 @@ public class TbResourceControllerTest extends AbstractControllerTest {
}); });
} }
private TbResourceInfo findResourceInfo(TbResourceId id) throws Exception {
return doGet("/api/resource/info/" + id, TbResourceInfo.class);
}
private byte[] download(TbResourceId resourceId) throws Exception { private byte[] download(TbResourceId resourceId) throws Exception {
return doGet("/api/resource/" + resourceId + "/download") return doGet("/api/resource/" + resourceId + "/download")
.andExpect(status().isOk()) .andExpect(status().isOk())

View File

@ -20,7 +20,6 @@ import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.thingsboard.server.common.data.id.TbResourceId; import org.thingsboard.server.common.data.id.TbResourceId;
import org.thingsboard.server.common.data.id.TenantId;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -34,12 +33,11 @@ public class ResourceInfoCacheKey implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 2100510964692846992L; private static final long serialVersionUID = 2100510964692846992L;
private final TenantId tenantId;
private final TbResourceId tbResourceId; private final TbResourceId tbResourceId;
@Override @Override
public String toString() { public String toString() {
return tenantId + "_" + tbResourceId; return tbResourceId.toString();
} }
} }

View File

@ -263,7 +263,7 @@ public class BaseResourceService extends AbstractCachedEntityService<ResourceInf
@Override @Override
public TbResource toResource(TenantId tenantId, ResourceExportData exportData) { public TbResource toResource(TenantId tenantId, ResourceExportData exportData) {
if (exportData.getType() == ResourceType.IMAGE || exportData.getSubType() == ResourceSubType.IMAGE if (exportData.getType() == ResourceType.IMAGE || exportData.getSubType() == ResourceSubType.IMAGE
|| exportData.getSubType() == ResourceSubType.SCADA_SYMBOL) { || exportData.getSubType() == ResourceSubType.SCADA_SYMBOL) {
throw new IllegalArgumentException("Image import not supported"); throw new IllegalArgumentException("Image import not supported");
} }
@ -311,7 +311,7 @@ public class BaseResourceService extends AbstractCachedEntityService<ResourceInf
log.trace("Executing findResourceInfoById [{}] [{}]", tenantId, resourceId); log.trace("Executing findResourceInfoById [{}] [{}]", tenantId, resourceId);
Validator.validateId(resourceId, id -> INCORRECT_RESOURCE_ID + id); Validator.validateId(resourceId, id -> INCORRECT_RESOURCE_ID + id);
return cache.getAndPutInTransaction(new ResourceInfoCacheKey(tenantId, resourceId), return cache.getAndPutInTransaction(new ResourceInfoCacheKey(resourceId),
() -> resourceInfoDao.findById(tenantId, resourceId.getId()), true); () -> resourceInfoDao.findById(tenantId, resourceId.getId()), true);
} }
@ -712,7 +712,7 @@ public class BaseResourceService extends AbstractCachedEntityService<ResourceInf
@Override @Override
public void handleEvictEvent(ResourceInfoEvictEvent event) { public void handleEvictEvent(ResourceInfoEvictEvent event) {
if (event.getResourceId() != null) { if (event.getResourceId() != null) {
cache.evict(new ResourceInfoCacheKey(event.getTenantId(), event.getResourceId())); cache.evict(new ResourceInfoCacheKey(event.getResourceId()));
} }
} }