Skip to content

Commit d3a1d58

Browse files
committed
allow api call to ignore setting
1 parent 90e770e commit d3a1d58

4 files changed

Lines changed: 88 additions & 31 deletions

File tree

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

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -484,12 +484,16 @@ public Response getVersion(@Context ContainerRequestContext crc,
484484
@QueryParam("excludeMetadataBlocks") Boolean excludeMetadataBlocks,
485485
@QueryParam("includeDeaccessioned") boolean includeDeaccessioned,
486486
@QueryParam("returnOwners") boolean returnOwners,
487+
@QueryParam("ignoreSettingExcludeEmailFromExport") Boolean ignoreSettingToExcludeEmailFromExport,
487488
@Context UriInfo uriInfo,
488489
@Context HttpHeaders headers) {
489490
return response( req -> {
491+
boolean includeMetadataBlocks = excludeMetadataBlocks == null ? true : !excludeMetadataBlocks;
492+
boolean includeFiles = excludeFiles == null ? true : !excludeFiles;
493+
boolean ignoreSettingExcludeEmailFromExport = ignoreSettingToExcludeEmailFromExport != null ? ignoreSettingToExcludeEmailFromExport : false;
490494

491495
//If excludeFiles is null the default is to provide the files and because of this we need to check permissions.
492-
boolean checkPerms = excludeFiles == null ? true : !excludeFiles;
496+
boolean checkPerms = includeFiles;
493497

494498
Dataset dataset = findDatasetOrDie(datasetId);
495499
DatasetVersion requestedDatasetVersion = getDatasetVersionOrDie(req,
@@ -503,16 +507,19 @@ public Response getVersion(@Context ContainerRequestContext crc,
503507
if (requestedDatasetVersion == null || requestedDatasetVersion.getId() == null) {
504508
return notFound("Dataset version not found");
505509
}
506-
507-
if (excludeFiles == null ? true : !excludeFiles) {
510+
if (includeFiles) {
508511
requestedDatasetVersion = datasetversionService.findDeep(requestedDatasetVersion.getId());
509512
}
510-
Boolean includeMetadataBlocks = excludeMetadataBlocks == null ? true : !excludeMetadataBlocks;
511513

512-
JsonObjectBuilder jsonBuilder = json(requestedDatasetVersion,
513-
null,
514-
excludeFiles == null ? true : !excludeFiles,
515-
returnOwners, includeMetadataBlocks);
514+
// Check to see if the caller wants to ignore the ExcludeEmailFromExport setting in the metadata block and that they have permission to do so
515+
// Let the JsonPrinter know to ignore the ExcludeEmailFromExport setting so the emails will show for this API call by permitted user
516+
if (ignoreSettingExcludeEmailFromExport && (!includeMetadataBlocks || !permissionService.userOn(getRequestUser(crc), dataset).has(Permission.EditDataset))) {
517+
// either not showing metadata block or user isn't allowed to override the setting
518+
ignoreSettingExcludeEmailFromExport = false;
519+
}
520+
521+
JsonObjectBuilder jsonBuilder = json(requestedDatasetVersion, null, includeFiles,
522+
returnOwners, includeMetadataBlocks, ignoreSettingExcludeEmailFromExport);
516523
return ok(jsonBuilder);
517524

518525
}, getRequestUser(crc));

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

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -495,17 +495,17 @@ public static JsonObjectBuilder json(FileDetailsHolder ds) {
495495
}
496496

497497
public static JsonObjectBuilder json(DatasetVersion dsv, boolean includeFiles) {
498-
return json(dsv, null, includeFiles, false,true);
498+
return json(dsv, null, includeFiles, false, true, false);
499499
}
500500
public static JsonObjectBuilder json(DatasetVersion dsv, boolean includeFiles, boolean includeMetadataBlocks) {
501-
return json(dsv, null, includeFiles, false, includeMetadataBlocks);
501+
return json(dsv, null, includeFiles, false, includeMetadataBlocks, false);
502502
}
503503
public static JsonObjectBuilder json(DatasetVersion dsv, List<String> anonymizedFieldTypeNamesList,
504504
boolean includeFiles, boolean returnOwners) {
505-
return json( dsv, anonymizedFieldTypeNamesList, includeFiles, returnOwners,true);
505+
return json(dsv, anonymizedFieldTypeNamesList, includeFiles, returnOwners, true, false);
506506
}
507507
public static JsonObjectBuilder json(DatasetVersion dsv, List<String> anonymizedFieldTypeNamesList,
508-
boolean includeFiles, boolean returnOwners, boolean includeMetadataBlocks) {
508+
boolean includeFiles, boolean returnOwners, boolean includeMetadataBlocks, boolean ignoreSettingExcludeEmailFromExport) {
509509
Dataset dataset = dsv.getDataset();
510510
JsonObjectBuilder bld = jsonObjectBuilder()
511511
.add("id", dsv.getId()).add("datasetId", dataset.getId())
@@ -554,10 +554,8 @@ public static JsonObjectBuilder json(DatasetVersion dsv, List<String> anonymized
554554
.add("studyCompletion", dsv.getTermsOfUseAndAccess().getStudyCompletion())
555555
.add("fileAccessRequest", dsv.getTermsOfUseAndAccess().isFileAccessRequest());
556556
if(includeMetadataBlocks) {
557-
bld.add("metadataBlocks", (anonymizedFieldTypeNamesList != null) ?
558-
jsonByBlocks(dsv.getDatasetFields(), anonymizedFieldTypeNamesList)
559-
: jsonByBlocks(dsv.getDatasetFields())
560-
);
557+
bld.add("metadataBlocks",
558+
jsonByBlocks(dsv.getDatasetFields(), anonymizedFieldTypeNamesList, ignoreSettingExcludeEmailFromExport));
561559
}
562560
if(returnOwners){
563561
bld.add("isPartOf", getOwnersFromDvObject(dataset));
@@ -641,15 +639,15 @@ public static JsonObjectBuilder json(DatasetDistributor dist) {
641639
}
642640

643641
public static JsonObjectBuilder jsonByBlocks(List<DatasetField> fields) {
644-
return jsonByBlocks(fields, null);
642+
return jsonByBlocks(fields, null, false);
645643
}
646644

647-
public static JsonObjectBuilder jsonByBlocks(List<DatasetField> fields, List<String> anonymizedFieldTypeNamesList) {
645+
public static JsonObjectBuilder jsonByBlocks(List<DatasetField> fields, List<String> anonymizedFieldTypeNamesList, boolean ignoreSettingExcludeEmailFromExport) {
648646
JsonObjectBuilder blocksBld = jsonObjectBuilder();
649647

650648
for (Map.Entry<MetadataBlock, List<DatasetField>> blockAndFields : DatasetField.groupByBlock(fields).entrySet()) {
651649
MetadataBlock block = blockAndFields.getKey();
652-
blocksBld.add(block.getName(), JsonPrinter.json(block, blockAndFields.getValue(), anonymizedFieldTypeNamesList));
650+
blocksBld.add(block.getName(), JsonPrinter.json(block, blockAndFields.getValue(), anonymizedFieldTypeNamesList, ignoreSettingExcludeEmailFromExport));
653651
}
654652
return blocksBld;
655653
}
@@ -667,14 +665,22 @@ public static JsonObjectBuilder json(MetadataBlock block, List<DatasetField> fie
667665
}
668666

669667
public static JsonObjectBuilder json(MetadataBlock block, List<DatasetField> fields, List<String> anonymizedFieldTypeNamesList) {
668+
return json(block, fields, anonymizedFieldTypeNamesList, false);
669+
}
670+
671+
public static JsonObjectBuilder json(MetadataBlock block, List<DatasetField> fields, List<String> anonymizedFieldTypeNamesList, boolean ignoreSettingExcludeEmailFromExport) {
670672
JsonObjectBuilder blockBld = jsonObjectBuilder();
671673

672674
blockBld.add("displayName", block.getDisplayName());
673675
blockBld.add("name", block.getName());
674676

675677
final JsonArrayBuilder fieldsArray = Json.createArrayBuilder();
676678
Map<Long, JsonObject> cvocMap = (datasetFieldService==null) ? new HashMap<Long, JsonObject>() :datasetFieldService.getCVocConf(true);
677-
DatasetFieldWalker.walk(fields, settingsService, cvocMap, new DatasetFieldsToJson(fieldsArray, anonymizedFieldTypeNamesList));
679+
if (ignoreSettingExcludeEmailFromExport) {
680+
DatasetFieldWalker.walk(fields, null, cvocMap, new DatasetFieldsToJson(fieldsArray, anonymizedFieldTypeNamesList));
681+
} else {
682+
DatasetFieldWalker.walk(fields, settingsService, cvocMap, new DatasetFieldsToJson(fieldsArray, anonymizedFieldTypeNamesList));
683+
}
678684

679685
blockBld.add("fields", fieldsArray);
680686
return blockBld;

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

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@
3131
import org.apache.commons.lang3.StringUtils;
3232
import org.apache.commons.lang3.exception.ExceptionUtils;
3333
import org.hamcrest.CoreMatchers;
34-
import org.junit.jupiter.api.AfterAll;
35-
import org.junit.jupiter.api.BeforeAll;
36-
import org.junit.jupiter.api.Disabled;
37-
import org.junit.jupiter.api.Test;
34+
import org.junit.jupiter.api.*;
3835
import org.skyscreamer.jsonassert.JSONAssert;
3936

4037
import javax.xml.stream.XMLInputFactory;
@@ -101,6 +98,10 @@ public static void setUpClass() {
10198
*/
10299
}
103100

101+
@AfterEach
102+
public void afterEach() {
103+
UtilIT.deleteSetting(SettingsServiceBean.Key.ExcludeEmailFromExport);
104+
}
104105

105106
@AfterAll
106107
public static void afterClass() {
@@ -1757,11 +1758,6 @@ public void testExcludeEmail() {
17571758
Response deleteUserResponse = UtilIT.deleteUser(username);
17581759
deleteUserResponse.prettyPrint();
17591760
assertEquals(200, deleteUserResponse.getStatusCode());
1760-
1761-
Response removeExcludeEmail = UtilIT.deleteSetting(SettingsServiceBean.Key.ExcludeEmailFromExport);
1762-
removeExcludeEmail.then().assertThat()
1763-
.statusCode(200);
1764-
17651761
}
17661762

17671763
@Disabled
@@ -6905,6 +6901,45 @@ public void testUpdateMultipleFileMetadata() {
69056901
.statusCode(OK.getStatusCode());
69066902
}
69076903

6904+
@Test
6905+
public void testExcludeEmailOverride() {
6906+
// Create super user
6907+
String apiToken = getSuperuserToken();
6908+
// Create user with no permission
6909+
String apiTokenNoPerms = UtilIT.createRandomUserGetToken();
6910+
// Create Collection
6911+
String collectionAlias = UtilIT.createRandomCollectionGetAlias(apiToken);
6912+
// Publish Collection
6913+
UtilIT.publishDataverseViaNativeApi(collectionAlias, apiToken).prettyPrint();
6914+
// Create Dataset
6915+
Response createDataset = UtilIT.createRandomDatasetViaNativeApi(collectionAlias, apiToken);
6916+
createDataset.then().assertThat()
6917+
.statusCode(CREATED.getStatusCode());
6918+
Integer datasetId = UtilIT.getDatasetIdFromResponse(createDataset);
6919+
String datasetPid = JsonPath.from(createDataset.asString()).getString("data.persistentId");
6920+
// Publish Dataset
6921+
UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken).prettyPrint();
6922+
6923+
UtilIT.setSetting(SettingsServiceBean.Key.ExcludeEmailFromExport, "true");
6924+
// User has permission to ignore the setting allowing the datasetContactEmail to be included in the response
6925+
Response response = UtilIT.getDatasetVersion(datasetPid, DS_VERSION_LATEST_PUBLISHED, apiToken, true, false, false, true);
6926+
//response.prettyPrint();
6927+
response.then().assertThat()
6928+
.statusCode(OK.getStatusCode());
6929+
6930+
String json = response.prettyPrint();
6931+
assertTrue(json.contains("datasetContactEmail"));
6932+
6933+
// User has no permission to override the setting. datasetContactEmail will be excluded
6934+
response = UtilIT.getDatasetVersion(datasetPid, DS_VERSION_LATEST_PUBLISHED, apiTokenNoPerms, true, false, false, true);
6935+
//response.prettyPrint();
6936+
response.then().assertThat()
6937+
.statusCode(OK.getStatusCode());
6938+
6939+
json = response.prettyPrint();
6940+
assertTrue(!json.contains("datasetContactEmail"));
6941+
}
6942+
69086943
private String getSuperuserToken() {
69096944
Response createResponse = UtilIT.createRandomUser();
69106945
String adminApiToken = UtilIT.getApiTokenFromResponse(createResponse);

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1753,7 +1753,15 @@ static Response getDatasetVersion(String persistentId, String versionNumber, Str
17531753
static Response getDatasetVersion(String persistentId, String versionNumber, String apiToken, boolean excludeFiles, boolean includeDeaccessioned) {
17541754
return getDatasetVersion(persistentId,versionNumber,apiToken,excludeFiles,false,includeDeaccessioned);
17551755
}
1756-
static Response getDatasetVersion(String persistentId, String versionNumber, String apiToken, boolean excludeFiles,boolean excludeMetadataBlocks, boolean includeDeaccessioned) {
1756+
static Response getDatasetVersion(String persistentId, String versionNumber, String apiToken, boolean excludeFiles, boolean excludeMetadataBlocks, boolean includeDeaccessioned) {
1757+
return getDatasetVersion(persistentId, versionNumber, apiToken, excludeFiles, excludeMetadataBlocks, includeDeaccessioned, false);
1758+
}
1759+
// includeMetadataBlocksEmail is an override of the Setting ExcludeEmailFromExport. excludeMetadataBlocks must be false and user needs EditDataset permission
1760+
static Response getDatasetVersion(String persistentId, String versionNumber, String apiToken,
1761+
boolean excludeFiles,
1762+
boolean excludeMetadataBlocks,
1763+
boolean includeDeaccessioned,
1764+
boolean ignoreSettingExcludeEmailFromExport) {
17571765
return given()
17581766
.header(API_TOKEN_HTTP_HEADER, apiToken)
17591767
.queryParam("includeDeaccessioned", includeDeaccessioned)
@@ -1762,7 +1770,8 @@ static Response getDatasetVersion(String persistentId, String versionNumber, Str
17621770
+ "?persistentId="
17631771
+ persistentId
17641772
+ (excludeFiles ? "&excludeFiles=true" : "")
1765-
+ (excludeMetadataBlocks ? "&excludeMetadataBlocks=true" : ""));
1773+
+ (excludeMetadataBlocks ? "&excludeMetadataBlocks=true" : "")
1774+
+ (ignoreSettingExcludeEmailFromExport ? "&ignoreSettingExcludeEmailFromExport=true" : ""));
17661775
}
17671776
static Response compareDatasetVersions(String persistentId, String versionNumber1, String versionNumber2, String apiToken) {
17681777
return given()

0 commit comments

Comments
 (0)