diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java index 6737b5aec..5550df913 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java @@ -27,11 +27,9 @@ import io.micronaut.security.rules.SecurityRule; import lombok.extern.slf4j.Slf4j; import okhttp3.*; -import org.brapi.client.v2.JSON; import org.brapi.client.v2.model.exceptions.ApiException; import org.brapi.v2.model.core.BrAPIListSummary; import org.brapi.v2.model.core.BrAPIServerInfo; -import org.brapi.v2.model.core.response.BrAPIListsListResponse; import org.brapi.v2.model.core.response.BrAPIServerInfoResponse; import org.breedinginsight.api.auth.AuthenticatedUser; import org.breedinginsight.api.auth.ProgramSecured; @@ -40,8 +38,7 @@ import org.breedinginsight.api.model.v1.validators.QueryValid; import org.breedinginsight.brapi.v1.controller.BrapiVersion; import org.breedinginsight.brapi.v1.model.request.query.BrapiQuery; -import org.breedinginsight.brapi.v2.model.response.mappers.GermplasmQueryMapper; -import org.breedinginsight.brapi.v2.model.response.mappers.ListQueryMapper; +import org.breedinginsight.utilities.response.mappers.ListQueryMapper; import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; import org.breedinginsight.model.ProgramBrAPIEndpoints; import org.breedinginsight.services.ProgramService; diff --git a/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java b/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java index d76bacb0e..e68202a6b 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java @@ -11,16 +11,19 @@ import org.brapi.v2.model.core.BrAPITrial; import org.breedinginsight.api.auth.ProgramSecured; import org.breedinginsight.api.auth.ProgramSecuredRoleGroup; +import org.breedinginsight.api.model.v1.request.query.SearchRequest; import org.breedinginsight.api.model.v1.response.DataResponse; import org.breedinginsight.api.model.v1.response.Response; +import org.breedinginsight.api.model.v1.validators.QueryValid; import org.breedinginsight.brapi.v1.controller.BrapiVersion; -import org.breedinginsight.brapi.v1.model.request.query.BrapiQuery; +import org.breedinginsight.brapi.v2.model.request.query.ExperimentQuery; import org.breedinginsight.brapi.v2.services.BrAPITrialService; import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.utilities.response.ResponseUtils; import org.breedinginsight.utilities.response.mappers.ExperimentQueryMapper; import javax.inject.Inject; +import javax.validation.Valid; import java.util.List; import java.util.UUID; @@ -42,14 +45,14 @@ public ExperimentController(BrAPITrialService experimentService, ExperimentQuery @Produces(MediaType.APPLICATION_JSON) @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) public HttpResponse>>> getExperiments( - @PathVariable("programId") UUID programId, @QueryValue BrapiQuery queryParams, - @QueryValue boolean metadata) { + @PathVariable("programId") UUID programId, + @QueryValue @QueryValid(using = ExperimentQueryMapper.class) @Valid ExperimentQuery queryParams) { try { log.debug("fetching trials for program: " + programId); List experiments = experimentService.getExperiments(programId); - return ResponseUtils.getBrapiQueryResponse(experiments, experimentQueryMapper, queryParams); - + SearchRequest searchRequest = queryParams.constructSearchRequest(); + return ResponseUtils.getBrapiQueryResponse(experiments, experimentQueryMapper, queryParams, searchRequest); } catch (ApiException e) { log.info(e.getMessage(), e); return HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, "Error retrieving experiments"); diff --git a/src/main/java/org/breedinginsight/brapi/v2/GermplasmController.java b/src/main/java/org/breedinginsight/brapi/v2/GermplasmController.java index 9d2b0285e..0141fa3db 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/GermplasmController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/GermplasmController.java @@ -30,14 +30,12 @@ import org.breedinginsight.brapi.v1.model.request.query.BrapiQuery; import org.breedinginsight.brapi.v2.dao.BrAPIGermplasmDAO; import org.breedinginsight.brapi.v2.model.request.query.GermplasmQuery; -import org.breedinginsight.brapi.v2.model.response.mappers.GermplasmQueryMapper; +import org.breedinginsight.utilities.response.mappers.GermplasmQueryMapper; import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; -import org.breedinginsight.brapps.importer.model.base.Germplasm; import org.breedinginsight.brapps.importer.model.exports.FileType; import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.model.DownloadFile; import org.breedinginsight.services.exceptions.DoesNotExistException; -import org.breedinginsight.utilities.Utilities; import org.breedinginsight.utilities.response.ResponseUtils; import javax.inject.Inject; diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ExperimentQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ExperimentQuery.java new file mode 100644 index 000000000..04da564bf --- /dev/null +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ExperimentQuery.java @@ -0,0 +1,29 @@ +package org.breedinginsight.brapi.v2.model.request.query; + +import io.micronaut.core.annotation.Introspected; +import lombok.Getter; +import org.breedinginsight.api.model.v1.request.query.FilterRequest; +import org.breedinginsight.api.model.v1.request.query.SearchRequest; +import org.breedinginsight.brapi.v1.model.request.query.BrapiQuery; +import org.jooq.tools.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Introspected +public class ExperimentQuery extends BrapiQuery { + private String name; + private String active; + + public SearchRequest constructSearchRequest() { + List filters = new ArrayList<>(); + if (!StringUtils.isBlank(getName())) { + filters.add(constructFilterRequest("name", getName())); + } + if (!StringUtils.isBlank(getActive())) { + filters.add(constructFilterRequest("active", getActive())); + } + return new SearchRequest(filters); + } +} diff --git a/src/main/java/org/breedinginsight/utilities/response/mappers/ExperimentQueryMapper.java b/src/main/java/org/breedinginsight/utilities/response/mappers/ExperimentQueryMapper.java index d4429b798..6452d1161 100644 --- a/src/main/java/org/breedinginsight/utilities/response/mappers/ExperimentQueryMapper.java +++ b/src/main/java/org/breedinginsight/utilities/response/mappers/ExperimentQueryMapper.java @@ -19,6 +19,7 @@ import lombok.Getter; import org.brapi.v2.model.core.BrAPITrial; +import org.breedinginsight.api.v1.controller.metadata.SortOrder; import javax.inject.Singleton; import java.util.Map; @@ -28,9 +29,17 @@ @Singleton public class ExperimentQueryMapper extends AbstractQueryMapper { + private final String defaultSortField = "name"; + private final SortOrder defaultSortOrder = SortOrder.ASC; + private Map> fields; - public ExperimentQueryMapper() { fields = Map.ofEntries(); } + public ExperimentQueryMapper() { + fields = Map.ofEntries( + Map.entry("name", BrAPITrial::getTrialName), + Map.entry("active", BrAPITrial::isActive) + ); + } @Override public boolean exists(String fieldName) { diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/response/mappers/GermplasmQueryMapper.java b/src/main/java/org/breedinginsight/utilities/response/mappers/GermplasmQueryMapper.java similarity index 98% rename from src/main/java/org/breedinginsight/brapi/v2/model/response/mappers/GermplasmQueryMapper.java rename to src/main/java/org/breedinginsight/utilities/response/mappers/GermplasmQueryMapper.java index d4ec67d0f..a8b29503c 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/response/mappers/GermplasmQueryMapper.java +++ b/src/main/java/org/breedinginsight/utilities/response/mappers/GermplasmQueryMapper.java @@ -1,4 +1,4 @@ -package org.breedinginsight.brapi.v2.model.response.mappers; +package org.breedinginsight.utilities.response.mappers; import com.google.gson.JsonObject; import lombok.Getter; diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/response/mappers/ListQueryMapper.java b/src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java similarity index 93% rename from src/main/java/org/breedinginsight/brapi/v2/model/response/mappers/ListQueryMapper.java rename to src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java index 4c2c08e19..302fe3b49 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/response/mappers/ListQueryMapper.java +++ b/src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java @@ -1,4 +1,4 @@ -package org.breedinginsight.brapi.v2.model.response.mappers; +package org.breedinginsight.utilities.response.mappers; import lombok.Getter; import org.brapi.v2.model.core.BrAPIListSummary; diff --git a/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java index 39920cb67..bc8a109aa 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java @@ -18,7 +18,7 @@ import org.breedinginsight.api.model.v1.request.query.FilterRequest; import org.breedinginsight.api.model.v1.request.query.SearchRequest; import org.breedinginsight.api.v1.controller.TestTokenValidator; -import org.breedinginsight.brapi.v2.model.response.mappers.GermplasmQueryMapper; +import org.breedinginsight.utilities.response.mappers.GermplasmQueryMapper; import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; import org.breedinginsight.brapps.importer.daos.BrAPIListDAO; import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; @@ -26,7 +26,6 @@ import org.breedinginsight.model.Program; import org.breedinginsight.model.Species; import org.breedinginsight.services.SpeciesService; -import org.breedinginsight.utilities.response.mappers.FilterField; import org.jooq.DSLContext; import org.junit.jupiter.api.*;