Skip to content

Commit 80fd9f7

Browse files
authored
Merge pull request #12112 from vera/feat/get-default-contributor-role
feat: add API for getting default contributor role of a collection
2 parents ad8c020 + 4dfb47b commit 80fd9f7

7 files changed

Lines changed: 112 additions & 12 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
A new API endpoint for getting the default contributor role of a collection (`GET /api/dataverses/$ID/defaultContributorRole`) was added.

doc/sphinx-guides/source/api/native-api.rst

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ The fully expanded example above (without environment variables) looks like this
525525
Assign Default Role to User Creating a Dataset in a Dataverse Collection
526526
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
527527

528-
Assign a default role to a user creating a dataset in a Dataverse collection ``id`` where ``roleAlias`` is the database alias of the role to be assigned:
528+
Assign a default role to a user creating a dataset in a Dataverse collection ``id`` where ``roleAlias`` is the database alias of the role to be assigned (requires ``ManageDataversePermissions``):
529529

530530
.. code-block:: bash
531531
@@ -544,6 +544,27 @@ The fully expanded example above (without environment variables) looks like this
544544
545545
Note: You may use "none" as the ``ROLE_ALIAS``. This will prevent a user who creates a dataset from having any role on that dataset. It is not recommended for Dataverse collections with human contributors.
546546

547+
.. _get-default-contributor-role-on-a-dataverse-api:
548+
549+
Get Default Role Assigned to User Creating a Dataset in a Dataverse Collection
550+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
551+
552+
Get the default role that is assigned to a user creating a dataset in a Dataverse collection ``id`` (requires ``ManageDataversePermissions``):
553+
554+
.. code-block:: bash
555+
556+
export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
557+
export SERVER_URL=https://demo.dataverse.org
558+
export ID=root
559+
560+
curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/dataverses/$ID/defaultContributorRole"
561+
562+
The fully expanded example above (without environment variables) looks like this:
563+
564+
.. code-block:: bash
565+
566+
curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/dataverses/root/defaultContributorRole"
567+
547568
.. _assign-role-on-a-dataverse-api:
548569

549570
Assign a New Role on a Dataverse Collection

src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1631,6 +1631,21 @@ public Response updateDefaultContributorRole(
16311631

16321632
}
16331633

1634+
@GET
1635+
@AuthRequired
1636+
@Path("{identifier}/defaultContributorRole")
1637+
public Response getDefaultContributorRole(
1638+
@Context ContainerRequestContext crc,
1639+
@PathParam("identifier") String dvIdtf) {
1640+
1641+
return response(req -> ok(
1642+
json(
1643+
execCommand(
1644+
new GetCollectionDefaultContributorRoleCommand(req,
1645+
findDataverseOrDie(dvIdtf))))), getRequestUser(crc));
1646+
1647+
}
1648+
16341649
@DELETE
16351650
@AuthRequired
16361651
@Path("{identifier}/groups/{aliasInOwner}")
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package edu.harvard.iq.dataverse.engine.command.impl;
2+
3+
import edu.harvard.iq.dataverse.Dataverse;
4+
import edu.harvard.iq.dataverse.authorization.DataverseRole;
5+
import edu.harvard.iq.dataverse.authorization.Permission;
6+
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
7+
import edu.harvard.iq.dataverse.engine.command.CommandContext;
8+
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
9+
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
10+
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
11+
12+
/**
13+
*
14+
* Gets the default contributor role of a collection.
15+
* Used by the /api/dataverses/.../defaultContributorRole API.
16+
*/
17+
@RequiredPermissions( Permission.ManageDataversePermissions )
18+
public class GetCollectionDefaultContributorRoleCommand extends AbstractCommand<DataverseRole> {
19+
20+
private final Dataverse dataverse;
21+
22+
public GetCollectionDefaultContributorRoleCommand(DataverseRequest aRequest, Dataverse target) {
23+
super(aRequest, target);
24+
dataverse = target;
25+
}
26+
27+
@Override
28+
public DataverseRole execute(CommandContext ctxt) throws CommandException {
29+
30+
if (dataverse != null) {
31+
return dataverse.getDefaultContributorRole();
32+
}
33+
34+
return null;
35+
}
36+
}
37+
38+

src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -246,16 +246,19 @@ public static JsonArrayBuilder jsonDataverseRoles(List<DataverseRole> roles) {
246246
}
247247

