Skip to content
This repository was archived by the owner on Aug 1, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
6ee3f2d
Merge pull request #35 from Breeding-Insight/feature/BI-2304
mlm483 Oct 7, 2024
a2e74c4
Merge pull request #40 from Breeding-Insight/release/1.0
mlm483 Nov 8, 2024
25a54cf
Merge pull request #41 from Breeding-Insight/hackathon/delete-germplasm
dmeidlin Dec 16, 2024
db5f678
[BI-2423] - added annotations to filter soft deleted rows
mlm483 Dec 20, 2024
a8c891b
clear data list when updating ListEntity instead of setting null poin…
dmeidlin Jan 10, 2025
c036d8a
Merge pull request #42 from Breeding-Insight/bug/BI-2423
mlm483 Jan 10, 2025
fcc2f55
delete unnecessary code
dmeidlin Jan 10, 2025
2568c86
add null check
dmeidlin Jan 10, 2025
b378f08
Merge pull request #43 from Breeding-Insight/bug/BI-2432
dmeidlin Jan 10, 2025
f307a60
remove cascading of all operations for ListItemEntity ManyToOne relat…
dmeidlin Jan 21, 2025
78e5868
Merge pull request #44 from Breeding-Insight/bug/BI-2438
dmeidlin Jan 22, 2025
cff1c29
Disable delayed search for batch delete post
nickpalladino Feb 7, 2025
4802f13
Added support for hard deleting plate batches
nickpalladino Feb 7, 2025
c702ba3
Added paging for json response
nickpalladino Feb 12, 2025
5620417
Merge pull request #45 from Breeding-Insight/feature/BI-2431
nickpalladino Feb 13, 2025
b13a93d
add germplasm delete endpoint and enable batch delete
dmeidlin Feb 13, 2025
04ba359
Removed commented code
nickpalladino Feb 21, 2025
6760fe6
Merge pull request #46 from Breeding-Insight/bug/BI-2422
nickpalladino Feb 25, 2025
ad05e37
Merge pull request #47 from Breeding-Insight/feature/BI-2476
dmeidlin Mar 3, 2025
4e6b7d1
[BI-2585] updated 'connceted_node_id' to 'connected_node_id'
davedrp Mar 20, 2025
8b912fa
Merge pull request #50 from Breeding-Insight/bug/BI-2585
davedrp Mar 21, 2025
3fb4a47
[BI-2585-fix] - fixed migration
mlm483 Mar 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions src/main/java/io/swagger/api/germ/GermplasmApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

import io.swagger.model.BrAPIResponse;
import io.swagger.model.Model202AcceptedSearchResponse;
import io.swagger.model.core.ListsListResponse;
import io.swagger.model.core.ListsSingleResponse;
import io.swagger.model.germ.GermplasmListResponse;
import io.swagger.model.germ.GermplasmMCPDResponse;
import io.swagger.model.germ.GermplasmNewRequest;
Expand Down Expand Up @@ -45,6 +47,20 @@ ResponseEntity<GermplasmSingleResponse> germplasmGermplasmDbIdGet(
@ApiParam(value = "HTTP HEADER - Token used for Authorization <strong> Bearer {token_string} </strong>") @RequestHeader(value = "Authorization", required = false) String authorization)
throws BrAPIServerException;

@ApiOperation(value = "Delete an existing germplasm", nickname = "germplasmGermplasmDbIdDelete", notes = "Delete an existing germplasm", response = GermplasmSingleResponse.class, authorizations = {
@Authorization(value = "AuthorizationToken") }, tags = { "Germplasm", })
@ApiResponses(value = { @ApiResponse(code = 204, message = "OK", response = GermplasmSingleResponse.class),
@ApiResponse(code = 400, message = "Bad Request", response = String.class),
@ApiResponse(code = 401, message = "Unauthorized", response = String.class),
@ApiResponse(code = 403, message = "Forbidden", response = String.class),
@ApiResponse(code = 404, message = "Not Found", response = String.class) })
@RequestMapping(value = "/germplasm/{germplasmDbId}", produces = { "application/json" }, method = RequestMethod.DELETE)
ResponseEntity<GermplasmSingleResponse> germplasmGermplasmDbIdDelete(
@ApiParam(value = "The unique ID of this germplasm", required = true) @PathVariable("germplasmDbId") String germplasmDbId,
@ApiParam(value = "hardDelete") @Valid @RequestParam(value = "hardDelete", defaultValue = "false", required = false) boolean hardDelete,
@ApiParam(value = "HTTP HEADER - Token used for Authorization <strong> Bearer {token_string} </strong>") @RequestHeader(value = "Authorization", required = false) String authorization)
throws BrAPIServerException;

