Fix load of JS Module extensions during installation or upgrade.

This commit is contained in:
Igor Kulikov 2024-12-27 15:32:17 +02:00
parent 8f406dad95
commit 94f294aebf
4 changed files with 12 additions and 9 deletions

View File

@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.ResourceSubType;
import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.ServiceType;
@ -74,7 +75,7 @@ public class DashboardSyncService {
List<RepoFile> resources = listFiles("resources"); List<RepoFile> resources = listFiles("resources");
for (RepoFile resourceFile : resources) { for (RepoFile resourceFile : resources) {
byte[] data = getFileContent(resourceFile.path()); byte[] data = getFileContent(resourceFile.path());
resourceService.createOrUpdateSystemResource(ResourceType.JS_MODULE, resourceFile.name(), data); resourceService.createOrUpdateSystemResource(ResourceType.JS_MODULE, ResourceSubType.EXTENSION, resourceFile.name(), data);
} }
List<RepoFile> images = listFiles("images"); List<RepoFile> images = listFiles("images");
for (RepoFile imageFile : images) { for (RepoFile imageFile : images) {
@ -89,7 +90,7 @@ public class DashboardSyncService {
widgetsBundleService.updateSystemWidgets(widgetsBundles, widgetTypes); widgetsBundleService.updateSystemWidgets(widgetsBundles, widgetTypes);
RepoFile dashboardFile = listFiles("dashboards").get(0); RepoFile dashboardFile = listFiles("dashboards").get(0);
resourceService.createOrUpdateSystemResource(ResourceType.DASHBOARD, GATEWAYS_DASHBOARD_KEY, getFileContent(dashboardFile.path())); resourceService.createOrUpdateSystemResource(ResourceType.DASHBOARD, null, GATEWAYS_DASHBOARD_KEY, getFileContent(dashboardFile.path()));
log.info("Gateways dashboard sync completed"); log.info("Gateways dashboard sync completed");
} }

View File

@ -416,9 +416,9 @@ public class InstallScripts {
} }
Path resourcesDir = Path.of(getDataDir(), RESOURCES_DIR); Path resourcesDir = Path.of(getDataDir(), RESOURCES_DIR);
loadSystemResources(resourcesDir.resolve("images"), ResourceType.IMAGE); loadSystemResources(resourcesDir.resolve("images"), ResourceType.IMAGE, null);
loadSystemResources(resourcesDir.resolve("js_modules"), ResourceType.JS_MODULE); loadSystemResources(resourcesDir.resolve("js_modules"), ResourceType.JS_MODULE, ResourceSubType.EXTENSION);
loadSystemResources(resourcesDir.resolve("dashboards"), ResourceType.DASHBOARD); loadSystemResources(resourcesDir.resolve("dashboards"), ResourceType.DASHBOARD, null);
} }
public void loadDashboards(TenantId tenantId, CustomerId customerId) { public void loadDashboards(TenantId tenantId, CustomerId customerId) {
@ -514,7 +514,7 @@ public class InstallScripts {
resourcesUpdater.updateWidgetsResources(); resourcesUpdater.updateWidgetsResources();
} }
private void loadSystemResources(Path dir, ResourceType resourceType) { private void loadSystemResources(Path dir, ResourceType resourceType, ResourceSubType resourceSubType) {
listDir(dir).forEach(resourceFile -> { listDir(dir).forEach(resourceFile -> {
String resourceKey = resourceFile.getFileName().toString(); String resourceKey = resourceFile.getFileName().toString();
try { try {
@ -522,7 +522,7 @@ public class InstallScripts {
if (resourceType == ResourceType.IMAGE) { if (resourceType == ResourceType.IMAGE) {
imageService.createOrUpdateSystemImage(resourceKey, data); imageService.createOrUpdateSystemImage(resourceKey, data);
} else { } else {
resourceService.createOrUpdateSystemResource(resourceType, resourceKey, data); resourceService.createOrUpdateSystemResource(resourceType, resourceSubType, resourceKey, data);
} }
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("Unable to load system resource " + resourceFile, e); throw new RuntimeException("Unable to load system resource " + resourceFile, e);

View File

@ -18,6 +18,7 @@ package org.thingsboard.server.dao.resource;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.ResourceExportData; import org.thingsboard.server.common.data.ResourceExportData;
import org.thingsboard.server.common.data.ResourceSubType;
import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.TbResource; import org.thingsboard.server.common.data.TbResource;
import org.thingsboard.server.common.data.TbResourceInfo; import org.thingsboard.server.common.data.TbResourceInfo;
@ -88,6 +89,6 @@ public interface ResourceService extends EntityDaoService {
Collection<TbResourceInfo> getUsedResources(TenantId tenantId, WidgetTypeDetails widgetTypeDetails); Collection<TbResourceInfo> getUsedResources(TenantId tenantId, WidgetTypeDetails widgetTypeDetails);
TbResource createOrUpdateSystemResource(ResourceType resourceType, String resourceKey, byte[] data); TbResource createOrUpdateSystemResource(ResourceType resourceType, ResourceSubType resourceSubType, String resourceKey, byte[] data);
} }

View File

@ -597,7 +597,7 @@ public class BaseResourceService extends AbstractCachedEntityService<ResourceInf
} }
@Override @Override
public TbResource createOrUpdateSystemResource(ResourceType resourceType, String resourceKey, byte[] data) { public TbResource createOrUpdateSystemResource(ResourceType resourceType, ResourceSubType resourceSubType, String resourceKey, byte[] data) {
if (resourceType == ResourceType.DASHBOARD) { if (resourceType == ResourceType.DASHBOARD) {
Dashboard dashboard = JacksonUtil.fromBytes(data, Dashboard.class); Dashboard dashboard = JacksonUtil.fromBytes(data, Dashboard.class);
dashboard.setTenantId(TenantId.SYS_TENANT_ID); dashboard.setTenantId(TenantId.SYS_TENANT_ID);
@ -615,6 +615,7 @@ public class BaseResourceService extends AbstractCachedEntityService<ResourceInf
resource = new TbResource(); resource = new TbResource();
resource.setTenantId(TenantId.SYS_TENANT_ID); resource.setTenantId(TenantId.SYS_TENANT_ID);
resource.setResourceType(resourceType); resource.setResourceType(resourceType);
resource.setResourceSubType(resourceSubType);
resource.setResourceKey(resourceKey); resource.setResourceKey(resourceKey);
resource.setFileName(resourceKey); resource.setFileName(resourceKey);
resource.setTitle(resourceKey); resource.setTitle(resourceKey);