Merge pull request #12667 from YevhenBondarenko/fix/PROD-5562

Fix audit log save error when saving resource
This commit is contained in:
Viacheslav Klimov 2025-02-24 16:27:00 +02:00 committed by GitHub
commit 7c2977bc8a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 111 additions and 87 deletions

View File

@ -217,7 +217,7 @@ public class TbResourceController extends BaseController {
@RequestBody TbResource resource) throws Exception {
resource.setTenantId(getTenantId());
checkEntity(resource.getId(), resource, Resource.TB_RESOURCE);
return new TbResourceInfo(tbResourceService.save(resource, getCurrentUser()));
return tbResourceService.save(resource, getCurrentUser());
}
@ApiOperation(value = "Get Resource Infos (getResources)",

View File

@ -126,7 +126,7 @@ public class DefaultTbImageService extends AbstractTbEntityService implements Tb
return savedImage;
} catch (Exception e) {
image.setData(null);
logEntityActionService.logEntityAction(tenantId, emptyId(EntityType.TB_RESOURCE), image, actionType, user, e);
logEntityActionService.logEntityAction(tenantId, emptyId(EntityType.TB_RESOURCE), new TbResourceInfo(image), actionType, user, e);
throw e;
}
}

View File

@ -67,7 +67,7 @@ public class DefaultTbResourceService extends AbstractTbEntityService implements
private final AccessControlService accessControlService;
@Override
public TbResource save(TbResource resource, SecurityUser user) throws ThingsboardException {
public TbResourceInfo save(TbResource resource, SecurityUser user) throws ThingsboardException {
if (resource.getResourceType() == ResourceType.IMAGE) {
throw new IllegalArgumentException("Image resource type is not supported");
}
@ -79,12 +79,11 @@ public class DefaultTbResourceService extends AbstractTbEntityService implements
} else if (resource.getResourceKey() == null) {
resource.setResourceKey(resource.getFileName());
}
TbResource savedResource = resourceService.saveResource(resource);
TbResourceInfo savedResource = new TbResourceInfo(resourceService.saveResource(resource));
logEntityActionService.logEntityAction(tenantId, savedResource.getId(), savedResource, actionType, user);
return savedResource;
} catch (Exception e) {
logEntityActionService.logEntityAction(tenantId, emptyId(EntityType.TB_RESOURCE),
resource, actionType, user, e);
logEntityActionService.logEntityAction(tenantId, emptyId(EntityType.TB_RESOURCE), new TbResourceInfo(resource), actionType, user, e);
throw e;
}
}

View File

