From 67d917241dc462814c9a689c420a99f57babe72e Mon Sep 17 00:00:00 2001 From: Dominik Riemer Date: Wed, 31 Jul 2024 09:29:48 +0200 Subject: [PATCH 1/3] feat(#3079): Add migration for existing data views --- .../model/client/user/PermissionBuilder.java | 2 +- .../model/dashboard/DashboardModel.java | 4 + .../datalake/DataExplorerWidgetModel.java | 4 + ....java => AbstractCRUDResourceManager.java} | 44 ++++--- .../management/DashboardResourceManager.java | 5 +- .../DataExplorerResourceManager.java | 5 +- .../DataExplorerWidgetResourceManager.java | 29 ++++ .../management/PermissionResourceManager.java | 4 + .../management/SpResourceManager.java | 7 + .../dashboard/AbstractDashboardResource.java | 4 +- .../rest/impl/dashboard/Dashboard.java | 5 +- .../datalake/DataLakeDashboardResource.java | 5 +- .../impl/datalake/DataLakeWidgetResource.java | 37 +++--- .../core/migrations/AvailableMigrations.java | 4 +- .../v970/DataExplorerDataViewMigration.java | 124 ++++++++++++++++++ .../apis/data-view-data-explorer.service.ts | 2 +- ...a-explorer-dashboard-overview.component.ts | 18 +-- ...explorer-data-view-overview.component.html | 9 ++ ...a-explorer-data-view-overview.component.ts | 24 +++- .../data-explorer-dashboard.service.ts | 13 ++ .../services/time-selection.service.ts | 24 ++++ 21 files changed, 306 insertions(+), 67 deletions(-) rename streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/{AbstractDashboardResourceManager.java => AbstractCRUDResourceManager.java} (52%) create mode 100644 streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerWidgetResourceManager.java create mode 100644 streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/DataExplorerDataViewMigration.java diff --git a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/PermissionBuilder.java b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/PermissionBuilder.java index b7857caf7d..e032f1e984 100644 --- a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/PermissionBuilder.java +++ b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/PermissionBuilder.java @@ -19,7 +19,7 @@ public class PermissionBuilder { - private Permission permission; + private final Permission permission; private PermissionBuilder(String objectInstanceId, Class objectInstanceClass, diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardModel.java b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardModel.java index f929b97ff6..cf9ee00ea2 100644 --- a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardModel.java +++ b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardModel.java @@ -139,4 +139,8 @@ public String getCouchDbId() { public Map getDashboardLiveSettings() { return dashboardLiveSettings; } + + public void setDashboardLiveSettings(Map dashboardLiveSettings) { + this.dashboardLiveSettings = dashboardLiveSettings; + } } diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java b/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java index e9ac5bc159..02b244d22c 100644 --- a/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java +++ b/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java @@ -115,4 +115,8 @@ public Map getTimeSettings() { return this.timeSettings; } + public void setTimeSettings(Map timeSettings) { + this.timeSettings = timeSettings; + } + } diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractDashboardResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractCRUDResourceManager.java similarity index 52% rename from streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractDashboardResourceManager.java rename to streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractCRUDResourceManager.java index 3c1a125b7d..15240a708d 100644 --- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractDashboardResourceManager.java +++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractCRUDResourceManager.java @@ -18,48 +18,54 @@ package org.apache.streampipes.resource.management; import org.apache.streampipes.model.client.user.Permission; -import org.apache.streampipes.model.dashboard.DashboardModel; +import org.apache.streampipes.model.shared.api.Storable; import org.apache.streampipes.model.util.ElementIdGenerator; import org.apache.streampipes.storage.api.CRUDStorage; import java.util.List; -public abstract class AbstractDashboardResourceManager - extends AbstractResourceManager> { +public abstract class AbstractCRUDResourceManager + extends AbstractResourceManager> { - public AbstractDashboardResourceManager(CRUDStorage db) { + private final Class elementClass; + + public AbstractCRUDResourceManager(CRUDStorage db, + Class elementClass) { super(db); + this.elementClass = elementClass; } - public List findAll() { + public List findAll() { return db.findAll(); } - public DashboardModel find(String dashboardId) { - return db.getElementById(dashboardId); + public T find(String elementId) { + return db.getElementById(elementId); } - public void delete(String dashboardId) { - db.deleteElementById(dashboardId); - deletePermissions(dashboardId); + public void delete(String elementId) { + db.deleteElementById(elementId); + deletePermissions(elementId); } - public void create(DashboardModel dashboardModel, String principalSid) { - if (dashboardModel.getElementId() == null) { - dashboardModel.setElementId(ElementIdGenerator.makeElementId(DashboardModel.class)); + public T create(T element, + String principalSid) { + if (element.getElementId() == null) { + element.setElementId(ElementIdGenerator.makeElementId(elementClass)); } - db.persist(dashboardModel); - new PermissionResourceManager().createDefault(dashboardModel.getElementId(), DashboardModel.class, principalSid, + db.persist(element); + new PermissionResourceManager().createDefault(element.getElementId(), elementClass, principalSid, false); + return find(element.getElementId()); } - public void update(DashboardModel dashboardModel) { - db.updateElement(dashboardModel); + public void update(T element) { + db.updateElement(element); } - private void deletePermissions(String dashboardId) { + private void deletePermissions(String elementId) { PermissionResourceManager manager = new PermissionResourceManager(); - List permissions = manager.findForObjectId(dashboardId); + List permissions = manager.findForObjectId(elementId); permissions.forEach(manager::delete); } } diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DashboardResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DashboardResourceManager.java index 01f3637413..b6db9d83ac 100644 --- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DashboardResourceManager.java +++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DashboardResourceManager.java @@ -17,11 +17,12 @@ */ package org.apache.streampipes.resource.management; +import org.apache.streampipes.model.dashboard.DashboardModel; import org.apache.streampipes.storage.management.StorageDispatcher; -public class DashboardResourceManager extends AbstractDashboardResourceManager { +public class DashboardResourceManager extends AbstractCRUDResourceManager { public DashboardResourceManager() { - super(StorageDispatcher.INSTANCE.getNoSqlStore().getDashboardStorage()); + super(StorageDispatcher.INSTANCE.getNoSqlStore().getDashboardStorage(), DashboardModel.class); } } diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java index 1a66b46695..38cca4a759 100644 --- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java +++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java @@ -17,11 +17,12 @@ */ package org.apache.streampipes.resource.management; +import org.apache.streampipes.model.dashboard.DashboardModel; import org.apache.streampipes.storage.management.StorageDispatcher; -public class DataExplorerResourceManager extends AbstractDashboardResourceManager { +public class DataExplorerResourceManager extends AbstractCRUDResourceManager { public DataExplorerResourceManager() { - super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerDashboardStorage()); + super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerDashboardStorage(), DashboardModel.class); } } diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerWidgetResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerWidgetResourceManager.java new file mode 100644 index 0000000000..9176b3bf43 --- /dev/null +++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerWidgetResourceManager.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.streampipes.resource.management; + +import org.apache.streampipes.model.datalake.DataExplorerWidgetModel; +import org.apache.streampipes.storage.api.CRUDStorage; + +public class DataExplorerWidgetResourceManager extends AbstractCRUDResourceManager { + + public DataExplorerWidgetResourceManager(CRUDStorage db) { + super(db, DataExplorerWidgetModel.class); + } +} diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java index dc263ee381..0d48e15949 100644 --- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java +++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/PermissionResourceManager.java @@ -34,6 +34,10 @@ public List findAll() { return db.findAll(); } + public Permission find(String elementId) { + return db.getElementById(elementId); + } + public List findForObjectId(String objectInstanceId) { return db.getUserPermissionsForObject(objectInstanceId); } diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java index 37df63dfc7..5f202f4b81 100644 --- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java +++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java @@ -17,6 +17,9 @@ */ package org.apache.streampipes.resource.management; +import org.apache.streampipes.model.datalake.DataExplorerWidgetModel; +import org.apache.streampipes.storage.api.CRUDStorage; + public class SpResourceManager { public AdapterResourceManager manageAdapters() { @@ -35,6 +38,10 @@ public DataExplorerResourceManager manageDataExplorer() { return new DataExplorerResourceManager(); } + public DataExplorerWidgetResourceManager manageDataExplorerWidget(CRUDStorage db) { + return new DataExplorerWidgetResourceManager(db); + } + public DataProcessorResourceManager manageDataProcessors() { return new DataProcessorResourceManager(); } diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java index 644b1f6f9d..da77678804 100644 --- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java +++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java @@ -19,7 +19,7 @@ package org.apache.streampipes.rest.impl.dashboard; import org.apache.streampipes.model.dashboard.DashboardModel; -import org.apache.streampipes.resource.management.AbstractDashboardResourceManager; +import org.apache.streampipes.resource.management.AbstractCRUDResourceManager; import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource; import org.springframework.http.MediaType; @@ -71,7 +71,7 @@ public ResponseEntity createDashboard(@RequestBody DashboardModel dashboar return ok(); } - protected abstract AbstractDashboardResourceManager getResourceManager(); + protected abstract AbstractCRUDResourceManager getResourceManager(); /** * Do not delete these abstract methods below - required by Spring SPEL (see above) diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/Dashboard.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/Dashboard.java index 429b199e41..ac161a72d7 100644 --- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/Dashboard.java +++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/Dashboard.java @@ -19,7 +19,8 @@ package org.apache.streampipes.rest.impl.dashboard; import org.apache.streampipes.model.client.user.Privilege; -import org.apache.streampipes.resource.management.AbstractDashboardResourceManager; +import org.apache.streampipes.model.dashboard.DashboardModel; +import org.apache.streampipes.resource.management.AbstractCRUDResourceManager; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -29,7 +30,7 @@ public class Dashboard extends AbstractDashboardResource { @Override - protected AbstractDashboardResourceManager getResourceManager() { + protected AbstractCRUDResourceManager getResourceManager() { return getSpResourceManager().manageDashboards(); } diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeDashboardResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeDashboardResource.java index f33720487e..3339bae6b0 100644 --- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeDashboardResource.java +++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeDashboardResource.java @@ -20,7 +20,8 @@ import org.apache.streampipes.model.client.user.Privilege; -import org.apache.streampipes.resource.management.AbstractDashboardResourceManager; +import org.apache.streampipes.model.dashboard.DashboardModel; +import org.apache.streampipes.resource.management.AbstractCRUDResourceManager; import org.apache.streampipes.rest.impl.dashboard.AbstractDashboardResource; import org.springframework.web.bind.annotation.RequestMapping; @@ -31,7 +32,7 @@ public class DataLakeDashboardResource extends AbstractDashboardResource { @Override - protected AbstractDashboardResourceManager getResourceManager() { + protected AbstractCRUDResourceManager getResourceManager() { return getSpResourceManager().manageDataExplorer(); } diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java index ced1771899..ff6f02f87e 100644 --- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java +++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java @@ -18,11 +18,10 @@ package org.apache.streampipes.rest.impl.datalake; -import org.apache.streampipes.model.dashboard.DashboardWidgetModel; import org.apache.streampipes.model.datalake.DataExplorerWidgetModel; -import org.apache.streampipes.model.util.ElementIdGenerator; -import org.apache.streampipes.rest.core.base.impl.AbstractRestResource; -import org.apache.streampipes.storage.api.CRUDStorage; +import org.apache.streampipes.resource.management.DataExplorerWidgetResourceManager; +import org.apache.streampipes.resource.management.SpResourceManager; +import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -39,16 +38,24 @@ @RestController @RequestMapping("/api/v3/datalake/dashboard/widgets") -public class DataLakeWidgetResource extends AbstractRestResource { +public class DataLakeWidgetResource extends AbstractAuthGuardedRestResource { + + private final DataExplorerWidgetResourceManager resourceManager; + + public DataLakeWidgetResource() { + this.resourceManager = new SpResourceManager().manageDataExplorerWidget( + getNoSqlStorage().getDataExplorerWidgetStorage() + ); + } @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> getAllDataExplorerWidgets() { - return ok(getDataExplorerWidgetStorage().findAll()); + return ok(resourceManager.findAll()); } @GetMapping(path = "/{widgetId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getDataExplorerWidget(@PathVariable("widgetId") String widgetId) { - return ok(getDataExplorerWidgetStorage().getElementById(widgetId)); + return ok(resourceManager.find(widgetId)); } @PutMapping( @@ -57,13 +64,13 @@ public ResponseEntity getDataExplorerWidget(@PathVariab produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity modifyDataExplorerWidget( @RequestBody DataExplorerWidgetModel dataExplorerWidgetModel) { - getDataExplorerWidgetStorage().updateElement(dataExplorerWidgetModel); - return ok(getDataExplorerWidgetStorage().getElementById(dataExplorerWidgetModel.getElementId())); + resourceManager.update(dataExplorerWidgetModel); + return ok(resourceManager.find(dataExplorerWidgetModel.getElementId())); } @DeleteMapping(path = "/{widgetId}") public ResponseEntity deleteDataExplorerWidget(@PathVariable("widgetId") String widgetId) { - getDataExplorerWidgetStorage().deleteElementById(widgetId); + resourceManager.delete(widgetId); return ok(); } @@ -73,14 +80,6 @@ public ResponseEntity deleteDataExplorerWidget(@PathVariable("widgetId") S ) public ResponseEntity createDataExplorerWidget( @RequestBody DataExplorerWidgetModel dataExplorerWidgetModel) { - String elementId = ElementIdGenerator.makeElementId(DashboardWidgetModel.class); - dataExplorerWidgetModel.setElementId(elementId); - getDataExplorerWidgetStorage().persist(dataExplorerWidgetModel); - return ok(getDataExplorerWidgetStorage().getElementById(elementId)); + return ok(resourceManager.create(dataExplorerWidgetModel, getAuthenticatedUserSid())); } - - private CRUDStorage getDataExplorerWidgetStorage() { - return getNoSqlStorage().getDataExplorerWidgetStorage(); - } - } diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java index 8b21c7575a..a12271b99c 100644 --- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java +++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java @@ -26,6 +26,7 @@ import org.apache.streampipes.service.core.migrations.v093.AdapterMigration; import org.apache.streampipes.service.core.migrations.v093.StoreEmailTemplatesMigration; import org.apache.streampipes.service.core.migrations.v095.MergeFilenamesAndRenameDuplicatesMigration; +import org.apache.streampipes.service.core.migrations.v970.DataExplorerDataViewMigration; import org.apache.streampipes.service.core.migrations.v970.AddLinkSettingsMigration; import java.util.Arrays; @@ -42,7 +43,8 @@ public List getAvailableMigrations() { new AdapterMigration(), new StoreEmailTemplatesMigration(), new MergeFilenamesAndRenameDuplicatesMigration(), - new AddLinkSettingsMigration() + new AddLinkSettingsMigration(), + new DataExplorerDataViewMigration() ); } } diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/DataExplorerDataViewMigration.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/DataExplorerDataViewMigration.java new file mode 100644 index 0000000000..c078ef980b --- /dev/null +++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/DataExplorerDataViewMigration.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.streampipes.service.core.migrations.v970; + +import org.apache.streampipes.model.client.user.PermissionBuilder; +import org.apache.streampipes.model.dashboard.DashboardModel; +import org.apache.streampipes.model.datalake.DataExplorerWidgetModel; +import org.apache.streampipes.resource.management.PermissionResourceManager; +import org.apache.streampipes.service.core.migrations.Migration; +import org.apache.streampipes.storage.api.CRUDStorage; +import org.apache.streampipes.storage.management.StorageDispatcher; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Migrates data explorer dashboards and data views + * Add permission object for each data view + * Add time settings to data views + * Add live settings to dashboards + */ +public class DataExplorerDataViewMigration implements Migration { + + private static final Logger LOG = LoggerFactory.getLogger(DataExplorerDataViewMigration.class); + + private final CRUDStorage dataViewStorage; + private final CRUDStorage dataExplorerDashboardStorage; + private final PermissionResourceManager permissionResourceManager; + + public DataExplorerDataViewMigration() { + var storage = StorageDispatcher.INSTANCE.getNoSqlStore(); + this.dataViewStorage = storage.getDataExplorerWidgetStorage(); + this.dataExplorerDashboardStorage = storage.getDataExplorerDashboardStorage(); + this.permissionResourceManager = new PermissionResourceManager(); + } + + @Override + public boolean shouldExecute() { + return !findDashboardsToMigrate().isEmpty(); + } + + @Override + public void executeMigration() throws IOException { + var allDashboards = findDashboardsToMigrate(); + var defaultLiveSettings = makeDefaultLiveSettings(); + + LOG.info("Migrating {} data explorer dashboards", allDashboards.size()); + + allDashboards + .forEach(dashboard -> { + var timeSettings = dashboard.getDashboardTimeSettings(); + dashboard.getDashboardGeneralSettings().put("globalTimeEnabled", true); + dashboard.setDashboardLiveSettings(defaultLiveSettings); + dashboard.getWidgets().forEach(widget -> { + var dataView = dataViewStorage.getElementById(widget.getId()); + if (dataView != null) { + dataView.setTimeSettings(timeSettings); + dataViewStorage.updateElement(dataView); + addPermissionsObject(dashboard, dataView); + } + }); + dataExplorerDashboardStorage.updateElement(dashboard); + }); + } + + @Override + public String getDescription() { + return "Migrating data explorer data views"; + } + + private List findDashboardsToMigrate() { + return dataExplorerDashboardStorage + .findAll() + .stream() + .filter(dashboard -> !dashboard.getDashboardGeneralSettings().containsKey("globalTimeEnabled")) + .toList(); + } + + private Map makeDefaultLiveSettings() { + var map = new HashMap(); + map.put("refreshModeActive", false); + map.put("refreshIntervalInSeconds", 10); + map.put("label", "Off"); + + return map; + } + + private void addPermissionsObject(DashboardModel dashboard, + DataExplorerWidgetModel dataView) { + var dashboardPermissions = permissionResourceManager.findForObjectId(dashboard.getElementId()); + if (!dashboardPermissions.isEmpty()) { + var dashboardPermission = dashboardPermissions.get(0); + if (permissionResourceManager.find(dataView.getElementId()) == null) { + var dataViewPermission = PermissionBuilder + .create(dataView.getElementId(), DataExplorerWidgetModel.class, dashboardPermission.getOwnerSid()) + .publicElement(dashboardPermission.isPublicElement()) + .build(); + dataViewPermission.setGrantedAuthorities(dashboardPermission.getGrantedAuthorities()); + permissionResourceManager.create(dataViewPermission); + } + } + } +} diff --git a/ui/projects/streampipes/platform-services/src/lib/apis/data-view-data-explorer.service.ts b/ui/projects/streampipes/platform-services/src/lib/apis/data-view-data-explorer.service.ts index dc228ebde7..320432ad4a 100644 --- a/ui/projects/streampipes/platform-services/src/lib/apis/data-view-data-explorer.service.ts +++ b/ui/projects/streampipes/platform-services/src/lib/apis/data-view-data-explorer.service.ts @@ -112,7 +112,7 @@ export class DataViewDataExplorerService { } deleteWidget(widgetId: string): Observable { - return this.http.delete(this.dashboardWidgetUrl + '/' + widgetId); + return this.http.delete(`${this.dashboardWidgetUrl}/${widgetId}`); } updateWidget(widget: DataExplorerWidgetModel): Observable { diff --git a/ui/src/app/data-explorer/components/overview/data-explorer-dashboard-overview/data-explorer-dashboard-overview.component.ts b/ui/src/app/data-explorer/components/overview/data-explorer-dashboard-overview/data-explorer-dashboard-overview.component.ts index 4d6b8ca7dd..630595d06d 100644 --- a/ui/src/app/data-explorer/components/overview/data-explorer-dashboard-overview/data-explorer-dashboard-overview.component.ts +++ b/ui/src/app/data-explorer/components/overview/data-explorer-dashboard-overview/data-explorer-dashboard-overview.component.ts @@ -61,19 +61,11 @@ export class SpDataExplorerDashboardOverviewComponent extends SpDataExplorerOver } showPermissionsDialog(dashboard: Dashboard) { - const dialogRef = this.dialogService.open( - ObjectPermissionDialogComponent, - { - panelType: PanelType.SLIDE_IN_PANEL, - title: 'Manage permissions', - width: '50vw', - data: { - objectInstanceId: dashboard.elementId, - headerTitle: - 'Manage permissions for dashboard ' + dashboard.name, - }, - }, - ); + const dialogRef = + this.dataExplorerDashboardService.openPermissionsDialog( + dashboard.elementId, + `Manage permissions for dashboard ${dashboard.name}`, + ); dialogRef.afterClosed().subscribe(refresh => { if (refresh) { diff --git a/ui/src/app/data-explorer/components/overview/data-explorer-data-view-overview/data-explorer-data-view-overview.component.html b/ui/src/app/data-explorer/components/overview/data-explorer-data-view-overview/data-explorer-data-view-overview.component.html index e175e52353..6695509fc4 100644 --- a/ui/src/app/data-explorer/components/overview/data-explorer-data-view-overview/data-explorer-data-view-overview.component.html +++ b/ui/src/app/data-explorer/components/overview/data-explorer-data-view-overview/data-explorer-data-view-overview.component.html @@ -83,6 +83,15 @@ > edit +