From efb95c5cbbf684fd6ccd712abe820f62315475fa Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Tue, 20 Jun 2023 11:56:26 -0400 Subject: [PATCH 01/13] create ListController --- .../brapi/v2/ListController.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/main/java/org/breedinginsight/brapi/v2/ListController.java diff --git a/src/main/java/org/breedinginsight/brapi/v2/ListController.java b/src/main/java/org/breedinginsight/brapi/v2/ListController.java new file mode 100644 index 000000000..a30ba6e8e --- /dev/null +++ b/src/main/java/org/breedinginsight/brapi/v2/ListController.java @@ -0,0 +1,100 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.breedinginsight.brapi.v2; + +import io.micronaut.http.HttpRequest; +import io.micronaut.http.HttpResponse; +import io.micronaut.http.HttpStatus; +import io.micronaut.http.MediaType; +import io.micronaut.http.annotation.*; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; +import lombok.extern.slf4j.Slf4j; +import org.brapi.client.v2.model.exceptions.ApiException; +import org.brapi.v2.model.core.BrAPIListSummary; +import org.breedinginsight.api.auth.ProgramSecured; +import org.breedinginsight.api.auth.ProgramSecuredRoleGroup; +import org.breedinginsight.api.auth.SecurityService; +import org.breedinginsight.api.model.v1.request.query.SearchRequest; +import org.breedinginsight.api.model.v1.validators.QueryValid; +import org.breedinginsight.brapi.v1.controller.BrapiVersion; +import org.breedinginsight.brapi.v2.model.request.query.ListQuery; +import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; +import org.breedinginsight.services.ProgramService; +import org.breedinginsight.services.exceptions.DoesNotExistException; +import org.breedinginsight.utilities.response.ResponseUtils; +import org.breedinginsight.utilities.response.mappers.ListQueryMapper; + +import javax.inject.Inject; +import javax.validation.Valid; +import java.util.List; +import java.util.UUID; + +@Slf4j +@Controller +@Secured(SecurityRule.IS_AUTHENTICATED) +public class ListController { + + private final BrAPIGermplasmService germplasmService; + private final ListQueryMapper listQueryMapper; + + @Inject + public ListController(BrAPIGermplasmService germplasmService, + ListQueryMapper listQueryMapper) { + this.germplasmService = germplasmService; + this.listQueryMapper = listQueryMapper; + } + + + //@Get(BrapiVersion.BRAPI_V2 + "/lists") + @Get("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/lists{?queryParams*}") + @Produces(MediaType.APPLICATION_JSON) + @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) + public HttpResponse getLists(@PathVariable("programId") UUID programId, HttpRequest request, + @QueryValue @QueryValid(using = ListQueryMapper.class) @Valid ListQuery queryParams + ) throws DoesNotExistException, ApiException { + try { + List brapiLists; + + // If the date display format was sent as a query param, then update the query mapper. + String dateFormatParam = queryParams.getDateDisplayFormat(); + if (dateFormatParam != null) { + listQueryMapper.setDateDisplayFormat(dateFormatParam); + } + + if (queryParams.getListType() == null) { + // TODO: in future return all list types but for now just return germplasm + brapiLists = germplasmService.getGermplasmListsByProgramId(programId, request); + } else { + // TODO: return appropriate lists by type, only germplasm currently + switch (queryParams.getListType()) { + case "germplasm": + default: + brapiLists = germplasmService.getGermplasmListsByProgramId(programId, request); + } + } + + SearchRequest searchRequest = queryParams.constructSearchRequest(); + return ResponseUtils.getBrapiQueryResponse(brapiLists, listQueryMapper, queryParams, searchRequest); + + } catch (IllegalArgumentException e) { + log.info(e.getMessage(), e); + return HttpResponse.status(HttpStatus.UNPROCESSABLE_ENTITY, "Error parsing requested date format"); + } + } +} From db7f402011afcca5dda70578ab74a3f9862acdc0 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Tue, 20 Jun 2023 12:39:15 -0400 Subject: [PATCH 02/13] Update ListQuery to include xrefsource and xrefid --- .../java/org/breedinginsight/brapi/v2/ListController.java | 2 -- .../brapi/v2/model/request/query/ListQuery.java | 8 ++++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/ListController.java b/src/main/java/org/breedinginsight/brapi/v2/ListController.java index a30ba6e8e..3315d871d 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ListController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ListController.java @@ -29,13 +29,11 @@ import org.brapi.v2.model.core.BrAPIListSummary; import org.breedinginsight.api.auth.ProgramSecured; import org.breedinginsight.api.auth.ProgramSecuredRoleGroup; -import org.breedinginsight.api.auth.SecurityService; import org.breedinginsight.api.model.v1.request.query.SearchRequest; import org.breedinginsight.api.model.v1.validators.QueryValid; import org.breedinginsight.brapi.v1.controller.BrapiVersion; import org.breedinginsight.brapi.v2.model.request.query.ListQuery; import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; -import org.breedinginsight.services.ProgramService; import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.utilities.response.ResponseUtils; import org.breedinginsight.utilities.response.mappers.ListQueryMapper; diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java index 8e379f788..5dcc25ad2 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java @@ -17,6 +17,8 @@ public class ListQuery extends BrapiQuery { private String name; private String description; private String size; + private String externalReferenceSource; + private String externalReferenceId; private String dateCreated; private String ownerName; // This is a meta-parameter, it describes the display format of any date fields. @@ -36,6 +38,12 @@ public SearchRequest constructSearchRequest() { if (!StringUtils.isBlank(getSize())) { filters.add(constructFilterRequest("size", getSize())); } + if (!StringUtils.isBlank(getExternalReferenceSource())) { + filters.add(constructFilterRequest("externalReferenceSource", getExternalReferenceSource())); + } + if (!StringUtils.isBlank(getExternalReferenceId())) { + filters.add(constructFilterRequest("externalReferenceId", getExternalReferenceId())); + } if (!StringUtils.isBlank(getDateCreated())) { filters.add(constructFilterRequest("dateCreated", getDateCreated())); } From ec1c8abbbb6ec8acbc1bd13d16162163651c1345 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:47:32 -0400 Subject: [PATCH 03/13] move GET /lists from BrAPIV2Controller to ListsController --- .../brapi/v2/BrAPIV2Controller.java | 37 ------- .../brapi/v2/ListController.java | 40 ++++--- .../v2/model/request/query/ListQuery.java | 14 ++- .../brapi/v2/services/BrAPIListService.java | 104 ++++++++++++++++++ .../brapi/v2/services/BrAPITrialService.java | 19 ++++ .../response/mappers/ListQueryMapper.java | 1 + 6 files changed, 157 insertions(+), 58 deletions(-) create mode 100644 src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java index 7b5f07f74..9770570d9 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java @@ -86,43 +86,6 @@ public BrAPIServerInfoResponse serverinfo() { return new BrAPIServerInfoResponse().result(serverInfo); } - //@Get(BrapiVersion.BRAPI_V2 + "/lists") - @Get("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/lists{?queryParams*}") - @Produces(MediaType.APPLICATION_JSON) - @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) - public HttpResponse getLists(@PathVariable("programId") UUID programId, HttpRequest request, - @QueryValue @QueryValid(using = ListQueryMapper.class) @Valid ListQuery queryParams - ) throws DoesNotExistException, ApiException { - try { - List brapiLists; - - // If the date display format was sent as a query param, then update the query mapper. - String dateFormatParam = queryParams.getDateDisplayFormat(); - if (dateFormatParam != null) { - listQueryMapper.setDateDisplayFormat(dateFormatParam); - } - - if (queryParams.getListType() == null) { - // TODO: in future return all list types but for now just return germplasm - brapiLists = germplasmService.getGermplasmListsByProgramId(programId, request); - } else { - // TODO: return appropriate lists by type, only germplasm currently - switch (queryParams.getListType()) { - case "germplasm": - default: - brapiLists = germplasmService.getGermplasmListsByProgramId(programId, request); - } - } - - SearchRequest searchRequest = queryParams.constructSearchRequest(); - return ResponseUtils.getBrapiQueryResponse(brapiLists, listQueryMapper, queryParams, searchRequest); - - } catch (IllegalArgumentException e) { - log.info(e.getMessage(), e); - return HttpResponse.status(HttpStatus.UNPROCESSABLE_ENTITY, "Error parsing requested date format"); - } - } - @Get("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/{+path}") @Produces(MediaType.APPLICATION_JSON) @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) diff --git a/src/main/java/org/breedinginsight/brapi/v2/ListController.java b/src/main/java/org/breedinginsight/brapi/v2/ListController.java index 3315d871d..05c47834d 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ListController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ListController.java @@ -27,6 +27,7 @@ import lombok.extern.slf4j.Slf4j; import org.brapi.client.v2.model.exceptions.ApiException; import org.brapi.v2.model.core.BrAPIListSummary; +import org.brapi.v2.model.core.BrAPIListTypes; import org.breedinginsight.api.auth.ProgramSecured; import org.breedinginsight.api.auth.ProgramSecuredRoleGroup; import org.breedinginsight.api.model.v1.request.query.SearchRequest; @@ -34,6 +35,10 @@ import org.breedinginsight.brapi.v1.controller.BrapiVersion; import org.breedinginsight.brapi.v2.model.request.query.ListQuery; import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; +import org.breedinginsight.brapi.v2.services.BrAPIListService; +import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; +import org.breedinginsight.model.Program; +import org.breedinginsight.services.ProgramService; import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.utilities.response.ResponseUtils; import org.breedinginsight.utilities.response.mappers.ListQueryMapper; @@ -48,12 +53,16 @@ @Secured(SecurityRule.IS_AUTHENTICATED) public class ListController { + private final ProgramService programService; + private final BrAPIListService listService; private final BrAPIGermplasmService germplasmService; private final ListQueryMapper listQueryMapper; @Inject - public ListController(BrAPIGermplasmService germplasmService, + public ListController(ProgramService programService, BrAPIListService listService, BrAPIGermplasmService germplasmService, ListQueryMapper listQueryMapper) { + this.programService = programService; + this.listService = listService; this.germplasmService = germplasmService; this.listQueryMapper = listQueryMapper; } @@ -67,32 +76,33 @@ public HttpResponse getLists(@PathVariable("programId") UUID programId, HttpRequ @QueryValue @QueryValid(using = ListQueryMapper.class) @Valid ListQuery queryParams ) throws DoesNotExistException, ApiException { try { - List brapiLists; + Program program = programService + .getById(programId) + .orElseThrow(() -> new DoesNotExistException("Program does not exist")); + + // get germplasm lists by default + BrAPIListTypes type = queryParams.getListType() == null ? + BrAPIListTypes.GERMPLASM : queryParams.getListType(); + ExternalReferenceSource source = queryParams.getExternalReferenceSource() == null ? + ExternalReferenceSource.PROGRAMS : queryParams.getExternalReferenceSource(); + UUID id = queryParams.getExternalReferenceId() == null || queryParams.getExternalReferenceId().isBlank() ? + programId : UUID.fromString(queryParams.getExternalReferenceId()); // If the date display format was sent as a query param, then update the query mapper. String dateFormatParam = queryParams.getDateDisplayFormat(); if (dateFormatParam != null) { listQueryMapper.setDateDisplayFormat(dateFormatParam); } - - if (queryParams.getListType() == null) { - // TODO: in future return all list types but for now just return germplasm - brapiLists = germplasmService.getGermplasmListsByProgramId(programId, request); - } else { - // TODO: return appropriate lists by type, only germplasm currently - switch (queryParams.getListType()) { - case "germplasm": - default: - brapiLists = germplasmService.getGermplasmListsByProgramId(programId, request); - } - } - + List brapiLists = listService.getListSummariesByTypeAndXref(type, source, id, program); SearchRequest searchRequest = queryParams.constructSearchRequest(); + return ResponseUtils.getBrapiQueryResponse(brapiLists, listQueryMapper, queryParams, searchRequest); } catch (IllegalArgumentException e) { log.info(e.getMessage(), e); return HttpResponse.status(HttpStatus.UNPROCESSABLE_ENTITY, "Error parsing requested date format"); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); } } } diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java index 5dcc25ad2..cf144e59b 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java @@ -2,9 +2,11 @@ import io.micronaut.core.annotation.Introspected; import lombok.Getter; +import org.brapi.v2.model.core.BrAPIListTypes; 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.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.jooq.tools.StringUtils; import java.util.ArrayList; @@ -13,11 +15,11 @@ @Getter @Introspected public class ListQuery extends BrapiQuery { - private String listType; + private BrAPIListTypes listType; private String name; private String description; private String size; - private String externalReferenceSource; + private ExternalReferenceSource externalReferenceSource; private String externalReferenceId; private String dateCreated; private String ownerName; @@ -26,8 +28,8 @@ public class ListQuery extends BrapiQuery { public SearchRequest constructSearchRequest() { List filters = new ArrayList<>(); - if (!StringUtils.isBlank(getListType())) { - filters.add(constructFilterRequest("type", getListType())); + if (getListType() != null) { + filters.add(constructFilterRequest("type", getListType().name())); } if (!StringUtils.isBlank(getName())) { filters.add(constructFilterRequest("name", getName())); @@ -38,8 +40,8 @@ public SearchRequest constructSearchRequest() { if (!StringUtils.isBlank(getSize())) { filters.add(constructFilterRequest("size", getSize())); } - if (!StringUtils.isBlank(getExternalReferenceSource())) { - filters.add(constructFilterRequest("externalReferenceSource", getExternalReferenceSource())); + if (getExternalReferenceSource() != null) { + filters.add(constructFilterRequest("externalReferenceSource", getExternalReferenceSource().getName())); } if (!StringUtils.isBlank(getExternalReferenceId())) { filters.add(constructFilterRequest("externalReferenceId", getExternalReferenceId())); diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java new file mode 100644 index 000000000..c8c28d364 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java @@ -0,0 +1,104 @@ +package org.breedinginsight.brapi.v2.services; + +import io.micronaut.context.annotation.Property; +import lombok.extern.slf4j.Slf4j; +import org.brapi.client.v2.model.exceptions.ApiException; +import org.brapi.v2.model.BrAPIExternalReference; +import org.brapi.v2.model.core.BrAPIListSummary; +import org.brapi.v2.model.core.BrAPIListTypes; +import org.brapi.v2.model.core.response.BrAPIListsSingleResponse; +import org.brapi.v2.model.germ.BrAPIGermplasm; +import org.brapi.v2.model.pheno.BrAPIObservationVariable; +import org.breedinginsight.brapi.v2.dao.BrAPIGermplasmDAO; +import org.breedinginsight.brapps.importer.daos.*; +import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; +import org.breedinginsight.model.Program; +import org.breedinginsight.services.exceptions.DoesNotExistException; +import org.breedinginsight.utilities.Utilities; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Slf4j +@Singleton +public class BrAPIListService { + private final String referenceSource; + private final BrAPITrialDAO trialDAO; + private final BrAPIObservationDAO observationDAO; + private final BrAPIListDAO listDAO; + private final BrAPIObservationVariableDAO obsVarDAO; + private final BrAPIStudyDAO studyDAO; + private final BrAPISeasonDAO seasonDAO; + private final BrAPIObservationUnitDAO ouDAO; + private final BrAPIGermplasmDAO germplasmDAO; + + @Inject + public BrAPIListService(@Property(name = "brapi.server.reference-source") String referenceSource, + BrAPITrialDAO trialDAO, + BrAPIObservationDAO observationDAO, + BrAPIListDAO listDAO, + BrAPIObservationVariableDAO obsVarDAO, + BrAPIStudyDAO studyDAO, + BrAPISeasonDAO seasonDAO, + BrAPIObservationUnitDAO ouDAO, + BrAPIGermplasmDAO germplasmDAO) { + + this.referenceSource = referenceSource; + this.trialDAO = trialDAO; + this.observationDAO = observationDAO; + this.listDAO = listDAO; + this.obsVarDAO = obsVarDAO; + this.studyDAO = studyDAO; + this.seasonDAO = seasonDAO; + this.ouDAO = ouDAO; + this.germplasmDAO = germplasmDAO; + } + + public List getListSummariesByTypeAndXref( + BrAPIListTypes type, + ExternalReferenceSource xrefSource, + UUID xrefId, + Program program) throws ApiException, DoesNotExistException, ClassNotFoundException { + List lists = listDAO.getListByTypeAndExternalRef( + type, + program.getId(), + String.format("%s/%s", referenceSource, xrefSource.getName()), + xrefId); + if (lists == null || lists.isEmpty()) { + throw new DoesNotExistException("list not returned from BrAPI service"); + } + + for (BrAPIListSummary list: lists) { + + // remove the program key from the list name + list.setListName(Utilities.removeProgramKeyAndUnknownAdditionalData(list.getListName(), program.getKey())); + + // set the owner of the list items as the list owner + BrAPIListsSingleResponse listDetails = listDAO.getListById(list.getListDbId(), program.getId()); + List listItemNames = listDetails.getResult().getData(); + String createdBy; + switch (type) { + case OBSERVATIONVARIABLES: + createdBy = obsVarDAO.getVariableByName(listItemNames, program.getId()).get(0) + .getAdditionalInfo() + .getAsJsonObject("createdBy") + .get("userName") + .getAsString(); + break; + case GERMPLASM: + default: + createdBy = germplasmDAO.getGermplasmByRawName(listItemNames, program.getId()).get(0) + .getAdditionalInfo() + .getAsJsonObject("createdBy") + .get("userName") + .getAsString(); + } + list.setListOwnerName(createdBy); + } + + return lists; + } +} diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index c66671355..6e3556b10 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -267,6 +267,25 @@ private void addObsVarDataToRow( } } + public List getListDetailsByTypeAndXref( + BrAPIListTypes type, + ExternalReferenceSource xrefObject, + String xrefId, + Program program) throws ApiException, DoesNotExistException { + List lists = listDAO.getListByTypeAndExternalRef( + type, + program.getId(), + String.format("%s/%s", referenceSource, xrefObject.getName()), + UUID.fromString(xrefId)); + if (lists == null || lists.isEmpty()) { + throw new DoesNotExistException("Dataset observation variables list not returned from BrAPI service"); + } + String listDbId = lists.get(0).getListDbId(); + BrAPIListsSingleResponse list = listDAO.getListById(listDbId, program.getId()); + List obsVarNames = list.getResult().getData(); + return obsVarDAO.getVariableByName(obsVarNames, program.getId()); + } + public List getDatasetObsVars(String datasetId, Program program) throws ApiException, DoesNotExistException { List lists = listDAO.getListByTypeAndExternalRef( BrAPIListTypes.OBSERVATIONVARIABLES, diff --git a/src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java b/src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java index a8155864d..b1d63f530 100644 --- a/src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java +++ b/src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java @@ -3,6 +3,7 @@ import lombok.Getter; import lombok.Setter; import org.brapi.v2.model.core.BrAPIListSummary; +import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import javax.inject.Singleton; import java.time.OffsetDateTime; From 9d7dfbd4627569e8bd2fc91dd9c18d2245490a13 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:59:22 -0400 Subject: [PATCH 04/13] create Dataset class --- .../brapi/v2/ListController.java | 2 +- .../org/breedinginsight/model/Dataset.java | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/breedinginsight/model/Dataset.java diff --git a/src/main/java/org/breedinginsight/brapi/v2/ListController.java b/src/main/java/org/breedinginsight/brapi/v2/ListController.java index 05c47834d..2dcdd72f7 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ListController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ListController.java @@ -95,7 +95,7 @@ public HttpResponse getLists(@PathVariable("programId") UUID programId, HttpRequ } List brapiLists = listService.getListSummariesByTypeAndXref(type, source, id, program); SearchRequest searchRequest = queryParams.constructSearchRequest(); - + return ResponseUtils.getBrapiQueryResponse(brapiLists, listQueryMapper, queryParams, searchRequest); } catch (IllegalArgumentException e) { diff --git a/src/main/java/org/breedinginsight/model/Dataset.java b/src/main/java/org/breedinginsight/model/Dataset.java new file mode 100644 index 000000000..1ec2843d0 --- /dev/null +++ b/src/main/java/org/breedinginsight/model/Dataset.java @@ -0,0 +1,28 @@ +package org.breedinginsight.model; + +import com.google.gson.JsonObject; +import org.brapi.v2.model.pheno.BrAPIObservation; +import org.brapi.v2.model.pheno.BrAPIObservationUnit; +import org.brapi.v2.model.pheno.BrAPIObservationVariable; +import java.util.List; + +public class Dataset { + public String experimentId; + public JsonObject additionalInfo; + public List data; + public List observationUnits; + public List observationVariables; + + public Dataset( + String experimentId, + JsonObject additionalInfo, + List data, + List observationUnits, + List observationVariables) { + this.experimentId = experimentId; + this.additionalInfo = additionalInfo; + this.data = data; + this.observationUnits = observationUnits; + this.observationVariables = observationVariables; + } +} From 3cb7a95a17610e348fe41a7190c3fe7446ed3458 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Wed, 21 Jun 2023 10:47:16 -0400 Subject: [PATCH 05/13] add GET /dataset/{datasetId}{?stats} to ExperimentController --- .../brapi/v2/ExperimentController.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java b/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java index 4e4a67f18..e016a9b13 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java @@ -21,6 +21,7 @@ import org.breedinginsight.brapi.v2.model.request.query.ExperimentExportQuery; import org.breedinginsight.brapi.v2.model.request.query.ExperimentQuery; import org.breedinginsight.brapi.v2.services.BrAPITrialService; +import org.breedinginsight.model.Dataset; import org.breedinginsight.model.DownloadFile; import org.breedinginsight.model.Program; import org.breedinginsight.services.ProgramService; @@ -108,9 +109,26 @@ public HttpResponse datasetExport( HttpResponse response = HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, downloadErrorMessage).contentType(MediaType.TEXT_PLAIN).body(downloadErrorMessage); return response; } - - } + @Get("/${micronaut.bi.api.version}/programs/{programId}/experiments/{experimentId}/dataset/{datasetId}{?stats=[true|false]}") + @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) + @Produces(MediaType.APPLICATION_JSON) + public HttpResponse> getDatasetData( + @PathVariable("programId") UUID programId, + @PathVariable("experimentId") UUID experimentId, + @PathVariable("datasetId") UUID datasetId, + @QueryValue(defaultValue = "false") Boolean stats) { + String downloadErrorMessage = "An error occurred while fetching the dataset. Contact the development team at bidevteam@cornell.edu."; + try { + Program program = programService.getById(programId).orElseThrow(() -> new DoesNotExistException("Program does not exist")); + Response response = new Response(experimentService.getDatasetData(program, experimentId, datasetId, stats)); + return HttpResponse.ok(response); + } catch (Exception e) { + log.info(e.getMessage(), e); + HttpResponse response = HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, downloadErrorMessage).contentType(MediaType.TEXT_PLAIN).body(downloadErrorMessage); + return response; + } + } } From 0d9a34026b91559e2c1aee79ad824d6e1ca7e73d Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Wed, 21 Jun 2023 20:38:57 -0400 Subject: [PATCH 06/13] add method TrialService::getDatasetData --- .../brapi/v2/services/BrAPITrialService.java | 27 +++++++++++++++++++ .../org/breedinginsight/model/Dataset.java | 23 ++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index 6e3556b10..6614c5b9b 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -22,6 +22,7 @@ import org.breedinginsight.model.Column; import org.breedinginsight.model.DownloadFile; import org.breedinginsight.model.Program; +import org.breedinginsight.model.*; import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.services.parsers.experiment.ExperimentFileColumns; import org.breedinginsight.services.writers.CSVWriter; @@ -198,6 +199,32 @@ public DownloadFile exportObservations( return new DownloadFile(fileName, downloadFile); } + public Dataset getDatasetData(Program program, UUID experimentId, UUID datsetId, Boolean stats) throws ApiException, DoesNotExistException { + BrAPITrial experiment = this.getExperiment(program, experimentId); + List expOUs = ouDAO.getObservationUnitsForTrialDbId(program.getId(), experiment.getTrialDbId()); + List datasetObsVars = getDatasetObsVars(datsetId.toString(), program); + List ouDbIds = expOUs.stream().map(BrAPIObservationUnit::getObservationUnitDbId).collect(Collectors.toList()); + List obsVarDbIds = datasetObsVars.stream().map(BrAPIObservationVariable::getObservationVariableDbId).collect(Collectors.toList()); + List data = observationDAO.getObservationsByObservationUnitsAndVariables(ouDbIds, obsVarDbIds, program); + Set datasetOUDbIds = data.stream().map(BrAPIObservation::getObservationUnitDbId).collect(Collectors.toSet()); + List datasetOUs = expOUs.stream().filter(unit -> datasetOUDbIds.contains(unit.getObservationUnitDbId())).collect(Collectors.toList()); + Dataset dataset = new Dataset(experimentId.toString(), data, datasetOUs, datasetObsVars); + if (stats) { + Integer ouCount = datasetOUs.size(); + Integer obsVarCount = datasetObsVars.size(); + Integer obsCount = ouCount * obsVarCount; + Integer obsDataCount = data.size(); + Integer emptyDataCount = obsCount - obsDataCount; + dataset = dataset.setStat(Dataset.DatasetStat.OBSERVATION_UNITS, ouCount) + .setStat(Dataset.DatasetStat.PHENOTYPES, obsVarCount) + .setStat(Dataset.DatasetStat.OBSERVATIONS, obsCount) + .setStat(Dataset.DatasetStat.OBSERVATIONS_WITH_DATA, obsDataCount) + .setStat(Dataset.DatasetStat.OBSERVATIONS_WITHOUT_DATA, emptyDataCount); + } + + return dataset; + } + private void addBrAPIObsToRecords( List dataset, BrAPITrial experiment, diff --git a/src/main/java/org/breedinginsight/model/Dataset.java b/src/main/java/org/breedinginsight/model/Dataset.java index 1ec2843d0..bcc8b357a 100644 --- a/src/main/java/org/breedinginsight/model/Dataset.java +++ b/src/main/java/org/breedinginsight/model/Dataset.java @@ -4,6 +4,7 @@ import org.brapi.v2.model.pheno.BrAPIObservation; import org.brapi.v2.model.pheno.BrAPIObservationUnit; import org.brapi.v2.model.pheno.BrAPIObservationVariable; + import java.util.List; public class Dataset { @@ -13,16 +14,34 @@ public class Dataset { public List observationUnits; public List observationVariables; + public enum DatasetStat { + OBSERVATION_UNITS("observationUnits"), + PHENOTYPES("phenotypes"), + OBSERVATIONS("observations"), + OBSERVATIONS_WITH_DATA("observationsWithData"), + OBSERVATIONS_WITHOUT_DATA("observationsWithoutData"); + + private final String displayName; + DatasetStat(String value) { + this.displayName = value; + } + + } + public Dataset( String experimentId, - JsonObject additionalInfo, List data, List observationUnits, List observationVariables) { this.experimentId = experimentId; - this.additionalInfo = additionalInfo; + this.additionalInfo = new JsonObject(); this.data = data; this.observationUnits = observationUnits; this.observationVariables = observationVariables; } + + public Dataset setStat(DatasetStat stat, Integer count) { + this.additionalInfo.addProperty(stat.displayName, count); + return this; + } } From 91aedbfe876b7b374b4d492f8920ffbaab3a40ed Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Thu, 22 Jun 2023 09:43:46 -0400 Subject: [PATCH 07/13] update stats calculation --- .../brapi/v2/services/BrAPITrialService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index 6614c5b9b..c94503d92 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -206,11 +206,11 @@ public Dataset getDatasetData(Program program, UUID experimentId, UUID datsetId, List ouDbIds = expOUs.stream().map(BrAPIObservationUnit::getObservationUnitDbId).collect(Collectors.toList()); List obsVarDbIds = datasetObsVars.stream().map(BrAPIObservationVariable::getObservationVariableDbId).collect(Collectors.toList()); List data = observationDAO.getObservationsByObservationUnitsAndVariables(ouDbIds, obsVarDbIds, program); - Set datasetOUDbIds = data.stream().map(BrAPIObservation::getObservationUnitDbId).collect(Collectors.toSet()); - List datasetOUs = expOUs.stream().filter(unit -> datasetOUDbIds.contains(unit.getObservationUnitDbId())).collect(Collectors.toList()); - Dataset dataset = new Dataset(experimentId.toString(), data, datasetOUs, datasetObsVars); + //Set datasetOUDbIds = data.stream().map(BrAPIObservation::getObservationUnitDbId).collect(Collectors.toSet()); + //List datasetOUs = expOUs.stream().filter(unit -> datasetOUDbIds.contains(unit.getObservationUnitDbId())).collect(Collectors.toList()); + Dataset dataset = new Dataset(experimentId.toString(), data, expOUs, datasetObsVars); if (stats) { - Integer ouCount = datasetOUs.size(); + Integer ouCount = expOUs.size(); Integer obsVarCount = datasetObsVars.size(); Integer obsCount = ouCount * obsVarCount; Integer obsDataCount = data.size(); From f031a95e1be2dad97398bd2600f125b38fcc0b3f Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Fri, 23 Jun 2023 13:33:21 -0400 Subject: [PATCH 08/13] fix querymapper --- .../brapi/v2/ExperimentController.java | 2 +- .../brapi/v2/ListController.java | 11 ++++++---- .../v2/model/request/query/ListQuery.java | 4 ++-- .../brapi/v2/services/BrAPIListService.java | 11 +++------- .../brapi/v2/services/BrAPITrialService.java | 2 ++ .../services/ExternalReferenceSource.java | 2 +- .../response/mappers/ListQueryMapper.java | 20 ++++++++++++++++++- 7 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java b/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java index e016a9b13..6e7ebedcd 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ExperimentController.java @@ -111,7 +111,7 @@ public HttpResponse datasetExport( } } - @Get("/${micronaut.bi.api.version}/programs/{programId}/experiments/{experimentId}/dataset/{datasetId}{?stats=[true|false]}") + @Get("/${micronaut.bi.api.version}/programs/{programId}/experiments/{experimentId}/dataset/{datasetId}{?stats}") @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) @Produces(MediaType.APPLICATION_JSON) public HttpResponse> getDatasetData( diff --git a/src/main/java/org/breedinginsight/brapi/v2/ListController.java b/src/main/java/org/breedinginsight/brapi/v2/ListController.java index 2dcdd72f7..aa14b8049 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ListController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ListController.java @@ -67,12 +67,11 @@ public ListController(ProgramService programService, BrAPIListService listServic this.listQueryMapper = listQueryMapper; } - //@Get(BrapiVersion.BRAPI_V2 + "/lists") @Get("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/lists{?queryParams*}") @Produces(MediaType.APPLICATION_JSON) @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) - public HttpResponse getLists(@PathVariable("programId") UUID programId, HttpRequest request, + public HttpResponse getLists(@PathVariable("programId") UUID programId, @QueryValue @QueryValid(using = ListQueryMapper.class) @Valid ListQuery queryParams ) throws DoesNotExistException, ApiException { try { @@ -81,8 +80,12 @@ public HttpResponse getLists(@PathVariable("programId") UUID programId, HttpRequ .orElseThrow(() -> new DoesNotExistException("Program does not exist")); // get germplasm lists by default - BrAPIListTypes type = queryParams.getListType() == null ? - BrAPIListTypes.GERMPLASM : queryParams.getListType(); +// BrAPIListTypes type = queryParams.getListType() == null || BrAPIListTypes.fromValue(queryParams.getListType()) == null ? +// BrAPIListTypes.GERMPLASM : BrAPIListTypes.fromValue(queryParams.getListType()); + BrAPIListTypes type = BrAPIListTypes.fromValue(queryParams.getListType()); + if (type == null) { + type = BrAPIListTypes.GERMPLASM; + } ExternalReferenceSource source = queryParams.getExternalReferenceSource() == null ? ExternalReferenceSource.PROGRAMS : queryParams.getExternalReferenceSource(); UUID id = queryParams.getExternalReferenceId() == null || queryParams.getExternalReferenceId().isBlank() ? diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java index cf144e59b..447c593a5 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java @@ -15,7 +15,7 @@ @Getter @Introspected public class ListQuery extends BrapiQuery { - private BrAPIListTypes listType; + private String listType; private String name; private String description; private String size; @@ -29,7 +29,7 @@ public class ListQuery extends BrapiQuery { public SearchRequest constructSearchRequest() { List filters = new ArrayList<>(); if (getListType() != null) { - filters.add(constructFilterRequest("type", getListType().name())); + filters.add(constructFilterRequest("type", getListType())); } if (!StringUtils.isBlank(getName())) { filters.add(constructFilterRequest("name", getName())); diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java index c8c28d364..5d11aaa99 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java @@ -79,24 +79,19 @@ public List getListSummariesByTypeAndXref( // set the owner of the list items as the list owner BrAPIListsSingleResponse listDetails = listDAO.getListById(list.getListDbId(), program.getId()); List listItemNames = listDetails.getResult().getData(); - String createdBy; switch (type) { case OBSERVATIONVARIABLES: - createdBy = obsVarDAO.getVariableByName(listItemNames, program.getId()).get(0) - .getAdditionalInfo() - .getAsJsonObject("createdBy") - .get("userName") - .getAsString(); break; case GERMPLASM: default: - createdBy = germplasmDAO.getGermplasmByRawName(listItemNames, program.getId()).get(0) + String createdBy = germplasmDAO.getGermplasmByRawName(listItemNames, program.getId()).get(0) .getAdditionalInfo() .getAsJsonObject("createdBy") .get("userName") .getAsString(); + list.setListOwnerName(createdBy); } - list.setListOwnerName(createdBy); + } return lists; diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index c94503d92..36b738028 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -201,6 +201,8 @@ public DownloadFile exportObservations( public Dataset getDatasetData(Program program, UUID experimentId, UUID datsetId, Boolean stats) throws ApiException, DoesNotExistException { BrAPITrial experiment = this.getExperiment(program, experimentId); + + // List expOUs = ouDAO.getObservationUnitsForTrialDbId(program.getId(), experiment.getTrialDbId()); List datasetObsVars = getDatasetObsVars(datsetId.toString(), program); List ouDbIds = expOUs.stream().map(BrAPIObservationUnit::getObservationUnitDbId).collect(Collectors.toList()); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/ExternalReferenceSource.java b/src/main/java/org/breedinginsight/brapps/importer/services/ExternalReferenceSource.java index aa2fd1d75..9e95bfd41 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/ExternalReferenceSource.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/ExternalReferenceSource.java @@ -13,7 +13,7 @@ public enum ExternalReferenceSource { private String name; - ExternalReferenceSource(String name) { + private ExternalReferenceSource(String name) { this.name = name; } } diff --git a/src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java b/src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java index b1d63f530..05c5a6ba4 100644 --- a/src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java +++ b/src/main/java/org/breedinginsight/utilities/response/mappers/ListQueryMapper.java @@ -3,13 +3,17 @@ import lombok.Getter; import lombok.Setter; import org.brapi.v2.model.core.BrAPIListSummary; +import org.breedinginsight.brapps.importer.model.base.ExternalReference; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import javax.inject.Singleton; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.function.Function; +import java.util.stream.Collectors; @Getter @Singleton @@ -37,7 +41,21 @@ public ListQueryMapper() { return dateCreated; }), Map.entry("ownerName", BrAPIListSummary::getListOwnerName), - Map.entry("type", BrAPIListSummary::getListType) + Map.entry("type", BrAPIListSummary::getListType), + Map.entry("externalReferenceSource", (summary) -> { + return summary + .getExternalReferences() + .stream() + .map(xref -> xref.getReferenceSource()) + .collect(Collectors.toList()); + }), + Map.entry("externalReferenceId", (summary) -> { + return summary + .getExternalReferences() + .stream() + .map(xref -> xref.getReferenceID()) + .collect(Collectors.toList()); + }) ); } From f74dcddfd73d0641f77ff32382d6ed2af69941a9 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Fri, 23 Jun 2023 14:33:56 -0400 Subject: [PATCH 09/13] cleanup code --- .../brapi/v2/ListController.java | 15 +++++------- .../v2/model/request/query/ListQuery.java | 1 - .../brapi/v2/services/BrAPIListService.java | 22 ----------------- .../brapi/v2/services/BrAPITrialService.java | 24 ++----------------- 4 files changed, 8 insertions(+), 54 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/ListController.java b/src/main/java/org/breedinginsight/brapi/v2/ListController.java index aa14b8049..37f826073 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ListController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ListController.java @@ -17,7 +17,6 @@ package org.breedinginsight.brapi.v2; -import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.HttpStatus; import io.micronaut.http.MediaType; @@ -31,10 +30,11 @@ 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.v2.model.request.query.ListQuery; -import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; import org.breedinginsight.brapi.v2.services.BrAPIListService; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.model.Program; @@ -55,15 +55,13 @@ public class ListController { private final ProgramService programService; private final BrAPIListService listService; - private final BrAPIGermplasmService germplasmService; private final ListQueryMapper listQueryMapper; @Inject - public ListController(ProgramService programService, BrAPIListService listService, BrAPIGermplasmService germplasmService, + public ListController(ProgramService programService, BrAPIListService listService, ListQueryMapper listQueryMapper) { this.programService = programService; this.listService = listService; - this.germplasmService = germplasmService; this.listQueryMapper = listQueryMapper; } @@ -71,8 +69,9 @@ public ListController(ProgramService programService, BrAPIListService listServic @Get("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/lists{?queryParams*}") @Produces(MediaType.APPLICATION_JSON) @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) - public HttpResponse getLists(@PathVariable("programId") UUID programId, - @QueryValue @QueryValid(using = ListQueryMapper.class) @Valid ListQuery queryParams + public HttpResponse>> getLists( + @PathVariable("programId") UUID programId, + @QueryValue @QueryValid(using = ListQueryMapper.class) @Valid ListQuery queryParams ) throws DoesNotExistException, ApiException { try { Program program = programService @@ -80,8 +79,6 @@ public HttpResponse getLists(@PathVariable("programId") UUID programId, .orElseThrow(() -> new DoesNotExistException("Program does not exist")); // get germplasm lists by default -// BrAPIListTypes type = queryParams.getListType() == null || BrAPIListTypes.fromValue(queryParams.getListType()) == null ? -// BrAPIListTypes.GERMPLASM : BrAPIListTypes.fromValue(queryParams.getListType()); BrAPIListTypes type = BrAPIListTypes.fromValue(queryParams.getListType()); if (type == null) { type = BrAPIListTypes.GERMPLASM; diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java index 447c593a5..4e2783b36 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java @@ -2,7 +2,6 @@ import io.micronaut.core.annotation.Introspected; import lombok.Getter; -import org.brapi.v2.model.core.BrAPIListTypes; 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; diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java index 5d11aaa99..d1006e417 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java @@ -3,12 +3,9 @@ import io.micronaut.context.annotation.Property; import lombok.extern.slf4j.Slf4j; import org.brapi.client.v2.model.exceptions.ApiException; -import org.brapi.v2.model.BrAPIExternalReference; import org.brapi.v2.model.core.BrAPIListSummary; import org.brapi.v2.model.core.BrAPIListTypes; import org.brapi.v2.model.core.response.BrAPIListsSingleResponse; -import org.brapi.v2.model.germ.BrAPIGermplasm; -import org.brapi.v2.model.pheno.BrAPIObservationVariable; import org.breedinginsight.brapi.v2.dao.BrAPIGermplasmDAO; import org.breedinginsight.brapps.importer.daos.*; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; @@ -18,7 +15,6 @@ import javax.inject.Inject; import javax.inject.Singleton; -import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -26,34 +22,16 @@ @Singleton public class BrAPIListService { private final String referenceSource; - private final BrAPITrialDAO trialDAO; - private final BrAPIObservationDAO observationDAO; private final BrAPIListDAO listDAO; - private final BrAPIObservationVariableDAO obsVarDAO; - private final BrAPIStudyDAO studyDAO; - private final BrAPISeasonDAO seasonDAO; - private final BrAPIObservationUnitDAO ouDAO; private final BrAPIGermplasmDAO germplasmDAO; @Inject public BrAPIListService(@Property(name = "brapi.server.reference-source") String referenceSource, - BrAPITrialDAO trialDAO, - BrAPIObservationDAO observationDAO, BrAPIListDAO listDAO, - BrAPIObservationVariableDAO obsVarDAO, - BrAPIStudyDAO studyDAO, - BrAPISeasonDAO seasonDAO, - BrAPIObservationUnitDAO ouDAO, BrAPIGermplasmDAO germplasmDAO) { this.referenceSource = referenceSource; - this.trialDAO = trialDAO; - this.observationDAO = observationDAO; this.listDAO = listDAO; - this.obsVarDAO = obsVarDAO; - this.studyDAO = studyDAO; - this.seasonDAO = seasonDAO; - this.ouDAO = ouDAO; this.germplasmDAO = germplasmDAO; } diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index 36b738028..9198e160d 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -202,14 +202,13 @@ public DownloadFile exportObservations( public Dataset getDatasetData(Program program, UUID experimentId, UUID datsetId, Boolean stats) throws ApiException, DoesNotExistException { BrAPITrial experiment = this.getExperiment(program, experimentId); - // + // TODO: Once BI-1831 is complete and OUs in a dataset can be identified using the datasetId stored as a xref + // the expOUs needs to be replaced with datasetOUs, as was done with datasetObsVars List expOUs = ouDAO.getObservationUnitsForTrialDbId(program.getId(), experiment.getTrialDbId()); List datasetObsVars = getDatasetObsVars(datsetId.toString(), program); List ouDbIds = expOUs.stream().map(BrAPIObservationUnit::getObservationUnitDbId).collect(Collectors.toList()); List obsVarDbIds = datasetObsVars.stream().map(BrAPIObservationVariable::getObservationVariableDbId).collect(Collectors.toList()); List data = observationDAO.getObservationsByObservationUnitsAndVariables(ouDbIds, obsVarDbIds, program); - //Set datasetOUDbIds = data.stream().map(BrAPIObservation::getObservationUnitDbId).collect(Collectors.toSet()); - //List datasetOUs = expOUs.stream().filter(unit -> datasetOUDbIds.contains(unit.getObservationUnitDbId())).collect(Collectors.toList()); Dataset dataset = new Dataset(experimentId.toString(), data, expOUs, datasetObsVars); if (stats) { Integer ouCount = expOUs.size(); @@ -296,25 +295,6 @@ private void addObsVarDataToRow( } } - public List getListDetailsByTypeAndXref( - BrAPIListTypes type, - ExternalReferenceSource xrefObject, - String xrefId, - Program program) throws ApiException, DoesNotExistException { - List lists = listDAO.getListByTypeAndExternalRef( - type, - program.getId(), - String.format("%s/%s", referenceSource, xrefObject.getName()), - UUID.fromString(xrefId)); - if (lists == null || lists.isEmpty()) { - throw new DoesNotExistException("Dataset observation variables list not returned from BrAPI service"); - } - String listDbId = lists.get(0).getListDbId(); - BrAPIListsSingleResponse list = listDAO.getListById(listDbId, program.getId()); - List obsVarNames = list.getResult().getData(); - return obsVarDAO.getVariableByName(obsVarNames, program.getId()); - } - public List getDatasetObsVars(String datasetId, Program program) throws ApiException, DoesNotExistException { List lists = listDAO.getListByTypeAndExternalRef( BrAPIListTypes.OBSERVATIONVARIABLES, From 271a302453cf6eaf9b033e96d9f2dfc0d3771cff Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Thu, 6 Jul 2023 11:18:23 -0400 Subject: [PATCH 10/13] respond to comments --- .../brapi/v2/BrAPIV2Controller.java | 17 +------------ .../brapi/v2/ListController.java | 6 ++--- .../v2/model/request/query/ListQuery.java | 4 ++-- .../brapi/v2/services/BrAPIListService.java | 24 +++++++++++++------ 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java index 9770570d9..0dcaa029b 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java @@ -27,29 +27,19 @@ import io.micronaut.security.rules.SecurityRule; import lombok.extern.slf4j.Slf4j; import okhttp3.*; -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.BrAPIServerInfoResponse; import org.breedinginsight.api.auth.AuthenticatedUser; import org.breedinginsight.api.auth.ProgramSecured; import org.breedinginsight.api.auth.ProgramSecuredRoleGroup; import org.breedinginsight.api.auth.SecurityService; -import org.breedinginsight.api.model.v1.request.query.SearchRequest; -import org.breedinginsight.api.model.v1.validators.QueryValid; import org.breedinginsight.brapi.v1.controller.BrapiVersion; -import org.breedinginsight.brapi.v2.model.request.query.ListQuery; -import org.breedinginsight.utilities.response.mappers.ListQueryMapper; -import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; import org.breedinginsight.model.ProgramBrAPIEndpoints; import org.breedinginsight.services.ProgramService; import org.breedinginsight.services.exceptions.DoesNotExistException; -import org.breedinginsight.utilities.response.ResponseUtils; import javax.inject.Inject; -import javax.validation.Valid; import java.io.IOException; -import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -60,16 +50,11 @@ public class BrAPIV2Controller { private final SecurityService securityService; private final ProgramService programService; - private final BrAPIGermplasmService germplasmService; - private ListQueryMapper listQueryMapper; @Inject - public BrAPIV2Controller(SecurityService securityService, ProgramService programService, BrAPIGermplasmService germplasmService, - ListQueryMapper listQueryMapper) { + public BrAPIV2Controller(SecurityService securityService, ProgramService programService) { this.securityService = securityService; this.programService = programService; - this.germplasmService = germplasmService; - this.listQueryMapper = listQueryMapper; } diff --git a/src/main/java/org/breedinginsight/brapi/v2/ListController.java b/src/main/java/org/breedinginsight/brapi/v2/ListController.java index 37f826073..8852fdee4 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ListController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ListController.java @@ -83,8 +83,8 @@ public HttpResponse>> getLists( if (type == null) { type = BrAPIListTypes.GERMPLASM; } - ExternalReferenceSource source = queryParams.getExternalReferenceSource() == null ? - ExternalReferenceSource.PROGRAMS : queryParams.getExternalReferenceSource(); + String source = queryParams.getExternalReferenceSource() == null ? + ExternalReferenceSource.PROGRAMS.getName() : queryParams.getExternalReferenceSource(); UUID id = queryParams.getExternalReferenceId() == null || queryParams.getExternalReferenceId().isBlank() ? programId : UUID.fromString(queryParams.getExternalReferenceId()); @@ -93,7 +93,7 @@ public HttpResponse>> getLists( if (dateFormatParam != null) { listQueryMapper.setDateDisplayFormat(dateFormatParam); } - List brapiLists = listService.getListSummariesByTypeAndXref(type, source, id, program); + List brapiLists = listService.getListSummariesByTypeAndXref(type, source, id.toString(), program); SearchRequest searchRequest = queryParams.constructSearchRequest(); return ResponseUtils.getBrapiQueryResponse(brapiLists, listQueryMapper, queryParams, searchRequest); diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java index 4e2783b36..c1b9c6f33 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ListQuery.java @@ -18,7 +18,7 @@ public class ListQuery extends BrapiQuery { private String name; private String description; private String size; - private ExternalReferenceSource externalReferenceSource; + private String externalReferenceSource; private String externalReferenceId; private String dateCreated; private String ownerName; @@ -40,7 +40,7 @@ public SearchRequest constructSearchRequest() { filters.add(constructFilterRequest("size", getSize())); } if (getExternalReferenceSource() != null) { - filters.add(constructFilterRequest("externalReferenceSource", getExternalReferenceSource().getName())); + filters.add(constructFilterRequest("externalReferenceSource", getExternalReferenceSource())); } if (!StringUtils.isBlank(getExternalReferenceId())) { filters.add(constructFilterRequest("externalReferenceId", getExternalReferenceId())); diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java index d1006e417..376f39fa4 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java @@ -3,6 +3,7 @@ import io.micronaut.context.annotation.Property; import lombok.extern.slf4j.Slf4j; import org.brapi.client.v2.model.exceptions.ApiException; +import org.brapi.v2.model.BrAPIExternalReference; import org.brapi.v2.model.core.BrAPIListSummary; import org.brapi.v2.model.core.BrAPIListTypes; import org.brapi.v2.model.core.response.BrAPIListsSingleResponse; @@ -16,7 +17,9 @@ import javax.inject.Inject; import javax.inject.Singleton; import java.util.List; +import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; @Slf4j @Singleton @@ -37,19 +40,26 @@ public BrAPIListService(@Property(name = "brapi.server.reference-source") String public List getListSummariesByTypeAndXref( BrAPIListTypes type, - ExternalReferenceSource xrefSource, - UUID xrefId, + String xrefSource, + String xrefId, Program program) throws ApiException, DoesNotExistException, ClassNotFoundException { List lists = listDAO.getListByTypeAndExternalRef( type, program.getId(), - String.format("%s/%s", referenceSource, xrefSource.getName()), - xrefId); - if (lists == null || lists.isEmpty()) { + String.format("%s/%s", referenceSource, xrefSource), + UUID.fromString(xrefId)); + if (lists == null) { throw new DoesNotExistException("list not returned from BrAPI service"); } - for (BrAPIListSummary list: lists) { + List programLists = lists.stream().filter(list -> { + Optional programXrefOptional = Utilities.getExternalReference(list.getExternalReferences(),Utilities.generateReferenceSource(referenceSource, ExternalReferenceSource.PROGRAMS)); + if (programXrefOptional.isEmpty() || !programXrefOptional.get().getReferenceID().equals(program.getId())) { + return false; + } + return true; + }).collect(Collectors.toList()); + for (BrAPIListSummary list: programLists) { // remove the program key from the list name list.setListName(Utilities.removeProgramKeyAndUnknownAdditionalData(list.getListName(), program.getKey())); @@ -72,6 +82,6 @@ public List getListSummariesByTypeAndXref( } - return lists; + return programLists; } } From 3a4478293f8487a94d8919f8362a7677e7f61471 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Mon, 10 Jul 2023 14:47:17 -0400 Subject: [PATCH 11/13] fix program filter in list fetch --- .../org/breedinginsight/brapi/v2/services/BrAPIListService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java index 376f39fa4..7bcebb914 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java @@ -54,7 +54,7 @@ public List getListSummariesByTypeAndXref( List programLists = lists.stream().filter(list -> { Optional programXrefOptional = Utilities.getExternalReference(list.getExternalReferences(),Utilities.generateReferenceSource(referenceSource, ExternalReferenceSource.PROGRAMS)); - if (programXrefOptional.isEmpty() || !programXrefOptional.get().getReferenceID().equals(program.getId())) { + if (programXrefOptional.isEmpty() || !programXrefOptional.get().getReferenceID().equals(program.getId().toString())) { return false; } return true; From 38bf53ec055831c09e519e6810fc5cdda9b299dc Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Tue, 11 Jul 2023 16:39:50 -0400 Subject: [PATCH 12/13] respond to comment --- .../org/breedinginsight/brapi/v2/ListController.java | 9 +++++++-- .../brapi/v2/services/BrAPIListService.java | 7 ++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/ListController.java b/src/main/java/org/breedinginsight/brapi/v2/ListController.java index 8852fdee4..2ab5a4a68 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ListController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ListController.java @@ -17,6 +17,7 @@ package org.breedinginsight.brapi.v2; +import io.micronaut.context.annotation.Property; import io.micronaut.http.HttpResponse; import io.micronaut.http.HttpStatus; import io.micronaut.http.MediaType; @@ -56,13 +57,16 @@ public class ListController { private final ProgramService programService; private final BrAPIListService listService; private final ListQueryMapper listQueryMapper; + private final String referenceSource; @Inject public ListController(ProgramService programService, BrAPIListService listService, - ListQueryMapper listQueryMapper) { + ListQueryMapper listQueryMapper, + @Property(name = "brapi.server.reference-source") String referenceSource) { this.programService = programService; this.listService = listService; this.listQueryMapper = listQueryMapper; + this.referenceSource = referenceSource; } //@Get(BrapiVersion.BRAPI_V2 + "/lists") @@ -84,7 +88,8 @@ public HttpResponse>> getLists( type = BrAPIListTypes.GERMPLASM; } String source = queryParams.getExternalReferenceSource() == null ? - ExternalReferenceSource.PROGRAMS.getName() : queryParams.getExternalReferenceSource(); + String.format("%s/%s", referenceSource, ExternalReferenceSource.PROGRAMS.getName()) : + queryParams.getExternalReferenceSource(); UUID id = queryParams.getExternalReferenceId() == null || queryParams.getExternalReferenceId().isBlank() ? programId : UUID.fromString(queryParams.getExternalReferenceId()); diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java index 7bcebb914..92791c304 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java @@ -46,7 +46,7 @@ public List getListSummariesByTypeAndXref( List lists = listDAO.getListByTypeAndExternalRef( type, program.getId(), - String.format("%s/%s", referenceSource, xrefSource), + xrefSource, UUID.fromString(xrefId)); if (lists == null) { throw new DoesNotExistException("list not returned from BrAPI service"); @@ -54,10 +54,7 @@ public List getListSummariesByTypeAndXref( List programLists = lists.stream().filter(list -> { Optional programXrefOptional = Utilities.getExternalReference(list.getExternalReferences(),Utilities.generateReferenceSource(referenceSource, ExternalReferenceSource.PROGRAMS)); - if (programXrefOptional.isEmpty() || !programXrefOptional.get().getReferenceID().equals(program.getId().toString())) { - return false; - } - return true; + return programXrefOptional.isPresent() && programXrefOptional.get().getReferenceID().equals(program.getId().toString()); }).collect(Collectors.toList()); for (BrAPIListSummary list: programLists) { From 84e14c735a8606f3ad83be91665cc7d0477244c6 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Tue, 18 Jul 2023 13:07:58 -0400 Subject: [PATCH 13/13] remove default settings for xref params --- .../brapi/v2/ListController.java | 22 +++++++++---------- .../brapi/v2/services/BrAPIListService.java | 18 ++++++++++----- .../brapps/importer/daos/BrAPIListDAO.java | 12 ++++++++++ 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/ListController.java b/src/main/java/org/breedinginsight/brapi/v2/ListController.java index 2ab5a4a68..59caa8a47 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ListController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ListController.java @@ -17,7 +17,6 @@ package org.breedinginsight.brapi.v2; -import io.micronaut.context.annotation.Property; import io.micronaut.http.HttpResponse; import io.micronaut.http.HttpStatus; import io.micronaut.http.MediaType; @@ -37,7 +36,6 @@ import org.breedinginsight.brapi.v1.controller.BrapiVersion; import org.breedinginsight.brapi.v2.model.request.query.ListQuery; import org.breedinginsight.brapi.v2.services.BrAPIListService; -import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.model.Program; import org.breedinginsight.services.ProgramService; import org.breedinginsight.services.exceptions.DoesNotExistException; @@ -57,16 +55,13 @@ public class ListController { private final ProgramService programService; private final BrAPIListService listService; private final ListQueryMapper listQueryMapper; - private final String referenceSource; @Inject public ListController(ProgramService programService, BrAPIListService listService, - ListQueryMapper listQueryMapper, - @Property(name = "brapi.server.reference-source") String referenceSource) { + ListQueryMapper listQueryMapper) { this.programService = programService; this.listService = listService; this.listQueryMapper = listQueryMapper; - this.referenceSource = referenceSource; } //@Get(BrapiVersion.BRAPI_V2 + "/lists") @@ -87,18 +82,21 @@ public HttpResponse>> getLists( if (type == null) { type = BrAPIListTypes.GERMPLASM; } - String source = queryParams.getExternalReferenceSource() == null ? - String.format("%s/%s", referenceSource, ExternalReferenceSource.PROGRAMS.getName()) : - queryParams.getExternalReferenceSource(); - UUID id = queryParams.getExternalReferenceId() == null || queryParams.getExternalReferenceId().isBlank() ? - programId : UUID.fromString(queryParams.getExternalReferenceId()); + String source = null; + String id = null; + if (queryParams.getExternalReferenceSource() != null && !queryParams.getExternalReferenceSource().isEmpty()) { + source = queryParams.getExternalReferenceSource(); + } + if (queryParams.getExternalReferenceId() != null && !queryParams.getExternalReferenceId().isEmpty()) { + id = queryParams.getExternalReferenceId(); + } // If the date display format was sent as a query param, then update the query mapper. String dateFormatParam = queryParams.getDateDisplayFormat(); if (dateFormatParam != null) { listQueryMapper.setDateDisplayFormat(dateFormatParam); } - List brapiLists = listService.getListSummariesByTypeAndXref(type, source, id.toString(), program); + List brapiLists = listService.getListSummariesByTypeAndXref(type, source, id, program); SearchRequest searchRequest = queryParams.constructSearchRequest(); return ResponseUtils.getBrapiQueryResponse(brapiLists, listQueryMapper, queryParams, searchRequest); diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java index 92791c304..7d69e831a 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java @@ -6,6 +6,7 @@ import org.brapi.v2.model.BrAPIExternalReference; import org.brapi.v2.model.core.BrAPIListSummary; import org.brapi.v2.model.core.BrAPIListTypes; +import org.brapi.v2.model.core.request.BrAPIListSearchRequest; import org.brapi.v2.model.core.response.BrAPIListsSingleResponse; import org.breedinginsight.brapi.v2.dao.BrAPIGermplasmDAO; import org.breedinginsight.brapps.importer.daos.*; @@ -16,6 +17,7 @@ import javax.inject.Inject; import javax.inject.Singleton; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -43,11 +45,17 @@ public List getListSummariesByTypeAndXref( String xrefSource, String xrefId, Program program) throws ApiException, DoesNotExistException, ClassNotFoundException { - List lists = listDAO.getListByTypeAndExternalRef( - type, - program.getId(), - xrefSource, - UUID.fromString(xrefId)); + BrAPIListSearchRequest searchRequest = new BrAPIListSearchRequest(); + if (type != null) { + searchRequest.listType(type); + } + if (xrefSource != null && !xrefSource.isEmpty()) { + searchRequest.externalReferenceSources(List.of(xrefSource)); + } + if (xrefId != null && !xrefId.isEmpty()) { + searchRequest.externalReferenceIDs(List.of(xrefId)); + } + List lists = listDAO.getListBySearch(searchRequest, program.getId()); if (lists == null) { throw new DoesNotExistException("list not returned from BrAPI service"); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/daos/BrAPIListDAO.java b/src/main/java/org/breedinginsight/brapps/importer/daos/BrAPIListDAO.java index a919fcf8d..cb24fd745 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/daos/BrAPIListDAO.java +++ b/src/main/java/org/breedinginsight/brapps/importer/daos/BrAPIListDAO.java @@ -64,6 +64,18 @@ public BrAPIListsSingleResponse getListById(String listId, UUID programId) throw return response.getBody(); } + public List getListBySearch(@NotNull BrAPIListSearchRequest searchRequest, UUID programId) throws ApiException { + ListsApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(programId), ListsApi.class); + List programLists = brAPIDAOUtil.search(api::searchListsPost, api::searchListsSearchResultsDbIdGet, searchRequest); + if (searchRequest.getExternalReferenceSources() != null && searchRequest.getExternalReferenceIDs() != null) { + programLists = processListsForProgram(programLists, + UUID.fromString(searchRequest.getExternalReferenceIDs().get(0)), + searchRequest.getExternalReferenceSources().get(0)); + } + return programLists; + + } + public List getListByTypeAndExternalRef(@NotNull BrAPIListTypes listType, UUID programId, String externalReferenceSource, UUID externalReferenceId) throws ApiException { BrAPIListSearchRequest searchRequest = new BrAPIListSearchRequest() .externalReferenceIDs(List.of(externalReferenceId.toString()))