From 53812dd6646533c06b540016e1043ef2cf7b7090 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Fri, 12 Dec 2025 14:08:24 +0100 Subject: [PATCH 1/3] feat: add API for getting default contributor role of a collection --- .../harvard/iq/dataverse/api/Dataverses.java | 15 +++++++ ...llectionDefaultContributorRoleCommand.java | 43 +++++++++++++++++++ .../iq/dataverse/util/json/JsonPrinter.java | 23 +++++----- 3 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetCollectionDefaultContributorRoleCommand.java diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java index caf778be675..083f8a8af52 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -1631,6 +1631,21 @@ public Response updateDefaultContributorRole( } + @GET + @AuthRequired + @Path("{identifier}/defaultContributorRole") + public Response getDefaultContributorRole( + @Context ContainerRequestContext crc, + @PathParam("identifier") String dvIdtf) { + + return response(req -> ok( + json( + execCommand( + new GetCollectionDefaultContributorRoleCommand(req, + findDataverseOrDie(dvIdtf))))), getRequestUser(crc)); + + } + @DELETE @AuthRequired @Path("{identifier}/groups/{aliasInOwner}") diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetCollectionDefaultContributorRoleCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetCollectionDefaultContributorRoleCommand.java new file mode 100644 index 00000000000..c4ef7a18c41 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetCollectionDefaultContributorRoleCommand.java @@ -0,0 +1,43 @@ +package edu.harvard.iq.dataverse.engine.command.impl; + +import edu.harvard.iq.dataverse.Dataverse; +import edu.harvard.iq.dataverse.authorization.DataverseRole; +import edu.harvard.iq.dataverse.authorization.Permission; +import edu.harvard.iq.dataverse.engine.command.AbstractCommand; +import edu.harvard.iq.dataverse.engine.command.CommandContext; +import edu.harvard.iq.dataverse.engine.command.DataverseRequest; +import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; +import edu.harvard.iq.dataverse.engine.command.exception.CommandException; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.logging.Logger; + +/** + * + * @author landreev + * Gets the default contributor role of a collection. + * Used by the /api/dataverses/.../defaultContributorRole API. + */ +@RequiredPermissions( Permission.ManageDataversePermissions ) +public class GetCollectionDefaultContributorRoleCommand extends AbstractCommand { + + private final Dataverse dataverse; + + public GetCollectionDefaultContributorRoleCommand(DataverseRequest aRequest, Dataverse target) { + super(aRequest, target); + dataverse = target; + } + + @Override + public DataverseRole execute(CommandContext ctxt) throws CommandException { + + if (dataverse != null) { + return dataverse.getDefaultContributorRole(); + } + + return null; + } +} + + 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..c2d9c18449d 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 @@ -261,16 +261,19 @@ public static JsonArrayBuilder jsonDataverseRoles(List roles) { } public static JsonObjectBuilder json(DataverseRole role) { - JsonObjectBuilder bld = jsonObjectBuilder() - .add("alias", role.getAlias()) - .add("name", role.getName()) - .add("permissions", JsonPrinter.json(role.permissions())) - .add("description", role.getDescription()); - if (role.getId() != null) { - bld.add("id", role.getId()); - } - if (role.getOwner() != null && role.getOwner().getId() != null) { - bld.add("ownerId", role.getOwner().getId()); + JsonObjectBuilder bld = jsonObjectBuilder(); + + if (role != null) { + bld.add("alias", role.getAlias()) + .add("name", role.getName()) + .add("permissions", JsonPrinter.json(role.permissions())) + .add("description", role.getDescription()); + if (role.getId() != null) { + bld.add("id", role.getId()); + } + if (role.getOwner() != null && role.getOwner().getId() != null) { + bld.add("ownerId", role.getOwner().getId()); + } } return bld; From 8d575b95ffb199735aa131265cc87cc71b26f072 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Mon, 26 Jan 2026 11:35:04 +0100 Subject: [PATCH 2/3] test: test API for getting default contributor role of a collection --- .../harvard/iq/dataverse/api/DataversesIT.java | 15 +++++++++++++++ .../java/edu/harvard/iq/dataverse/api/UtilIT.java | 9 ++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index dc658c7134b..0f3a551dbdf 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -21,6 +21,7 @@ import java.nio.file.Paths; import java.text.MessageFormat; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.logging.Logger; @@ -544,6 +545,13 @@ public void testUpdateDefaultContributorRole() { updateDataverseDefaultRole.then().assertThat() .body("data.message", equalTo("Default contributor role for Dataverse " + dataverseAlias + " has been set to Curator.")) .statusCode(200); + + // test GET API for retrieving the role that was just set + Response getDataverseDefaultRole = UtilIT.getDefaultContributorsRoleOnDataverse(dataverseAlias, apiToken); + getDataverseDefaultRole.prettyPrint(); + getDataverseDefaultRole.then().assertThat() + .body("data.alias", equalTo("curator")) + .statusCode(200); //for test use an existing role. In practice this likely will be a custom role Response updateDataverseDefaultRoleNone = UtilIT.updateDefaultContributorsRoleOnDataverse(dataverseAlias, "none", apiToken); @@ -552,6 +560,13 @@ public void testUpdateDefaultContributorRole() { .body("data.message", equalTo("Default contributor role for Dataverse " + dataverseAlias + " has been set to None.")) .statusCode(200); + // test GET API for retrieving the role that was just set + Response getDataverseDefaultRoleNone = UtilIT.getDefaultContributorsRoleOnDataverse(dataverseAlias, apiToken); + getDataverseDefaultRoleNone.prettyPrint(); + getDataverseDefaultRoleNone.then().assertThat() + .body("data", equalTo(Collections.emptyMap())) + .statusCode(200); + // try bad role alias Response updateDataverseDefaultRoleBadRoleAlias = UtilIT.updateDefaultContributorsRoleOnDataverse(dataverseAlias, "colonel", apiToken); updateDataverseDefaultRoleBadRoleAlias.prettyPrint(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 24ab8b56eff..7a26672f616 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -2624,7 +2624,7 @@ static Response getRoleAssignmentsOnDataverse(String dataverseAliasOrId, String .get(url); } - static Response updateDefaultContributorsRoleOnDataverse(String dataverseAliasOrId,String roleAlias, String apiToken) { + static Response updateDefaultContributorsRoleOnDataverse(String dataverseAliasOrId, String roleAlias, String apiToken) { String url = "/api/dataverses/" + dataverseAliasOrId + "/defaultContributorRole/" + roleAlias; System.out.println("URL: " + url); return given() @@ -2632,6 +2632,13 @@ static Response updateDefaultContributorsRoleOnDataverse(String dataverseAliasOr .put(url); } + static Response getDefaultContributorsRoleOnDataverse(String dataverseAliasOrId, String apiToken) { + String url = "/api/dataverses/" + dataverseAliasOrId + "/defaultContributorRole"; + return given() + .header(API_TOKEN_HTTP_HEADER, apiToken) + .get(url); + } + static Response getRoleAssignmentsOnDataset(String datasetId, String persistentId, String apiToken) { String url = "/api/datasets/" + datasetId + "/assignments"; System.out.println("URL: " + url); From 9be6c93a70330250a958c9774b49652c37f137d5 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Mon, 26 Jan 2026 11:46:54 +0100 Subject: [PATCH 3/3] docs: add API for getting default contributor role of a collection --- doc/release-notes/12112-get-default-contributor-role.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/release-notes/12112-get-default-contributor-role.md diff --git a/doc/release-notes/12112-get-default-contributor-role.md b/doc/release-notes/12112-get-default-contributor-role.md new file mode 100644 index 00000000000..0ed0072bd6e --- /dev/null +++ b/doc/release-notes/12112-get-default-contributor-role.md @@ -0,0 +1 @@ +A new API endpoint for getting the default contributor role of a collection (`GET /api/dataverses/$ID/defaultContributorRole`) was added. \ No newline at end of file