Skip to content

Commit 407e9f9

Browse files
authored
Merge pull request #11681 from IQSS/11525-retrieve-collections-a-user-can-create-datasets-in
11525 retrieve collections a user can create datasets in
2 parents b01ffe4 + 801d8cc commit 407e9f9

File tree

13 files changed

+472
-258
lines changed

13 files changed

+472
-258
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
### New API to retrieve a list of collections that an authenticated user can create a dataset in
2+
3+
The API GET /api/mydata/retrieve/collectionList will return all the dataverse objects that the user can add to
4+
5+
See also [the guides](https://guides.dataverse.org/en/latest/api/native-api.html#mydata) and #11525.

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7997,3 +7997,19 @@ Parameters:
79977997
79987998
``per_page`` Number of results returned per page.
79997999
8000+
MyData Collection List
8001+
----------------------
8002+
8003+
The MyData Collection List API is used to get a list of the collections an authenticated user can create a Dataset in.
8004+
Param userIdentifier={userName} is used by a superuser to get the collections for a specific user.
8005+
8006+
A curl example listing collections:
8007+
8008+
.. code-block:: bash
8009+
8010+
export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
8011+
export SERVER_URL=https://demo.dataverse.org
8012+
8013+
curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/mydata/retrieve/collectionList"
8014+
curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/mydata/retrieve/collectionList?userIdentifier=anotherUser"
8015+

src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ public class PermissionServiceBean {
9595
@Inject
9696
DatasetVersionFilesServiceBean datasetVersionFilesServiceBean;
9797

98+
private static final String LIST_ALL_DATAVERSES_SUPERUSER_HAS_PERMISSION = """
99+
SELECT id, name, alias FROM DATAVERSE
100+
""";
101+
98102
private static final String LIST_ALL_DATAVERSES_USER_HAS_PERMISSION = """
99103
WITH grouplist AS (
100104
SELECT explicitgroup_authenticateduser.explicitgroup_id as id FROM explicitgroup_authenticateduser
@@ -928,6 +932,7 @@ public List<Dataverse> findPermittedCollections(DataverseRequest request, Authen
928932
String ipRangeSQL = "FALSE";
929933
if (request != null
930934
&& request.getAuthenticatedUser() != null
935+
&& !request.getAuthenticatedUser().isSuperuser()
931936
&& request.getSourceAddress() != null
932937
&& request.getAuthenticatedUser().getUserIdentifier().equalsIgnoreCase(user.getUserIdentifier())) {
933938
IpAddress ip = request.getSourceAddress();
@@ -950,11 +955,15 @@ public List<Dataverse> findPermittedCollections(DataverseRequest request, Authen
950955
}
951956
}
952957
}
953-
954-
String sqlCode = LIST_ALL_DATAVERSES_USER_HAS_PERMISSION
955-
.replace("@USERID", String.valueOf(user.getId()))
956-
.replace("@PERMISSIONBIT", String.valueOf(permissionBit))
957-
.replace("@IPRANGESQL", ipRangeSQL);
958+
String sqlCode;
959+
if (user.isSuperuser()) {
960+
sqlCode = LIST_ALL_DATAVERSES_SUPERUSER_HAS_PERMISSION;
961+
} else {
962+
sqlCode = LIST_ALL_DATAVERSES_USER_HAS_PERMISSION
963+
.replace("@USERID", String.valueOf(user.getId()))
964+
.replace("@PERMISSIONBIT", String.valueOf(permissionBit))
965+
.replace("@IPRANGESQL", ipRangeSQL);
966+
}
958967
return em.createNativeQuery(sqlCode, Dataverse.class).getResultList();
959968
}
960969
return null;

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package edu.harvard.iq.dataverse.api;
77

8+
import edu.harvard.iq.dataverse.Dataverse;
89
import edu.harvard.iq.dataverse.api.auth.AuthRequired;
910
import edu.harvard.iq.dataverse.authorization.users.ApiToken;
1011
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
@@ -26,6 +27,7 @@
2627
import java.util.logging.Logger;
2728

2829
import edu.harvard.iq.dataverse.util.json.JsonParseException;
30+
import edu.harvard.iq.dataverse.util.json.JsonPrinter;
2931
import edu.harvard.iq.dataverse.util.json.JsonUtil;
3032
import jakarta.ejb.Stateless;
3133
import jakarta.json.JsonArray;
@@ -286,8 +288,8 @@ public Response getUserPermittedCollections(@Context ContainerRequestContext crc
286288
}
287289
try {
288290
AuthenticatedUser userToQuery = authSvc.getAuthenticatedUser(identifier);
289-
JsonObjectBuilder jsonObj = execCommand(new GetUserPermittedCollectionsCommand(createDataverseRequest(getRequestUser(crc)), userToQuery, permission));
290-
return ok(jsonObj);
291+
List<Dataverse> collections = execCommand(new GetUserPermittedCollectionsCommand(createDataverseRequest(getRequestUser(crc)), userToQuery, permission));
292+
return ok(JsonPrinter.jsonArray(collections));
291293
} catch (WrappedResponse ex) {
292294
return ex.getResponse();
293295
}

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetUserPermittedCollectionsCommand.java

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,44 @@
33
import edu.harvard.iq.dataverse.Dataverse;
44
import edu.harvard.iq.dataverse.DvObject;
55
import edu.harvard.iq.dataverse.authorization.Permission;
6-
import edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip.IpAddress;
76
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
87
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
98
import edu.harvard.iq.dataverse.engine.command.CommandContext;
109
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
1110
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
1211
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
13-
import jakarta.json.Json;
14-
import jakarta.json.JsonArrayBuilder;
15-
import jakarta.json.JsonObjectBuilder;
12+
import edu.harvard.iq.dataverse.engine.command.exception.InvalidCommandArgumentsException;
13+
import edu.harvard.iq.dataverse.util.BundleUtil;
1614

1715
import java.util.List;
18-
import java.util.logging.Logger;
19-
20-
import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json;
2116

17+
/**
18+
* Command that retrieves all {@link Dataverse} collections for which a given
19+
* {@link AuthenticatedUser} has the specified permission.
20+
* <p>
21+
* The permission is provided as a string corresponding to one of the names
22+
* in the {@link Permission} enumeration (e.g. {@code Permission.AddDataset.name()}).
23+
* If the special value {@code "any"} is passed, all collections for which
24+
* the user has at least one permission are returned.
25+
* </p>
26+
*
27+
* <p>
28+
* Example:
29+
* <pre>
30+
* new GetUserPermittedCollectionsCommand(request, user, Permission.AddDataset.name());
31+
* </pre>
32+
* will return the list of collections where the user can add datasets.
33+
* </p>
34+
*/
2235
@RequiredPermissions({})
23-
public class GetUserPermittedCollectionsCommand extends AbstractCommand<JsonObjectBuilder> {
24-
private static final Logger logger = Logger.getLogger(GetUserPermittedCollectionsCommand.class.getCanonicalName());
36+
public class GetUserPermittedCollectionsCommand extends AbstractCommand<List<Dataverse>> {
37+
38+
public static final String ANY_PERMISSION = "any";
39+
40+
private final DataverseRequest request;
41+
private final AuthenticatedUser user;
42+
private final String permission;
2543

26-
private DataverseRequest request;
27-
private AuthenticatedUser user;
28-
private String permission;
2944
public GetUserPermittedCollectionsCommand(DataverseRequest request, AuthenticatedUser user, String permission) {
3045
super(request, (DvObject) null);
3146
this.request = request;
@@ -34,28 +49,16 @@ public GetUserPermittedCollectionsCommand(DataverseRequest request, Authenticate
3449
}
3550

3651
@Override
37-
public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException {
52+
public List<Dataverse> execute(CommandContext ctxt) throws CommandException {
3853
if (user == null) {
39-
throw new CommandException("User not found.", this);
54+
throw new CommandException(BundleUtil.getStringFromBundle("getUserPermittedCollectionsCommand.errors.userNotFound"), this);
4055
}
4156
int permissionBit;
4257
try {
43-
permissionBit = permission.equalsIgnoreCase("any") ?
44-
Integer.MAX_VALUE : (1 << Permission.valueOf(permission).ordinal());
58+
permissionBit = permission.equalsIgnoreCase(ANY_PERMISSION) ? Integer.MAX_VALUE : (1 << Permission.valueOf(permission).ordinal());
4559
} catch (IllegalArgumentException e) {
46-
throw new CommandException("Permission not valid.", this);
47-
}
48-
List<Dataverse> collections = ctxt.permissions().findPermittedCollections(request, user, permissionBit);
49-
if (collections != null) {
50-
JsonObjectBuilder job = Json.createObjectBuilder();
51-
JsonArrayBuilder jab = Json.createArrayBuilder();
52-
for (Dataverse dv : collections) {
53-
jab.add(json(dv));
54-
}
55-
job.add("count", collections.size());
56-
job.add("items", jab);
57-
return job;
60+
throw new InvalidCommandArgumentsException(BundleUtil.getStringFromBundle("getUserPermittedCollectionsCommand.errors.permissionNotValid"), this);
5861
}
59-
return null;
62+
return ctxt.permissions().findPermittedCollections(request, user, permissionBit);
6063
}
6164
}

0 commit comments

Comments
 (0)