@ApiOperation(value = "Get the details of a specific Germplasm in MCPD format", nickname = "germplasmGermplasmDbIdMcpdGet", notes = "Get all MCPD details of a germplasm <a target=\"_blank\" href=\"https://www.bioversityInternational.org/fileadmin/user_upload/online_library/publications/pdfs/FAOBIOVERSITY_MULTI-CROP_PASSPORT_DESCRIPTORS_V.2.1_2015_2020.pdf\"> MCPD v2.1 spec can be found here </a> Implementation Notes - When the MCPD spec identifies a field which can have multiple values returned, the JSON response should be an array instead of a semi-colon separated string.", response = GermplasmMCPDResponse.class, authorizations = {
@Authorization(value = "AuthorizationToken") }, tags = { "Germplasm", })
@ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = GermplasmMCPDResponse.class),
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/io/swagger/api/pheno/ObservationsApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,8 @@ ResponseEntity<ObservationTableResponse> observationsTableGet(
@ApiParam(value = "observationUnitLevelRelationshipOrder") @Valid @RequestParam(value = "observationUnitLevelRelationshipOrder", required = false) String observationUnitLevelRelationshipOrder,
@ApiParam(value = "observationUnitLevelRelationshipCode") @Valid @RequestParam(value = "observationUnitLevelRelationshipCode", required = false) String observationUnitLevelRelationshipCode,
@ApiParam(value = "observationUnitLevelRelationshipDbId") @Valid @RequestParam(value = "observationUnitLevelRelationshipDbId", required = false) String observationUnitLevelRelationshipDbId,
@ApiParam(value = "page") @Valid @RequestParam(value = "page", required = false) Integer page,
@ApiParam(value = "pageSize") @Valid @RequestParam(value = "pageSize", required = false) Integer pageSize,
@ApiParam(value = "HTTP HEADER - Token used for Authorization <strong> Bearer {token_string} </strong>") @RequestHeader(value = "Authorization", required = false) String authorization)
throws BrAPIServerException;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.model.SearchRequest;
import io.swagger.model.geno.PlateSearchRequest;
import io.swagger.model.geno.SampleSearchRequest;
import io.swagger.model.germ.GermplasmSearchRequest;

Expand All @@ -17,7 +18,8 @@ public class BatchDeleteSearchRequest extends SearchRequest {
@JsonSubTypes.Type(value = GermplasmSearchRequest.class, name = "germplasm"),
@JsonSubTypes.Type(value = ListSearchRequest.class, name = "lists"),
@JsonSubTypes.Type(value = TrialSearchRequest.class, name = "trials"),
@JsonSubTypes.Type(value = SampleSearchRequest.class, name = "samples")
@JsonSubTypes.Type(value = SampleSearchRequest.class, name = "samples"),
@JsonSubTypes.Type(value = PlateSearchRequest.class, name = "plates")
})
private SearchRequest searchRequest = null;

