diff --git a/pom.xml b/pom.xml
index 962d101a..a1e201c5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,6 +20,7 @@
21
2.10.0
2.0.16
+ 2.18.1
@@ -73,28 +74,11 @@
io.jsonwebtoken
jjwt
0.9.1
-
-
- com.fasterxml.jackson.core
- jackson-databind
-
-
com.google.api-client
google-api-client
1.27.0
-
-
- com.fasterxml.jackson.core
- jackson-core
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- [2.9.9.1,)
io.springfox
@@ -106,11 +90,6 @@
springfox-swagger-ui
${springfox-version}
-
- com.github.joschi.jackson
- jackson-datatype-threetenbp
- 2.8.4
-
jakarta.annotation
jakarta.annotation-api
@@ -143,6 +122,18 @@
+
+
+
+ com.fasterxml.jackson
+ jackson-bom
+ ${jackson.version}
+ pom
+ import
+
+
+
+
@@ -161,7 +152,7 @@
org.springframework.boot
spring-boot-maven-plugin
- 2.7.5
+ ${spring.version}
@@ -173,21 +164,4 @@
-
-
- spring-releases
- https://repo.spring.io/libs-release
-
-
- spring-milestone
- https://repo.spring.io/libs-milestone
-
-
-
-
- spring-releases
- https://repo.spring.io/libs-release
-
-
-
diff --git a/src/main/java/io/swagger/model/FilterBy.java b/src/main/java/io/swagger/model/FilterBy.java
new file mode 100644
index 00000000..acbc03e7
--- /dev/null
+++ b/src/main/java/io/swagger/model/FilterBy.java
@@ -0,0 +1,24 @@
+package io.swagger.model;
+
+public class FilterBy {
+
+ private String filterOn;
+ private String value;
+
+ public String getFilterOn() {
+ return filterOn;
+ }
+
+ public void setFilterOn(String filterOn) {
+ this.filterOn = filterOn;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+}
diff --git a/src/main/java/io/swagger/model/SearchRequest.java b/src/main/java/io/swagger/model/SearchRequest.java
index 8ad217c4..828cd69c 100644
--- a/src/main/java/io/swagger/model/SearchRequest.java
+++ b/src/main/java/io/swagger/model/SearchRequest.java
@@ -2,9 +2,14 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import io.swagger.model.sort.SortBy;
+import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
+import org.springframework.http.HttpStatus;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
public abstract class SearchRequest {
@JsonIgnore
@@ -25,6 +30,20 @@ public abstract class SearchRequest {
@JsonProperty("externalReferenceSources")
protected List externalReferenceSources = null;
+ @JsonProperty("filterBy")
+ protected List filterBy = null;
+
+ @JsonProperty("sortBy")
+ protected List sortBy = null;
+
+ @JsonIgnore
+ protected Map sortFilterEntityColumnNamesByRequestName = null;
+
+ @JsonIgnore
+ public List getExternalReferenceIds() {
+ return externalReferenceIds;
+ }
+
final public SearchRequest page(Integer page) {
this.page = page;
return this;
@@ -119,4 +138,76 @@ public void addExternalReferenceItem(String externalReferenceId, String external
}
}
+
+ public List getFilterBy() {
+ return filterBy;
+ }
+
+ public void setFilterBy(List filterBy) throws BrAPIServerException {
+
+ if (filterBy == null || filterBy.isEmpty()) {
+ return;
+ }
+
+ Map allowedSortFilterNames = getSortFilterEntityColumnNamesByRequestName();
+
+ for (FilterBy filterByItem : filterBy) {
+
+ if (filterByItem.getFilterOn() == null || filterByItem.getFilterOn().isEmpty()) {
+ throw new BrAPIServerException(HttpStatus.BAD_REQUEST, "filterOn attribute not provided in element of filterBy list.");
+ }
+
+ if (filterByItem.getValue() == null || filterByItem.getValue().isEmpty()) {
+ throw new BrAPIServerException(HttpStatus.BAD_REQUEST, "value attribute not provided in element of filterBy list.");
+ }
+
+ String filterColumnEntityName = getSortFilterEntityColumnNamesByRequestName().get(filterByItem.getFilterOn());
+
+ if (filterColumnEntityName == null) {
+ throw new BrAPIServerException(HttpStatus.BAD_REQUEST,
+ String.format("Supplied filterColumn [%s] not available in allowed names [%s]", filterByItem.getFilterOn(), allowedSortFilterNames.keySet())
+ );
+ } else {
+ // Remap suppliedFilterColumn to actual entity name supplied by mapper
+ filterByItem.setFilterOn(filterColumnEntityName);
+ }
+ }
+ this.filterBy = filterBy;
+ }
+
+ public List getSortByElements() {
+ return sortBy;
+ }
+
+ public void setSortBy(List sortBy) throws BrAPIServerException {
+
+ if (sortBy == null || sortBy.isEmpty()) {
+ return;
+ }
+
+ Map allowedSortFilterNames = getSortFilterEntityColumnNamesByRequestName();
+
+ for (SortBy sortByItem : sortBy) {
+ if (sortByItem.getSortedOn() == null || sortByItem.getSortedOn().isEmpty()) {
+ throw new BrAPIServerException(HttpStatus.BAD_REQUEST, "sortedOn attribute not provided in element of sortBy list");
+ }
+
+ String sortColumnEntityName = getSortFilterEntityColumnNamesByRequestName().get(sortByItem.getSortedOn());
+
+ if (sortColumnEntityName == null) {
+ throw new BrAPIServerException(HttpStatus.BAD_REQUEST,
+ String.format("Supplied sortColumn [%s] not available in allowed names [%s]", sortByItem.getSortedOn(), allowedSortFilterNames.keySet())
+ );
+ } else {
+ // Remap suppliedFilterColumn to actual entity name supplied by mapper
+ sortByItem.setSortedOn(sortColumnEntityName);
+ }
+ }
+
+ this.sortBy = sortBy;
+ }
+
+ public Map getSortFilterEntityColumnNamesByRequestName() {
+ throw new UnsupportedOperationException(String.format("Sort/Filtering not implemented for %s", this.getClass().getSimpleName()));
+ }
}
diff --git a/src/main/java/io/swagger/model/core/SortBy.java b/src/main/java/io/swagger/model/core/SortBy.java
deleted file mode 100644
index 8a132a3e..00000000
--- a/src/main/java/io/swagger/model/core/SortBy.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package io.swagger.model.core;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonValue;
-
-public enum SortBy {
-
- STUDYDBID("studyDbId"),
-
- STARTDATE("startDate"),
-
- ENDDATE("endDate"),
-
- TRIALDBID("trialDbId"),
-
- TRIALNAME("trialName"),
-
- PROGRAMDBID("programDbId"),
-
- LOCATIONDBID("locationDbId"),
-
- SEASONDBID("seasonDbId"),
-
- STUDYTYPE("studyType"),
-
- STUDYNAME("studyName"),
-
- STUDYLOCATION("studyLocation"),
-
- PROGRAMNAME("programName"),
-
- GERMPLASMDBID("germplasmDbId"),
-
- OBSERVATIONVARIABLEDBID("observationVariableDbId");
-private String value;
-
- SortBy(String value) {
- this.value = value;
- }
-
- @Override
- @JsonValue
- public String toString() {
- return String.valueOf(value);
- }
-
- @JsonCreator
- public static SortBy fromValue(String text) {
- for (SortBy b : SortBy.values()) {
- if (String.valueOf(b.value).equals(text)) {
- return b;
- }
- }
- return null;
- }
-}
diff --git a/src/main/java/io/swagger/model/core/StudySearchRequest.java b/src/main/java/io/swagger/model/core/StudySearchRequest.java
index 0b26436b..78ed90d0 100644
--- a/src/main/java/io/swagger/model/core/StudySearchRequest.java
+++ b/src/main/java/io/swagger/model/core/StudySearchRequest.java
@@ -1,14 +1,34 @@
package io.swagger.model.core;
+import java.util.Map;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.model.SearchRequest;
+
import java.util.ArrayList;
import java.util.List;
public class StudySearchRequest extends SearchRequest {
+
+ // Key - allowed sort or field filter name for this entity
+ // Value = entity field name that represents the submitted field. Used later on in query building.
+ private static final Map ALLOWED_SORT_AND_FILTER_FIELDS =
+ Map.ofEntries(
+ Map.entry("germplasmDbId", "*obsunit.germplasm.id"),
+ Map.entry("locationDbId", "location.id"),
+ Map.entry("observationVariableDbId", "*observation.observationVariable.id"),
+ Map.entry("programDbId", "trial.program.id"),
+ Map.entry("programName", "trial.program.name"),
+ Map.entry("seasonDbId", "*season.id"),
+ Map.entry("studyDbId", "id"),
+ Map.entry("studyLocation", "location.id"),
+ Map.entry("trialDbId", "trial.id"),
+ Map.entry("studyType", "studyName"),
+ Map.entry("studyName", "studyName")
+ );
+
@JsonProperty("commonCropNames")
private List commonCropNames = null;
@@ -54,12 +74,6 @@ public class StudySearchRequest extends SearchRequest {
@JsonProperty("seasonDbIds")
private List seasonDbIds = null;
- @JsonProperty("sortBy")
- private SortBy sortBy = null;
-
- @JsonProperty("sortOrder")
- private SortOrder sortOrder = null;
-
@JsonProperty("studyCodes")
private List studyCodes = null;
@@ -376,32 +390,6 @@ public void setSeasonDbIds(List seasonDbIds) {
this.seasonDbIds = seasonDbIds;
}
- public StudySearchRequest sortBy(SortBy sortBy) {
- this.sortBy = sortBy;
- return this;
- }
-
- public SortBy getSortBy() {
- return sortBy;
- }
-
- public void setSortBy(SortBy sortBy) {
- this.sortBy = sortBy;
- }
-
- public StudySearchRequest sortOrder(SortOrder sortOrder) {
- this.sortOrder = sortOrder;
- return this;
- }
-
- public SortOrder getSortOrder() {
- return sortOrder;
- }
-
- public void setSortOrder(SortOrder sortOrder) {
- this.sortOrder = sortOrder;
- }
-
public StudySearchRequest studyCodes(List studyCodes) {
this.studyCodes = studyCodes;
return this;
@@ -492,7 +480,6 @@ public boolean equals(java.lang.Object o) {
&& Objects.equals(this.active, studySearchRequest.active)
&& Objects.equals(this.seasonDbIds, studySearchRequest.seasonDbIds)
&& Objects.equals(this.sortBy, studySearchRequest.sortBy)
- && Objects.equals(this.sortOrder, studySearchRequest.sortOrder)
&& Objects.equals(this.studyCodes, studySearchRequest.studyCodes)
&& Objects.equals(this.studyPUIs, studySearchRequest.studyPUIs)
&& Objects.equals(this.studyTypes, studySearchRequest.studyTypes) && super.equals(o);
@@ -503,7 +490,7 @@ public int hashCode() {
return Objects.hash(commonCropNames, programDbIds, programNames, trialDbIds, trialNames, studyDbIds, studyNames,
locationDbIds, locationNames, germplasmDbIds, germplasmNames, observationVariableDbIds,
observationVariableNames, externalReferenceIds, externalReferenceSources, active, seasonDbIds, sortBy,
- sortOrder, studyCodes, studyPUIs, studyTypes, super.hashCode());
+ studyCodes, studyPUIs, studyTypes, super.hashCode());
}
@Override
@@ -529,7 +516,6 @@ public String toString() {
sb.append(" active: ").append(toIndentedString(active)).append("\n");
sb.append(" seasonDbIds: ").append(toIndentedString(seasonDbIds)).append("\n");
sb.append(" sortBy: ").append(toIndentedString(sortBy)).append("\n");
- sb.append(" sortOrder: ").append(toIndentedString(sortOrder)).append("\n");
sb.append(" studyCodes: ").append(toIndentedString(studyCodes)).append("\n");
sb.append(" studyPUIs: ").append(toIndentedString(studyPUIs)).append("\n");
sb.append(" studyTypes: ").append(toIndentedString(studyTypes)).append("\n");
@@ -583,8 +569,6 @@ public Integer getTotalParameterCount() {
count += this.seasonDbIds.size();
if (this.sortBy != null)
count += 1;
- if (this.sortOrder != null)
- count += 1;
if (this.studyCodes != null)
count += this.studyCodes.size();
if (this.studyPUIs != null)
@@ -593,4 +577,9 @@ public Integer getTotalParameterCount() {
count += this.studyTypes.size();
return count;
}
+
+ @Override
+ public Map getSortFilterEntityColumnNamesByRequestName() {
+ return ALLOWED_SORT_AND_FILTER_FIELDS;
+ }
}
diff --git a/src/main/java/io/swagger/model/core/TrialSearchRequest.java b/src/main/java/io/swagger/model/core/TrialSearchRequest.java
index 830dde51..ce24b1f7 100644
--- a/src/main/java/io/swagger/model/core/TrialSearchRequest.java
+++ b/src/main/java/io/swagger/model/core/TrialSearchRequest.java
@@ -1,13 +1,28 @@
package io.swagger.model.core;
-import java.util.Objects;
+import java.util.*;
+
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.model.SearchRequest;
-import java.util.ArrayList;
-import java.util.List;
+
import java.time.LocalDate;
public class TrialSearchRequest extends SearchRequest {
+
+ // Key - allowed sort or field filter name for this entity
+ // Value = entity field name that represents the submitted field. Used later on in query building.
+ private static final Map ALLOWED_SORT_AND_FILTER_FIELDS =
+ Map.of(
+ "trialName", "trialName",
+ "createdDate", "createdDate",
+ "createdBy", "createdBy",
+ "trialDbId", "id",
+ "programDbId","program.id",
+ "startDate", "startDate",
+ "endDate", "endDate",
+ "active", "active"
+ );
+
@JsonProperty("commonCropNames")
private List commonCropNames = null;
@@ -50,28 +65,6 @@ public class TrialSearchRequest extends SearchRequest {
@JsonProperty("trialPUIs")
private List trialPUIs = null;
- @JsonProperty("sortBy")
- private SortBy sortBy = null;
-
- @JsonProperty("sortOrder")
- private SortOrder sortOrder = null;
-
- public SortBy getSortBy() {
- return sortBy;
- }
-
- public void setSortBy(SortBy sortBy) {
- this.sortBy = sortBy;
- }
-
- public SortOrder getSortOrder() {
- return sortOrder;
- }
-
- public void setSortOrder(SortOrder sortOrder) {
- this.sortOrder = sortOrder;
- }
-
public TrialSearchRequest commonCropNames(List commonCropNames) {
this.commonCropNames = commonCropNames;
return this;
@@ -445,4 +438,9 @@ public Integer getTotalParameterCount() {
count += this.trialPUIs.size();
return count;
}
+
+ @Override
+ public Map getSortFilterEntityColumnNamesByRequestName() {
+ return ALLOWED_SORT_AND_FILTER_FIELDS;
+ }
}
diff --git a/src/main/java/io/swagger/model/sort/SortBy.java b/src/main/java/io/swagger/model/sort/SortBy.java
new file mode 100644
index 00000000..bb286fa6
--- /dev/null
+++ b/src/main/java/io/swagger/model/sort/SortBy.java
@@ -0,0 +1,30 @@
+package io.swagger.model.sort;
+
+public class SortBy {
+ private String sortedOn;
+ private SortOrder sortOrder = SortOrder.ASC;
+
+ public SortBy(String sortedOn,
+ SortOrder sortOrder) {
+ this.sortedOn = sortedOn;
+ this.sortOrder = sortOrder;
+ }
+
+ public SortBy() {}
+
+ public String getSortedOn() {
+ return sortedOn;
+ }
+
+ public void setSortedOn(String sortedOn) {
+ this.sortedOn = sortedOn;
+ }
+
+ public SortOrder getSortOrder() {
+ return sortOrder;
+ }
+
+ public void setSortOrder(SortOrder sortOrder) {
+ this.sortOrder = sortOrder;
+ }
+}
diff --git a/src/main/java/io/swagger/model/core/SortOrder.java b/src/main/java/io/swagger/model/sort/SortOrder.java
similarity index 95%
rename from src/main/java/io/swagger/model/core/SortOrder.java
rename to src/main/java/io/swagger/model/sort/SortOrder.java
index 0e5b36bd..4cc9d5aa 100644
--- a/src/main/java/io/swagger/model/core/SortOrder.java
+++ b/src/main/java/io/swagger/model/sort/SortOrder.java
@@ -1,4 +1,4 @@
-package io.swagger.model.core;
+package io.swagger.model.sort;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
diff --git a/src/main/java/org/brapi/test/BrAPITestServer/BrapiExceptionHandler.java b/src/main/java/org/brapi/test/BrAPITestServer/BrapiExceptionHandler.java
index 7ee15a60..fa6508f0 100644
--- a/src/main/java/org/brapi/test/BrAPITestServer/BrapiExceptionHandler.java
+++ b/src/main/java/org/brapi/test/BrAPITestServer/BrapiExceptionHandler.java
@@ -1,13 +1,12 @@
package org.brapi.test.BrAPITestServer;
import java.util.ArrayList;
+import java.util.Map;
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
+import org.springframework.http.*;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.MissingServletRequestParameterException;
@@ -70,4 +69,36 @@ private ResponseEntity