248248
public static JsonObjectBuilder json(DataverseRole role) {
249-
JsonObjectBuilder bld = jsonObjectBuilder()
250-
.add("alias", role.getAlias())
251-
.add("name", role.getName())
252-
.add("permissions", JsonPrinter.json(role.permissions()))
253-
.add("description", role.getDescription());
254-
if (role.getId() != null) {
255-
bld.add("id", role.getId());
256-
}
257-
if (role.getOwner() != null && role.getOwner().getId() != null) {
258-
bld.add("ownerId", role.getOwner().getId());
249+
JsonObjectBuilder bld = jsonObjectBuilder();
250+
251+
if (role != null) {
252+
bld.add("alias", role.getAlias())
253+
.add("name", role.getName())
254+
.add("permissions", JsonPrinter.json(role.permissions()))
255+
.add("description", role.getDescription());
256+
if (role.getId() != null) {
257+
bld.add("id", role.getId());
258+
}
259+
if (role.getOwner() != null && role.getOwner().getId() != null) {
260+
bld.add("ownerId", role.getOwner().getId());
261+
}
259262
}
260263

261264
return bld;

src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.nio.file.Paths;
2222
import java.text.MessageFormat;
2323
import java.util.Arrays;
24+
import java.util.Collections;
2425
import java.util.List;
2526
import java.util.Map;
2627
import java.util.logging.Logger;
@@ -544,6 +545,13 @@ public void testUpdateDefaultContributorRole() {
544545
updateDataverseDefaultRole.then().assertThat()
545546
.body("data.message", equalTo("Default contributor role for Dataverse " + dataverseAlias + " has been set to Curator."))
546547
.statusCode(200);
548+
549+
// test GET API for retrieving the role that was just set
550+
Response getDataverseDefaultRole = UtilIT.getDefaultContributorsRoleOnDataverse(dataverseAlias, apiToken);
551+
getDataverseDefaultRole.prettyPrint();
552+
getDataverseDefaultRole.then().assertThat()
553+
.body("data.alias", equalTo("curator"))
554+
.statusCode(200);
547555

548556
//for test use an existing role. In practice this likely will be a custom role
549557
Response updateDataverseDefaultRoleNone = UtilIT.updateDefaultContributorsRoleOnDataverse(dataverseAlias, "none", apiToken);
@@ -552,6 +560,13 @@ public void testUpdateDefaultContributorRole() {
552560
.body("data.message", equalTo("Default contributor role for Dataverse " + dataverseAlias + " has been set to None."))
553561
.statusCode(200);
554562

563+
// test GET API for retrieving the role that was just set
564+
Response getDataverseDefaultRoleNone = UtilIT.getDefaultContributorsRoleOnDataverse(dataverseAlias, apiToken);
565+
getDataverseDefaultRoleNone.prettyPrint();
566+
getDataverseDefaultRoleNone.then().assertThat()
567+
.body("data", equalTo(Collections.emptyMap()))
568+
.statusCode(200);
569+
555570
// try bad role alias
556571
Response updateDataverseDefaultRoleBadRoleAlias = UtilIT.updateDefaultContributorsRoleOnDataverse(dataverseAlias, "colonel", apiToken);
557572
updateDataverseDefaultRoleBadRoleAlias.prettyPrint();

src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2729,14 +2729,21 @@ static Response getRoleAssignmentsOnDataverse(String dataverseAliasOrId, String
27292729
.get(url);
27302730
}
27312731

2732-
static Response updateDefaultContributorsRoleOnDataverse(String dataverseAliasOrId,String roleAlias, String apiToken) {
2732+
static Response updateDefaultContributorsRoleOnDataverse(String dataverseAliasOrId, String roleAlias, String apiToken) {
27332733
String url = "/api/dataverses/" + dataverseAliasOrId + "/defaultContributorRole/" + roleAlias;
27342734
System.out.println("URL: " + url);
27352735
return given()
27362736
.header(API_TOKEN_HTTP_HEADER, apiToken)
27372737
.put(url);
27382738
}
27392739

2740+
static Response getDefaultContributorsRoleOnDataverse(String dataverseAliasOrId, String apiToken) {
2741+
String url = "/api/dataverses/" + dataverseAliasOrId + "/defaultContributorRole";
2742+
return given()
2743+
.header(API_TOKEN_HTTP_HEADER, apiToken)
2744+
.get(url);
2745+
}
2746+
27402747
static Response getRoleAssignmentsOnDataset(String datasetId, String persistentId, String apiToken) {
27412748
String url = "/api/datasets/" + datasetId + "/assignments";
27422749
System.out.println("URL: " + url);

0 commit comments

Comments
 (0)