From 599e257e78d1836c82311caad3aae64c2d658ae4 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Thu, 26 Mar 2026 15:12:31 +0100
Subject: [PATCH 01/45] bump version to 1.20.0
the ability to save/load full sparql queries is a new feature
---
SECURITY.md | 4 ++--
pom.xml | 2 +-
src/main/resources/application.yml | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/SECURITY.md b/SECURITY.md
index 70fa28bd0..2c2b9d08e 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -7,8 +7,8 @@ For older versions, we highly recommend upgrading to the latest version.
| Version | Supported |
|---------| ------------------ |
-| 1.19.x | :white_check_mark: |
-| < 1.19 | :x: |
+| 1.20.x | :white_check_mark: |
+| < 1.20 | :x: |
## Current Recommendations
diff --git a/pom.xml b/pom.xml
index bd53d0a48..5fa744a25 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
org.fairdatateam
fairdatapoint
- 1.19.1
+ 1.20.0
jar
FairDataPoint
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index f391064f7..4184e92d9 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -65,7 +65,7 @@ metadataProperties:
openapi:
title: FAIR Data Point API
- version: 1.19.1
+ version: 1.20.0
description: "The reference implementation of the metadata registration service: A service implementing the API specification. It contains an authentication system to allow maintainers to define and update metadata. Read-only access to the data is public."
contact:
name: Luiz Bonino
From 2e89c249946000ce077d962f9037d5dae743b996 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Wed, 18 Mar 2026 09:48:32 +0100
Subject: [PATCH 02/45] add SearchSavedSparql entity similar to
SearchSavedQuery
---
.../entity/search/SearchSavedSparql.java | 79 +++++++++++++++++++
1 file changed, 79 insertions(+)
create mode 100644 src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java
new file mode 100644
index 000000000..ffdca37c3
--- /dev/null
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java
@@ -0,0 +1,79 @@
+/**
+ * The MIT License
+ * Copyright © 2017 DTL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package nl.dtls.fairdatapoint.entity.search;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.bson.types.ObjectId;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.time.Instant;
+
+@Document
+@NoArgsConstructor
+@AllArgsConstructor
+@Getter
+@Setter
+public class SearchSavedSparql {
+
+ @Id
+ private ObjectId id;
+
+ private String uuid;
+
+ private String userUuid;
+
+ private AccessLevel accessLevel;
+
+ private Instant createdAt;
+
+ private Instant updatedAt;
+
+ private String name;
+
+ private String description;
+
+ private String query;
+
+ private String defaultGraphUri;
+
+ private String namedGraphUri;
+
+ @Getter
+ public enum AccessLevel {
+ // todo: update SearchSavedQuery and SearchSavedQueryType to match this
+ AUTHENTICATED("all authenticated users have access"),
+ CREATOR("only creator has access");
+
+ private final String description;
+
+ AccessLevel(String description) {
+ this.description = description;
+ }
+ }
+
+}
From ac2ecbb010807714c1f9fc29dc9b9900b63be7cf Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Wed, 18 Mar 2026 10:18:06 +0100
Subject: [PATCH 03/45] move SearchSavedQueryType enum into SearchSavedQuery
class
to improve encapsulation and readability
---
.../api/dto/search/SearchSavedQueryChangeDTO.java | 4 ++--
.../api/dto/search/SearchSavedQueryDTO.java | 4 ++--
.../search/SearchSavedQueryFixtures.java | 7 +++----
.../entity/search/SearchSavedQuery.java | 9 ++++++++-
.../search/query/SearchSavedQueryService.java | 5 ++---
.../search/query/saved/Detail_DELETE.java | 5 -----
.../acceptance/search/query/saved/Detail_PUT.java | 13 ++++++-------
.../acceptance/search/query/saved/List_POST.java | 8 +++-----
8 files changed, 26 insertions(+), 29 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java
index ec6632172..d97c6b12b 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java
@@ -26,7 +26,7 @@
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.*;
-import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQueryType;
+import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
@NoArgsConstructor
@AllArgsConstructor
@@ -42,7 +42,7 @@ public class SearchSavedQueryChangeDTO {
private String description;
@NotNull
- private SearchSavedQueryType type;
+ private SearchSavedQuery.Type type;
@Valid
@NotNull
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
index 5b15ef74b..29705b3c5 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
@@ -28,7 +28,7 @@
import jakarta.validation.constraints.NotNull;
import lombok.*;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
-import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQueryType;
+import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
import java.time.Instant;
@@ -49,7 +49,7 @@ public class SearchSavedQueryDTO {
private String description;
@NotNull
- private SearchSavedQueryType type;
+ private SearchSavedQuery.Type type;
@Valid
@JsonInclude
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java b/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java
index 2fcf379e9..46cf9ee14 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java
@@ -24,7 +24,6 @@
import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
-import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQueryType;
import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.springframework.stereotype.Service;
@@ -42,7 +41,7 @@ public SearchSavedQuery savedQueryPublic01() {
.uuid(UUID.randomUUID().toString())
.name("All datasets")
.description("Quickly query all datasets (DCAT)")
- .type(SearchSavedQueryType.PUBLIC)
+ .type(SearchSavedQuery.Type.PUBLIC)
.userUuid(KnownUUIDs.USER_ALBERT_UUID)
.variables(SearchQueryVariablesDTO.builder()
.prefixes(PREFIX_DCAT)
@@ -60,7 +59,7 @@ public SearchSavedQuery savedQueryInternal01() {
.uuid(UUID.randomUUID().toString())
.name("All distributions")
.description("Quickly query all distributions (DCAT)")
- .type(SearchSavedQueryType.INTERNAL)
+ .type(SearchSavedQuery.Type.INTERNAL)
.userUuid(KnownUUIDs.USER_ADMIN_UUID)
.variables(SearchQueryVariablesDTO.builder()
.prefixes(PREFIX_DCAT)
@@ -78,7 +77,7 @@ public SearchSavedQuery savedQueryPrivate01() {
.uuid(UUID.randomUUID().toString())
.name("Things with data")
.description("This is private query of Nikola Tesla.")
- .type(SearchSavedQueryType.PRIVATE)
+ .type(SearchSavedQuery.Type.PRIVATE)
.userUuid(KnownUUIDs.USER_NIKOLA_UUID)
.variables(SearchQueryVariablesDTO.builder()
.prefixes("")
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
index 31d9e7d44..faf69eedd 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
@@ -49,11 +49,18 @@ public class SearchSavedQuery {
private String userUuid;
- private SearchSavedQueryType type;
+ private Type type;
private Instant createdAt;
private Instant updatedAt;
private SearchQueryVariablesDTO variables;
+
+ public enum Type {
+ PUBLIC,
+ PRIVATE,
+ INTERNAL
+ }
+
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
index 266112681..4e04a74ef 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
@@ -27,7 +27,6 @@
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.exception.ForbiddenException;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
-import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQueryType;
import org.fairdatateam.fairdatapoint.entity.user.User;
import org.fairdatateam.fairdatapoint.entity.user.UserRole;
import org.fairdatateam.fairdatapoint.service.security.CurrentUserProvider;
@@ -108,7 +107,7 @@ public Optional update(String uuid, SearchSavedQueryChangeD
}
private boolean canSeeQuery(Optional optionalUser, SearchSavedQuery query) {
- return query.getType().equals(SearchSavedQueryType.PUBLIC)
+ return query.getType().equals(SearchSavedQuery.Type.PUBLIC)
|| optionalUser
.filter(user -> user.getRole().equals(UserRole.ADMIN))
.isPresent()
@@ -118,7 +117,7 @@ private boolean canSeeQuery(Optional optionalUser, SearchSavedQuery query)
}
private boolean isOwnOrInternal(User user, SearchSavedQuery query) {
- return query.getType().equals(SearchSavedQueryType.INTERNAL)
+ return query.getType().equals(SearchSavedQuery.Type.INTERNAL)
|| Objects.equals(query.getUserUuid(), user.getUuid());
}
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_DELETE.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_DELETE.java
index da3452670..a45e5d545 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_DELETE.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_DELETE.java
@@ -23,14 +23,9 @@
package org.fairdatateam.fairdatapoint.acceptance.search.query.saved;
import org.fairdatateam.fairdatapoint.WebIntegrationTest;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.mongo.migration.development.search.SearchSavedQueryFixtures;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
-import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQueryType;
-import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
index 54cdb1764..a926022c1 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
@@ -29,7 +29,6 @@
import org.fairdatateam.fairdatapoint.database.mongo.migration.development.search.SearchSavedQueryFixtures;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
-import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQueryType;
import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -73,7 +72,7 @@ public void res403_anonymousUser() {
SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
- .type(SearchSavedQueryType.PUBLIC)
+ .type(SearchSavedQuery.Type.PUBLIC)
.variables(SearchQueryVariablesDTO.builder()
.prefixes("A")
.graphPattern("B")
@@ -107,7 +106,7 @@ public void res403_nonOwnerUser() {
SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
- .type(SearchSavedQueryType.PUBLIC)
+ .type(SearchSavedQuery.Type.PUBLIC)
.variables(SearchQueryVariablesDTO.builder()
.prefixes("A")
.graphPattern("B")
@@ -141,7 +140,7 @@ public void res200_owner() {
SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
- .type(SearchSavedQueryType.INTERNAL)
+ .type(SearchSavedQuery.Type.INTERNAL)
.variables(SearchQueryVariablesDTO.builder()
.prefixes("A")
.graphPattern("B")
@@ -159,7 +158,7 @@ public void res200_owner() {
// THEN:
assertThat(result.getStatusCode(), is(equalTo(HttpStatus.OK)));
assertThat(result.getBody().getUser().getUuid(), is(equalTo(KnownUUIDs.USER_ALBERT_UUID)));
- assertThat(result.getBody().getType(), is(equalTo(SearchSavedQueryType.INTERNAL)));
+ assertThat(result.getBody().getType(), is(equalTo(SearchSavedQuery.Type.INTERNAL)));
assertThat(result.getBody().getName(), is(equalTo("Edited query")));
assertThat(result.getBody().getVariables().getPrefixes(), is(equalTo("A")));
assertThat(result.getBody().getVariables().getGraphPattern(), is(equalTo("B")));
@@ -181,7 +180,7 @@ public void res200_admin() {
SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
- .type(SearchSavedQueryType.INTERNAL)
+ .type(SearchSavedQuery.Type.INTERNAL)
.variables(SearchQueryVariablesDTO.builder()
.prefixes("A")
.graphPattern("B")
@@ -199,7 +198,7 @@ public void res200_admin() {
// THEN:
assertThat(result.getStatusCode(), is(equalTo(HttpStatus.OK)));
assertThat(result.getBody().getUser().getUuid(), is(equalTo(KnownUUIDs.USER_ALBERT_UUID)));
- assertThat(result.getBody().getType(), is(equalTo(SearchSavedQueryType.INTERNAL)));
+ assertThat(result.getBody().getType(), is(equalTo(SearchSavedQuery.Type.INTERNAL)));
assertThat(result.getBody().getName(), is(equalTo("Edited query")));
assertThat(result.getBody().getVariables().getPrefixes(), is(equalTo("A")));
assertThat(result.getBody().getVariables().getGraphPattern(), is(equalTo("B")));
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
index 259ff3942..3e3dc82b2 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
@@ -26,10 +26,8 @@
import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
-import org.fairdatateam.fairdatapoint.database.mongo.migration.development.search.SearchSavedQueryFixtures;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
-import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQueryType;
import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -70,7 +68,7 @@ public void res403_anonymousUser() {
SearchSavedQueryChangeDTO.builder()
.name("New query")
.description("")
- .type(SearchSavedQueryType.PUBLIC)
+ .type(SearchSavedQuery.Type.PUBLIC)
.variables(SearchQueryVariablesDTO.builder()
.prefixes("")
.graphPattern("")
@@ -104,7 +102,7 @@ public void res201() {
SearchSavedQueryChangeDTO.builder()
.name("New query")
.description("")
- .type(SearchSavedQueryType.PUBLIC)
+ .type(SearchSavedQuery.Type.PUBLIC)
.variables(SearchQueryVariablesDTO.builder()
.prefixes("")
.graphPattern("")
@@ -122,7 +120,7 @@ public void res201() {
// THEN:
assertThat(result.getStatusCode(), is(equalTo(HttpStatus.CREATED)));
assertThat(result.getBody().getUser().getUuid(), is(equalTo(KnownUUIDs.USER_NIKOLA_UUID)));
- assertThat(result.getBody().getType(), is(equalTo(SearchSavedQueryType.PUBLIC)));
+ assertThat(result.getBody().getType(), is(equalTo(SearchSavedQuery.Type.PUBLIC)));
assertThat(searchSavedQueryRepository.count(), is(equalTo(1L)));
}
}
From 1d3f9827640bdcbd6530e06beb46086eaa6040ad Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Mon, 23 Mar 2026 09:44:07 +0100
Subject: [PATCH 04/45] add sequence diagram for saved query (wip)
---
docs/diagrams/sequence-save-query.mermaid | 3 +++
1 file changed, 3 insertions(+)
create mode 100644 docs/diagrams/sequence-save-query.mermaid
diff --git a/docs/diagrams/sequence-save-query.mermaid b/docs/diagrams/sequence-save-query.mermaid
new file mode 100644
index 000000000..75685f2f7
--- /dev/null
+++ b/docs/diagrams/sequence-save-query.mermaid
@@ -0,0 +1,3 @@
+sequenceDiagram
+ user ->> fdp-client: GET /search/query
+ fdp-client ->> fdp: POST
From 1ff6cbf1ef05ca944543a56fe5954c7e9f2cff33 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Mon, 23 Mar 2026 11:34:48 +0100
Subject: [PATCH 05/45] fix package name for SearchSavedSparql
---
.../fairdatapoint/entity/search/SearchSavedSparql.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java
index ffdca37c3..f737cd0f5 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java
@@ -21,7 +21,7 @@
* THE SOFTWARE.
*/
-package nl.dtls.fairdatapoint.entity.search;
+package org.fairdatateam.fairdatapoint.entity.search;
import lombok.AllArgsConstructor;
import lombok.Getter;
From 243341f95702fc24bf50b240737cff5ee71fc782 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Mon, 23 Mar 2026 13:10:41 +0100
Subject: [PATCH 06/45] complete saved-query sequence diagram
---
docs/diagrams/sequence-save-query.mermaid | 48 ++++++++++++++++++++++-
1 file changed, 46 insertions(+), 2 deletions(-)
diff --git a/docs/diagrams/sequence-save-query.mermaid b/docs/diagrams/sequence-save-query.mermaid
index 75685f2f7..6d22dd654 100644
--- a/docs/diagrams/sequence-save-query.mermaid
+++ b/docs/diagrams/sequence-save-query.mermaid
@@ -1,3 +1,47 @@
+%% restricted sparql query execution and saving in fdp v1.18.x
sequenceDiagram
- user ->> fdp-client: GET /search/query
- fdp-client ->> fdp: POST
+%% simple search or switch to advanced search
+ user ->> fdp-client: use search box
or click "Advanced" under search box
+ fdp-client ->> fdp-client: /search
+ fdp-client ->> fdp: GET /search/query
+ fdp-client ->> fdp: GET /search/filters
+ fdp-client ->> fdp: GET /search/query/saved
+ fdp-client ->> fdp: POST /search/query
{"graphPattern": str, "ordering": str, "prefixes": str}
+ fdp ->> fdp-client: Status 200
{"template": }
+ fdp ->> fdp-client: Status 200
[, ...]
+ fdp ->> fdp-client: Status 200
[, ...]
+ fdp ->> fdp-client: Status 200
[, ...]
+ fdp-client ->> user: normal search form
+
+%% switch to sparql search
+ user ->> fdp-client: click "Switch to SPARQL"
+ fdp-client ->> fdp-client: /search?isSparql=true
+ fdp-client ->> fdp: 3x GET, 1x POST (same as bove)
+ fdp ->> fdp-client: 4x Status 200 (same as above)
+ fdp-client ->> user: sparql search form
+
+%% perform sparql search
+ user ->> fdp-client: fill out sparql search form
+ user ->> fdp-client: click "Search"
+ fdp-client ->> fdp: POST /search/query
{"graphPattern": str, "ordering": str, "prefixes": str}
+ fdp ->> fdp-client: Status 200
array of
[{"uri": str, "title": str, "description": str, "types": array, "relations": array}, ...]
+ fdp-client ->> user: list of query results
+
+%% save query
+ user ->> fdp-client: click "Save query"
+ fdp-client ->> user: save query form
+ user ->> fdp-client: fill out save query form
+ user ->> fdp-client: click "Save"
+ fdp-client ->> fdp: POST /search/query/saved
{"name": str, "description": str, "type": str, "variables": }
+ fdp ->> fdp-client: Status 201
{"name": str, "description": str, "type": str, "variables": ,
"uuid": str, "user": , "createdAt": str, "updatedAt": str}
+ fdp-client -->> user: (no feedback)
+
+%% load query
+ user ->> fdp-client: click "Saved queries"
+ fdp-client ->> user: list of saved queries
+ user ->> fdp-client: click a saved query
+ fdp-client ->> fdp: 3x GET (same as bove)
+ fdp-client ->> fdp: POST /search/query
from saved query
+ fdp ->> fdp-client: 4x Status 200 (same as above)
+ fdp-client ->> user: saved query title, owner, and content
+ fdp-client ->> user: list of query results
From e31c0c4b1a555781099f7ae4e4be50ebc357f1c1 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 24 Mar 2026 10:12:07 +0100
Subject: [PATCH 07/45] Revert "add SearchSavedSparql entity similar to
SearchSavedQuery"
because we're just going to add a field to SearchSavedQuery instead
This reverts commit 76ed8e61a10d17014386a786e4f02ef4a0a314cf.
---
.../entity/search/SearchSavedSparql.java | 79 -------------------
1 file changed, 79 deletions(-)
delete mode 100644 src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java
deleted file mode 100644
index f737cd0f5..000000000
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedSparql.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * The MIT License
- * Copyright © 2017 DTL
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package org.fairdatateam.fairdatapoint.entity.search;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import org.bson.types.ObjectId;
-import org.springframework.data.annotation.Id;
-import org.springframework.data.mongodb.core.mapping.Document;
-
-import java.time.Instant;
-
-@Document
-@NoArgsConstructor
-@AllArgsConstructor
-@Getter
-@Setter
-public class SearchSavedSparql {
-
- @Id
- private ObjectId id;
-
- private String uuid;
-
- private String userUuid;
-
- private AccessLevel accessLevel;
-
- private Instant createdAt;
-
- private Instant updatedAt;
-
- private String name;
-
- private String description;
-
- private String query;
-
- private String defaultGraphUri;
-
- private String namedGraphUri;
-
- @Getter
- public enum AccessLevel {
- // todo: update SearchSavedQuery and SearchSavedQueryType to match this
- AUTHENTICATED("all authenticated users have access"),
- CREATOR("only creator has access");
-
- private final String description;
-
- AccessLevel(String description) {
- this.description = description;
- }
- }
-
-}
From 38852c73ff7fe1dd534ff361ce464a3d78c996d4 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 24 Mar 2026 10:16:46 +0100
Subject: [PATCH 08/45] remove deprecated SearchSavedQueryType
the enum is now part of SearchSavedQuery
---
.../entity/search/SearchSavedQueryType.java | 29 -------------------
1 file changed, 29 deletions(-)
delete mode 100644 src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQueryType.java
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQueryType.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQueryType.java
deleted file mode 100644
index d4435a39f..000000000
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQueryType.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * The MIT License
- * Copyright © 2017 FAIR Data Team
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package org.fairdatateam.fairdatapoint.entity.search;
-
-public enum SearchSavedQueryType {
- PUBLIC,
- PRIVATE,
- INTERNAL
-}
From d3dc560d41e3e6317b5ee66479e26d0ec3448fa1 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 24 Mar 2026 18:04:38 +0100
Subject: [PATCH 09/45] move SparqlQuery record into separate class with string
array fields
using string array fields defaultGraphUris and namedGraphUris we can specify multiple graphs in a natural way
---
.../search/SearchSparqlController.java | 22 +++++--------------
.../entity/search/SparqlQuery.java | 10 +++++++++
2 files changed, 16 insertions(+), 16 deletions(-)
create mode 100644 src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSparqlController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSparqlController.java
index cf81fe5ce..2707bc235 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSparqlController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSparqlController.java
@@ -41,6 +41,7 @@
import org.eclipse.rdf4j.http.server.readonly.sparql.SparqlQueryEvaluator;
import org.eclipse.rdf4j.query.MalformedQueryException;
import org.eclipse.rdf4j.repository.Repository;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQuery;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -94,10 +95,10 @@ public void sparqlPost(
sparqlQueryEvaluator.evaluate(
result,
rdf4jRepository,
- sparqlQuery.query,
+ sparqlQuery.query(),
accept,
- toArray(sparqlQuery.defaultGraphUri),
- toArray(sparqlQuery.namedGraphUri)
+ toArray(sparqlQuery.defaultGraphUris()),
+ toArray(sparqlQuery.namedGraphUris())
);
}
catch (MalformedQueryException | IllegalStateException | IOException exception) {
@@ -105,11 +106,8 @@ public void sparqlPost(
}
}
- private String[] toArray(String graphUri) {
- if (graphUri != null && !graphUri.isEmpty()) {
- return new String[]{graphUri};
- }
- return ALL_GRAPHS;
+ private String[] toArray(String[] graphUris) {
+ return (graphUris == null) ? ALL_GRAPHS : graphUris;
}
/**
@@ -140,12 +138,4 @@ public OutputStream getOutputstream() throws IOException {
}
}
- /**
- * Defines the content of the query request body, for JSON deserialization.
- * @param query
- * @param defaultGraphUri
- * @param namedGraphUri
- */
- public record SparqlQuery(String query, String defaultGraphUri, String namedGraphUri) {
- }
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java
new file mode 100644
index 000000000..2ab3c1f60
--- /dev/null
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java
@@ -0,0 +1,10 @@
+package org.fairdatateam.fairdatapoint.entity.search;
+
+/**
+ * Defines the content of a full SPARQL query
+ * @param query
+ * @param defaultGraphUris
+ * @param namedGraphUris
+ */
+public record SparqlQuery(String query, String[] defaultGraphUris, String[] namedGraphUris) {
+}
From 38f01aa98e8d3b0d9f04496813c0547b94c42127 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Wed, 25 Mar 2026 09:43:28 +0100
Subject: [PATCH 10/45] add activations to sequence diagram
---
docs/diagrams/sequence-save-query.mermaid | 48 +++++++++++------------
1 file changed, 24 insertions(+), 24 deletions(-)
diff --git a/docs/diagrams/sequence-save-query.mermaid b/docs/diagrams/sequence-save-query.mermaid
index 6d22dd654..3749218db 100644
--- a/docs/diagrams/sequence-save-query.mermaid
+++ b/docs/diagrams/sequence-save-query.mermaid
@@ -1,47 +1,47 @@
%% restricted sparql query execution and saving in fdp v1.18.x
sequenceDiagram
%% simple search or switch to advanced search
- user ->> fdp-client: use search box
or click "Advanced" under search box
+ user ->>+ fdp-client: use search box
or click "Advanced" under search box
fdp-client ->> fdp-client: /search
- fdp-client ->> fdp: GET /search/query
+ fdp-client ->>+ fdp: GET /search/query
fdp-client ->> fdp: GET /search/filters
fdp-client ->> fdp: GET /search/query/saved
fdp-client ->> fdp: POST /search/query
{"graphPattern": str, "ordering": str, "prefixes": str}
fdp ->> fdp-client: Status 200
{"template": }
fdp ->> fdp-client: Status 200
[, ...]
fdp ->> fdp-client: Status 200
[, ...]
- fdp ->> fdp-client: Status 200
[, ...]
- fdp-client ->> user: normal search form
+ fdp ->>- fdp-client: Status 200
[, ...]
+ fdp-client ->>- user: normal search form
%% switch to sparql search
- user ->> fdp-client: click "Switch to SPARQL"
+ user ->>+ fdp-client: click "Switch to SPARQL"
fdp-client ->> fdp-client: /search?isSparql=true
- fdp-client ->> fdp: 3x GET, 1x POST (same as bove)
- fdp ->> fdp-client: 4x Status 200 (same as above)
- fdp-client ->> user: sparql search form
+ fdp-client ->>+ fdp: 3x GET, 1x POST (same as bove)
+ fdp ->>- fdp-client: 4x Status 200 (same as above)
+ fdp-client ->>- user: sparql search form
%% perform sparql search
user ->> fdp-client: fill out sparql search form
- user ->> fdp-client: click "Search"
- fdp-client ->> fdp: POST /search/query
{"graphPattern": str, "ordering": str, "prefixes": str}
- fdp ->> fdp-client: Status 200
array of
[{"uri": str, "title": str, "description": str, "types": array, "relations": array}, ...]
- fdp-client ->> user: list of query results
+ user ->>+ fdp-client: click "Search"
+ fdp-client ->>+ fdp: POST /search/query
{"graphPattern": str, "ordering": str, "prefixes": str}
+ fdp ->>- fdp-client: Status 200
array of
[{"uri": str, "title": str, "description": str, "types": array, "relations": array}, ...]
+ fdp-client ->>- user: list of query results
%% save query
- user ->> fdp-client: click "Save query"
- fdp-client ->> user: save query form
+ user ->>+ fdp-client: click "Save query"
+ fdp-client ->>- user: save query form
user ->> fdp-client: fill out save query form
- user ->> fdp-client: click "Save"
- fdp-client ->> fdp: POST /search/query/saved
{"name": str, "description": str, "type": str, "variables": }
- fdp ->> fdp-client: Status 201
{"name": str, "description": str, "type": str, "variables": ,
"uuid": str, "user": , "createdAt": str, "updatedAt": str}
- fdp-client -->> user: (no feedback)
+ user ->>+ fdp-client: click "Save"
+ fdp-client ->>+ fdp: POST /search/query/saved
{"name": str, "description": str, "type": str, "variables": }
+ fdp ->>- fdp-client: Status 201
{"name": str, "description": str, "type": str, "variables": ,
"uuid": str, "user": , "createdAt": str, "updatedAt": str}
+ fdp-client -->>- user: (no feedback)
%% load query
- user ->> fdp-client: click "Saved queries"
- fdp-client ->> user: list of saved queries
- user ->> fdp-client: click a saved query
- fdp-client ->> fdp: 3x GET (same as bove)
+ user ->>+ fdp-client: click "Saved queries"
+ fdp-client ->>- user: list of saved queries
+ user ->>+ fdp-client: click a saved query
+ fdp-client ->>+ fdp: 3x GET (same as bove)
fdp-client ->> fdp: POST /search/query
from saved query
- fdp ->> fdp-client: 4x Status 200 (same as above)
+ fdp ->>- fdp-client: 4x Status 200 (same as above)
fdp-client ->> user: saved query title, owner, and content
- fdp-client ->> user: list of query results
+ fdp-client ->>- user: list of query results
From 79fa24db6a2cf6e471c5352f19ea4f56e102d74d Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Wed, 25 Mar 2026 09:46:56 +0100
Subject: [PATCH 11/45] add license text to SparqlQuery.java
---
.../entity/search/SparqlQuery.java | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java
index 2ab3c1f60..533634fb5 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java
@@ -1,3 +1,25 @@
+/**
+ * The MIT License
+ * Copyright © 2017 FAIR Data Team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
package org.fairdatateam.fairdatapoint.entity.search;
/**
From d294085cf7b266ad0d5e4c74fe8b23cb6389770c Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Wed, 25 Mar 2026 10:20:36 +0100
Subject: [PATCH 12/45] adapt tests to new SparqlQuery location
---
.../sparql/TestSearchSparqlController.java | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/sparql/TestSearchSparqlController.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/sparql/TestSearchSparqlController.java
index e98eb9f1e..5a23b136f 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/sparql/TestSearchSparqlController.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/sparql/TestSearchSparqlController.java
@@ -26,8 +26,8 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.fairdatateam.fairdatapoint.WebIntegrationTest;
-import org.fairdatateam.fairdatapoint.api.controller.search.SearchSparqlController;
import org.eclipse.rdf4j.rio.RDFFormat;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQuery;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
@@ -53,8 +53,7 @@ public class TestSearchSparqlController extends WebIntegrationTest {
@Test
public void postSparqlUnauthenticated() throws JsonProcessingException {
// prepare request
- SearchSparqlController.SparqlQuery sparqlQuery = new SearchSparqlController.SparqlQuery(
- querySelectAll, null, null);
+ SparqlQuery sparqlQuery = new SparqlQuery(querySelectAll, null, null);
RequestEntity> request = RequestEntity
.post(url)
.accept(MediaType.APPLICATION_JSON)
@@ -75,9 +74,8 @@ public void postSparqlUnauthenticated() throws JsonProcessingException {
@ValueSource(strings = { MediaType.APPLICATION_JSON_VALUE, "*/*" })
public void postSparqlSelectAll(String acceptHeader) throws JsonProcessingException {
// prepare request
- SearchSparqlController.SparqlQuery sparqlQuery = new SearchSparqlController.SparqlQuery(
- querySelectAll, null, null);
- RequestEntity request = RequestEntity
+ SparqlQuery sparqlQuery = new SparqlQuery(querySelectAll, null, null);
+ RequestEntity request = RequestEntity
.post(url)
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
.accept(MediaType.valueOf(acceptHeader))
@@ -102,8 +100,7 @@ public void postSparqlSelectAll(String acceptHeader) throws JsonProcessingExcept
@Test
public void postSparqlAskAny() throws JsonProcessingException {
// prepare request
- SearchSparqlController.SparqlQuery sparqlQuery = new SearchSparqlController.SparqlQuery(
- "ASK { ?s ?p ?o }", null, null);
+ SparqlQuery sparqlQuery = new SparqlQuery("ASK { ?s ?p ?o }", null, null);
RequestEntity> request = RequestEntity
.post(url)
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
@@ -132,8 +129,7 @@ public void postSparqlAskAny() throws JsonProcessingException {
})
public void postSparqlConstructOrDescribe(String query) throws JsonProcessingException {
// prepare request
- SearchSparqlController.SparqlQuery sparqlQuery = new SearchSparqlController.SparqlQuery(
- query, null, null);
+ SparqlQuery sparqlQuery = new SparqlQuery(query, null, null);
RequestEntity> request = RequestEntity
.post(url)
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
@@ -181,8 +177,7 @@ public void postSparqlUpdateDenied(String update) throws JsonProcessingException
""";
// prepare request
- SearchSparqlController.SparqlQuery sparqlQuery = new SearchSparqlController.SparqlQuery(
- prologue + update, null, null);
+ SparqlQuery sparqlQuery = new SparqlQuery(prologue + update, null, null);
RequestEntity> request = RequestEntity
.post(url)
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
From d31c39ae536fdd544498087360309350b0893e8f Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Wed, 25 Mar 2026 10:30:37 +0100
Subject: [PATCH 13/45] todo move SearchQueryVariablesDTO
---
.../fairdatapoint/entity/search/SearchSavedQuery.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
index faf69eedd..01f7f9c81 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
@@ -55,6 +55,7 @@ public class SearchSavedQuery {
private Instant updatedAt;
+ // TODO: move "SearchQueryVariablesDTO" to entity/search/ and rename to e.g. SparqlQueryRestricted (not a DTO)
private SearchQueryVariablesDTO variables;
public enum Type {
From a4e4ff9d91ecfd6ffda594bad20cb82104c146b4 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Wed, 25 Mar 2026 10:34:17 +0100
Subject: [PATCH 14/45] add optional sparqlQuery field to SearchSavedQuery
---
.../fairdatapoint/entity/search/SearchSavedQuery.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
index 01f7f9c81..de2bd54fe 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
@@ -58,6 +58,8 @@ public class SearchSavedQuery {
// TODO: move "SearchQueryVariablesDTO" to entity/search/ and rename to e.g. SparqlQueryRestricted (not a DTO)
private SearchQueryVariablesDTO variables;
+ private SparqlQuery sparqlQuery;
+
public enum Type {
PUBLIC,
PRIVATE,
From ccb5347138bcb84c3f2f4c049f8d0c41346c46ba Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Wed, 25 Mar 2026 12:46:22 +0100
Subject: [PATCH 15/45] add optional sparqlQuery field to SearchSavedQueryDTO
---
.../fairdatapoint/api/dto/search/SearchSavedQueryDTO.java | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
index 29705b3c5..8c3d60863 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
@@ -29,6 +29,7 @@
import lombok.*;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQuery;
import java.time.Instant;
@@ -64,4 +65,8 @@ public class SearchSavedQueryDTO {
@Valid
@NotNull
private SearchQueryVariablesDTO variables;
+
+ @Valid
+ private SparqlQuery sparqlQuery;
+
}
From 7815a7498e4e7e7a6eaa7024f4000a988ea91683 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Wed, 25 Mar 2026 16:47:21 +0100
Subject: [PATCH 16/45] todo replace user object by user uuid string in
SearchSavedQueryDTO
---
.../fairdatapoint/api/dto/search/SearchSavedQueryDTO.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
index 8c3d60863..9ec0ec68f 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
@@ -52,6 +52,7 @@ public class SearchSavedQueryDTO {
@NotNull
private SearchSavedQuery.Type type;
+ // TODO: only return userUuid string, or perhaps part of name, but certainly not email and role
@Valid
@JsonInclude
private UserDTO user;
From 83f91bf03f055920b958ff69d056cc603aba462f Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Thu, 26 Mar 2026 15:49:06 +0100
Subject: [PATCH 17/45] add SparqlQueryRestricted record and decouple
SearchSavedQuery from SearchQueryVariablesDTO
we're not renaming the entity field "variabes", so data migration is not needed
---
.../entity/search/SearchSavedQuery.java | 4 +--
.../entity/search/SparqlQueryRestricted.java | 33 +++++++++++++++++++
2 files changed, 34 insertions(+), 3 deletions(-)
create mode 100644 src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryRestricted.java
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
index de2bd54fe..8d8396d19 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
@@ -23,7 +23,6 @@
package org.fairdatateam.fairdatapoint.entity.search;
import lombok.*;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@@ -55,8 +54,7 @@ public class SearchSavedQuery {
private Instant updatedAt;
- // TODO: move "SearchQueryVariablesDTO" to entity/search/ and rename to e.g. SparqlQueryRestricted (not a DTO)
- private SearchQueryVariablesDTO variables;
+ private SparqlQueryRestricted variables;
private SparqlQuery sparqlQuery;
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryRestricted.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryRestricted.java
new file mode 100644
index 000000000..091290931
--- /dev/null
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryRestricted.java
@@ -0,0 +1,33 @@
+/**
+ * The MIT License
+ * Copyright © 2017 FAIR Data Team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.fairdatateam.fairdatapoint.entity.search;
+
+/**
+ * Defines the content of a restricted SPARQL query as defined by the template
+ * src/main/resources/org/fairdatateam/fairdatapoint/service/search/queryTemplate.sparql
+ * @param prefixes
+ * @param graphPattern
+ * @param ordering
+ */
+public record SparqlQueryRestricted(String prefixes, String graphPattern, String ordering) {
+}
From 973cefbfb3198093c4a29d1a14c40c2aee4bb763 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Thu, 26 Mar 2026 15:51:50 +0100
Subject: [PATCH 18/45] rename SparqlQuery to SparqlQueryFull
for consistency with SparqlQueryRestricted
---
.../search/SearchSparqlController.java | 10 ++++----
.../api/dto/search/SearchSavedQueryDTO.java | 4 ++--
.../entity/search/SearchSavedQuery.java | 2 +-
...{SparqlQuery.java => SparqlQueryFull.java} | 2 +-
.../sparql/TestSearchSparqlController.java | 24 +++++++++----------
5 files changed, 21 insertions(+), 21 deletions(-)
rename src/main/java/org/fairdatateam/fairdatapoint/entity/search/{SparqlQuery.java => SparqlQueryFull.java} (93%)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSparqlController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSparqlController.java
index 2707bc235..11a113288 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSparqlController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSparqlController.java
@@ -41,7 +41,7 @@
import org.eclipse.rdf4j.http.server.readonly.sparql.SparqlQueryEvaluator;
import org.eclipse.rdf4j.query.MalformedQueryException;
import org.eclipse.rdf4j.repository.Repository;
-import org.fairdatateam.fairdatapoint.entity.search.SparqlQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryFull;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -85,7 +85,7 @@ public SearchSparqlController(Repository rdf4jRepository, SparqlQueryEvaluator s
)
public void sparqlPost(
@RequestHeader(value = HttpHeaders.ACCEPT, defaultValue = JSON_MEDIA_TYPES) String acceptHeader,
- @RequestBody SparqlQuery sparqlQuery,
+ @RequestBody SparqlQueryFull sparqlQueryFull,
HttpServletResponse response
) throws IOException {
// enforce default accept header for wildcard
@@ -95,10 +95,10 @@ public void sparqlPost(
sparqlQueryEvaluator.evaluate(
result,
rdf4jRepository,
- sparqlQuery.query(),
+ sparqlQueryFull.query(),
accept,
- toArray(sparqlQuery.defaultGraphUris()),
- toArray(sparqlQuery.namedGraphUris())
+ toArray(sparqlQueryFull.defaultGraphUris()),
+ toArray(sparqlQueryFull.namedGraphUris())
);
}
catch (MalformedQueryException | IllegalStateException | IOException exception) {
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
index 9ec0ec68f..1c96345ec 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
@@ -29,7 +29,7 @@
import lombok.*;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
-import org.fairdatateam.fairdatapoint.entity.search.SparqlQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryFull;
import java.time.Instant;
@@ -68,6 +68,6 @@ public class SearchSavedQueryDTO {
private SearchQueryVariablesDTO variables;
@Valid
- private SparqlQuery sparqlQuery;
+ private SparqlQueryFull sparqlQueryFull;
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
index 8d8396d19..3be4db489 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
@@ -56,7 +56,7 @@ public class SearchSavedQuery {
private SparqlQueryRestricted variables;
- private SparqlQuery sparqlQuery;
+ private SparqlQueryFull sparqlQueryFull;
public enum Type {
PUBLIC,
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryFull.java
similarity index 93%
rename from src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java
rename to src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryFull.java
index 533634fb5..90645d26e 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryFull.java
@@ -28,5 +28,5 @@
* @param defaultGraphUris
* @param namedGraphUris
*/
-public record SparqlQuery(String query, String[] defaultGraphUris, String[] namedGraphUris) {
+public record SparqlQueryFull(String query, String[] defaultGraphUris, String[] namedGraphUris) {
}
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/sparql/TestSearchSparqlController.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/sparql/TestSearchSparqlController.java
index 5a23b136f..4163517f0 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/sparql/TestSearchSparqlController.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/sparql/TestSearchSparqlController.java
@@ -27,7 +27,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import org.fairdatateam.fairdatapoint.WebIntegrationTest;
import org.eclipse.rdf4j.rio.RDFFormat;
-import org.fairdatateam.fairdatapoint.entity.search.SparqlQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryFull;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
@@ -53,11 +53,11 @@ public class TestSearchSparqlController extends WebIntegrationTest {
@Test
public void postSparqlUnauthenticated() throws JsonProcessingException {
// prepare request
- SparqlQuery sparqlQuery = new SparqlQuery(querySelectAll, null, null);
+ SparqlQueryFull sparqlQueryFull = new SparqlQueryFull(querySelectAll, null, null);
RequestEntity> request = RequestEntity
.post(url)
.accept(MediaType.APPLICATION_JSON)
- .body(sparqlQuery);
+ .body(sparqlQueryFull);
// perform
ResponseEntity response = client.exchange(request, String.class);
@@ -74,13 +74,13 @@ public void postSparqlUnauthenticated() throws JsonProcessingException {
@ValueSource(strings = { MediaType.APPLICATION_JSON_VALUE, "*/*" })
public void postSparqlSelectAll(String acceptHeader) throws JsonProcessingException {
// prepare request
- SparqlQuery sparqlQuery = new SparqlQuery(querySelectAll, null, null);
- RequestEntity request = RequestEntity
+ SparqlQueryFull sparqlQueryFull = new SparqlQueryFull(querySelectAll, null, null);
+ RequestEntity request = RequestEntity
.post(url)
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
.accept(MediaType.valueOf(acceptHeader))
.contentType(MediaType.APPLICATION_JSON)
- .body(sparqlQuery);
+ .body(sparqlQueryFull);
// perform
ResponseEntity response = client.exchange(request, String.class);
@@ -100,12 +100,12 @@ public void postSparqlSelectAll(String acceptHeader) throws JsonProcessingExcept
@Test
public void postSparqlAskAny() throws JsonProcessingException {
// prepare request
- SparqlQuery sparqlQuery = new SparqlQuery("ASK { ?s ?p ?o }", null, null);
+ SparqlQueryFull sparqlQueryFull = new SparqlQueryFull("ASK { ?s ?p ?o }", null, null);
RequestEntity> request = RequestEntity
.post(url)
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
.accept(MediaType.APPLICATION_JSON)
- .body(sparqlQuery);
+ .body(sparqlQueryFull);
// perform
ResponseEntity response = client.exchange(request, String.class);
@@ -129,13 +129,13 @@ public void postSparqlAskAny() throws JsonProcessingException {
})
public void postSparqlConstructOrDescribe(String query) throws JsonProcessingException {
// prepare request
- SparqlQuery sparqlQuery = new SparqlQuery(query, null, null);
+ SparqlQueryFull sparqlQueryFull = new SparqlQueryFull(query, null, null);
RequestEntity> request = RequestEntity
.post(url)
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
// QueryTypes.CONSTRUCT_OR_DESCRIBE does not support simple JSON, only application/ld+json (or ttl, n3)
.accept(MediaType.valueOf(RDFFormat.JSONLD.getDefaultMIMEType()))
- .body(sparqlQuery);
+ .body(sparqlQueryFull);
// perform
ResponseEntity response = client.exchange(request, String.class);
@@ -177,12 +177,12 @@ public void postSparqlUpdateDenied(String update) throws JsonProcessingException
""";
// prepare request
- SparqlQuery sparqlQuery = new SparqlQuery(prologue + update, null, null);
+ SparqlQueryFull sparqlQueryFull = new SparqlQueryFull(prologue + update, null, null);
RequestEntity> request = RequestEntity
.post(url)
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
.accept(MediaType.APPLICATION_JSON)
- .body(sparqlQuery);
+ .body(sparqlQueryFull);
// perform
ResponseEntity response = client.exchange(request, String.class);
From 9c66a9ea2d8ffad633ed66090a686860752646aa Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Thu, 26 Mar 2026 16:26:01 +0100
Subject: [PATCH 19/45] add explicit mappings between SparqlQueryRestricted and
SearchQueryVariablesDTO for consistency
actually this is a 1-1 mapping, so it is redundant, but I'm following the approach of the existing code
(which is to be the hobgoblin from PEP 8...)
---
.../search/query/SearchSavedQueryMapper.java | 24 ++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index d3f9c43a7..28341450a 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -22,10 +22,12 @@
*/
package org.fairdatateam.fairdatapoint.service.search.query;
+import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryRestricted;
import org.fairdatateam.fairdatapoint.entity.user.UserRole;
import org.springframework.stereotype.Component;
@@ -48,7 +50,7 @@ public SearchSavedQueryDTO toDTO(SearchSavedQuery query) {
.uuid(query.getUuid())
.name(query.getName())
.description(query.getDescription())
- .variables(query.getVariables())
+ .variables(toSearchQueryVariablesDTO(query.getVariables()))
.user(userDTO)
.type(query.getType())
.createdAt(query.getCreatedAt())
@@ -64,7 +66,7 @@ public SearchSavedQuery fromChangeDTO(
.name(reqDto.getName())
.description(reqDto.getDescription())
.type(reqDto.getType())
- .variables(reqDto.getVariables())
+ .variables(fromSearchQueryVariablesDTO(reqDto.getVariables()))
.userUuid(userUuid)
.createdAt(Instant.now())
.updatedAt(Instant.now())
@@ -77,10 +79,26 @@ public SearchSavedQuery fromChangeDTO(
return query.toBuilder()
.name(reqDto.getName())
.description(reqDto.getDescription())
- .variables(reqDto.getVariables())
+ .variables(fromSearchQueryVariablesDTO(reqDto.getVariables()))
.userUuid(query.getUserUuid())
.type(reqDto.getType())
.updatedAt(Instant.now())
.build();
}
+
+ private SparqlQueryRestricted fromSearchQueryVariablesDTO(SearchQueryVariablesDTO variablesDTO) {
+ // 1-to-1 mapping is redundant, but we do it anyway to be consistent with the existing codebase
+ return new SparqlQueryRestricted(
+ variablesDTO.getPrefixes(), variablesDTO.getGraphPattern(), variablesDTO.getOrdering()
+ );
+ }
+
+ private SearchQueryVariablesDTO toSearchQueryVariablesDTO(SparqlQueryRestricted restrictedQuery) {
+ // 1-to-1 mapping is redundant, but we do it anyway to be consistent with the existing codebase
+ return SearchQueryVariablesDTO.builder()
+ .prefixes(restrictedQuery.prefixes())
+ .graphPattern(restrictedQuery.graphPattern())
+ .ordering(restrictedQuery.ordering())
+ .build();
+ }
}
From 1f30cc5ea84772f3b66a9ec254a96109c780cfbc Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Thu, 26 Mar 2026 16:41:49 +0100
Subject: [PATCH 20/45] adapt SearchSavedQueryFixtures to use
SparqlQueryRestricted
---
.../search/SearchSavedQueryFixtures.java | 31 ++++++-------------
1 file changed, 9 insertions(+), 22 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java b/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java
index 46cf9ee14..04323f7ff 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java
@@ -22,8 +22,8 @@
*/
package org.fairdatateam.fairdatapoint.database.mongo.migration.development.search;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryRestricted;
import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.springframework.stereotype.Service;
@@ -43,12 +43,7 @@ public SearchSavedQuery savedQueryPublic01() {
.description("Quickly query all datasets (DCAT)")
.type(SearchSavedQuery.Type.PUBLIC)
.userUuid(KnownUUIDs.USER_ALBERT_UUID)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes(PREFIX_DCAT)
- .graphPattern("?entity rdf:type dcat:Dataset .")
- .ordering(ORDER_TITLE)
- .build()
- )
+ .variables(new SparqlQueryRestricted(PREFIX_DCAT, "?entity rdf:type dcat:Dataset .", ORDER_TITLE))
.createdAt(Instant.now())
.updatedAt(Instant.now())
.build();
@@ -61,33 +56,25 @@ public SearchSavedQuery savedQueryInternal01() {
.description("Quickly query all distributions (DCAT)")
.type(SearchSavedQuery.Type.INTERNAL)
.userUuid(KnownUUIDs.USER_ADMIN_UUID)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes(PREFIX_DCAT)
- .graphPattern("?entity rdf:type dcat:Distribution .")
- .ordering(ORDER_TITLE)
- .build()
- )
+ .variables(new SparqlQueryRestricted(PREFIX_DCAT, "?entity rdf:type dcat:Distribution .", ORDER_TITLE))
.createdAt(Instant.now())
.updatedAt(Instant.now())
.build();
}
public SearchSavedQuery savedQueryPrivate01() {
+ final String graphPattern = """
+ ?entity ?relationPredicate ?relationObject .
+ FILTER isLiteral(?relationObject)
+ FILTER CONTAINS(LCASE(str(?relationObject)), LCASE("data"))
+ """;
return SearchSavedQuery.builder()
.uuid(UUID.randomUUID().toString())
.name("Things with data")
.description("This is private query of Nikola Tesla.")
.type(SearchSavedQuery.Type.PRIVATE)
.userUuid(KnownUUIDs.USER_NIKOLA_UUID)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("")
- .graphPattern("""
- ?entity ?relationPredicate ?relationObject .
- FILTER isLiteral(?relationObject)
- FILTER CONTAINS(LCASE(str(?relationObject)), LCASE("data"))""")
- .ordering(ORDER_TITLE)
- .build()
- )
+ .variables(new SparqlQueryRestricted("", graphPattern, ORDER_TITLE))
.createdAt(Instant.now())
.updatedAt(Instant.now())
.build();
From ac43b2133e934412ccde7157d1bd4380755f6a5a Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Thu, 26 Mar 2026 17:58:10 +0100
Subject: [PATCH 21/45] rename SparqlQueryRestricted to SparqlQueryVariables
because it is a better fit with the existing variables field names and makes more sense semantically
---
.../development/search/SearchSavedQueryFixtures.java | 8 ++++----
.../fairdatapoint/entity/search/SearchSavedQuery.java | 2 +-
...arqlQueryRestricted.java => SparqlQueryVariables.java} | 2 +-
.../service/search/query/SearchSavedQueryMapper.java | 8 ++++----
4 files changed, 10 insertions(+), 10 deletions(-)
rename src/main/java/org/fairdatateam/fairdatapoint/entity/search/{SparqlQueryRestricted.java => SparqlQueryVariables.java} (93%)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java b/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java
index 04323f7ff..bb28a266d 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/database/mongo/migration/development/search/SearchSavedQueryFixtures.java
@@ -23,7 +23,7 @@
package org.fairdatateam.fairdatapoint.database.mongo.migration.development.search;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
-import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryRestricted;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.springframework.stereotype.Service;
@@ -43,7 +43,7 @@ public SearchSavedQuery savedQueryPublic01() {
.description("Quickly query all datasets (DCAT)")
.type(SearchSavedQuery.Type.PUBLIC)
.userUuid(KnownUUIDs.USER_ALBERT_UUID)
- .variables(new SparqlQueryRestricted(PREFIX_DCAT, "?entity rdf:type dcat:Dataset .", ORDER_TITLE))
+ .variables(new SparqlQueryVariables(PREFIX_DCAT, "?entity rdf:type dcat:Dataset .", ORDER_TITLE))
.createdAt(Instant.now())
.updatedAt(Instant.now())
.build();
@@ -56,7 +56,7 @@ public SearchSavedQuery savedQueryInternal01() {
.description("Quickly query all distributions (DCAT)")
.type(SearchSavedQuery.Type.INTERNAL)
.userUuid(KnownUUIDs.USER_ADMIN_UUID)
- .variables(new SparqlQueryRestricted(PREFIX_DCAT, "?entity rdf:type dcat:Distribution .", ORDER_TITLE))
+ .variables(new SparqlQueryVariables(PREFIX_DCAT, "?entity rdf:type dcat:Distribution .", ORDER_TITLE))
.createdAt(Instant.now())
.updatedAt(Instant.now())
.build();
@@ -74,7 +74,7 @@ FILTER CONTAINS(LCASE(str(?relationObject)), LCASE("data"))
.description("This is private query of Nikola Tesla.")
.type(SearchSavedQuery.Type.PRIVATE)
.userUuid(KnownUUIDs.USER_NIKOLA_UUID)
- .variables(new SparqlQueryRestricted("", graphPattern, ORDER_TITLE))
+ .variables(new SparqlQueryVariables("", graphPattern, ORDER_TITLE))
.createdAt(Instant.now())
.updatedAt(Instant.now())
.build();
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
index 3be4db489..5c952a1ae 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
@@ -54,7 +54,7 @@ public class SearchSavedQuery {
private Instant updatedAt;
- private SparqlQueryRestricted variables;
+ private SparqlQueryVariables variables;
private SparqlQueryFull sparqlQueryFull;
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryRestricted.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryVariables.java
similarity index 93%
rename from src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryRestricted.java
rename to src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryVariables.java
index 091290931..9ffa4c980 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryRestricted.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryVariables.java
@@ -29,5 +29,5 @@
* @param graphPattern
* @param ordering
*/
-public record SparqlQueryRestricted(String prefixes, String graphPattern, String ordering) {
+public record SparqlQueryVariables(String prefixes, String graphPattern, String ordering) {
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index 28341450a..11e7e990f 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -27,7 +27,7 @@
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
-import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryRestricted;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
import org.fairdatateam.fairdatapoint.entity.user.UserRole;
import org.springframework.stereotype.Component;
@@ -86,14 +86,14 @@ public SearchSavedQuery fromChangeDTO(
.build();
}
- private SparqlQueryRestricted fromSearchQueryVariablesDTO(SearchQueryVariablesDTO variablesDTO) {
+ private SparqlQueryVariables fromSearchQueryVariablesDTO(SearchQueryVariablesDTO variablesDTO) {
// 1-to-1 mapping is redundant, but we do it anyway to be consistent with the existing codebase
- return new SparqlQueryRestricted(
+ return new SparqlQueryVariables(
variablesDTO.getPrefixes(), variablesDTO.getGraphPattern(), variablesDTO.getOrdering()
);
}
- private SearchQueryVariablesDTO toSearchQueryVariablesDTO(SparqlQueryRestricted restrictedQuery) {
+ private SearchQueryVariablesDTO toSearchQueryVariablesDTO(SparqlQueryVariables restrictedQuery) {
// 1-to-1 mapping is redundant, but we do it anyway to be consistent with the existing codebase
return SearchQueryVariablesDTO.builder()
.prefixes(restrictedQuery.prefixes())
From b45088f4288c77b70ae55bfb31037cd55899b189 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Thu, 26 Mar 2026 18:09:59 +0100
Subject: [PATCH 22/45] replace SearchQueryVariablesDTO type by
SparqlQueryVariables in SearchSavedQueryDTO
and adapt references and usages
---
.../api/controller/search/SearchController.java | 5 +++--
.../api/dto/search/SearchSavedQueryDTO.java | 4 ++--
.../service/search/SearchService.java | 15 ++++++---------
.../search/query/SearchSavedQueryMapper.java | 10 +---------
4 files changed, 12 insertions(+), 22 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java
index bf5867b68..1178150c2 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java
@@ -26,6 +26,7 @@
import jakarta.validation.Valid;
import org.fairdatateam.fairdatapoint.api.dto.search.*;
import org.fairdatateam.fairdatapoint.database.rdf.repository.MetadataRepositoryException;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
import org.fairdatateam.fairdatapoint.service.search.SearchService;
import org.eclipse.rdf4j.query.MalformedQueryException;
import org.springframework.beans.factory.annotation.Autowired;
@@ -69,9 +70,9 @@ public ResponseEntity getSearchQueryTemplate() {
produces = MediaType.APPLICATION_JSON_VALUE
)
public ResponseEntity> searchWithQuery(
- @RequestBody @Valid SearchQueryVariablesDTO reqDto
+ @RequestBody @Valid SparqlQueryVariables body
) throws MetadataRepositoryException, MalformedQueryException {
- return ResponseEntity.ok(searchService.search(reqDto));
+ return ResponseEntity.ok(searchService.search(body));
}
@GetMapping(
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
index 1c96345ec..73cbeed21 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
@@ -30,6 +30,7 @@
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryFull;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
import java.time.Instant;
@@ -64,8 +65,7 @@ public class SearchSavedQueryDTO {
private Instant updatedAt;
@Valid
- @NotNull
- private SearchQueryVariablesDTO variables;
+ private SparqlQueryVariables variables;
@Valid
private SparqlQueryFull sparqlQueryFull;
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/SearchService.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/SearchService.java
index 25728bfed..e37885e45 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/SearchService.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/SearchService.java
@@ -27,10 +27,7 @@
import org.fairdatateam.fairdatapoint.database.rdf.repository.GenericMetadataRepository;
import org.fairdatateam.fairdatapoint.entity.exception.ResourceNotFoundException;
import org.fairdatateam.fairdatapoint.entity.metadata.MetadataState;
-import org.fairdatateam.fairdatapoint.entity.search.SearchFilterCacheContainer;
-import org.fairdatateam.fairdatapoint.entity.search.SearchFilterType;
-import org.fairdatateam.fairdatapoint.entity.search.SearchFilterValue;
-import org.fairdatateam.fairdatapoint.entity.search.SearchResult;
+import org.fairdatateam.fairdatapoint.entity.search.*;
import org.fairdatateam.fairdatapoint.entity.settings.SettingsSearchFilter;
import org.fairdatateam.fairdatapoint.service.metadata.state.MetadataStateService;
import org.fairdatateam.fairdatapoint.service.settings.SettingsService;
@@ -113,7 +110,7 @@ public List search(SearchQueryDTO simpleQuery) throws MetadataR
* @return List of search result objects
*/
public List search(
- SearchQueryVariablesDTO queryVariables
+ SparqlQueryVariables queryVariables
) throws MetadataRepositoryException, MalformedQueryException {
// Compose query
final String query = composeQuery(queryVariables);
@@ -226,11 +223,11 @@ private boolean isUsableForFilter(IRI iri) {
* @param queryVariables User input to be used as template context
* @return Full SPARQL query string
*/
- private String composeQuery(SearchQueryVariablesDTO queryVariables) {
+ private String composeQuery(SparqlQueryVariables queryVariables) {
final Map templateContext = Map.of(
- "prefixes", queryVariables.getPrefixes(),
- "graphPattern", queryVariables.getGraphPattern(),
- "ordering", queryVariables.getOrdering()
+ "prefixes", queryVariables.prefixes(),
+ "graphPattern", queryVariables.graphPattern(),
+ "ordering", queryVariables.ordering()
);
final StrSubstitutor substitutor = new StrSubstitutor(templateContext, "{{", "}}");
return substitutor.replace(queryTemplate);
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index 11e7e990f..545ff0b57 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -50,7 +50,7 @@ public SearchSavedQueryDTO toDTO(SearchSavedQuery query) {
.uuid(query.getUuid())
.name(query.getName())
.description(query.getDescription())
- .variables(toSearchQueryVariablesDTO(query.getVariables()))
+ .variables(query.getVariables())
.user(userDTO)
.type(query.getType())
.createdAt(query.getCreatedAt())
@@ -93,12 +93,4 @@ private SparqlQueryVariables fromSearchQueryVariablesDTO(SearchQueryVariablesDTO
);
}
- private SearchQueryVariablesDTO toSearchQueryVariablesDTO(SparqlQueryVariables restrictedQuery) {
- // 1-to-1 mapping is redundant, but we do it anyway to be consistent with the existing codebase
- return SearchQueryVariablesDTO.builder()
- .prefixes(restrictedQuery.prefixes())
- .graphPattern(restrictedQuery.graphPattern())
- .ordering(restrictedQuery.ordering())
- .build();
- }
}
From 94cbae15ab72eefba4532a2d9171314192f90c58 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Thu, 26 Mar 2026 18:19:39 +0100
Subject: [PATCH 23/45] rename SearchSavedQueryChangeDTO to
SparqlQueryVariablesChangeDTO
to distinguish from SparqlQueryFullChangeDTO to be added later
---
.../search/SearchSavedQueryController.java | 6 +++---
...java => SparqlQueryVariablesChangeDTO.java} | 2 +-
.../search/query/SearchSavedQueryMapper.java | 6 +++---
.../search/query/SearchSavedQueryService.java | 8 ++++----
.../search/query/saved/Detail_PUT.java | 18 +++++++++---------
.../search/query/saved/List_POST.java | 11 +++++------
6 files changed, 25 insertions(+), 26 deletions(-)
rename src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/{SearchSavedQueryChangeDTO.java => SparqlQueryVariablesChangeDTO.java} (97%)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index ef2ed3c89..1ddfaf270 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -25,7 +25,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchResultDTO;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.rdf.repository.MetadataRepositoryException;
import org.fairdatateam.fairdatapoint.entity.exception.ResourceNotFoundException;
@@ -90,7 +90,7 @@ public ResponseEntity> search(
@PreAuthorize("isAuthenticated()")
@PostMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity create(
- @RequestBody @Valid SearchSavedQueryChangeDTO reqDto
+ @RequestBody @Valid SparqlQueryVariablesChangeDTO reqDto
) {
final SearchSavedQueryDTO dto = searchSavedQueryService.create(reqDto);
return new ResponseEntity<>(dto, HttpStatus.CREATED);
@@ -100,7 +100,7 @@ public ResponseEntity create(
@PutMapping(path = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity update(
@PathVariable final String uuid,
- @RequestBody @Valid SearchSavedQueryChangeDTO reqDto
+ @RequestBody @Valid SparqlQueryVariablesChangeDTO reqDto
) {
final Optional oDto = searchSavedQueryService.update(uuid, reqDto);
if (oDto.isPresent()) {
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
similarity index 97%
rename from src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java
rename to src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
index d97c6b12b..b9e72e1fe 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
@@ -33,7 +33,7 @@
@Getter
@Setter
@Builder
-public class SearchSavedQueryChangeDTO {
+public class SparqlQueryVariablesChangeDTO {
@NotBlank
private String name;
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index 545ff0b57..8866fa1e7 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -23,7 +23,7 @@
package org.fairdatateam.fairdatapoint.service.search.query;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
@@ -59,7 +59,7 @@ public SearchSavedQueryDTO toDTO(SearchSavedQuery query) {
}
public SearchSavedQuery fromChangeDTO(
- SearchSavedQueryChangeDTO reqDto, String userUuid
+ SparqlQueryVariablesChangeDTO reqDto, String userUuid
) {
return SearchSavedQuery.builder()
.uuid(UUID.randomUUID().toString())
@@ -74,7 +74,7 @@ public SearchSavedQuery fromChangeDTO(
}
public SearchSavedQuery fromChangeDTO(
- SearchSavedQuery query, SearchSavedQueryChangeDTO reqDto
+ SearchSavedQuery query, SparqlQueryVariablesChangeDTO reqDto
) {
return query.toBuilder()
.name(reqDto.getName())
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
index 4e04a74ef..3abea6ce7 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
@@ -22,7 +22,7 @@
*/
package org.fairdatateam.fairdatapoint.service.search.query;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.exception.ForbiddenException;
@@ -82,15 +82,15 @@ public boolean delete(String uuid) {
return true;
}
- public SearchSavedQueryDTO create(SearchSavedQueryChangeDTO reqDto) {
- final String currentUserUuid = currentUserProvider.getCurrentUserUuid().orElse(null);
+ public SearchSavedQueryDTO create(SparqlQueryVariablesChangeDTO reqDto) {
+ final String currentUserUuid = currentUserProvider.getCurrentUserUuid().orElse(null);
final SearchSavedQuery searchSavedQuery = repository.save(
mapper.fromChangeDTO(reqDto, currentUserUuid)
);
return mapper.toDTO(searchSavedQuery);
}
- public Optional update(String uuid, SearchSavedQueryChangeDTO reqDto) {
+ public Optional update(String uuid, SparqlQueryVariablesChangeDTO reqDto) {
final Optional optionalSearchQuery = repository.findByUuid(uuid);
if (optionalSearchQuery.isEmpty()) {
return Optional.empty();
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
index a926022c1..45a4b7eba 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
@@ -24,7 +24,7 @@
import org.fairdatateam.fairdatapoint.WebIntegrationTest;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.mongo.migration.development.search.SearchSavedQueryFixtures;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
@@ -66,10 +66,10 @@ public void res403_anonymousUser() {
SearchSavedQuery query = searchSavedQueryRepository.save(searchSavedQueryFixtures.savedQueryPublic01());
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.put(url(query.getUuid()))
.body(
- SearchSavedQueryChangeDTO.builder()
+ SparqlQueryVariablesChangeDTO.builder()
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
@@ -99,11 +99,11 @@ public void res403_nonOwnerUser() {
SearchSavedQuery query = searchSavedQueryRepository.save(searchSavedQueryFixtures.savedQueryPublic01());
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.put(url(query.getUuid()))
.header(HttpHeaders.AUTHORIZATION, NIKOLA_TOKEN)
.body(
- SearchSavedQueryChangeDTO.builder()
+ SparqlQueryVariablesChangeDTO.builder()
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
@@ -133,11 +133,11 @@ public void res200_owner() {
SearchSavedQuery query = searchSavedQueryRepository.save(searchSavedQueryFixtures.savedQueryPublic01());
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.put(url(query.getUuid()))
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
.body(
- SearchSavedQueryChangeDTO.builder()
+ SparqlQueryVariablesChangeDTO.builder()
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.INTERNAL)
@@ -173,11 +173,11 @@ public void res200_admin() {
SearchSavedQuery query = searchSavedQueryRepository.save(searchSavedQueryFixtures.savedQueryPublic01());
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.put(url(query.getUuid()))
.header(HttpHeaders.AUTHORIZATION, ADMIN_TOKEN)
.body(
- SearchSavedQueryChangeDTO.builder()
+ SparqlQueryVariablesChangeDTO.builder()
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.INTERNAL)
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
index 3e3dc82b2..d5c4a489b 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
@@ -24,7 +24,7 @@
import org.fairdatateam.fairdatapoint.WebIntegrationTest;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
@@ -39,7 +39,6 @@
import org.springframework.http.ResponseEntity;
import java.net.URI;
-import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
@@ -62,10 +61,10 @@ public void res403_anonymousUser() {
searchSavedQueryRepository.deleteAll();
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.post(url())
.body(
- SearchSavedQueryChangeDTO.builder()
+ SparqlQueryVariablesChangeDTO.builder()
.name("New query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
@@ -95,11 +94,11 @@ public void res201() {
searchSavedQueryRepository.deleteAll();
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.post(url())
.header(HttpHeaders.AUTHORIZATION, NIKOLA_TOKEN)
.body(
- SearchSavedQueryChangeDTO.builder()
+ SparqlQueryVariablesChangeDTO.builder()
.name("New query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
From f9d1efc902454f14ca6873d572c9bdc8a59b7082 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Thu, 26 Mar 2026 18:29:00 +0100
Subject: [PATCH 24/45] replace SearchQueryVariablesDTO type by
SparqlQueryVariables in SparqlQueryVariablesChangeDTO
and adapt references
---
.../search/SparqlQueryVariablesChangeDTO.java | 3 +-
.../search/query/SearchSavedQueryMapper.java | 13 +-----
.../search/query/saved/Detail_PUT.java | 42 +++++--------------
.../search/query/saved/List_POST.java | 16 ++-----
4 files changed, 18 insertions(+), 56 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
index b9e72e1fe..58c8fb86b 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
@@ -27,6 +27,7 @@
import jakarta.validation.constraints.NotNull;
import lombok.*;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
@NoArgsConstructor
@AllArgsConstructor
@@ -46,5 +47,5 @@ public class SparqlQueryVariablesChangeDTO {
@Valid
@NotNull
- private SearchQueryVariablesDTO variables;
+ private SparqlQueryVariables variables;
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index 8866fa1e7..d396fc8a2 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -22,12 +22,10 @@
*/
package org.fairdatateam.fairdatapoint.service.search.query;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
-import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
import org.fairdatateam.fairdatapoint.entity.user.UserRole;
import org.springframework.stereotype.Component;
@@ -66,7 +64,7 @@ public SearchSavedQuery fromChangeDTO(
.name(reqDto.getName())
.description(reqDto.getDescription())
.type(reqDto.getType())
- .variables(fromSearchQueryVariablesDTO(reqDto.getVariables()))
+ .variables(reqDto.getVariables())
.userUuid(userUuid)
.createdAt(Instant.now())
.updatedAt(Instant.now())
@@ -79,18 +77,11 @@ public SearchSavedQuery fromChangeDTO(
return query.toBuilder()
.name(reqDto.getName())
.description(reqDto.getDescription())
- .variables(fromSearchQueryVariablesDTO(reqDto.getVariables()))
+ .variables(reqDto.getVariables())
.userUuid(query.getUserUuid())
.type(reqDto.getType())
.updatedAt(Instant.now())
.build();
}
- private SparqlQueryVariables fromSearchQueryVariablesDTO(SearchQueryVariablesDTO variablesDTO) {
- // 1-to-1 mapping is redundant, but we do it anyway to be consistent with the existing codebase
- return new SparqlQueryVariables(
- variablesDTO.getPrefixes(), variablesDTO.getGraphPattern(), variablesDTO.getOrdering()
- );
- }
-
}
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
index 45a4b7eba..57d7ae5c1 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
@@ -23,12 +23,12 @@
package org.fairdatateam.fairdatapoint.acceptance.search.query.saved;
import org.fairdatateam.fairdatapoint.WebIntegrationTest;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.mongo.migration.development.search.SearchSavedQueryFixtures;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -73,12 +73,7 @@ public void res403_anonymousUser() {
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("A")
- .graphPattern("B")
- .ordering("C")
- .build()
- )
+ .variables(new SparqlQueryVariables("A", "B", "C"))
.build()
);
ParameterizedTypeReference> responseType = new ParameterizedTypeReference<>() {
@@ -107,12 +102,7 @@ public void res403_nonOwnerUser() {
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("A")
- .graphPattern("B")
- .ordering("C")
- .build()
- )
+ .variables(new SparqlQueryVariables("A", "B", "C"))
.build()
);
ParameterizedTypeReference> responseType = new ParameterizedTypeReference<>() {
@@ -141,12 +131,7 @@ public void res200_owner() {
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.INTERNAL)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("A")
- .graphPattern("B")
- .ordering("C")
- .build()
- )
+ .variables(new SparqlQueryVariables("A", "B", "C"))
.build()
);
ParameterizedTypeReference responseType = new ParameterizedTypeReference<>() {
@@ -160,9 +145,9 @@ public void res200_owner() {
assertThat(result.getBody().getUser().getUuid(), is(equalTo(KnownUUIDs.USER_ALBERT_UUID)));
assertThat(result.getBody().getType(), is(equalTo(SearchSavedQuery.Type.INTERNAL)));
assertThat(result.getBody().getName(), is(equalTo("Edited query")));
- assertThat(result.getBody().getVariables().getPrefixes(), is(equalTo("A")));
- assertThat(result.getBody().getVariables().getGraphPattern(), is(equalTo("B")));
- assertThat(result.getBody().getVariables().getOrdering(), is(equalTo("C")));
+ assertThat(result.getBody().getVariables().prefixes(), is(equalTo("A")));
+ assertThat(result.getBody().getVariables().graphPattern(), is(equalTo("B")));
+ assertThat(result.getBody().getVariables().ordering(), is(equalTo("C")));
}
@Test
@@ -181,12 +166,7 @@ public void res200_admin() {
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.INTERNAL)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("A")
- .graphPattern("B")
- .ordering("C")
- .build()
- )
+ .variables(new SparqlQueryVariables("A", "B", "C"))
.build()
);
ParameterizedTypeReference responseType = new ParameterizedTypeReference<>() {
@@ -200,8 +180,8 @@ public void res200_admin() {
assertThat(result.getBody().getUser().getUuid(), is(equalTo(KnownUUIDs.USER_ALBERT_UUID)));
assertThat(result.getBody().getType(), is(equalTo(SearchSavedQuery.Type.INTERNAL)));
assertThat(result.getBody().getName(), is(equalTo("Edited query")));
- assertThat(result.getBody().getVariables().getPrefixes(), is(equalTo("A")));
- assertThat(result.getBody().getVariables().getGraphPattern(), is(equalTo("B")));
- assertThat(result.getBody().getVariables().getOrdering(), is(equalTo("C")));
+ assertThat(result.getBody().getVariables().prefixes(), is(equalTo("A")));
+ assertThat(result.getBody().getVariables().graphPattern(), is(equalTo("B")));
+ assertThat(result.getBody().getVariables().ordering(), is(equalTo("C")));
}
}
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
index d5c4a489b..0e8e291e0 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
@@ -23,11 +23,11 @@
package org.fairdatateam.fairdatapoint.acceptance.search.query.saved;
import org.fairdatateam.fairdatapoint.WebIntegrationTest;
-import org.fairdatateam.fairdatapoint.api.dto.search.SearchQueryVariablesDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -68,12 +68,7 @@ public void res403_anonymousUser() {
.name("New query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("")
- .graphPattern("")
- .ordering("")
- .build()
- )
+ .variables(new SparqlQueryVariables("", "", ""))
.build()
);
ParameterizedTypeReference> responseType = new ParameterizedTypeReference<>() {
@@ -102,12 +97,7 @@ public void res201() {
.name("New query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("")
- .graphPattern("")
- .ordering("")
- .build()
- )
+ .variables(new SparqlQueryVariables("", "", ""))
.build()
);
ParameterizedTypeReference responseType = new ParameterizedTypeReference<>() {
From b39d4dc91b0cd75654903dc9801880e056a94b87 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Fri, 27 Mar 2026 09:30:14 +0100
Subject: [PATCH 25/45] add controller for saving full sparql query (wip)
---
.../search/SearchSavedQueryController.java | 16 +++++-
.../dto/search/SparqlQueryFullChangeDTO.java | 51 +++++++++++++++++++
.../search/query/SearchSavedQueryService.java | 2 +-
3 files changed, 66 insertions(+), 3 deletions(-)
create mode 100644 src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index 1ddfaf270..f0ad33c21 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -27,6 +27,7 @@
import org.fairdatateam.fairdatapoint.api.dto.search.SearchResultDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
+import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.database.rdf.repository.MetadataRepositoryException;
import org.fairdatateam.fairdatapoint.entity.exception.ResourceNotFoundException;
import org.fairdatateam.fairdatapoint.service.search.SearchService;
@@ -90,9 +91,20 @@ public ResponseEntity> search(
@PreAuthorize("isAuthenticated()")
@PostMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity create(
- @RequestBody @Valid SparqlQueryVariablesChangeDTO reqDto
+ @RequestBody @Valid SparqlQueryVariablesChangeDTO body
+ ) {
+ final UserDTO userDto = userService.getCurrentUser().orElse(null);
+ final SearchSavedQueryDTO dto = searchSavedQueryService.create(body);
+ return new ResponseEntity<>(dto, HttpStatus.CREATED);
+ }
+
+ @PreAuthorize("isAuthenticated()")
+ @PostMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity create(
+ @RequestBody @Valid SparqlQueryFullChangeDTO body
) {
- final SearchSavedQueryDTO dto = searchSavedQueryService.create(reqDto);
+ final UserDTO userDto = userService.getCurrentUser().orElse(null);
+ final SearchSavedQueryDTO dto = searchSavedQueryService.create(body);
return new ResponseEntity<>(dto, HttpStatus.CREATED);
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
new file mode 100644
index 000000000..6c6639b80
--- /dev/null
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
@@ -0,0 +1,51 @@
+/**
+ * The MIT License
+ * Copyright © 2017 FAIR Data Team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.fairdatateam.fairdatapoint.api.dto.search;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.*;
+import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryFull;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Getter
+@Setter
+@Builder
+public class SparqlQueryFullChangeDTO {
+
+ @NotBlank
+ private String name;
+
+ @NotNull
+ private String description;
+
+ @NotNull
+ private SearchSavedQuery.Type type;
+
+ @Valid
+ @NotNull
+ private SparqlQueryFull sparqlQueryFull;
+}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
index 3abea6ce7..e37cfb4e8 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
@@ -83,7 +83,7 @@ public boolean delete(String uuid) {
}
public SearchSavedQueryDTO create(SparqlQueryVariablesChangeDTO reqDto) {
- final String currentUserUuid = currentUserProvider.getCurrentUserUuid().orElse(null);
+ final String currentUserUuid = currentUserProvider.getCurrentUserUuid().orElse(null);
final SearchSavedQuery searchSavedQuery = repository.save(
mapper.fromChangeDTO(reqDto, currentUserUuid)
);
From 89403e983c87a93cbafd6f5a33110d615680200d Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Fri, 27 Mar 2026 16:41:19 +0100
Subject: [PATCH 26/45] switch SearchSavedQueryController to constructor
autowiring
---
.../search/SearchSavedQueryController.java | 21 ++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index f0ad33c21..55cefb486 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -32,7 +32,7 @@
import org.fairdatateam.fairdatapoint.entity.exception.ResourceNotFoundException;
import org.fairdatateam.fairdatapoint.service.search.SearchService;
import org.fairdatateam.fairdatapoint.service.search.query.SearchSavedQueryService;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.fairdatateam.fairdatapoint.service.security.CurrentUserProvider;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -51,11 +51,22 @@ public class SearchSavedQueryController {
private static final String NOT_FOUND_MSG = "Saved query '%s' doesn't exist";
- @Autowired
- private SearchSavedQueryService searchSavedQueryService;
+ private final CurrentUserProvider currentUserProvider;
- @Autowired
- private SearchService searchService;
+ private final SearchSavedQueryService searchSavedQueryService;
+
+ private final SearchService searchService;
+
+ /**
+ * Constructor (autowired)
+ */
+ public SearchSavedQueryController(
+ CurrentUserProvider userProvider, SearchSavedQueryService savedQueryService, SearchService searchService
+ ) {
+ this.currentUserProvider = userProvider;
+ this.searchSavedQueryService = savedQueryService;
+ this.searchService = searchService;
+ }
@GetMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity> getAll() {
From e4c9024a273e75ec7f10a56cf0f48de54140b086 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Fri, 27 Mar 2026 17:16:49 +0100
Subject: [PATCH 27/45] move DTO mapping from SearchSavedQueryService.create
into SearchSavedQueryController
this way the DTO mapping is done at the boundary, where is makes most sense to me
also the SearchSavedQueryService.create method now only knows about domain objects
this is an intentional break in consistency with the existing codebase
---
.../search/SearchSavedQueryController.java | 30 ++++++++++---------
.../search/query/SearchSavedQueryMapper.java | 5 +---
.../search/query/SearchSavedQueryService.java | 9 ++----
3 files changed, 20 insertions(+), 24 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index 55cefb486..5f6b215ec 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -30,9 +30,10 @@
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.database.rdf.repository.MetadataRepositoryException;
import org.fairdatateam.fairdatapoint.entity.exception.ResourceNotFoundException;
+import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
import org.fairdatateam.fairdatapoint.service.search.SearchService;
+import org.fairdatateam.fairdatapoint.service.search.query.SearchSavedQueryMapper;
import org.fairdatateam.fairdatapoint.service.search.query.SearchSavedQueryService;
-import org.fairdatateam.fairdatapoint.service.security.CurrentUserProvider;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -51,9 +52,9 @@ public class SearchSavedQueryController {
private static final String NOT_FOUND_MSG = "Saved query '%s' doesn't exist";
- private final CurrentUserProvider currentUserProvider;
+ private final SearchSavedQueryMapper savedQueryMapper;
- private final SearchSavedQueryService searchSavedQueryService;
+ private final SearchSavedQueryService savedQueryService;
private final SearchService searchService;
@@ -61,23 +62,25 @@ public class SearchSavedQueryController {
* Constructor (autowired)
*/
public SearchSavedQueryController(
- CurrentUserProvider userProvider, SearchSavedQueryService savedQueryService, SearchService searchService
+ SearchSavedQueryMapper savedQueryMapper,
+ SearchSavedQueryService savedQueryService,
+ SearchService searchService
) {
- this.currentUserProvider = userProvider;
- this.searchSavedQueryService = savedQueryService;
+ this.savedQueryMapper = savedQueryMapper;
+ this.savedQueryService = savedQueryService;
this.searchService = searchService;
}
@GetMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity> getAll() {
- return new ResponseEntity<>(searchSavedQueryService.getAll(), HttpStatus.OK);
+ return new ResponseEntity<>(savedQueryService.getAll(), HttpStatus.OK);
}
@GetMapping(path = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity getSingle(
@PathVariable final String uuid
) throws ResourceNotFoundException {
- final Optional oDto = searchSavedQueryService.getSingle(uuid);
+ final Optional oDto = savedQueryService.getSingle(uuid);
if (oDto.isPresent()) {
return new ResponseEntity<>(oDto.get(), HttpStatus.OK);
}
@@ -90,7 +93,7 @@ public ResponseEntity getSingle(
public ResponseEntity> search(
@PathVariable final String uuid
) throws ResourceNotFoundException, MetadataRepositoryException {
- final Optional oDto = searchSavedQueryService.getSingle(uuid);
+ final Optional oDto = savedQueryService.getSingle(uuid);
if (oDto.isPresent()) {
return ResponseEntity.ok(searchService.search(oDto.get().getVariables()));
}
@@ -104,9 +107,8 @@ public ResponseEntity> search(
public ResponseEntity create(
@RequestBody @Valid SparqlQueryVariablesChangeDTO body
) {
- final UserDTO userDto = userService.getCurrentUser().orElse(null);
- final SearchSavedQueryDTO dto = searchSavedQueryService.create(body);
- return new ResponseEntity<>(dto, HttpStatus.CREATED);
+ final SearchSavedQuery savedQuery = savedQueryService.create(savedQueryMapper.fromChangeDTO(body));
+ return new ResponseEntity<>(savedQueryMapper.toDTO(savedQuery), HttpStatus.CREATED);
}
@PreAuthorize("isAuthenticated()")
@@ -125,7 +127,7 @@ public ResponseEntity update(
@PathVariable final String uuid,
@RequestBody @Valid SparqlQueryVariablesChangeDTO reqDto
) {
- final Optional oDto = searchSavedQueryService.update(uuid, reqDto);
+ final Optional oDto = savedQueryService.update(uuid, reqDto);
if (oDto.isPresent()) {
return new ResponseEntity<>(oDto.get(), HttpStatus.OK);
}
@@ -140,7 +142,7 @@ public ResponseEntity update(
public ResponseEntity delete(
@PathVariable final String uuid
) throws ResourceNotFoundException {
- final boolean result = searchSavedQueryService.delete(uuid);
+ final boolean result = savedQueryService.delete(uuid);
if (result) {
return ResponseEntity.noContent().build();
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index d396fc8a2..e1b58f9fc 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -56,16 +56,13 @@ public SearchSavedQueryDTO toDTO(SearchSavedQuery query) {
.build();
}
- public SearchSavedQuery fromChangeDTO(
- SparqlQueryVariablesChangeDTO reqDto, String userUuid
- ) {
+ public SearchSavedQuery fromChangeDTO(SparqlQueryVariablesChangeDTO reqDto) {
return SearchSavedQuery.builder()
.uuid(UUID.randomUUID().toString())
.name(reqDto.getName())
.description(reqDto.getDescription())
.type(reqDto.getType())
.variables(reqDto.getVariables())
- .userUuid(userUuid)
.createdAt(Instant.now())
.updatedAt(Instant.now())
.build();
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
index e37cfb4e8..2ca33fc19 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
@@ -82,12 +82,9 @@ public boolean delete(String uuid) {
return true;
}
- public SearchSavedQueryDTO create(SparqlQueryVariablesChangeDTO reqDto) {
- final String currentUserUuid = currentUserProvider.getCurrentUserUuid().orElse(null);
- final SearchSavedQuery searchSavedQuery = repository.save(
- mapper.fromChangeDTO(reqDto, currentUserUuid)
- );
- return mapper.toDTO(searchSavedQuery);
+ public SearchSavedQuery create(SearchSavedQuery searchSavedQuery) {
+ searchSavedQuery.setUuid(currentUserProvider.getCurrentUserUuid().orElse(null));
+ return repository.save(searchSavedQuery);
}
public Optional update(String uuid, SparqlQueryVariablesChangeDTO reqDto) {
From 4029fea3acb0665feaef1192a1c826274cea8675 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Fri, 27 Mar 2026 17:30:56 +0100
Subject: [PATCH 28/45] set entity uuid and timestamps in
SearchSavedQueryService.create() method instead of SearchSavedQueryMapper
again an intentional break in consistency with the existing code base,
because I think this makes more sense
---
.../search/query/SearchSavedQueryMapper.java | 13 +++++--------
.../search/query/SearchSavedQueryService.java | 8 +++++++-
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index e1b58f9fc..1bc035e9f 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -56,15 +56,12 @@ public SearchSavedQueryDTO toDTO(SearchSavedQuery query) {
.build();
}
- public SearchSavedQuery fromChangeDTO(SparqlQueryVariablesChangeDTO reqDto) {
+ public SearchSavedQuery fromChangeDTO(SparqlQueryVariablesChangeDTO variablesChangeDTO) {
return SearchSavedQuery.builder()
- .uuid(UUID.randomUUID().toString())
- .name(reqDto.getName())
- .description(reqDto.getDescription())
- .type(reqDto.getType())
- .variables(reqDto.getVariables())
- .createdAt(Instant.now())
- .updatedAt(Instant.now())
+ .name(variablesChangeDTO.getName())
+ .description(variablesChangeDTO.getDescription())
+ .type(variablesChangeDTO.getType())
+ .variables(variablesChangeDTO.getVariables())
.build();
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
index 2ca33fc19..8ba006ccc 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
@@ -33,9 +33,11 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.time.Instant;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
+import java.util.UUID;
@Service
public class SearchSavedQueryService {
@@ -83,7 +85,11 @@ public boolean delete(String uuid) {
}
public SearchSavedQuery create(SearchSavedQuery searchSavedQuery) {
- searchSavedQuery.setUuid(currentUserProvider.getCurrentUserUuid().orElse(null));
+ final Instant now = Instant.now();
+ searchSavedQuery.setUuid(UUID.randomUUID().toString());
+ searchSavedQuery.setUserUuid(currentUserProvider.getCurrentUserUuid().orElse(null));
+ searchSavedQuery.setCreatedAt(now);
+ searchSavedQuery.setUpdatedAt(now);
return repository.save(searchSavedQuery);
}
From 9e1100508bb2dfe6daf58be33aba5df7c312378b Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Fri, 27 Mar 2026 18:14:19 +0100
Subject: [PATCH 29/45] implement separate /search/sparql/saved endpoint
and adapt existing mapper and controlled methods accordingly
---
.../search/SearchSavedQueryController.java | 32 +++++++++----------
.../search/query/SearchSavedQueryMapper.java | 15 +++++++--
.../search/query/SearchSavedQueryService.java | 2 +-
3 files changed, 29 insertions(+), 20 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index 5f6b215ec..cb8219de1 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -25,6 +25,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchResultDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryFullChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
@@ -47,7 +48,7 @@
@Tag(name = "Search")
@RestController
-@RequestMapping("/search/query/saved")
+@RequestMapping("/search")
public class SearchSavedQueryController {
private static final String NOT_FOUND_MSG = "Saved query '%s' doesn't exist";
@@ -71,12 +72,12 @@ public SearchSavedQueryController(
this.searchService = searchService;
}
- @GetMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
+ @GetMapping(path = "/query/saved", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity> getAll() {
return new ResponseEntity<>(savedQueryService.getAll(), HttpStatus.OK);
}
- @GetMapping(path = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ @GetMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity getSingle(
@PathVariable final String uuid
) throws ResourceNotFoundException {
@@ -89,7 +90,7 @@ public ResponseEntity getSingle(
}
}
- @PostMapping(path = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ @PostMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity> search(
@PathVariable final String uuid
) throws ResourceNotFoundException, MetadataRepositoryException {
@@ -103,27 +104,26 @@ public ResponseEntity> search(
}
@PreAuthorize("isAuthenticated()")
- @PostMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity create(
+ @PostMapping(path = "/query/saved", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity createTemplateSparqlQuery(
@RequestBody @Valid SparqlQueryVariablesChangeDTO body
) {
- final SearchSavedQuery savedQuery = savedQueryService.create(savedQueryMapper.fromChangeDTO(body));
+ final SearchSavedQuery savedQuery = savedQueryService.create(savedQueryMapper.fromVariablesChangeDTO(body));
return new ResponseEntity<>(savedQueryMapper.toDTO(savedQuery), HttpStatus.CREATED);
}
@PreAuthorize("isAuthenticated()")
- @PostMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity create(
+ @PostMapping(path = "/sparql/saved", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity createFullSparqlQuery(
@RequestBody @Valid SparqlQueryFullChangeDTO body
) {
- final UserDTO userDto = userService.getCurrentUser().orElse(null);
- final SearchSavedQueryDTO dto = searchSavedQueryService.create(body);
- return new ResponseEntity<>(dto, HttpStatus.CREATED);
+ final SearchSavedQuery savedQuery = savedQueryService.create(savedQueryMapper.fromFullChangeDTO(body));
+ return new ResponseEntity<>(savedQueryMapper.toDTO(savedQuery), HttpStatus.CREATED);
}
@PreAuthorize("isAuthenticated()")
- @PutMapping(path = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity update(
+ @PutMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity updateTemplateSparqlQuery(
@PathVariable final String uuid,
@RequestBody @Valid SparqlQueryVariablesChangeDTO reqDto
) {
@@ -137,9 +137,9 @@ public ResponseEntity update(
}
@PreAuthorize("isAuthenticated()")
- @DeleteMapping(path = "/{uuid}")
+ @DeleteMapping(path = "/query/saved/{uuid}")
@ResponseStatus(HttpStatus.NO_CONTENT)
- public ResponseEntity delete(
+ public ResponseEntity deleteTemplateSparqlQuery(
@PathVariable final String uuid
) throws ResourceNotFoundException {
final boolean result = savedQueryService.delete(uuid);
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index 1bc035e9f..3c8d5d7d8 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -22,6 +22,7 @@
*/
package org.fairdatateam.fairdatapoint.service.search.query;
+import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryFullChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
@@ -30,7 +31,6 @@
import org.springframework.stereotype.Component;
import java.time.Instant;
-import java.util.UUID;
@Component
public class SearchSavedQueryMapper {
@@ -56,7 +56,16 @@ public SearchSavedQueryDTO toDTO(SearchSavedQuery query) {
.build();
}
- public SearchSavedQuery fromChangeDTO(SparqlQueryVariablesChangeDTO variablesChangeDTO) {
+ public SearchSavedQuery fromFullChangeDTO(SparqlQueryFullChangeDTO fullChangeDTO) {
+ return SearchSavedQuery.builder()
+ .name(fullChangeDTO.getName())
+ .description(fullChangeDTO.getDescription())
+ .type(fullChangeDTO.getType())
+ .sparqlQueryFull(fullChangeDTO.getSparqlQueryFull())
+ .build();
+ }
+
+ public SearchSavedQuery fromVariablesChangeDTO(SparqlQueryVariablesChangeDTO variablesChangeDTO) {
return SearchSavedQuery.builder()
.name(variablesChangeDTO.getName())
.description(variablesChangeDTO.getDescription())
@@ -65,7 +74,7 @@ public SearchSavedQuery fromChangeDTO(SparqlQueryVariablesChangeDTO variablesCha
.build();
}
- public SearchSavedQuery fromChangeDTO(
+ public SearchSavedQuery fromVariablesChangeDTO(
SearchSavedQuery query, SparqlQueryVariablesChangeDTO reqDto
) {
return query.toBuilder()
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
index 8ba006ccc..58505de64 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
@@ -104,7 +104,7 @@ public Optional update(String uuid, SparqlQueryVariablesCha
throw new ForbiddenException(MSG_CANNOT_UPDATE);
}
final SearchSavedQuery updatedQuery = repository.save(
- mapper.fromChangeDTO(searchSavedQuery, reqDto)
+ mapper.fromVariablesChangeDTO(searchSavedQuery, reqDto)
);
return Optional.of(mapper.toDTO(updatedQuery));
}
From f64746a16dd1527fdd506c156aacd7aa4e831e4d Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Fri, 27 Mar 2026 18:23:12 +0100
Subject: [PATCH 30/45] rename entity and dto fields from sparqlQueryFull to
sparqlQuery
---
.../fairdatapoint/api/dto/search/SearchSavedQueryDTO.java | 2 +-
.../fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java | 2 +-
.../fairdatapoint/entity/search/SearchSavedQuery.java | 2 +-
.../service/search/query/SearchSavedQueryMapper.java | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
index 73cbeed21..9c2dc1180 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
@@ -68,6 +68,6 @@ public class SearchSavedQueryDTO {
private SparqlQueryVariables variables;
@Valid
- private SparqlQueryFull sparqlQueryFull;
+ private SparqlQueryFull sparqlQuery;
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
index 6c6639b80..4e1b2d19c 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
@@ -47,5 +47,5 @@ public class SparqlQueryFullChangeDTO {
@Valid
@NotNull
- private SparqlQueryFull sparqlQueryFull;
+ private SparqlQueryFull sparqlQuery;
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
index 5c952a1ae..48abc93c1 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
@@ -56,7 +56,7 @@ public class SearchSavedQuery {
private SparqlQueryVariables variables;
- private SparqlQueryFull sparqlQueryFull;
+ private SparqlQueryFull sparqlQuery;
public enum Type {
PUBLIC,
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index 3c8d5d7d8..a6fd7b83f 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -61,7 +61,7 @@ public SearchSavedQuery fromFullChangeDTO(SparqlQueryFullChangeDTO fullChangeDTO
.name(fullChangeDTO.getName())
.description(fullChangeDTO.getDescription())
.type(fullChangeDTO.getType())
- .sparqlQueryFull(fullChangeDTO.getSparqlQueryFull())
+ .sparqlQuery(fullChangeDTO.getSparqlQuery())
.build();
}
From 7f684a60ad1b634a2e3fd078724d3ebb3088867b Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 13:37:37 +0200
Subject: [PATCH 31/45] rename sparqlQuery property to queryFull
to prevent ambiguity w.r.t. SettingsAutocompleteSource etc.
---
.../fairdatapoint/api/dto/search/SearchSavedQueryDTO.java | 2 +-
.../fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java | 2 +-
.../fairdatapoint/entity/search/SearchSavedQuery.java | 2 +-
.../service/search/query/SearchSavedQueryMapper.java | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
index 9c2dc1180..9157a6b39 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryDTO.java
@@ -68,6 +68,6 @@ public class SearchSavedQueryDTO {
private SparqlQueryVariables variables;
@Valid
- private SparqlQueryFull sparqlQuery;
+ private SparqlQueryFull queryFull;
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
index 4e1b2d19c..b3cb04d2f 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
@@ -47,5 +47,5 @@ public class SparqlQueryFullChangeDTO {
@Valid
@NotNull
- private SparqlQueryFull sparqlQuery;
+ private SparqlQueryFull queryFull;
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
index 48abc93c1..fb8a7f245 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
@@ -56,7 +56,7 @@ public class SearchSavedQuery {
private SparqlQueryVariables variables;
- private SparqlQueryFull sparqlQuery;
+ private SparqlQueryFull queryFull;
public enum Type {
PUBLIC,
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index a6fd7b83f..9da6aa50e 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -61,7 +61,7 @@ public SearchSavedQuery fromFullChangeDTO(SparqlQueryFullChangeDTO fullChangeDTO
.name(fullChangeDTO.getName())
.description(fullChangeDTO.getDescription())
.type(fullChangeDTO.getType())
- .sparqlQuery(fullChangeDTO.getSparqlQuery())
+ .queryFull(fullChangeDTO.getQueryFull())
.build();
}
From 089c0de73dd7e9084c9944b6480f68ac7d0c0cab Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 13:42:25 +0200
Subject: [PATCH 32/45] remove SparqlQueryFullChangeDTO
and move the SparqlQueryFull object into SparqlQueryVariablesChangeDTO
---
.../search/SearchSavedQueryController.java | 10 ----
.../dto/search/SparqlQueryFullChangeDTO.java | 51 -------------------
.../search/SparqlQueryVariablesChangeDTO.java | 6 ++-
.../search/query/SearchSavedQueryMapper.java | 10 ----
4 files changed, 5 insertions(+), 72 deletions(-)
delete mode 100644 src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index cb8219de1..65cb0fd7b 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -25,7 +25,6 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchResultDTO;
-import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryFullChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
@@ -112,15 +111,6 @@ public ResponseEntity createTemplateSparqlQuery(
return new ResponseEntity<>(savedQueryMapper.toDTO(savedQuery), HttpStatus.CREATED);
}
- @PreAuthorize("isAuthenticated()")
- @PostMapping(path = "/sparql/saved", produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity createFullSparqlQuery(
- @RequestBody @Valid SparqlQueryFullChangeDTO body
- ) {
- final SearchSavedQuery savedQuery = savedQueryService.create(savedQueryMapper.fromFullChangeDTO(body));
- return new ResponseEntity<>(savedQueryMapper.toDTO(savedQuery), HttpStatus.CREATED);
- }
-
@PreAuthorize("isAuthenticated()")
@PutMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity updateTemplateSparqlQuery(
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
deleted file mode 100644
index b3cb04d2f..000000000
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryFullChangeDTO.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * The MIT License
- * Copyright © 2017 FAIR Data Team
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package org.fairdatateam.fairdatapoint.api.dto.search;
-
-import jakarta.validation.Valid;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.*;
-import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
-import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryFull;
-
-@NoArgsConstructor
-@AllArgsConstructor
-@Getter
-@Setter
-@Builder
-public class SparqlQueryFullChangeDTO {
-
- @NotBlank
- private String name;
-
- @NotNull
- private String description;
-
- @NotNull
- private SearchSavedQuery.Type type;
-
- @Valid
- @NotNull
- private SparqlQueryFull queryFull;
-}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
index 58c8fb86b..3cf3f14b3 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
@@ -27,6 +27,7 @@
import jakarta.validation.constraints.NotNull;
import lombok.*;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryFull;
import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
@NoArgsConstructor
@@ -46,6 +47,9 @@ public class SparqlQueryVariablesChangeDTO {
private SearchSavedQuery.Type type;
@Valid
- @NotNull
private SparqlQueryVariables variables;
+
+ @Valid
+ private SparqlQueryFull queryFull;
+
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index 9da6aa50e..b90c0f524 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -22,7 +22,6 @@
*/
package org.fairdatateam.fairdatapoint.service.search.query;
-import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryFullChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
@@ -56,15 +55,6 @@ public SearchSavedQueryDTO toDTO(SearchSavedQuery query) {
.build();
}
- public SearchSavedQuery fromFullChangeDTO(SparqlQueryFullChangeDTO fullChangeDTO) {
- return SearchSavedQuery.builder()
- .name(fullChangeDTO.getName())
- .description(fullChangeDTO.getDescription())
- .type(fullChangeDTO.getType())
- .queryFull(fullChangeDTO.getQueryFull())
- .build();
- }
-
public SearchSavedQuery fromVariablesChangeDTO(SparqlQueryVariablesChangeDTO variablesChangeDTO) {
return SearchSavedQuery.builder()
.name(variablesChangeDTO.getName())
From efa9a06a293e82b96e0b2485448cd3f98bb2fd1b Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 14:52:17 +0200
Subject: [PATCH 33/45] revert name change for SearchSavedQueryChangeDTO
---
.../search/SearchSavedQueryController.java | 8 ++++----
...DTO.java => SearchSavedQueryChangeDTO.java} | 2 +-
.../search/query/SearchSavedQueryMapper.java | 16 ++++++++--------
.../search/query/SearchSavedQueryService.java | 6 +++---
.../search/query/saved/Detail_PUT.java | 18 +++++++++---------
.../search/query/saved/List_POST.java | 10 +++++-----
6 files changed, 30 insertions(+), 30 deletions(-)
rename src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/{SparqlQueryVariablesChangeDTO.java => SearchSavedQueryChangeDTO.java} (97%)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index 65cb0fd7b..d5940dc33 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -25,7 +25,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchResultDTO;
-import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.database.rdf.repository.MetadataRepositoryException;
@@ -105,9 +105,9 @@ public ResponseEntity> search(
@PreAuthorize("isAuthenticated()")
@PostMapping(path = "/query/saved", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity createTemplateSparqlQuery(
- @RequestBody @Valid SparqlQueryVariablesChangeDTO body
+ @RequestBody @Valid SearchSavedQueryChangeDTO body
) {
- final SearchSavedQuery savedQuery = savedQueryService.create(savedQueryMapper.fromVariablesChangeDTO(body));
+ final SearchSavedQuery savedQuery = savedQueryService.create(savedQueryMapper.fromChangeDTO(body));
return new ResponseEntity<>(savedQueryMapper.toDTO(savedQuery), HttpStatus.CREATED);
}
@@ -115,7 +115,7 @@ public ResponseEntity createTemplateSparqlQuery(
@PutMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity updateTemplateSparqlQuery(
@PathVariable final String uuid,
- @RequestBody @Valid SparqlQueryVariablesChangeDTO reqDto
+ @RequestBody @Valid SearchSavedQueryChangeDTO reqDto
) {
final Optional oDto = savedQueryService.update(uuid, reqDto);
if (oDto.isPresent()) {
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java
similarity index 97%
rename from src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
rename to src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java
index 3cf3f14b3..8f6b2b295 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SparqlQueryVariablesChangeDTO.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java
@@ -35,7 +35,7 @@
@Getter
@Setter
@Builder
-public class SparqlQueryVariablesChangeDTO {
+public class SearchSavedQueryChangeDTO {
@NotBlank
private String name;
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index b90c0f524..db10242a4 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -22,7 +22,7 @@
*/
package org.fairdatateam.fairdatapoint.service.search.query;
-import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
@@ -55,17 +55,17 @@ public SearchSavedQueryDTO toDTO(SearchSavedQuery query) {
.build();
}
- public SearchSavedQuery fromVariablesChangeDTO(SparqlQueryVariablesChangeDTO variablesChangeDTO) {
+ public SearchSavedQuery fromChangeDTO(SearchSavedQueryChangeDTO changeDTO) {
return SearchSavedQuery.builder()
- .name(variablesChangeDTO.getName())
- .description(variablesChangeDTO.getDescription())
- .type(variablesChangeDTO.getType())
- .variables(variablesChangeDTO.getVariables())
+ .name(changeDTO.getName())
+ .description(changeDTO.getDescription())
+ .type(changeDTO.getType())
+ .variables(changeDTO.getVariables())
.build();
}
- public SearchSavedQuery fromVariablesChangeDTO(
- SearchSavedQuery query, SparqlQueryVariablesChangeDTO reqDto
+ public SearchSavedQuery fromChangeDTO(
+ SearchSavedQuery query, SearchSavedQueryChangeDTO reqDto
) {
return query.toBuilder()
.name(reqDto.getName())
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
index 58505de64..8c5c4cc85 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryService.java
@@ -22,7 +22,7 @@
*/
package org.fairdatateam.fairdatapoint.service.search.query;
-import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.exception.ForbiddenException;
@@ -93,7 +93,7 @@ public SearchSavedQuery create(SearchSavedQuery searchSavedQuery) {
return repository.save(searchSavedQuery);
}
- public Optional update(String uuid, SparqlQueryVariablesChangeDTO reqDto) {
+ public Optional update(String uuid, SearchSavedQueryChangeDTO reqDto) {
final Optional optionalSearchQuery = repository.findByUuid(uuid);
if (optionalSearchQuery.isEmpty()) {
return Optional.empty();
@@ -104,7 +104,7 @@ public Optional update(String uuid, SparqlQueryVariablesCha
throw new ForbiddenException(MSG_CANNOT_UPDATE);
}
final SearchSavedQuery updatedQuery = repository.save(
- mapper.fromVariablesChangeDTO(searchSavedQuery, reqDto)
+ mapper.fromChangeDTO(searchSavedQuery, reqDto)
);
return Optional.of(mapper.toDTO(updatedQuery));
}
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
index 57d7ae5c1..3762ab12e 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/Detail_PUT.java
@@ -23,7 +23,7 @@
package org.fairdatateam.fairdatapoint.acceptance.search.query.saved;
import org.fairdatateam.fairdatapoint.WebIntegrationTest;
-import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.mongo.migration.development.search.SearchSavedQueryFixtures;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
@@ -66,10 +66,10 @@ public void res403_anonymousUser() {
SearchSavedQuery query = searchSavedQueryRepository.save(searchSavedQueryFixtures.savedQueryPublic01());
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.put(url(query.getUuid()))
.body(
- SparqlQueryVariablesChangeDTO.builder()
+ SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
@@ -94,11 +94,11 @@ public void res403_nonOwnerUser() {
SearchSavedQuery query = searchSavedQueryRepository.save(searchSavedQueryFixtures.savedQueryPublic01());
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.put(url(query.getUuid()))
.header(HttpHeaders.AUTHORIZATION, NIKOLA_TOKEN)
.body(
- SparqlQueryVariablesChangeDTO.builder()
+ SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
@@ -123,11 +123,11 @@ public void res200_owner() {
SearchSavedQuery query = searchSavedQueryRepository.save(searchSavedQueryFixtures.savedQueryPublic01());
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.put(url(query.getUuid()))
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
.body(
- SparqlQueryVariablesChangeDTO.builder()
+ SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.INTERNAL)
@@ -158,11 +158,11 @@ public void res200_admin() {
SearchSavedQuery query = searchSavedQueryRepository.save(searchSavedQueryFixtures.savedQueryPublic01());
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.put(url(query.getUuid()))
.header(HttpHeaders.AUTHORIZATION, ADMIN_TOKEN)
.body(
- SparqlQueryVariablesChangeDTO.builder()
+ SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
.type(SearchSavedQuery.Type.INTERNAL)
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
index 0e8e291e0..41ffa7540 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
@@ -23,7 +23,7 @@
package org.fairdatateam.fairdatapoint.acceptance.search.query.saved;
import org.fairdatateam.fairdatapoint.WebIntegrationTest;
-import org.fairdatateam.fairdatapoint.api.dto.search.SparqlQueryVariablesChangeDTO;
+import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
@@ -61,10 +61,10 @@ public void res403_anonymousUser() {
searchSavedQueryRepository.deleteAll();
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.post(url())
.body(
- SparqlQueryVariablesChangeDTO.builder()
+ SearchSavedQueryChangeDTO.builder()
.name("New query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
@@ -89,11 +89,11 @@ public void res201() {
searchSavedQueryRepository.deleteAll();
// AND: prepare request
- RequestEntity request = RequestEntity
+ RequestEntity request = RequestEntity
.post(url())
.header(HttpHeaders.AUTHORIZATION, NIKOLA_TOKEN)
.body(
- SparqlQueryVariablesChangeDTO.builder()
+ SearchSavedQueryChangeDTO.builder()
.name("New query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
From 3855dc2d3e07cec51cc685de563b986ca7602f3b Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 15:03:38 +0200
Subject: [PATCH 34/45] note about inconsistent property name 'variables'
---
.../fairdatapoint/entity/search/SearchSavedQuery.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
index fb8a7f245..3f8eca5fd 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQuery.java
@@ -54,6 +54,7 @@ public class SearchSavedQuery {
private Instant updatedAt;
+ // could rename to queryVariables for consistency, but that would be incompatible with existing queries in database
private SparqlQueryVariables variables;
private SparqlQueryFull queryFull;
From 11a31c07951ec1b504d4511b17e7d2bc1bf29db2 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 15:08:49 +0200
Subject: [PATCH 35/45] revert renaming SearchSavedQueryController methods
---
.../api/controller/search/SearchSavedQueryController.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index d5940dc33..172a20bff 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -104,7 +104,7 @@ public ResponseEntity> search(
@PreAuthorize("isAuthenticated()")
@PostMapping(path = "/query/saved", produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity createTemplateSparqlQuery(
+ public ResponseEntity create(
@RequestBody @Valid SearchSavedQueryChangeDTO body
) {
final SearchSavedQuery savedQuery = savedQueryService.create(savedQueryMapper.fromChangeDTO(body));
@@ -113,7 +113,7 @@ public ResponseEntity createTemplateSparqlQuery(
@PreAuthorize("isAuthenticated()")
@PutMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity updateTemplateSparqlQuery(
+ public ResponseEntity update(
@PathVariable final String uuid,
@RequestBody @Valid SearchSavedQueryChangeDTO reqDto
) {
@@ -129,7 +129,7 @@ public ResponseEntity updateTemplateSparqlQuery(
@PreAuthorize("isAuthenticated()")
@DeleteMapping(path = "/query/saved/{uuid}")
@ResponseStatus(HttpStatus.NO_CONTENT)
- public ResponseEntity deleteTemplateSparqlQuery(
+ public ResponseEntity delete(
@PathVariable final String uuid
) throws ResourceNotFoundException {
final boolean result = savedQueryService.delete(uuid);
From 2182cf68f82e33f3d24589de51731ebf84ccc575 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 15:14:52 +0200
Subject: [PATCH 36/45] set SearchSavedQuery.queryFull in
SearchSavedQueryMapper
---
.../service/search/query/SearchSavedQueryMapper.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index db10242a4..bdccbb7ed 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -61,6 +61,7 @@ public SearchSavedQuery fromChangeDTO(SearchSavedQueryChangeDTO changeDTO) {
.description(changeDTO.getDescription())
.type(changeDTO.getType())
.variables(changeDTO.getVariables())
+ .queryFull(changeDTO.getQueryFull())
.build();
}
@@ -71,6 +72,7 @@ public SearchSavedQuery fromChangeDTO(
.name(reqDto.getName())
.description(reqDto.getDescription())
.variables(reqDto.getVariables())
+ .queryFull(reqDto.getQueryFull())
.userUuid(query.getUserUuid())
.type(reqDto.getType())
.updatedAt(Instant.now())
From ca5f0fe6308a8e98b980b0d1cbd282149811493b Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 16:05:52 +0200
Subject: [PATCH 37/45] add operation descriptions for search endpoints in
openapi/swagger documentation
---
.../api/controller/search/SearchSavedQueryController.java | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index 172a20bff..42a352212 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -22,6 +22,7 @@
*/
package org.fairdatateam.fairdatapoint.api.controller.search;
+import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchResultDTO;
@@ -72,11 +73,13 @@ public SearchSavedQueryController(
}
@GetMapping(path = "/query/saved", produces = MediaType.APPLICATION_JSON_VALUE)
+ @Operation(description = "List all existing saved queries")
public ResponseEntity> getAll() {
return new ResponseEntity<>(savedQueryService.getAll(), HttpStatus.OK);
}
@GetMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ @Operation(description = "Retrieve an existing saved query definition")
public ResponseEntity getSingle(
@PathVariable final String uuid
) throws ResourceNotFoundException {
@@ -90,6 +93,7 @@ public ResponseEntity getSingle(
}
@PostMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ @Operation(description = "Evaluate an existing saved query")
public ResponseEntity> search(
@PathVariable final String uuid
) throws ResourceNotFoundException, MetadataRepositoryException {
@@ -104,6 +108,7 @@ public ResponseEntity> search(
@PreAuthorize("isAuthenticated()")
@PostMapping(path = "/query/saved", produces = MediaType.APPLICATION_JSON_VALUE)
+ @Operation(description = "Save the query that is defined in the request body")
public ResponseEntity create(
@RequestBody @Valid SearchSavedQueryChangeDTO body
) {
@@ -113,6 +118,7 @@ public ResponseEntity create(
@PreAuthorize("isAuthenticated()")
@PutMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ @Operation(description = "Change an existing saved query")
public ResponseEntity update(
@PathVariable final String uuid,
@RequestBody @Valid SearchSavedQueryChangeDTO reqDto
@@ -129,6 +135,7 @@ public ResponseEntity update(
@PreAuthorize("isAuthenticated()")
@DeleteMapping(path = "/query/saved/{uuid}")
@ResponseStatus(HttpStatus.NO_CONTENT)
+ @Operation(description = "Delete an existing saved query")
public ResponseEntity delete(
@PathVariable final String uuid
) throws ResourceNotFoundException {
From 57595a3a25c67693203a26f2521dd3cee961d276 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 16:13:49 +0200
Subject: [PATCH 38/45] revert changes in request mapping for
/search/query/saved
---
.../search/SearchSavedQueryController.java | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index 42a352212..eaa476665 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -48,7 +48,7 @@
@Tag(name = "Search")
@RestController
-@RequestMapping("/search")
+@RequestMapping("/search/query/saved")
public class SearchSavedQueryController {
private static final String NOT_FOUND_MSG = "Saved query '%s' doesn't exist";
@@ -72,13 +72,13 @@ public SearchSavedQueryController(
this.searchService = searchService;
}
- @GetMapping(path = "/query/saved", produces = MediaType.APPLICATION_JSON_VALUE)
+ @GetMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(description = "List all existing saved queries")
public ResponseEntity> getAll() {
return new ResponseEntity<>(savedQueryService.getAll(), HttpStatus.OK);
}
- @GetMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ @GetMapping(path = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(description = "Retrieve an existing saved query definition")
public ResponseEntity getSingle(
@PathVariable final String uuid
@@ -92,7 +92,7 @@ public ResponseEntity getSingle(
}
}
- @PostMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ @PostMapping(path = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(description = "Evaluate an existing saved query")
public ResponseEntity> search(
@PathVariable final String uuid
@@ -107,7 +107,7 @@ public ResponseEntity> search(
}
@PreAuthorize("isAuthenticated()")
- @PostMapping(path = "/query/saved", produces = MediaType.APPLICATION_JSON_VALUE)
+ @PostMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(description = "Save the query that is defined in the request body")
public ResponseEntity create(
@RequestBody @Valid SearchSavedQueryChangeDTO body
@@ -117,7 +117,7 @@ public ResponseEntity create(
}
@PreAuthorize("isAuthenticated()")
- @PutMapping(path = "/query/saved/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ @PutMapping(path = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(description = "Change an existing saved query")
public ResponseEntity update(
@PathVariable final String uuid,
@@ -133,7 +133,7 @@ public ResponseEntity update(
}
@PreAuthorize("isAuthenticated()")
- @DeleteMapping(path = "/query/saved/{uuid}")
+ @DeleteMapping(path = "/{uuid}")
@ResponseStatus(HttpStatus.NO_CONTENT)
@Operation(description = "Delete an existing saved query")
public ResponseEntity delete(
From e2cc8ced5bc8c11b3c99def7218754c48465d059 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 17:18:26 +0200
Subject: [PATCH 39/45] set SearchSavedQueryDTO.queryFull in
SearchSavedQueryMapper
---
.../service/search/query/SearchSavedQueryMapper.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
index bdccbb7ed..78084f3b7 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/service/search/query/SearchSavedQueryMapper.java
@@ -48,6 +48,7 @@ public SearchSavedQueryDTO toDTO(SearchSavedQuery query) {
.name(query.getName())
.description(query.getDescription())
.variables(query.getVariables())
+ .queryFull(query.getQueryFull())
.user(userDTO)
.type(query.getType())
.createdAt(query.getCreatedAt())
From ea3dace2aa816210927c16b00a15058eb2ceb968 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 17:19:42 +0200
Subject: [PATCH 40/45] adapt test to check both SparqlQueryVariables and
SparqlQueryFull
---
.../search/query/saved/List_POST.java | 33 +++++++++++++++----
1 file changed, 27 insertions(+), 6 deletions(-)
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
index 41ffa7540..68ea711ff 100644
--- a/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
+++ b/src/test/java/org/fairdatateam/fairdatapoint/acceptance/search/query/saved/List_POST.java
@@ -27,10 +27,14 @@
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
import org.fairdatateam.fairdatapoint.database.mongo.repository.SearchSavedQueryRepository;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryFull;
import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpHeaders;
@@ -39,10 +43,12 @@
import org.springframework.http.ResponseEntity;
import java.net.URI;
+import java.util.stream.Stream;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.jupiter.api.Assertions.assertTrue;
@DisplayName("POST /search/query/saved")
public class List_POST extends WebIntegrationTest {
@@ -82,9 +88,9 @@ public void res403_anonymousUser() {
assertThat(searchSavedQueryRepository.count(), is(equalTo(0L)));
}
- @Test
- @DisplayName("HTTP 201")
- public void res201() {
+ @ParameterizedTest
+ @MethodSource("queryRecordProvider")
+ public void saveQuery(SparqlQueryVariables queryVariables, SparqlQueryFull queryFull) {
// GIVEN: prepare data
searchSavedQueryRepository.deleteAll();
@@ -97,7 +103,8 @@ public void res201() {
.name("New query")
.description("")
.type(SearchSavedQuery.Type.PUBLIC)
- .variables(new SparqlQueryVariables("", "", ""))
+ .variables(queryVariables)
+ .queryFull(queryFull)
.build()
);
ParameterizedTypeReference responseType = new ParameterizedTypeReference<>() {
@@ -108,8 +115,22 @@ public void res201() {
// THEN:
assertThat(result.getStatusCode(), is(equalTo(HttpStatus.CREATED)));
- assertThat(result.getBody().getUser().getUuid(), is(equalTo(KnownUUIDs.USER_NIKOLA_UUID)));
- assertThat(result.getBody().getType(), is(equalTo(SearchSavedQuery.Type.PUBLIC)));
+ SearchSavedQueryDTO savedQueryDTO = result.getBody();
+ assertThat(savedQueryDTO.getUser().getUuid(), is(equalTo(KnownUUIDs.USER_NIKOLA_UUID)));
+ assertThat(savedQueryDTO.getType(), is(equalTo(SearchSavedQuery.Type.PUBLIC)));
assertThat(searchSavedQueryRepository.count(), is(equalTo(1L)));
+ // either query variables or full query should be null
+ assertTrue((savedQueryDTO.getVariables() == null) != (savedQueryDTO.getQueryFull() == null));
}
+
+ /**
+ * Provides values for the queryVariables and queryFull arguments for the saveQuery parameterized test
+ */
+ static Stream queryRecordProvider() {
+ return Stream.of(
+ Arguments.of(new SparqlQueryVariables("", "", ""), null),
+ Arguments.of(null, new SparqlQueryFull("", new String[0], new String[0]))
+ );
+ }
+
}
From 6c01835625cb70173dc3f416bc2236329af61530 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 17:32:01 +0200
Subject: [PATCH 41/45] simplify SearchSavedQueryController.search Optional
handling
---
.../controller/search/SearchSavedQueryController.java | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index eaa476665..b038413ce 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -97,13 +97,9 @@ public ResponseEntity getSingle(
public ResponseEntity> search(
@PathVariable final String uuid
) throws ResourceNotFoundException, MetadataRepositoryException {
- final Optional oDto = savedQueryService.getSingle(uuid);
- if (oDto.isPresent()) {
- return ResponseEntity.ok(searchService.search(oDto.get().getVariables()));
- }
- else {
- throw new ResourceNotFoundException(format(NOT_FOUND_MSG, uuid));
- }
+ final SearchSavedQueryDTO savedQueryDTO = savedQueryService.getSingle(uuid).orElseThrow(
+ () -> new ResourceNotFoundException(format(NOT_FOUND_MSG, uuid)));
+ return ResponseEntity.ok(searchService.search(savedQueryDTO.getVariables()));
}
@PreAuthorize("isAuthenticated()")
From 27b147c3f8532115b749f3c5c9c43b4c379cd674 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 7 Apr 2026 17:52:38 +0200
Subject: [PATCH 42/45] add operation descriptions for search endpoints in
openapi/swagger docs
---
.../api/controller/search/SearchController.java | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java
index 1178150c2..88e947b18 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java
@@ -22,6 +22,7 @@
*/
package org.fairdatateam.fairdatapoint.api.controller.search;
+import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.fairdatateam.fairdatapoint.api.dto.search.*;
@@ -50,9 +51,11 @@ public class SearchController {
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE
)
+ @Operation(description = "Search by string literal")
public ResponseEntity> search(
@RequestBody @Valid SearchQueryDTO reqDto
) throws MetadataRepositoryException {
+ // this uses AbstractMetadataRepository.findByLiteral
return ResponseEntity.ok(searchService.search(reqDto));
}
@@ -60,6 +63,7 @@ public ResponseEntity> search(
path = "/query",
produces = MediaType.APPLICATION_JSON_VALUE
)
+ @Operation(description = "Retrieve the template used for restricted queries")
public ResponseEntity getSearchQueryTemplate() {
return ResponseEntity.ok(searchService.getSearchQueryTemplate());
}
@@ -69,6 +73,7 @@ public ResponseEntity getSearchQueryTemplate() {
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE
)
+ @Operation(description = "Evaluate restricted query defined in the request body")
public ResponseEntity> searchWithQuery(
@RequestBody @Valid SparqlQueryVariables body
) throws MetadataRepositoryException, MalformedQueryException {
@@ -79,6 +84,7 @@ public ResponseEntity> searchWithQuery(
path = "/filters",
produces = MediaType.APPLICATION_JSON_VALUE
)
+ @Operation(description = "Retrieve list of all search filters")
public ResponseEntity> getSearchFilters() {
return ResponseEntity.ok(searchService.getSearchFilters());
}
@@ -88,6 +94,7 @@ public ResponseEntity> getSearchFilters() {
produces = MediaType.APPLICATION_JSON_VALUE
)
@PreAuthorize("hasRole('ADMIN')")
+ @Operation(description = "Reset search filter cache")
public ResponseEntity> resetSearchFiltersCache() {
return ResponseEntity.ok(searchService.resetSearchFilters());
}
From b1664d00664549c61ecc410f856624f67db83820 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Tue, 14 Apr 2026 18:00:30 +0200
Subject: [PATCH 43/45] remove unused import
---
.../api/controller/search/SearchSavedQueryController.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
index b038413ce..28ced0fda 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSavedQueryController.java
@@ -28,7 +28,6 @@
import org.fairdatateam.fairdatapoint.api.dto.search.SearchResultDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryChangeDTO;
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
-import org.fairdatateam.fairdatapoint.api.dto.user.UserDTO;
import org.fairdatateam.fairdatapoint.database.rdf.repository.MetadataRepositoryException;
import org.fairdatateam.fairdatapoint.entity.exception.ResourceNotFoundException;
import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
From f079e49c8b4b7d570071fdc7421344d582b4cc79 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Fri, 17 Apr 2026 10:41:50 +0200
Subject: [PATCH 44/45] remove old comment
---
.../fairdatapoint/api/controller/search/SearchController.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java
index 88e947b18..0019c6371 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java
@@ -55,7 +55,6 @@ public class SearchController {
public ResponseEntity> search(
@RequestBody @Valid SearchQueryDTO reqDto
) throws MetadataRepositoryException {
- // this uses AbstractMetadataRepository.findByLiteral
return ResponseEntity.ok(searchService.search(reqDto));
}
From d4d16730268017253ff5a2c497d0d8802d39dcb4 Mon Sep 17 00:00:00 2001
From: dennisvang <29799340+dennisvang@users.noreply.github.com>
Date: Fri, 17 Apr 2026 14:54:33 +0200
Subject: [PATCH 45/45] add SearchSavedQueryServiceTests.java with test for
create method
---
.../search/SearchSavedQueryServiceTests.java | 55 +++++++++++++++++++
1 file changed, 55 insertions(+)
create mode 100644 src/test/java/org/fairdatateam/fairdatapoint/service/search/SearchSavedQueryServiceTests.java
diff --git a/src/test/java/org/fairdatateam/fairdatapoint/service/search/SearchSavedQueryServiceTests.java b/src/test/java/org/fairdatateam/fairdatapoint/service/search/SearchSavedQueryServiceTests.java
new file mode 100644
index 000000000..26d8a052c
--- /dev/null
+++ b/src/test/java/org/fairdatateam/fairdatapoint/service/search/SearchSavedQueryServiceTests.java
@@ -0,0 +1,55 @@
+/**
+ * The MIT License
+ * Copyright © 2017 FAIR Data Team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.fairdatateam.fairdatapoint.service.search;
+
+import org.fairdatateam.fairdatapoint.BaseIntegrationTest;
+import org.fairdatateam.fairdatapoint.entity.search.SearchSavedQuery;
+import org.fairdatateam.fairdatapoint.service.search.query.SearchSavedQueryService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class SearchSavedQueryServiceTests extends BaseIntegrationTest {
+
+ private final SearchSavedQueryService savedQueryService;
+
+ /**
+ * Constructor
+ */
+ // constructor injection in junit tests requires explicit @Autowired annotation
+ @Autowired
+ public SearchSavedQueryServiceTests(SearchSavedQueryService savedQueryService) {
+ this.savedQueryService = savedQueryService;
+ }
+
+ @Test
+ public void testCreateAutogeneratedValues() {
+ final SearchSavedQuery savedQuery = new SearchSavedQuery();
+ SearchSavedQuery newSavedQuery = savedQueryService.create(savedQuery);
+ assertNotNull(newSavedQuery.getUuid());
+ assertNotNull(newSavedQuery.getUserUuid());
+ assertNotNull(newSavedQuery.getCreatedAt());
+ assertNotNull(newSavedQuery.getUpdatedAt());
+ }
+}