This is an automated email from the ASF dual-hosted git repository.
SvenO3 pushed a commit to branch
improve-rest-authorizations-for-different-ressources
in repository https://gitbox.apache.org/repos/asf/streampipes.git
The following commit(s) were added to
refs/heads/improve-rest-authorizations-for-different-ressources by this push:
new 94fdb89446 Clean up pipeline canvas metadata resource
94fdb89446 is described below
commit 94fdb8944688bae6f2a0d1fbf7595022ab277d88
Author: Sven Oehler <[email protected]>
AuthorDate: Wed Jul 1 18:09:21 2026 +0200
Clean up pipeline canvas metadata resource
---
.../rest/impl/PipelineCanvasMetadataResource.java | 68 +++++++++-------------
.../impl/pe/PipelineElementTemplateResource.java | 1 -
.../lib/apis/pipeline-canvas-metadata.service.ts | 12 +---
.../save-pipeline/save-pipeline.component.ts | 17 ++----
4 files changed, 33 insertions(+), 65 deletions(-)
diff --git
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineCanvasMetadataResource.java
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineCanvasMetadataResource.java
index f081e4b579..ee86ad9d14 100644
---
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineCanvasMetadataResource.java
+++
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineCanvasMetadataResource.java
@@ -18,18 +18,19 @@
package org.apache.streampipes.rest.impl;
import org.apache.streampipes.model.canvas.PipelineCanvasMetadata;
+import org.apache.streampipes.model.client.user.DefaultPrivilege;
import org.apache.streampipes.model.message.Notifications;
-import org.apache.streampipes.rest.core.base.impl.AbstractRestResource;
+import
org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
import org.apache.streampipes.rest.shared.exception.SpMessageException;
import
org.apache.streampipes.storage.api.pipeline.IPipelineCanvasMetadataStorage;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -37,9 +38,10 @@ import
org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v2/pipeline-canvas-metadata")
-public class PipelineCanvasMetadataResource extends AbstractRestResource {
+public class PipelineCanvasMetadataResource extends
AbstractAuthGuardedRestResource {
@GetMapping(path = "/pipeline/{pipelineId}", produces =
MediaType.APPLICATION_JSON_VALUE)
+ @PreAuthorize("this.hasReadAuthority() and hasPermission(#pipelineId,
'READ')")
public ResponseEntity<PipelineCanvasMetadata>
getPipelineCanvasMetadataForPipeline(
@PathVariable("pipelineId") String pipelineId) {
try {
@@ -50,65 +52,49 @@ public class PipelineCanvasMetadataResource extends
AbstractRestResource {
}
}
- @GetMapping(path = "{canvasId}", produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity<PipelineCanvasMetadata> getPipelineCanvasMetadata(
- @PathVariable("canvasId") String pipelineCanvasId) {
- try {
- return ok(getPipelineCanvasMetadataStorage()
- .getElementById(pipelineCanvasId));
- } catch (IllegalArgumentException e) {
- throw new SpMessageException(HttpStatus.BAD_REQUEST,
Notifications.error(e.getMessage()));
- }
- }
-
- @PostMapping(
- consumes = MediaType.APPLICATION_JSON_VALUE,
- produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity<Void> storePipelineCanvasMetadata(@RequestBody
PipelineCanvasMetadata pipelineCanvasMetadata) {
- getPipelineCanvasMetadataStorage().persist(pipelineCanvasMetadata);
- return ok();
- }
-
- @DeleteMapping(
- path = "{canvasId}",
- produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity<Void>
deletePipelineCanvasMetadata(@PathVariable("canvasId") String pipelineCanvasId)
{
- PipelineCanvasMetadata metadata = find(pipelineCanvasId);
- getPipelineCanvasMetadataStorage().deleteElement(metadata);
- return ok();
- }
-
@DeleteMapping(
path = "/pipeline/{pipelineId}",
produces = MediaType.APPLICATION_JSON_VALUE)
+ @PreAuthorize("this.hasWriteAuthority() and hasPermission(#pipelineId,
'WRITE')")
public ResponseEntity<Void>
deletePipelineCanvasMetadataForPipeline(@PathVariable("pipelineId") String
pipelineId) {
PipelineCanvasMetadata metadata =
getPipelineCanvasMetadataStorage().getPipelineCanvasMetadataForPipeline(pipelineId);
- getPipelineCanvasMetadataStorage().deleteElement(metadata);
+ if (metadata != null) {
+ getPipelineCanvasMetadataStorage().deleteElement(metadata);
+ }
return ok();
}
@PutMapping(
- path = "{canvasId}",
+ path = "/pipeline/{pipelineId}",
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity<Void>
updatePipelineCanvasMetadata(@PathVariable("canvasId") String pipelineCanvasId,
+ @PreAuthorize("this.hasWriteAuthority() and hasPermission(#pipelineId,
'WRITE')")
+ public ResponseEntity<Void>
updatePipelineCanvasMetadata(@PathVariable("pipelineId") String pipelineId,
@RequestBody
PipelineCanvasMetadata pipelineCanvasMetadata) {
- try {
- var existing =
getPipelineCanvasMetadataStorage().getElementById(pipelineCanvasMetadata.getId());
+ var existing =
getPipelineCanvasMetadataStorage().getPipelineCanvasMetadataForPipeline(pipelineId);
+ pipelineCanvasMetadata.setPipelineId(pipelineId);
+ if (existing != null) {
+ pipelineCanvasMetadata.setId(existing.getId());
pipelineCanvasMetadata.setRev(existing.getRev());
getPipelineCanvasMetadataStorage().updateElement(pipelineCanvasMetadata);
- } catch (IllegalArgumentException e) {
+ } else {
+ pipelineCanvasMetadata.setId(null);
+ pipelineCanvasMetadata.setRev(null);
getPipelineCanvasMetadataStorage().persist(pipelineCanvasMetadata);
}
return ok();
}
- private PipelineCanvasMetadata find(String canvasId) {
- return getPipelineCanvasMetadataStorage().getElementById(canvasId);
- }
-
private IPipelineCanvasMetadataStorage getPipelineCanvasMetadataStorage() {
return getNoSqlStorage().getPipelineCanvasMetadataStorage();
}
+
+ public boolean hasWriteAuthority() {
+ return
isAdminOrHasAnyAuthority(DefaultPrivilege.Constants.PRIVILEGE_WRITE_PIPELINE_VALUE);
+ }
+
+ public boolean hasReadAuthority() {
+ return
isAdminOrHasAnyAuthority(DefaultPrivilege.Constants.PRIVILEGE_READ_PIPELINE_VALUE);
+ }
}
diff --git
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/PipelineElementTemplateResource.java
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/PipelineElementTemplateResource.java
index 7fce6cc8b0..33eaa6e154 100644
---
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/PipelineElementTemplateResource.java
+++
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/pe/PipelineElementTemplateResource.java
@@ -27,7 +27,6 @@ import
org.apache.streampipes.model.graph.DataProcessorInvocation;
import org.apache.streampipes.model.graph.DataSinkInvocation;
import org.apache.streampipes.model.template.PipelineElementTemplate;
import
org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
-import org.apache.streampipes.rest.core.base.impl.AbstractRestResource;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
diff --git
a/ui/projects/streampipes/platform-services/src/lib/apis/pipeline-canvas-metadata.service.ts
b/ui/projects/streampipes/platform-services/src/lib/apis/pipeline-canvas-metadata.service.ts
index 4babb0052b..141b8e604f 100644
---
a/ui/projects/streampipes/platform-services/src/lib/apis/pipeline-canvas-metadata.service.ts
+++
b/ui/projects/streampipes/platform-services/src/lib/apis/pipeline-canvas-metadata.service.ts
@@ -30,13 +30,6 @@ export class PipelineCanvasMetadataService {
private http = inject(HttpClient);
private platformServicesCommons = inject(PlatformServicesCommons);
- addPipelineCanvasMetadata(pipelineCanvasMetadata: PipelineCanvasMetadata) {
- return this.http.post(
- this.pipelineCanvasMetadataBasePath,
- pipelineCanvasMetadata,
- );
- }
-
getPipelineCanvasMetadata(
pipelineId: string,
): Observable<PipelineCanvasMetadata> {
@@ -50,12 +43,11 @@ export class PipelineCanvasMetadataService {
}
updatePipelineCanvasMetadata(
+ pipelineId: string,
pipelineCanvasMetadata: PipelineCanvasMetadata,
) {
return this.http.put(
- this.pipelineCanvasMetadataBasePath +
- '/' +
- pipelineCanvasMetadata.pipelineId,
+ this.pipelineCanvasMetadataPipelinePath + pipelineId,
pipelineCanvasMetadata,
);
}
diff --git a/ui/src/app/editor/dialog/save-pipeline/save-pipeline.component.ts
b/ui/src/app/editor/dialog/save-pipeline/save-pipeline.component.ts
index 0853a11381..1cb1fa125c 100644
--- a/ui/src/app/editor/dialog/save-pipeline/save-pipeline.component.ts
+++ b/ui/src/app/editor/dialog/save-pipeline/save-pipeline.component.ts
@@ -333,20 +333,11 @@ export class SavePipelineComponent implements OnInit {
}
getPipelineCanvasMetadata$(pipelineId: string): Observable<object> {
- let request;
this.pipelineCanvasMetadata.pipelineId = pipelineId;
- if (this.storageOptions.updateModeActive) {
- request = this.pipelineCanvasService.updatePipelineCanvasMetadata(
- this.pipelineCanvasMetadata,
- );
- } else {
- this.pipelineCanvasMetadata._id = undefined;
- this.pipelineCanvasMetadata._rev = undefined;
- request = this.pipelineCanvasService.addPipelineCanvasMetadata(
- this.pipelineCanvasMetadata,
- );
- }
- return request;
+ return this.pipelineCanvasService.updatePipelineCanvasMetadata(
+ pipelineId,
+ this.pipelineCanvasMetadata,
+ );
}
addStatusIndicator(message: string, status: Status) {