Expand Down
3 changes: 2 additions & 1 deletion src/main/java/io/swagger/model/core/BatchDeleteTypes.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ public enum BatchDeleteTypes {
GERMPLASM("germplasm"),
LISTS("lists"),
TRIALS("trials"),
SAMPLES("samples");
SAMPLES("samples"),
PLATES("plates");


private final String value;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,11 @@ public ResponseEntity<? extends BrAPIResponse> batchDeletesPost(@Valid @RequestB
BrAPIComponent component = componentFactory.getComponent(batchType);

// Return the searchDbId with a 202 if the search is too in-depth with several parameters
String searchReqDbId = searchService.saveSearchRequest(body, SearchRequestEntity.SearchRequestTypes.BATCHES);
if (searchReqDbId != null) {
return responseAccepted(searchReqDbId);
}
// TODO: disabled for now
//String searchReqDbId = searchService.saveSearchRequest(body, SearchRequestEntity.SearchRequestTypes.BATCHES);
//if (searchReqDbId != null) {
// return responseAccepted(searchReqDbId);
//}

// Fetch requested BrAPI entities
SearchRequest entitySearch = body.getSearchRequest();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import io.swagger.model.BrAPIResponse;
import io.swagger.model.Metadata;
import io.swagger.model.core.ListsSingleResponse;
import io.swagger.model.germ.Germplasm;
import io.swagger.model.germ.GermplasmListResponse;
import io.swagger.model.germ.GermplasmListResponseResult;
Expand All @@ -16,6 +17,7 @@
import io.swagger.model.germ.GermplasmProgenyResponse;
import io.swagger.api.germ.GermplasmApi;

import jakarta.validation.Valid;
import org.brapi.test.BrAPITestServer.controller.core.BrAPIController;
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
import org.brapi.test.BrAPITestServer.model.entity.SearchRequestEntity;
Expand Down Expand Up @@ -72,6 +74,26 @@ public ResponseEntity<GermplasmSingleResponse> germplasmGermplasmDbIdGet(
return responseOK(new GermplasmSingleResponse(), data);
}

@CrossOrigin
@Override
public ResponseEntity<GermplasmSingleResponse> germplasmGermplasmDbIdDelete(
@PathVariable("germplasmDbId") String germplasmDbId,
@Valid @RequestParam(value = "hardDelete", defaultValue = "false" ,required = false) boolean hardDelete,
@RequestHeader(value = "Authorization", required = false) String authorization) throws BrAPIServerException {

log.debug("Request: " + request.getRequestURI());
validateSecurityContext(request, "ROLE_USER");
validateAcceptHeader(request);

if (hardDelete) {
germplasmService.deleteGermplasm(germplasmDbId);
return responseNoContent();
}

germplasmService.softDeleteGermplasm(germplasmDbId);
return responseNoContent();
}

@CrossOrigin
@Override
public ResponseEntity<GermplasmMCPDResponse> germplasmGermplasmDbIdMcpdGet(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,11 +173,14 @@ public ResponseEntity observationsTableGet(@RequestHeader(value = "Accept", requ
@RequestParam(value = "observationUnitLevelRelationshipOrder", required = false) String observationUnitLevelRelationshipOrder,
@RequestParam(value = "observationUnitLevelRelationshipCode", required = false) String observationUnitLevelRelationshipCode,
@RequestParam(value = "observationUnitLevelRelationshipDbId", required = false) String observationUnitLevelRelationshipDbId,
@RequestParam(value = "page", required = false) Integer page,
@RequestParam(value = "pageSize", required = false) Integer pageSize,
@RequestHeader(value = "Authorization", required = false) String authorization)
throws BrAPIServerException {

log.debug("Request: " + request.getRequestURI());
validateSecurityContext(request, "ROLE_ANONYMOUS", "ROLE_USER");
Metadata metadata = generateMetaDataTemplate(page, pageSize);

String sep = "";
if ("text/csv".equals(accept)) {
Expand All @@ -193,7 +196,8 @@ public ResponseEntity observationsTableGet(@RequestHeader(value = "Accept", requ
SearchRequestEntity request = searchService.findById(searchResultsDbId);
if (request != null) {
ObservationSearchRequest body = request.getParameters(ObservationSearchRequest.class);
data = observationService.findObservationsTable(body);
//TODO: revisit paging for this case; metadata=null
data = observationService.findObservationsTable(body, null);
} else {
return responseAccepted(searchResultsDbId);
}
Expand All @@ -204,11 +208,11 @@ public ResponseEntity observationsTableGet(@RequestHeader(value = "Accept", requ
observationUnitLevelName, observationUnitLevelOrder, observationUnitLevelCode,
observationUnitLevelRelationshipName, observationUnitLevelRelationshipOrder,
observationUnitLevelRelationshipCode, observationUnitLevelRelationshipDbId,
observationTimeStampRangeStart, observationTimeStampRangeEnd, searchResultsDbId);
observationTimeStampRangeStart, observationTimeStampRangeEnd, searchResultsDbId, metadata);
}

if (sep.isEmpty()) {
return responseOK(new ObservationTableResponse(), data);
return responseOK(new ObservationTableResponse(), data, metadata);
} else {
String textTable = observationService.getObservationTableText(data, sep);
return new ResponseEntity<String>(textTable, HttpStatus.OK);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.brapi.test.BrAPITestServer.factory.geno;

import io.swagger.model.Metadata;
import io.swagger.model.core.BatchDeleteTypes;
import io.swagger.model.geno.Plate;
import io.swagger.model.geno.PlateSearchRequest;
import org.apache.commons.lang3.NotImplementedException;
import org.brapi.test.BrAPITestServer.factory.BrAPIComponent;
import org.brapi.test.BrAPITestServer.service.geno.PlateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Component
public class PlateComponent implements BrAPIComponent<Plate, PlateSearchRequest> {
private final PlateService plateService;

@Autowired
public PlateComponent(PlateService plateService) {
this.plateService = plateService;
}

@Override
public List<Plate> findEntities(PlateSearchRequest request, Metadata metadata) {
return plateService.findPlates(request, metadata);
}

@Override
public BatchDeleteTypes getBatchDeleteType() {
return BatchDeleteTypes.PLATES;
}


@Override
public List<String> collectDbIds(List<Plate> entities) {
return entities.stream().map(Plate::getPlateDbId).collect(Collectors.toList());
}

@Override
public void deleteBatchDeleteData(List<String> dbIds) {
plateService.deletePlateBatch(dbIds);
}

@Override
public void softDeleteBatchDeleteData(List<String> dbIds) {
//TODO: implement if needed in future
throw new NotImplementedException("plate softDeleteBatchDeleteData not implemented");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@ public List<String> collectDbIds(List<Germplasm> entities) {

@Override
public void deleteBatchDeleteData(List<String> dbIds) {

germplasmService.deleteGermplasmBatch(dbIds);
}

@Override
public void softDeleteBatchDeleteData(List<String> dbIds) {

germplasmService.softDeleteGermplasmBatch(dbIds);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import javax.persistence.*;

import org.brapi.test.BrAPITestServer.model.entity.BrAPIBaseEntity;
import org.hibernate.annotations.Where;

@Entity
@Table(name = "trial_dataset_authorship")
@Where(clause = "soft_deleted = false")
public class DatasetAuthorshipEntity extends BrAPIBaseEntity {
@Column
private String datasetPUI;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
@Table(name = "list_item")
@Where(clause = "soft_deleted = false")
public class ListItemEntity extends BrAPIBaseEntity {
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.LAZY)
private ListEntity list;
@Column
private String item;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import javax.persistence.*;

import org.brapi.test.BrAPITestServer.model.entity.BrAPIBaseEntity;
import org.hibernate.annotations.Where;

@Entity
@Table(name = "trial_publication")
@Where(clause = "soft_deleted = false")
public class PublicationEntity extends BrAPIBaseEntity {
@Column
private String publicationPUI;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
import org.brapi.test.BrAPITestServer.model.entity.pheno.ObservationEntity;
import org.brapi.test.BrAPITestServer.model.entity.pheno.ObservationUnitEntity;
import org.brapi.test.BrAPITestServer.model.entity.pheno.ObservationVariableEntity;
import org.hibernate.annotations.Where;

@Entity
@Table(name = "study")
@Where(clause = "soft_deleted = false")
public class StudyEntity extends BrAPIPrimaryEntity {

@Column
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
import javax.persistence.*;

import org.brapi.test.BrAPITestServer.model.entity.BrAPIPrimaryEntity;
import org.hibernate.annotations.Where;

@Entity
@Table(name = "callset")
@Where(clause = "soft_deleted = false")
public class CallSetEntity extends BrAPIPrimaryEntity {
@Column
private String callSetName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@

import io.swagger.model.geno.PlateFormat;
import io.swagger.model.geno.SampleType;
import org.hibernate.annotations.Where;

@Entity
@Table(name="plate")
@Where(clause = "soft_deleted = false")
public class PlateEntity extends BrAPIPrimaryEntity{
@Column
private String clientPlateDbId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@
import io.swagger.model.germ.GermplasmMCPD.AcquisitionSourceCodeEnum;
import io.swagger.model.germ.GermplasmMCPD.MlsStatusEnum;
import io.swagger.model.germ.GermplasmStorageTypesEnum;
import org.hibernate.annotations.Where;

@Entity
@Table(name = "germplasm")
@Where(clause = "soft_deleted = false")
public class GermplasmEntity extends BrAPIPrimaryEntity {
@Column
private String accessionNumber;
Expand Down Expand Up @@ -84,6 +86,8 @@ public class GermplasmEntity extends BrAPIPrimaryEntity {
private List<ObservationUnitEntity> observationUnits;
@ElementCollection
private List<GermplasmStorageTypesEnum> typeOfGermplasmStorageCode;
@Column(name = "soft_deleted")
private boolean softDeleted;

public GermplasmInstituteEntity getHostInstitute() {
if (getInstitutes() != null) {
Expand Down Expand Up @@ -352,4 +356,8 @@ public void setTypeOfGermplasmStorageCode(List<GermplasmStorageTypesEnum> typeOf
this.typeOfGermplasmStorageCode = typeOfGermplasmStorageCode;
}

public boolean getSoftDeleted() { return softDeleted; }

public void setSoftDeleted(boolean sofDeleted) { this.softDeleted = sofDeleted; }

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class PedigreeEdgeEntity extends BrAPIPrimaryEntity{
@ManyToOne(fetch = FetchType.LAZY)
private PedigreeNodeEntity thisNode;
@ManyToOne(fetch = FetchType.LAZY)
private PedigreeNodeEntity conncetedNode;
private PedigreeNodeEntity connectedNode;
@Column
private ParentType parentType;
@Column
Expand All @@ -31,11 +31,11 @@ public EdgeType getEdgeType() {
public void setEdgeType(EdgeType edgeType) {
this.edgeType = edgeType;
}
public PedigreeNodeEntity getConncetedNode() {
return conncetedNode;
public PedigreeNodeEntity getConnectedNode() {
return connectedNode;
}
public void setConncetedNode(PedigreeNodeEntity conncetedNode) {
this.conncetedNode = conncetedNode;
public void setConnectedNode(PedigreeNodeEntity connectedNode) {
this.connectedNode = connectedNode;
}
public ParentType getParentType() {
return parentType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public List<PedigreeEdgeEntity> getParentEdges() {
public List<PedigreeNodeEntity> getParentNodes() {
return edges.stream().filter(e -> {
return e.getEdgeType() == EdgeType.parent;
}).map(edge -> edge.getConncetedNode()).collect(Collectors.toList());
}).map(edge -> edge.getConnectedNode()).collect(Collectors.toList());
}

public List<PedigreeEdgeEntity> getProgenyEdges() {
Expand All @@ -106,13 +106,13 @@ public List<PedigreeEdgeEntity> getProgenyEdges() {
public List<PedigreeNodeEntity> getProgenyNodes() {
return edges.stream().filter(e -> {
return e.getEdgeType() == EdgeType.child;
}).map(edge -> edge.getConncetedNode()).collect(Collectors.toList());
}).map(edge -> edge.getConnectedNode()).collect(Collectors.toList());
}

public void addParent(PedigreeNodeEntity node, ParentType type) {
PedigreeEdgeEntity edge = new PedigreeEdgeEntity();
edge.setThisNode(this);
edge.setConncetedNode(node);
edge.setConnectedNode(node);
edge.setParentType(type);
edge.setEdgeType(EdgeType.parent);
if(edges == null)
Expand All @@ -123,7 +123,7 @@ public void addParent(PedigreeNodeEntity node, ParentType type) {
public void addProgeny(PedigreeNodeEntity node, ParentType type) {
PedigreeEdgeEntity edge = new PedigreeEdgeEntity();
edge.setThisNode(this);
edge.setConncetedNode(node);
edge.setConnectedNode(node);
edge.setParentType(type);
edge.setEdgeType(EdgeType.child);
if(edges == null)
Expand Down
Loading
Loading