@ -18,17 +18,26 @@ package org.thingsboard.server.service.resource;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.ResourceExportData;
import org.thingsboard.server.common.data.TbResource;
import org.thingsboard.server.common.data.TbResourceInfo;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.lwm2m.LwM2mObject;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
import org.thingsboard.server.service.entitiy.SimpleTbEntityService;
import org.thingsboard.server.service.security.model.SecurityUser;
import java.util.List;
public interface TbResourceService extends SimpleTbEntityService<TbResource> {
public interface TbResourceService {
default TbResourceInfo save(TbResource entity) throws Exception {
return save(entity, null);
}
TbResourceInfo save(TbResource entity, SecurityUser user) throws Exception;
void delete(TbResource entity, User user);
List<LwM2mObject> findLwM2mObject(TenantId tenantId,
String sortOrder,

View File

@ -629,8 +629,11 @@ public abstract class AbstractNotifyEntityTest extends AbstractWebTest {
private String entityClassToEntityTypeName(HasName entity) {
String entityType = entityClassToString(entity);
return "SAVE_OTA_PACKAGE_INFO_REQUEST".equals(entityType) || "OTA_PACKAGE_INFO".equals(entityType) ?
EntityType.OTA_PACKAGE.name().toUpperCase(Locale.ENGLISH) : entityType;
return switch (entityType) {
case "SAVE_OTA_PACKAGE_INFO_REQUEST", "OTA_PACKAGE_INFO" -> "OTA_PACKAGE";
case "TB_RESOURCE_INFO" -> "TB_RESOURCE";
default -> entityType;
};
}
private String entityClassToString(HasName entity) {

View File

@ -104,7 +104,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setFileName(DEFAULT_FILE_NAME);
resource.setEncodedData(TEST_DATA);
TbResource savedResource = save(resource);
TbResourceInfo savedResource = save(resource);
testNotifyEntityAllOneTimeLogEntityActionEntityEqClass(savedResource, savedResource.getId(), savedResource.getId(),
savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(),
@ -119,15 +119,15 @@ public class TbResourceControllerTest extends AbstractControllerTest {
Assert.assertEquals(DEFAULT_FILE_NAME, savedResource.getResourceKey());
Assert.assertArrayEquals(resource.getData(), download(savedResource.getId()));
savedResource.setTitle("My new resource");
savedResource.setData(null);
save(savedResource);
TbResource foundResource = doGet("/api/resource/" + savedResource.getId().getId().toString(), TbResource.class);
foundResource.setTitle("My new resource");
foundResource.setData(null);
savedResource = save(foundResource);
Assert.assertEquals(foundResource.getTitle(), savedResource.getTitle());
testNotifyEntityAllOneTimeLogEntityActionEntityEqClass(foundResource, foundResource.getId(), foundResource.getId(),
testNotifyEntityAllOneTimeLogEntityActionEntityEqClass(savedResource, savedResource.getId(), savedResource.getId(),
savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(),
ActionType.UPDATED, ActionType.UPDATED);
}
@ -147,7 +147,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
.andExpect(status().isBadRequest())
.andExpect(statusReason(containsString(msgError)));
testNotifyEntityEqualsOneTimeServiceNeverError(resource, savedTenant.getId(),
testNotifyEntityEqualsOneTimeServiceNeverError(new TbResourceInfo(resource), savedTenant.getId(),
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(msgError));
}
@ -159,7 +159,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setFileName(DEFAULT_FILE_NAME);
resource.setEncodedData(TEST_DATA);
TbResource savedResource = save(resource);
TbResourceInfo savedResource = save(resource);
loginDifferentTenant();
@ -188,7 +188,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setFileName(DEFAULT_FILE_NAME);
resource.setEncodedData(TEST_DATA);
TbResource savedResource = save(resource);
TbResourceInfo savedResource = save(resource);
TbResource foundResource = doGet("/api/resource/" + savedResource.getUuidId(), TbResource.class);
Assert.assertNotNull(foundResource);
@ -204,7 +204,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setFileName(DEFAULT_FILE_NAME);
resource.setEncodedData(TEST_DATA);
TbResource savedResource = save(resource);
TbResourceInfo savedResource = save(resource);
Mockito.reset(tbClusterService, auditLogService);
String resourceIdStr = savedResource.getId().getId().toString();
@ -229,7 +229,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setFileName(DEFAULT_FILE_NAME);
resource.setEncodedData(TEST_DATA);
TbResource savedResource = save(resource);
TbResourceInfo savedResource = save(resource);
Mockito.reset(tbClusterService, auditLogService);
String resourceIdStr = savedResource.getId().getId().toString();
@ -274,7 +274,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
}
} while (pageData.hasNext());
testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAny(new TbResource(), new TbResource(),
testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAny(new TbResourceInfo(), new TbResourceInfo(),
savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(),
ActionType.ADDED, cntEntity, cntEntity, cntEntity);
@ -322,7 +322,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
}
} while (pageData.hasNext());
testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAny(new TbResource(), new TbResource(),
testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAny(new TbResourceInfo(), new TbResourceInfo(),
savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED,
jksCntEntity + lwm2mCntEntity, jksCntEntity + lwm2mCntEntity, jksCntEntity + lwm2mCntEntity);
@ -414,7 +414,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setResourceType(ResourceType.PKCS_12);
resource.setFileName(i + DEFAULT_FILE_NAME_2);
resource.setEncodedData(TEST_DATA);
TbResource saved = save(resource);
TbResourceInfo saved = save(resource);
lwm2mesources.add(saved);
}
@ -536,7 +536,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setFileName(JS_TEST_FILE_NAME);
resource.setEncodedData(TEST_DATA);
TbResource savedResource = save(resource);
TbResourceInfo savedResource = save(resource);
testNotifyEntityAllOneTimeLogEntityActionEntityEqClass(savedResource, savedResource.getId(), savedResource.getId(),
savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(),
@ -567,7 +567,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setFileName(JS_TEST_FILE_NAME);
resource.setEncodedData(TEST_DATA);
TbResource savedResource = save(resource);
TbResourceInfo savedResource = save(resource);
//download as public customer
Device device = new Device();
@ -611,7 +611,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setFileName(JS_TEST_FILE_NAME);
resource.setEncodedData(TEST_DATA);
TbResource savedResource = save(resource);
TbResourceInfo savedResource = save(resource);
loginDifferentTenant();
loginDifferentTenantCustomer();
@ -626,17 +626,19 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setTitle("My resource");
resource.setFileName("3.pks");
resource.setEncodedData(TEST_DATA);
TbResource savedResource = save(resource);
TbResourceInfo savedResource = save(resource);
resource.setEtag(savedResource.getEtag());
savedResource.setEncodedData(TEST_DATA);
doPost("/api/resource", savedResource)
TbResource foundResource = doGet("/api/resource/" + savedResource.getUuidId(), TbResource.class);
foundResource.setEncodedData(TEST_DATA);
doPost("/api/resource", foundResource)
.andExpect(status().isBadRequest())
.andExpect(statusReason(containsString("can't be updated")));
savedResource.setData(null);
savedResource.setTitle("Updated resource");
savedResource = doPost("/api/resource", savedResource, TbResource.class);
foundResource.setData(null);
foundResource.setTitle("Updated resource");
savedResource = doPost("/api/resource", foundResource, TbResource.class);
assertThat(savedResource.getTitle()).isEqualTo("Updated resource");
assertThat(savedResource.getFileName()).isEqualTo(resource.getFileName());
assertThat(savedResource.getEtag()).isEqualTo(resource.getEtag());
@ -650,14 +652,16 @@ public class TbResourceControllerTest extends AbstractControllerTest {
resource.setTitle("My resource");
resource.setFileName("module.js");
resource.setEncodedData(TEST_DATA);
TbResource savedResource = save(resource);
resource.setEtag(savedResource.getEtag());
TbResourceInfo savedResource = save(resource);
TbResource foundResource = doGet("/api/resource/" + savedResource.getUuidId(), TbResource.class);
resource.setEtag(foundResource.getEtag());
String newData = Base64.getEncoder().encodeToString(new byte[]{1, 2, 3});
savedResource.setEncodedData(newData);
savedResource.setFileName("new-module.js");
savedResource.setTitle("Updated title");
savedResource = save(savedResource);
foundResource.setEncodedData(newData);
foundResource.setFileName("new-module.js");
foundResource.setTitle("Updated title");
savedResource = save(foundResource);
assertThat(savedResource.getTitle()).isEqualTo("Updated title");
assertThat(savedResource.getFileName()).isEqualTo("new-module.js");
@ -669,7 +673,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
public void testGetLwm2mListObjectsPage() throws Exception {
loginTenantAdmin();
List<TbResource> resources = loadLwm2mResources();
List<TbResourceInfo> resources = loadLwm2mResources();
List<LwM2mObject> objects =
doGetTyped("/api/resource/lwm2m/page?pageSize=100&page=0", new TypeReference<>() {});
@ -683,7 +687,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
public void testGetLwm2mListObjects() throws Exception {
loginTenantAdmin();
List<TbResource> resources = loadLwm2mResources();
List<TbResourceInfo> resources = loadLwm2mResources();
List<LwM2mObject> objects =
doGetTyped("/api/resource/lwm2m?sortProperty=id&sortOrder=ASC&objectIds=3_1.2,5_1.2,19_1.1", new TypeReference<>() {});
@ -693,7 +697,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
removeLoadResources(resources);
}
private TbResource save(TbResource tbResource) throws Exception {
private TbResourceInfo save(TbResource tbResource) throws Exception {
return doPostWithTypedResponse("/api/resource", tbResource, new TypeReference<>() {
});
}
@ -709,10 +713,10 @@ public class TbResourceControllerTest extends AbstractControllerTest {
}
private List<TbResource> loadLwm2mResources() throws Exception {
private List<TbResourceInfo> loadLwm2mResources() throws Exception {
var models = List.of("1", "2", "3", "5", "6", "9", "19", "3303");
List<TbResource> resources = new ArrayList<>(models.size());
List<TbResourceInfo> resources = new ArrayList<>(models.size());
for (String model : models) {
String fileName = model + ".xml";
@ -728,7 +732,7 @@ public class TbResourceControllerTest extends AbstractControllerTest {
return resources;
}
private void removeLoadResources(List<TbResource> resources) throws Exception {
private void removeLoadResources(List<TbResourceInfo> resources) throws Exception {
for (TbResourceInfo resource : resources) {
doDelete("/api/resource/" + resource.getId().getId().toString())
.andExpect(status().isOk());

View File

@ -202,7 +202,7 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
}
}
private TbResource createResource(String title, String filename) throws Exception {
private TbResourceInfo createResource(String title, String filename) throws Exception {
TbResource resource = new TbResource();
resource.setTenantId(tenantId);
resource.setTitle(title);
@ -222,25 +222,29 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
resource.setFileName(DEFAULT_FILE_NAME);
resource.setData(TEST_DATA);
TbResource savedResource = tbResourceService.save(resource);
TbResourceInfo savedResource = tbResourceService.save(resource);
Assert.assertNotNull(savedResource);
Assert.assertNotNull(savedResource.getId());
Assert.assertTrue(savedResource.getCreatedTime() > 0);
assertEquals(resource.getTenantId(), savedResource.getTenantId());
assertEquals(resource.getTitle(), savedResource.getTitle());
assertEquals(resource.getResourceKey(), savedResource.getResourceKey());
assertArrayEquals(TEST_DATA, savedResource.getData());
savedResource.setTitle("My new resource");
savedResource.setData(null);
tbResourceService.save(savedResource);
TbResource foundResource = resourceService.findResourceById(tenantId, savedResource.getId());
assertEquals(foundResource.getTitle(), savedResource.getTitle());
Assert.assertNotNull(foundResource);
Assert.assertNotNull(foundResource.getId());
Assert.assertTrue(foundResource.getCreatedTime() > 0);
assertEquals(resource.getTenantId(), foundResource.getTenantId());
assertEquals(resource.getTitle(), foundResource.getTitle());
assertEquals(resource.getResourceKey(), foundResource.getResourceKey());
assertArrayEquals(TEST_DATA, foundResource.getData());
String title = "My new resource";
foundResource.setTitle(title);
foundResource.setData(null);
tbResourceService.save(foundResource);
foundResource = resourceService.findResourceById(tenantId, foundResource.getId());
assertEquals(title, foundResource.getTitle());
assertArrayEquals(foundResource.getData(), TEST_DATA);
tbResourceService.delete(savedResource, null);
tbResourceService.delete(foundResource, null);
}
@Test
@ -251,17 +255,19 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
resource.setFileName("test_model.xml");
resource.setEncodedData(Base64.getEncoder().encodeToString(LWM2M_TEST_MODEL.getBytes()));
TbResource savedResource = tbResourceService.save(resource);
TbResourceInfo savedResource = tbResourceService.save(resource);
Assert.assertNotNull(savedResource);
Assert.assertNotNull(savedResource.getId());
Assert.assertTrue(savedResource.getCreatedTime() > 0);
assertEquals(resource.getTenantId(), savedResource.getTenantId());
assertEquals("My first resource id=0 v1.0", savedResource.getTitle());
assertEquals("0_1.0", savedResource.getResourceKey());
assertArrayEquals(savedResource.getData(), LWM2M_TEST_MODEL.getBytes());
TbResource foundResource = resourceService.findResourceById(tenantId, savedResource.getId());
tbResourceService.delete(savedResource, null);
Assert.assertNotNull(foundResource);
Assert.assertNotNull(foundResource.getId());
Assert.assertTrue(foundResource.getCreatedTime() > 0);
assertEquals(resource.getTenantId(), foundResource.getTenantId());
assertEquals("My first resource id=0 v1.0", foundResource.getTitle());
assertEquals("0_1.0", foundResource.getResourceKey());
assertArrayEquals(foundResource.getData(), LWM2M_TEST_MODEL.getBytes());
tbResourceService.delete(foundResource, null);
}
@Test
@ -271,11 +277,12 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
resource.setTitle("My resource");
resource.setFileName(DEFAULT_FILE_NAME);
resource.setData(TEST_DATA);
TbResource savedResource = tbResourceService.save(resource);
TbResourceInfo savedResource = tbResourceService.save(resource);
assertEquals(TenantId.SYS_TENANT_ID, savedResource.getTenantId());
tbResourceService.delete(savedResource, null);
TbResource foundResource = resourceService.findResourceById(tenantId, savedResource.getId());
tbResourceService.delete(foundResource, null);
}
@Test
@ -286,7 +293,7 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
resource.setTitle("My resource");
resource.setFileName(DEFAULT_FILE_NAME);
resource.setData(TEST_DATA);
resource = tbResourceService.save(resource);
TbResourceInfo savedResource = tbResourceService.save(resource);
TbResource resource2 = new TbResource();
resource2.setTenantId(tenantId);
@ -294,11 +301,11 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
resource2.setTitle("My resource");
resource2.setFileName(DEFAULT_FILE_NAME);
resource2.setData(TEST_DATA);
resource2 = tbResourceService.save(resource2);
TbResourceInfo savedResource2 = tbResourceService.save(resource2);
assertThat(resource2.getId()).isNotEqualTo(resource.getId());
assertThat(resource2.getFileName()).isEqualTo("test.jks");
assertThat(resource2.getResourceKey()).isEqualTo("test_(1).jks");
assertThat(savedResource2.getId()).isNotEqualTo(savedResource.getId());
assertThat(savedResource2.getFileName()).isEqualTo("test.jks");
assertThat(savedResource2.getResourceKey()).isEqualTo("test_(1).jks");
}
@Test
@ -348,12 +355,13 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
resource.setTitle("My resource");
resource.setFileName(DEFAULT_FILE_NAME);
resource.setData(TEST_DATA);
TbResource savedResource = tbResourceService.save(resource);
TbResourceInfo savedResource = tbResourceService.save(resource);
TbResource foundResource = resourceService.findResourceById(tenantId, savedResource.getId());
Assert.assertNotNull(foundResource);
assertEquals(savedResource, foundResource);
tbResourceService.delete(savedResource, null);
assertEquals(savedResource, new TbResourceInfo(foundResource));
assertArrayEquals(TEST_DATA, foundResource.getData());
tbResourceService.delete(foundResource, null);
}
@Test
@ -364,12 +372,13 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
resource.setTitle("My resource");
resource.setFileName(DEFAULT_FILE_NAME);
resource.setData(TEST_DATA);
TbResource savedResource = tbResourceService.save(resource);
TbResourceInfo savedResource = tbResourceService.save(resource);
TbResource foundResource = resourceService.findResourceByTenantIdAndKey(tenantId, savedResource.getResourceType(), savedResource.getResourceKey());
Assert.assertNotNull(foundResource);
assertEquals(savedResource, foundResource);
tbResourceService.delete(savedResource, null);
assertEquals(savedResource, new TbResourceInfo(foundResource));
assertArrayEquals(TEST_DATA, foundResource.getData());
tbResourceService.delete(foundResource, null);
}
@Test
@ -379,11 +388,11 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
resource.setTitle("My resource");
resource.setFileName(DEFAULT_FILE_NAME);
resource.setData(TEST_DATA);
TbResource savedResource = tbResourceService.save(resource);
TbResourceInfo savedResource = tbResourceService.save(resource);
TbResource foundResource = resourceService.findResourceById(tenantId, savedResource.getId());
Assert.assertNotNull(foundResource);
tbResourceService.delete(savedResource, null);
tbResourceService.delete(foundResource, null);
foundResource = resourceService.findResourceById(tenantId, savedResource.getId());
Assert.assertNull(foundResource);
}
@ -471,7 +480,7 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
resource.setResourceType(ResourceType.JKS);
resource.setFileName(i + DEFAULT_FILE_NAME);
resource.setData(TEST_DATA);
resources.add(new TbResourceInfo(tbResourceService.save(resource)));
resources.add(tbResourceService.save(resource));
}
List<TbResourceInfo> loadedResources = new ArrayList<>();