Skip to content

Commit

Permalink
fixed notifyCustodiansOfApprovedDatasets()
Browse files Browse the repository at this point in the history
  • Loading branch information
hams7504 committed Nov 21, 2023
1 parent 57a9f51 commit 03c1716
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 12 deletions.
39 changes: 39 additions & 0 deletions src/main/java/org/broadinstitute/consent/http/models/Dataset.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.broadinstitute.consent.http.models;

import com.google.gson.Gson;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
Expand All @@ -8,8 +10,12 @@
import java.util.Optional;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import com.google.gson.reflect.TypeToken;
import org.bouncycastle.crypto.CryptoServicesRegistrar.Property;
import org.broadinstitute.consent.http.enumeration.PropertyType;
import org.broadinstitute.consent.http.models.dataset_registration_v1.ConsentGroup;
import org.broadinstitute.consent.http.models.dataset_registration_v1.ConsentGroup.AccessManagement;
import org.broadinstitute.consent.http.util.gson.GsonUtil;
import org.checkerframework.checker.nullness.qual.NonNull;

public class Dataset {
Expand Down Expand Up @@ -471,4 +477,37 @@ public User getCreateUser() {
public void setCreateUser(User createUser) {
this.createUser = createUser;
}

public List<String> getDataCustodianEmails() {
if (!(this.getProperties() == null)) {
Gson gson = GsonUtil.getInstance();
Type listOfStringsType = new TypeToken<List<String>>() {}.getType();
return this.getProperties()
.stream()
.filter(p -> (Objects.nonNull(p.getSchemaProperty()) &&
p.getSchemaProperty().equalsIgnoreCase("dataCustodianEmail")))
.filter(p -> p.getPropertyType().equals(PropertyType.Json))
.map(p -> {
List<String> stringList = gson.fromJson(p.getPropertyValueAsString(), listOfStringsType);
return stringList;
})
.flatMap(List::stream)
.distinct()
.toList();
}
return List.of();
}

public List<String> getDataDepositorEmails() {
if (!(this.getProperties() == null)) {
return this.getProperties()
.stream()
.filter(p -> Objects.nonNull(p.getSchemaProperty()) &&
p.getPropertyName().equalsIgnoreCase("Data Depositor"))
.map(p -> p.getPropertyValueAsString())
.distinct()
.toList();
}
return List.of();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -352,8 +352,10 @@ public void sendDatasetApprovalNotifications(List<Vote> votes) {
protected void notifyCustodiansOfApprovedDatasets(List<Dataset> datasets, User researcher,
String darCode) throws IllegalArgumentException {
Map<User, HashSet<Dataset>> custodianMap = new HashMap<>();

// Find all the custodians, data owners, and data submitters to notify for each dataset
datasets.forEach(d -> {

// Data Submitter
if (Objects.nonNull(d.getCreateUserId())) {
User submitter = userDAO.findUserById(d.getCreateUserId());
Expand All @@ -362,22 +364,25 @@ protected void notifyCustodiansOfApprovedDatasets(List<Dataset> datasets, User r
custodianMap.get(submitter).add(d);
}
}
// Data Custodians and Data Depositor
List<String> custodianEmails = d.getProperties()
.stream()
.filter(p ->
(Objects.nonNull(p.getSchemaProperty()) && p.getSchemaProperty()
.equalsIgnoreCase("dataCustodianEmail")) ||
p.getPropertyName().equalsIgnoreCase("Data Depositor"))
.map(DatasetProperty::getPropertyValueAsString)
.distinct()
.toList();

// Data Custodians
List<String> custodianEmails = d.getDataCustodianEmails();
if (!custodianEmails.isEmpty()) {
userDAO.findUsersByEmailList(custodianEmails).forEach(u -> {
custodianMap.putIfAbsent(u, new HashSet<>());
custodianMap.get(u).add(d);
});
}

// Data Depositors
List<String> depositorEmails = d.getDataDepositorEmails();
if (!depositorEmails.isEmpty()) {
userDAO.findUsersByEmailList(depositorEmails).forEach(u -> {
custodianMap.putIfAbsent(u, new HashSet<>());
custodianMap.get(u).add(d);
});
}

// Data Owners
List<Integer> ownerUserIds = datasetAssociationDAO.getDataOwnersOfDataSet(d.getDataSetId());
if (!ownerUserIds.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import com.google.gson.Gson;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.RandomStringUtils;
import org.broadinstitute.consent.http.enumeration.PropertyType;
import org.broadinstitute.consent.http.models.dataset_registration_v1.ConsentGroup.AccessManagement;
import org.broadinstitute.consent.http.util.gson.GsonUtil;
import org.junit.jupiter.api.Test;

class DatasetTests {
Expand Down Expand Up @@ -176,4 +178,62 @@ void testIsDatasetMatchControlledAccess() {
assertTrue(ds.isDatasetMatch(value, AccessManagement.CONTROLLED));
assertFalse(ds.isDatasetMatch(RandomStringUtils.randomAlphanumeric(25), AccessManagement.OPEN));
}

@Test
void testGetDataDepositorEmails() {
Dataset ds = new Dataset();

assertTrue(ds.getDataDepositorEmails().isEmpty());

DatasetProperty depositorProp = new DatasetProperty();
depositorProp.setPropertyName("Data Depositor");
depositorProp.setPropertyValue("[email protected]");
depositorProp.setSchemaProperty("dataDepositorEmail");
depositorProp.setPropertyType(PropertyType.String);
ds.setProperties(Set.of(depositorProp));

assertTrue(ds.getDataDepositorEmails().size() == 1);
assertEquals(ds.getDataDepositorEmails(), List.of("[email protected]"));

Gson gson = GsonUtil.getInstance();
DatasetProperty custodianProp = new DatasetProperty();
custodianProp.setSchemaProperty("dataCustodianEmail");
custodianProp.setPropertyName("Custodian Email");
custodianProp.setPropertyType(PropertyType.Json);
custodianProp.setPropertyValue(gson.toJson(List.of("[email protected]")));
ds.setProperties(Set.of(depositorProp, custodianProp));

assertTrue(ds.getDataDepositorEmails().size() == 1);
assertEquals(ds.getDataDepositorEmails(), List.of("[email protected]"));

}

@Test
void testGetDataCustodianEmails() {
Dataset ds = new Dataset();

assertTrue(ds.getDataCustodianEmails().isEmpty());

Gson gson = GsonUtil.getInstance();
DatasetProperty custodianProp = new DatasetProperty();
custodianProp.setSchemaProperty("dataCustodianEmail");
custodianProp.setPropertyName("Custodian Email");
custodianProp.setPropertyType(PropertyType.Json);
custodianProp.setPropertyValue(gson.toJson(List.of("[email protected]")));
ds.setProperties(Set.of(custodianProp));

assertTrue(ds.getDataCustodianEmails().size() == 1);
assertEquals(ds.getDataCustodianEmails(), List.of("[email protected]"));

DatasetProperty depositorProp = new DatasetProperty();
depositorProp.setPropertyName("Data Depositor");
depositorProp.setPropertyValue("[email protected]");
depositorProp.setSchemaProperty("dataDepositorEmail");
depositorProp.setPropertyType(PropertyType.String);
ds.setProperties(Set.of(depositorProp, custodianProp));

assertTrue(ds.getDataCustodianEmails().size() == 1);
assertEquals(ds.getDataCustodianEmails(), List.of("[email protected]"));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.openMocks;

import com.google.gson.Gson;
import org.broadinstitute.consent.http.util.gson.GsonUtil;
import jakarta.ws.rs.NotFoundException;
import java.util.Collections;
import java.util.List;
Expand Down Expand Up @@ -781,6 +783,7 @@ public void testNotifyCustodiansOfApprovedDatasets() {
DatasetProperty depositorProp = new DatasetProperty();
depositorProp.setPropertyName("Data Depositor");
depositorProp.setPropertyValue("[email protected]");
depositorProp.setSchemaProperty("dataDepositorEmail");
depositorProp.setPropertyType(PropertyType.String);

Dataset d1 = new Dataset();
Expand Down Expand Up @@ -836,8 +839,68 @@ public void testNotifyCustodiansOfApprovedDatasets() {
}

@Test
public void testNotifyCustodiansOfApprovedDatasetsNoSubmitterOrDepositorOrCustodians()
throws Exception {
public void testNotifyCustodiansOfApprovedDatasetsWithCustodianProps() {
User submitter = new User();
submitter.setEmail("[email protected]");
submitter.setDisplayName("submitter");
submitter.setUserId(4);

Gson gson = GsonUtil.getInstance();
DatasetProperty custodianProp = new DatasetProperty();
custodianProp.setSchemaProperty("dataCustodianEmail");
custodianProp.setPropertyName("Custodian Email");
custodianProp.setPropertyType(PropertyType.Json);
custodianProp.setPropertyValue(gson.toJson(List.of("[email protected]")));

Dataset d1 = new Dataset();
d1.setDataSetId(1);
d1.setName(RandomStringUtils.random(50, true, false));
d1.setAlias(1);
d1.setDataUse(new DataUseBuilder().setGeneralUse(false).setCommercialUse(true).build());
d1.setProperties(Set.of(custodianProp));
d1.setCreateUserId(submitter.getUserId());

Dataset d2 = new Dataset();
d2.setDataSetId(2);
d2.setName(RandomStringUtils.random(50, true, false));
d2.setAlias(2);
d2.setDataUse(new DataUseBuilder().setGeneralUse(false).setHmbResearch(true).build());
d2.setProperties(Set.of(custodianProp));
d2.setCreateUserId(submitter.getUserId());

User researcher = new User();
researcher.setEmail("[email protected]");
researcher.setDisplayName("Researcher");
researcher.setUserId(1);

User custodian = new User();
custodian.setEmail("[email protected]");
custodian.setDisplayName("custodian");
custodian.setUserId(3);

when(userDAO.findUserById(submitter.getUserId())).thenReturn(submitter);
when(userDAO.findUsersByEmailList(List.of(custodian.getEmail()))).thenReturn(
List.of(custodian));
when(userDAO.findUsers(List.of(3))).thenReturn(List.of(custodian));

initService();
try {
service.notifyCustodiansOfApprovedDatasets(List.of(d1, d2), researcher, "Dar Code");
verify(emailService, times(2)).sendDataCustodianApprovalMessage(
any(),
any(),
any(),
any(),
any()
);
} catch (Exception e) {
fail(e.getMessage());

}
}

@Test
public void testNotifyCustodiansOfApprovedDatasetsNoSubmitterOrDepositorOrCustodians() throws Exception {
User submitterNotFound = new User();
submitterNotFound.setEmail("[email protected]");
submitterNotFound.setDisplayName("submitter");
Expand Down

0 comments on commit 03c1716

Please sign in to comment.