You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampipes.apache.org by ri...@apache.org on 2024/07/31 07:30:03 UTC
(streampipes) branch 3079-add-permission-management-to-data-views created (now 67d917241d)
This is an automated email from the ASF dual-hosted git repository.
riemer pushed a change to branch 3079-add-permission-management-to-data-views
in repository https://gitbox.apache.org/repos/asf/streampipes.git
at 67d917241d feat(#3079): Add migration for existing data views
This branch includes the following new commits:
new 67d917241d feat(#3079): Add migration for existing data views
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(streampipes) 01/01: feat(#3079): Add migration for existing data views
Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
riemer pushed a commit to branch 3079-add-permission-management-to-data-views
in repository https://gitbox.apache.org/repos/asf/streampipes.git
commit 67d917241dc462814c9a689c420a99f57babe72e
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Wed Jul 31 09:29:48 2024 +0200
feat(#3079): Add migration for existing data views
---
.../model/client/user/PermissionBuilder.java | 2 +-
.../model/dashboard/DashboardModel.java | 4 +
.../model/datalake/DataExplorerWidgetModel.java | 4 +
...nager.java => AbstractCRUDResourceManager.java} | 44 ++++----
.../management/DashboardResourceManager.java | 5 +-
.../management/DataExplorerResourceManager.java | 5 +-
...java => DataExplorerWidgetResourceManager.java} | 10 +-
.../management/PermissionResourceManager.java | 4 +
.../resource/management/SpResourceManager.java | 7 ++
.../impl/dashboard/AbstractDashboardResource.java | 4 +-
.../streampipes/rest/impl/dashboard/Dashboard.java | 5 +-
.../impl/datalake/DataLakeDashboardResource.java | 5 +-
.../rest/impl/datalake/DataLakeWidgetResource.java | 37 +++---
.../core/migrations/AvailableMigrations.java | 4 +-
.../v970/DataExplorerDataViewMigration.java | 124 +++++++++++++++++++++
.../lib/apis/data-view-data-explorer.service.ts | 2 +-
.../data-explorer-dashboard-overview.component.ts | 18 +--
...data-explorer-data-view-overview.component.html | 9 ++
.../data-explorer-data-view-overview.component.ts | 24 +++-
.../services/data-explorer-dashboard.service.ts | 13 +++
.../services/time-selection.service.ts | 24 ++++
21 files changed, 283 insertions(+), 71 deletions(-)
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 @@ package org.apache.streampipes.model.client.user;
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 class DashboardModel implements Storable {
public Map<String, Object> getDashboardLiveSettings() {
return dashboardLiveSettings;
}
+
+ public void setDashboardLiveSettings(Map<String, Object> 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 class DataExplorerWidgetModel extends DashboardEntity {
return this.timeSettings;
}
+ public void setTimeSettings(Map<String, Object> 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<CRUDStorage<DashboardModel>> {
+public abstract class AbstractCRUDResourceManager<T extends Storable>
+ extends AbstractResourceManager<CRUDStorage<T>> {
- public AbstractDashboardResourceManager(CRUDStorage<DashboardModel> db) {
+ private final Class<T> elementClass;
+
+ public AbstractCRUDResourceManager(CRUDStorage<T> db,
+ Class<T> elementClass) {
super(db);
+ this.elementClass = elementClass;
}
- public List<DashboardModel> findAll() {
+ public List<T> 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<Permission> permissions = manager.findForObjectId(dashboardId);
+ List<Permission> 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<DashboardModel> {
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<DashboardModel> {
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/DashboardResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerWidgetResourceManager.java
similarity index 70%
copy from streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DashboardResourceManager.java
copy to streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerWidgetResourceManager.java
index 01f3637413..9176b3bf43 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/DataExplorerWidgetResourceManager.java
@@ -15,13 +15,15 @@
* limitations under the License.
*
*/
+
package org.apache.streampipes.resource.management;
-import org.apache.streampipes.storage.management.StorageDispatcher;
+import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
+import org.apache.streampipes.storage.api.CRUDStorage;
-public class DashboardResourceManager extends AbstractDashboardResourceManager {
+public class DataExplorerWidgetResourceManager extends AbstractCRUDResourceManager<DataExplorerWidgetModel> {
- public DashboardResourceManager() {
- super(StorageDispatcher.INSTANCE.getNoSqlStore().getDashboardStorage());
+ public DataExplorerWidgetResourceManager(CRUDStorage<DataExplorerWidgetModel> 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 class PermissionResourceManager extends AbstractResourceManager<IPermissi
return db.findAll();
}
+ public Permission find(String elementId) {
+ return db.getElementById(elementId);
+ }
+
public List<Permission> 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 class SpResourceManager {
return new DataExplorerResourceManager();
}
+ public DataExplorerWidgetResourceManager manageDataExplorerWidget(CRUDStorage<DataExplorerWidgetModel> 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 abstract class AbstractDashboardResource extends AbstractAuthGuardedRestR
return ok();
}
- protected abstract AbstractDashboardResourceManager getResourceManager();
+ protected abstract AbstractCRUDResourceManager<DashboardModel> 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 @@ import org.springframework.web.bind.annotation.RestController;
public class Dashboard extends AbstractDashboardResource {
@Override
- protected AbstractDashboardResourceManager getResourceManager() {
+ protected AbstractCRUDResourceManager<DashboardModel> 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 @@ package org.apache.streampipes.rest.impl.datalake;
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 @@ import org.springframework.web.bind.annotation.RestController;
public class DataLakeDashboardResource extends AbstractDashboardResource {
@Override
- protected AbstractDashboardResourceManager getResourceManager() {
+ protected AbstractCRUDResourceManager<DashboardModel> 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 @@ import java.util.List;
@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<List<DataExplorerWidgetModel>> getAllDataExplorerWidgets() {
- return ok(getDataExplorerWidgetStorage().findAll());
+ return ok(resourceManager.findAll());
}
@GetMapping(path = "/{widgetId}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<DataExplorerWidgetModel> getDataExplorerWidget(@PathVariable("widgetId") String widgetId) {
- return ok(getDataExplorerWidgetStorage().getElementById(widgetId));
+ return ok(resourceManager.find(widgetId));
}
@PutMapping(
@@ -57,13 +64,13 @@ public class DataLakeWidgetResource extends AbstractRestResource {
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<DataExplorerWidgetModel> 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<Void> deleteDataExplorerWidget(@PathVariable("widgetId") String widgetId) {
- getDataExplorerWidgetStorage().deleteElementById(widgetId);
+ resourceManager.delete(widgetId);
return ok();
}
@@ -73,14 +80,6 @@ public class DataLakeWidgetResource extends AbstractRestResource {
)
public ResponseEntity<DataExplorerWidgetModel> 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<DataExplorerWidgetModel> 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.v090.UpdateUsernameViewMig
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 class AvailableMigrations {
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<DataExplorerWidgetModel> dataViewStorage;
+ private final CRUDStorage<DashboardModel> 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<DashboardModel> findDashboardsToMigrate() {
+ return dataExplorerDashboardStorage
+ .findAll()
+ .stream()
+ .filter(dashboard -> !dashboard.getDashboardGeneralSettings().containsKey("globalTimeEnabled"))
+ .toList();
+ }
+
+ private Map<String, Object> makeDefaultLiveSettings() {
+ var map = new HashMap<String, Object>();
+ 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<any> {
- return this.http.delete(this.dashboardWidgetUrl + '/' + widgetId);
+ return this.http.delete(`${this.dashboardWidgetUrl}/${widgetId}`);
}
updateWidget(widget: DataExplorerWidgetModel): Observable<any> {
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 @@
>
<i class="material-icons">edit</i>
</button>
+ <button
+ mat-icon-button
+ color="accent"
+ matTooltip="Manage permissions"
+ *ngIf="isAdmin"
+ (click)="showPermissionsDialog(element)"
+ >
+ <i class="material-icons">share</i>
+ </button>
<button
mat-icon-button
color="accent"
diff --git a/ui/src/app/data-explorer/components/overview/data-explorer-data-view-overview/data-explorer-data-view-overview.component.ts b/ui/src/app/data-explorer/components/overview/data-explorer-data-view-overview/data-explorer-data-view-overview.component.ts
index aa1fea2166..b964a8d3de 100644
--- a/ui/src/app/data-explorer/components/overview/data-explorer-data-view-overview/data-explorer-data-view-overview.component.ts
+++ b/ui/src/app/data-explorer/components/overview/data-explorer-data-view-overview/data-explorer-data-view-overview.component.ts
@@ -27,6 +27,7 @@ import {
import { CurrentUserService, DialogService } from '@streampipes/shared-ui';
import { AuthService } from '../../../../services/auth.service';
import { DataExplorerRoutingService } from '../../../services/data-explorer-routing.service';
+import { DataExplorerDashboardService } from '../../../services/data-explorer-dashboard.service';
@Component({
selector: 'sp-data-explorer-data-view-overview',
@@ -40,6 +41,7 @@ export class SpDataExplorerDataViewOverviewComponent extends SpDataExplorerOverv
constructor(
private dataViewService: DataViewDataExplorerService,
+ private dataExplorerDashboardService: DataExplorerDashboardService,
public dialogService: DialogService,
authService: AuthService,
currentUserService: CurrentUserService,
@@ -50,10 +52,10 @@ export class SpDataExplorerDataViewOverviewComponent extends SpDataExplorerOverv
afterInit(): void {
this.displayedColumns = ['name', 'actions'];
- this.getCharts();
+ this.getDataViews();
}
- getCharts(): void {
+ getDataViews(): void {
this.dataViewService.getAllWidgets().subscribe(widgets => {
widgets = widgets.sort((a, b) =>
a.baseAppearanceConfig.widgetTitle.localeCompare(
@@ -68,7 +70,23 @@ export class SpDataExplorerDataViewOverviewComponent extends SpDataExplorerOverv
this.routingService.navigateToDataView(editMode, dataView.elementId);
}
+ showPermissionsDialog(dashboard: Dashboard) {
+ const dialogRef =
+ this.dataExplorerDashboardService.openPermissionsDialog(
+ dashboard.elementId,
+ `Manage permissions for dashboard ${dashboard.name}`,
+ );
+
+ dialogRef.afterClosed().subscribe(refresh => {
+ if (refresh) {
+ this.getDataViews();
+ }
+ });
+ }
+
deleteDataView(dataView: DataExplorerWidgetModel) {
- this.dataViewService.deleteWidget(dataView.elementId);
+ this.dataViewService
+ .deleteWidget(dataView.elementId)
+ .subscribe(() => this.getDataViews());
}
}
diff --git a/ui/src/app/data-explorer/services/data-explorer-dashboard.service.ts b/ui/src/app/data-explorer/services/data-explorer-dashboard.service.ts
index dcc5bba228..8f6f1376f3 100644
--- a/ui/src/app/data-explorer/services/data-explorer-dashboard.service.ts
+++ b/ui/src/app/data-explorer/services/data-explorer-dashboard.service.ts
@@ -27,6 +27,7 @@ import {
import { DataExplorerEditDashboardDialogComponent } from '../dialogs/edit-dashboard/data-explorer-edit-dashboard-dialog.component';
import { DialogService, PanelType } from '@streampipes/shared-ui';
import { DataDownloadDialogComponent } from '../../core-ui/data-download-dialog/data-download-dialog.component';
+import { ObjectPermissionDialogComponent } from '../../core-ui/object-permission-dialog/object-permission-dialog.component';
@Injectable({ providedIn: 'root' })
export class DataExplorerDashboardService {
@@ -47,6 +48,18 @@ export class DataExplorerDashboardService {
);
}
+ openPermissionsDialog(elementId: string, headerTitle: string) {
+ return this.dialogService.open(ObjectPermissionDialogComponent, {
+ panelType: PanelType.SLIDE_IN_PANEL,
+ title: 'Manage permissions',
+ width: '50vw',
+ data: {
+ objectInstanceId: elementId,
+ headerTitle,
+ },
+ });
+ }
+
downloadDataAsFile(
timeSettings: TimeSettings,
dataView: DataExplorerWidgetModel,
diff --git a/ui/src/app/data-explorer/services/time-selection.service.ts b/ui/src/app/data-explorer/services/time-selection.service.ts
index 94cdef6361..11a9515cfc 100644
--- a/ui/src/app/data-explorer/services/time-selection.service.ts
+++ b/ui/src/app/data-explorer/services/time-selection.service.ts
@@ -40,6 +40,15 @@ import {
@Injectable({ providedIn: 'root' })
export class TimeSelectionService {
+ legacyMappings: Record<number, TimeSelectionId> = {
+ 15: TimeSelectionId.LAST_15_MINUTES,
+ 60: TimeSelectionId.LAST_HOUR,
+ 1440: TimeSelectionId.LAST_DAY,
+ 10080: TimeSelectionId.LAST_WEEK,
+ 43200: TimeSelectionId.LAST_MONTH,
+ 525600: TimeSelectionId.LAST_YEAR,
+ };
+
quickTimeSelections: QuickTimeSelection[] = [
{
label: 'Last 15 min',
@@ -138,6 +147,11 @@ export class TimeSelectionService {
}
public updateTimeSettings(timeSettings: TimeSettings, now: Date): void {
+ // for backwards compatibility
+ if (timeSettings.timeSelectionId === undefined) {
+ timeSettings.timeSelectionId =
+ this.findLegacyTimeSelectionId(timeSettings);
+ }
if (timeSettings.timeSelectionId !== TimeSelectionId.CUSTOM) {
const updatedTimeSettings = this.getTimeSettings(
timeSettings.timeSelectionId,
@@ -154,6 +168,16 @@ export class TimeSelectionService {
);
}
+ private findLegacyTimeSelectionId(
+ timeSettings: TimeSettings,
+ ): TimeSelectionId {
+ if (timeSettings.dynamicSelection in this.legacyMappings) {
+ return this.legacyMappings[timeSettings.dynamicSelection];
+ } else {
+ return TimeSelectionId.CUSTOM;
+ }
+ }
+
public timeSelectionChangeSubject: Subject<TimeSettings | undefined> =
new Subject<TimeSettings | undefined>();