Skip to content

Commit

Permalink
Fix addDataverse expected request body structure (IQSS#10802)
Browse files Browse the repository at this point in the history
* Fixed: MetadataBlockServiceBean to check for not excluded fields in input levels

* Changed: using queries for obtaining dataset field types based on displaying conditions

* Refactor: json printer method for MetadataBlock

* Added: IT test case for list metadata blocks testing field with include=false and displayOnCreate=true property

* Fixed: removed condition in MetadataBlockServiceBean

* Added: release notes for IQSS#10741

* Fixed: displayOnCreate query logic

* Fixed: excluding conditionally required fields when display-on-create is true

* Fixed: query predicate for required-in-dataverse field condition

* Fixed: addDataverse API facetIds field json structure

* Added: docs IQSS#10800
  • Loading branch information
GPortas committed Sep 4, 2024
1 parent 05962ef commit 3834bbf
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 9 deletions.
1 change: 1 addition & 0 deletions doc/release-notes/10800-add-dataverse-request-json-fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed the "addDataverse" API endpoint (/dataverses/{id} POST) expected request JSON structure to parse facetIds as described in the docs.
7 changes: 4 additions & 3 deletions src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java
Original file line number Diff line number Diff line change
Expand Up @@ -143,16 +143,17 @@ public Response addDataverse(@Context ContainerRequestContext crc, String body,
JsonObject metadataBlocksJson = newDataverseJson.getJsonObject("metadataBlocks");
List<DataverseFieldTypeInputLevel> inputLevels = null;
List<MetadataBlock> metadataBlocks = null;
List<DatasetFieldType> facetList = null;
if (metadataBlocksJson != null) {
JsonArray inputLevelsArray = metadataBlocksJson.getJsonArray("inputLevels");
inputLevels = inputLevelsArray != null ? parseInputLevels(inputLevelsArray, newDataverse) : null;

JsonArray metadataBlockNamesArray = metadataBlocksJson.getJsonArray("metadataBlockNames");
metadataBlocks = metadataBlockNamesArray != null ? parseNewDataverseMetadataBlocks(metadataBlockNamesArray) : null;
}

JsonArray facetIdsArray = newDataverseJson.getJsonArray("facetIds");
List<DatasetFieldType> facetList = facetIdsArray != null ? parseFacets(facetIdsArray) : null;
JsonArray facetIdsArray = metadataBlocksJson.getJsonArray("facetIds");
facetList = facetIdsArray != null ? parseFacets(facetIdsArray) : null;
}

if (!parentIdtf.isEmpty()) {
Dataverse owner = findDataverseOrDie(parentIdtf);
Expand Down
13 changes: 10 additions & 3 deletions src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import static jakarta.ws.rs.core.Response.Status.*;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.hasItemInArray;
import static org.junit.jupiter.api.Assertions.*;

Expand Down Expand Up @@ -998,16 +999,22 @@ public void testAddDataverse() {
String actualMetadataBlockName = listMetadataBlocksResponse.then().extract().path("data[0].name");
assertEquals(actualMetadataBlockName, "citation");

// Assert root facets are configured
String[] expectedRootFacetIds = {"authorName", "subject", "keywordValue", "dateOfDeposit"};
Response listDataverseFacetsResponse = UtilIT.listDataverseFacets(testDataverseAlias, apiToken);
List<String> actualFacetNames = listDataverseFacetsResponse.then().extract().path("data");
assertThat("Facet names should match expected root facet ids", actualFacetNames, containsInAnyOrder(expectedRootFacetIds));

// With optional input levels and facet ids
String[] testInputLevelNames = {"geographicCoverage", "country"};
String[] testFacetIds = {"authorName", "authorAffiliation"};
String[] testFacetIds = {"language", "contributorName"};
String[] testMetadataBlockNames = {"citation", "geospatial"};
testDataverseAlias = UtilIT.getRandomDvAlias() + testAliasSuffix;
createSubDataverseResponse = UtilIT.createSubDataverse(testDataverseAlias, null, apiToken, "root", testInputLevelNames, testFacetIds, testMetadataBlockNames);
createSubDataverseResponse.then().assertThat().statusCode(CREATED.getStatusCode());

// Assert facets are configured
Response listDataverseFacetsResponse = UtilIT.listDataverseFacets(testDataverseAlias, apiToken);
// Assert custom facets are configured
listDataverseFacetsResponse = UtilIT.listDataverseFacets(testDataverseAlias, apiToken);
String actualFacetName1 = listDataverseFacetsResponse.then().extract().path("data[0]");
String actualFacetName2 = listDataverseFacetsResponse.then().extract().path("data[1]");
assertNotEquals(actualFacetName1, actualFacetName2);
Expand Down
6 changes: 3 additions & 3 deletions src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -398,16 +398,16 @@ static Response createSubDataverse(String alias, String category, String apiToke
metadataBlocksObjectBuilder.add("metadataBlockNames", metadataBlockNamesArrayBuilder);
}

objectBuilder.add("metadataBlocks", metadataBlocksObjectBuilder);

if (facetIds != null) {
JsonArrayBuilder facetIdsArrayBuilder = Json.createArrayBuilder();
for(String facetId : facetIds) {
facetIdsArrayBuilder.add(facetId);
}
objectBuilder.add("facetIds", facetIdsArrayBuilder);
metadataBlocksObjectBuilder.add("facetIds", facetIdsArrayBuilder);
}

objectBuilder.add("metadataBlocks", metadataBlocksObjectBuilder);

JsonObject dvData = objectBuilder.build();
Response createDataverseResponse = given()
.body(dvData.toString()).contentType(ContentType.JSON)
Expand Down

0 comments on commit 3834bbf

Please sign in to comment.