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/docs/diagrams/sequence-save-query.mermaid b/docs/diagrams/sequence-save-query.mermaid
new file mode 100644
index 000000000..3749218db
--- /dev/null
+++ b/docs/diagrams/sequence-save-query.mermaid
@@ -0,0 +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
+ 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
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/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchController.java
index bf5867b68..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
@@ -22,10 +22,12 @@
*/
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.*;
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;
@@ -49,6 +51,7 @@ 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 {
@@ -59,6 +62,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());
}
@@ -68,16 +72,18 @@ 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 SearchQueryVariablesDTO reqDto
+ @RequestBody @Valid SparqlQueryVariables body
) throws MetadataRepositoryException, MalformedQueryException {
- return ResponseEntity.ok(searchService.search(reqDto));
+ return ResponseEntity.ok(searchService.search(body));
}
@GetMapping(
path = "/filters",
produces = MediaType.APPLICATION_JSON_VALUE
)
+ @Operation(description = "Retrieve list of all search filters")
public ResponseEntity> getSearchFilters() {
return ResponseEntity.ok(searchService.getSearchFilters());
}
@@ -87,6 +93,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());
}
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..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
@@ -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;
@@ -29,9 +30,10 @@
import org.fairdatateam.fairdatapoint.api.dto.search.SearchSavedQueryDTO;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -50,22 +52,37 @@ public class SearchSavedQueryController {
private static final String NOT_FOUND_MSG = "Saved query '%s' doesn't exist";
- @Autowired
- private SearchSavedQueryService searchSavedQueryService;
+ private final SearchSavedQueryMapper savedQueryMapper;
- @Autowired
- private SearchService searchService;
+ private final SearchSavedQueryService savedQueryService;
+
+ private final SearchService searchService;
+
+ /**
+ * Constructor (autowired)
+ */
+ public SearchSavedQueryController(
+ SearchSavedQueryMapper savedQueryMapper,
+ SearchSavedQueryService savedQueryService,
+ SearchService searchService
+ ) {
+ this.savedQueryMapper = savedQueryMapper;
+ this.savedQueryService = savedQueryService;
+ this.searchService = searchService;
+ }
@GetMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
+ @Operation(description = "List all existing saved queries")
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)
+ @Operation(description = "Retrieve an existing saved query definition")
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);
}
@@ -75,34 +92,33 @@ public ResponseEntity getSingle(
}
@PostMapping(path = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ @Operation(description = "Evaluate an existing saved query")
public ResponseEntity> search(
@PathVariable final String uuid
) throws ResourceNotFoundException, MetadataRepositoryException {
- final Optional oDto = searchSavedQueryService.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()")
@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 reqDto
+ @RequestBody @Valid SearchSavedQueryChangeDTO body
) {
- final SearchSavedQueryDTO dto = searchSavedQueryService.create(reqDto);
- return new ResponseEntity<>(dto, HttpStatus.CREATED);
+ final SearchSavedQuery savedQuery = savedQueryService.create(savedQueryMapper.fromChangeDTO(body));
+ return new ResponseEntity<>(savedQueryMapper.toDTO(savedQuery), HttpStatus.CREATED);
}
@PreAuthorize("isAuthenticated()")
@PutMapping(path = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
+ @Operation(description = "Change an existing saved query")
public ResponseEntity update(
@PathVariable final String uuid,
@RequestBody @Valid SearchSavedQueryChangeDTO 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);
}
@@ -114,10 +130,11 @@ public ResponseEntity update(
@PreAuthorize("isAuthenticated()")
@DeleteMapping(path = "/{uuid}")
@ResponseStatus(HttpStatus.NO_CONTENT)
+ @Operation(description = "Delete an existing saved query")
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/api/controller/search/SearchSparqlController.java b/src/main/java/org/fairdatateam/fairdatapoint/api/controller/search/SearchSparqlController.java
index cf81fe5ce..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,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.SparqlQueryFull;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -84,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
@@ -94,10 +95,10 @@ public void sparqlPost(
sparqlQueryEvaluator.evaluate(
result,
rdf4jRepository,
- sparqlQuery.query,
+ sparqlQueryFull.query(),
accept,
- toArray(sparqlQuery.defaultGraphUri),
- toArray(sparqlQuery.namedGraphUri)
+ toArray(sparqlQueryFull.defaultGraphUris()),
+ toArray(sparqlQueryFull.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/api/dto/search/SearchSavedQueryChangeDTO.java b/src/main/java/org/fairdatateam/fairdatapoint/api/dto/search/SearchSavedQueryChangeDTO.java
index ec6632172..8f6b2b295 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,9 @@
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;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryFull;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
@NoArgsConstructor
@AllArgsConstructor
@@ -42,9 +44,12 @@ public class SearchSavedQueryChangeDTO {
private String description;
@NotNull
- private SearchSavedQueryType type;
+ private SearchSavedQuery.Type type;
@Valid
- @NotNull
- private SearchQueryVariablesDTO variables;
+ private SparqlQueryVariables variables;
+
+ @Valid
+ private SparqlQueryFull queryFull;
+
}
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..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
@@ -28,7 +28,9 @@
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 org.fairdatateam.fairdatapoint.entity.search.SparqlQueryFull;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
import java.time.Instant;
@@ -49,8 +51,9 @@ public class SearchSavedQueryDTO {
private String description;
@NotNull
- private SearchSavedQueryType type;
+ 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;
@@ -62,6 +65,9 @@ public class SearchSavedQueryDTO {
private Instant updatedAt;
@Valid
- @NotNull
- private SearchQueryVariablesDTO variables;
+ private SparqlQueryVariables variables;
+
+ @Valid
+ private SparqlQueryFull queryFull;
+
}
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..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
@@ -22,9 +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.SearchSavedQueryType;
+import org.fairdatateam.fairdatapoint.entity.search.SparqlQueryVariables;
import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.springframework.stereotype.Service;
@@ -42,14 +41,9 @@ 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)
- .graphPattern("?entity rdf:type dcat:Dataset .")
- .ordering(ORDER_TITLE)
- .build()
- )
+ .variables(new SparqlQueryVariables(PREFIX_DCAT, "?entity rdf:type dcat:Dataset .", ORDER_TITLE))
.createdAt(Instant.now())
.updatedAt(Instant.now())
.build();
@@ -60,35 +54,27 @@ 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)
- .graphPattern("?entity rdf:type dcat:Distribution .")
- .ordering(ORDER_TITLE)
- .build()
- )
+ .variables(new SparqlQueryVariables(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(SearchSavedQueryType.PRIVATE)
+ .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 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 31d9e7d44..3f8eca5fd 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;
@@ -49,11 +48,21 @@ public class SearchSavedQuery {
private String userUuid;
- private SearchSavedQueryType type;
+ private Type type;
private Instant createdAt;
private Instant updatedAt;
- private SearchQueryVariablesDTO variables;
+ // could rename to queryVariables for consistency, but that would be incompatible with existing queries in database
+ private SparqlQueryVariables variables;
+
+ private SparqlQueryFull queryFull;
+
+ public enum Type {
+ PUBLIC,
+ PRIVATE,
+ INTERNAL
+ }
+
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQueryType.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryFull.java
similarity index 84%
rename from src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQueryType.java
rename to src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryFull.java
index d4435a39f..90645d26e 100644
--- a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SearchSavedQueryType.java
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryFull.java
@@ -22,8 +22,11 @@
*/
package org.fairdatateam.fairdatapoint.entity.search;
-public enum SearchSavedQueryType {
- PUBLIC,
- PRIVATE,
- INTERNAL
+/**
+ * Defines the content of a full SPARQL query
+ * @param query
+ * @param defaultGraphUris
+ * @param namedGraphUris
+ */
+public record SparqlQueryFull(String query, String[] defaultGraphUris, String[] namedGraphUris) {
}
diff --git a/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryVariables.java b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryVariables.java
new file mode 100644
index 000000000..9ffa4c980
--- /dev/null
+++ b/src/main/java/org/fairdatateam/fairdatapoint/entity/search/SparqlQueryVariables.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 SparqlQueryVariables(String prefixes, String graphPattern, String ordering) {
+}
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 d3f9c43a7..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
@@ -30,7 +30,6 @@
import org.springframework.stereotype.Component;
import java.time.Instant;
-import java.util.UUID;
@Component
public class SearchSavedQueryMapper {
@@ -49,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())
@@ -56,18 +56,13 @@ public SearchSavedQueryDTO toDTO(SearchSavedQuery query) {
.build();
}
- public SearchSavedQuery fromChangeDTO(
- SearchSavedQueryChangeDTO reqDto, String userUuid
- ) {
+ public SearchSavedQuery fromChangeDTO(SearchSavedQueryChangeDTO changeDTO) {
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())
+ .name(changeDTO.getName())
+ .description(changeDTO.getDescription())
+ .type(changeDTO.getType())
+ .variables(changeDTO.getVariables())
+ .queryFull(changeDTO.getQueryFull())
.build();
}
@@ -78,9 +73,11 @@ public SearchSavedQuery fromChangeDTO(
.name(reqDto.getName())
.description(reqDto.getDescription())
.variables(reqDto.getVariables())
+ .queryFull(reqDto.getQueryFull())
.userUuid(query.getUserUuid())
.type(reqDto.getType())
.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 266112681..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
@@ -27,16 +27,17 @@
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;
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,12 +84,13 @@ public boolean delete(String uuid) {
return true;
}
- public SearchSavedQueryDTO create(SearchSavedQueryChangeDTO 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) {
+ 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);
}
public Optional update(String uuid, SearchSavedQueryChangeDTO reqDto) {
@@ -108,7 +110,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 +120,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/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
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..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,13 +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.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.entity.search.SparqlQueryVariables;
import org.fairdatateam.fairdatapoint.util.KnownUUIDs;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -73,13 +72,8 @@ public void res403_anonymousUser() {
SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
- .type(SearchSavedQueryType.PUBLIC)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("A")
- .graphPattern("B")
- .ordering("C")
- .build()
- )
+ .type(SearchSavedQuery.Type.PUBLIC)
+ .variables(new SparqlQueryVariables("A", "B", "C"))
.build()
);
ParameterizedTypeReference> responseType = new ParameterizedTypeReference<>() {
@@ -107,13 +101,8 @@ public void res403_nonOwnerUser() {
SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
- .type(SearchSavedQueryType.PUBLIC)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("A")
- .graphPattern("B")
- .ordering("C")
- .build()
- )
+ .type(SearchSavedQuery.Type.PUBLIC)
+ .variables(new SparqlQueryVariables("A", "B", "C"))
.build()
);
ParameterizedTypeReference> responseType = new ParameterizedTypeReference<>() {
@@ -141,13 +130,8 @@ public void res200_owner() {
SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
- .type(SearchSavedQueryType.INTERNAL)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("A")
- .graphPattern("B")
- .ordering("C")
- .build()
- )
+ .type(SearchSavedQuery.Type.INTERNAL)
+ .variables(new SparqlQueryVariables("A", "B", "C"))
.build()
);
ParameterizedTypeReference responseType = new ParameterizedTypeReference<>() {
@@ -159,11 +143,11 @@ 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")));
- 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,13 +165,8 @@ public void res200_admin() {
SearchSavedQueryChangeDTO.builder()
.name("Edited query")
.description("")
- .type(SearchSavedQueryType.INTERNAL)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("A")
- .graphPattern("B")
- .ordering("C")
- .build()
- )
+ .type(SearchSavedQuery.Type.INTERNAL)
+ .variables(new SparqlQueryVariables("A", "B", "C"))
.build()
);
ParameterizedTypeReference responseType = new ParameterizedTypeReference<>() {
@@ -199,10 +178,10 @@ 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")));
- 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 259ff3942..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
@@ -23,16 +23,18 @@
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.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;
@@ -41,11 +43,12 @@
import org.springframework.http.ResponseEntity;
import java.net.URI;
-import java.util.List;
+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 {
@@ -70,13 +73,8 @@ public void res403_anonymousUser() {
SearchSavedQueryChangeDTO.builder()
.name("New query")
.description("")
- .type(SearchSavedQueryType.PUBLIC)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("")
- .graphPattern("")
- .ordering("")
- .build()
- )
+ .type(SearchSavedQuery.Type.PUBLIC)
+ .variables(new SparqlQueryVariables("", "", ""))
.build()
);
ParameterizedTypeReference> responseType = new ParameterizedTypeReference<>() {
@@ -90,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();
@@ -104,13 +102,9 @@ public void res201() {
SearchSavedQueryChangeDTO.builder()
.name("New query")
.description("")
- .type(SearchSavedQueryType.PUBLIC)
- .variables(SearchQueryVariablesDTO.builder()
- .prefixes("")
- .graphPattern("")
- .ordering("")
- .build()
- )
+ .type(SearchSavedQuery.Type.PUBLIC)
+ .variables(queryVariables)
+ .queryFull(queryFull)
.build()
);
ParameterizedTypeReference responseType = new ParameterizedTypeReference<>() {
@@ -121,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(SearchSavedQueryType.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]))
+ );
}
+
}
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..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
@@ -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.SparqlQueryFull;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
@@ -53,12 +53,11 @@ public class TestSearchSparqlController extends WebIntegrationTest {
@Test
public void postSparqlUnauthenticated() throws JsonProcessingException {
// prepare request
- SearchSparqlController.SparqlQuery sparqlQuery = new SearchSparqlController.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);
@@ -75,14 +74,13 @@ 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
+ 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);
@@ -102,13 +100,12 @@ 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);
+ 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);
@@ -132,14 +129,13 @@ public void postSparqlAskAny() throws JsonProcessingException {
})
public void postSparqlConstructOrDescribe(String query) throws JsonProcessingException {
// prepare request
- SearchSparqlController.SparqlQuery sparqlQuery = new SearchSparqlController.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);
@@ -181,13 +177,12 @@ public void postSparqlUpdateDenied(String update) throws JsonProcessingException
""";
// prepare request
- SearchSparqlController.SparqlQuery sparqlQuery = new SearchSparqlController.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);
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());
+ }
+}