diff --git a/doc/release-notes/12008-dataset-api-locks.md b/doc/release-notes/12008-dataset-api-locks.md new file mode 100644 index 00000000000..4eeba82b7af --- /dev/null +++ b/doc/release-notes/12008-dataset-api-locks.md @@ -0,0 +1 @@ +The API returning information about datasets (`/api/datasets/{id}`) now includes a `locks` field containing a list of the types of all existing locks, e.g. `"locks": ["InReview"]`. diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 27b7a122c93..11a3e7b53d8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -486,6 +486,13 @@ public static JsonObjectBuilder json(Dataset ds, Boolean returnOwners) { bld.add("isPartOf", getOwnersFromDvObject(ds)); } bld.add("datasetType", ds.getDatasetType().getName()); + + JsonArrayBuilder locksArrayBuilder = Json.createArrayBuilder(); + for (DatasetLock lock : ds.getLocks()) { + locksArrayBuilder.add(lock.getReason().toString()); + } + bld.add("locks", locksArrayBuilder); + return bld; } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index b7cbb37480c..d9e21d9fdc7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -3077,12 +3077,19 @@ public void testDatasetLocksApi() { .statusCode(200); // Check again: - // This should return an empty list, as the dataset should have no locks just yet: + // This should no longer return an empty list, as the dataset now has a lock: checkDatasetLocks = UtilIT.checkDatasetLocks(datasetId.longValue(), "Ingest", apiToken); checkDatasetLocks.prettyPrint(); checkDatasetLocks.then().assertThat() .body("data[0].lockType", equalTo("Ingest")) .statusCode(200); + + // Confirm that when getting the dataset, the lock is also listed + Response getDatasetJson = UtilIT.nativeGet(datasetId, apiToken); + getDatasetJson.prettyPrint(); + getDatasetJson.then().assertThat() + .body("data.locks[0]", equalTo("Ingest")) + .statusCode(200); // Try to lock the dataset with the same type lock, AGAIN // (this should fail, of course!) @@ -3197,6 +3204,13 @@ public void testDatasetLocksApi() { checkDatasetLocks.then().assertThat() .body("data", equalTo(emptyArray)) .statusCode(200); + + // Confirm that when getting the dataset, the lock is also no longer listed + getDatasetJson = UtilIT.nativeGet(datasetId, apiToken); + getDatasetJson.prettyPrint(); + getDatasetJson.then().assertThat() + .body("data.locks", equalTo(emptyArray)) + .statusCode(200); } /** diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java index a2bef649c72..77fa9a64f2e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java @@ -6,6 +6,7 @@ import io.restassured.response.Response; import edu.harvard.iq.dataverse.authorization.DataverseRole; import jakarta.json.Json; +import jakarta.json.JsonArray; import jakarta.json.JsonObjectBuilder; import static edu.harvard.iq.dataverse.UserNotification.Type.*; @@ -120,6 +121,13 @@ public void testCuratorSendsCommentsToAuthor() { .body("message", equalTo("You cannot submit this dataset for review because it is already in review.")) .statusCode(FORBIDDEN.getStatusCode()); + // Confirm that when getting the dataset, the "InReview" lock is listed + Response getDatasetJson = UtilIT.nativeGet(datasetId, authorApiToken); + getDatasetJson.prettyPrint(); + getDatasetJson.then().assertThat() + .body("data.locks[0]", equalTo("InReview")) + .statusCode(200); + Response authorsChecksForCommentsPrematurely = UtilIT.getNotifications(authorApiToken); authorsChecksForCommentsPrematurely.prettyPrint(); authorsChecksForCommentsPrematurely.then().assertThat() @@ -429,6 +437,14 @@ public void testCuratorSendsCommentsToAuthor() { // .body("data[3].reasonsForReturn", equalTo(null)) .statusCode(OK.getStatusCode()); + // Confirm that when getting the dataset, the "InReview" lock is no longer listed + JsonArray emptyArray = Json.createArrayBuilder().build(); + getDatasetJson = UtilIT.nativeGet(datasetId, authorApiToken); + getDatasetJson.prettyPrint(); + getDatasetJson.then().assertThat() + .body("data.locks", equalTo(emptyArray)) + .statusCode(200); + // These println's are here in case you want to log into the GUI to see what notifications look like. System.out.println("Curator username/password: " + curatorUsername); System.out.println("Author username/password: " + authorUsername);