Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ protected void configure() {
public DAOContainer providesDAOContainer() {
DAOContainer container = new DAOContainer();
container.setCounterDAO(providesCounterDAO());
container.setDaaDAO(providesDaaDAO());
container.setDacDAO(providesDacDAO());
container.setDataAccessRequestDAO(providesDataAccessRequestDAO());
container.setDarCollectionDAO(providesDARCollectionDAO());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
public class DAOContainer {

private CounterDAO counterDAO;
private DaaDAO daaDAO;
private DacDAO dacDAO;
private DataAccessRequestDAO dataAccessRequestDAO;
private DarCollectionDAO darCollectionDAO;
Expand All @@ -35,6 +36,14 @@ public void setCounterDAO(CounterDAO counterDAO) {
this.counterDAO = counterDAO;
}

public DaaDAO getDaaDAO() {
return daaDAO;
}

public void setDaaDAO(DaaDAO daaDAO) {
this.daaDAO = daaDAO;
}

public DacDAO getDacDAO() {
return dacDAO;
}
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/org/broadinstitute/consent/http/db/DaaDAO.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.time.Instant;
import java.util.List;
import java.util.Set;
import org.broadinstitute.consent.http.db.mapper.DaaAuditMapper;
import org.broadinstitute.consent.http.db.mapper.DaaMapper;
import org.broadinstitute.consent.http.db.mapper.DataAccessAgreementReducer;
Expand All @@ -12,6 +13,8 @@
import org.jdbi.v3.sqlobject.config.RegisterBeanMapper;
import org.jdbi.v3.sqlobject.config.RegisterRowMapper;
import org.jdbi.v3.sqlobject.customizer.Bind;
import org.jdbi.v3.sqlobject.customizer.BindList;
import org.jdbi.v3.sqlobject.customizer.BindList.EmptyHandling;
import org.jdbi.v3.sqlobject.statement.SqlQuery;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
import org.jdbi.v3.sqlobject.statement.UseRowReducer;
Expand Down Expand Up @@ -274,4 +277,26 @@ void deleteDacDaaRelation(
ORDER BY action_date DESC
""")
List<DaaAudit> findAllDaaAudits();

/**
* Find all DAAs for a list of dataset IDs. Note that this only finds the DAA IDs for DAAs that
* are CURRENTLY associated to the Dataset-DAC assignments. A DAC's DAA assignment can change. We
* are also NOT considering the initial DAC that created the DAA.
*
* @param datasetIds List of dataset IDs
* @return List of Data Access Agreement IDs
*/
@SqlQuery(
"""
SELECT distinct daa.daa_id
FROM data_access_agreement daa
INNER JOIN dac_daa ON daa.daa_id = dac_daa.daa_id
INNER JOIN dac ON dac.dac_id = dac_daa.dac_id
INNER JOIN dataset ON dataset.dac_id = dac.dac_id
WHERE dataset.dataset_id IN (<datasetIds>)
ORDER BY daa.daa_id
""")
Set<Integer> findDaaIdsByDatasetIds(
@BindList(value = "datasetIds", onEmpty = EmptyHandling.NULL_STRING)
List<Integer> datasetIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

Expand Down Expand Up @@ -161,6 +162,7 @@ public class DataAccessRequestData {
private String piName;
private String piEmail;
private String piCountryOfOperation;
private Set<Integer> daaIds;

@Override
public String toString() {
Expand Down Expand Up @@ -684,6 +686,14 @@ public void setPiEmail(String piEmail) {
this.piEmail = piEmail;
}

public Set<Integer> getDaaIds() {
return daaIds;
}

public void setDaaIds(Set<Integer> daaIds) {
this.daaIds = daaIds;
}

// Validate all ontology entries
private static void validateOntologyEntries(DataAccessRequestData data) {
if (Objects.nonNull(data) && !data.getOntologies().isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ public DataAccessRequest createDataAccessRequest(
}
String referenceId;
List<Integer> datasetIds = dataAccessRequest.getDatasetIds();

if (Objects.nonNull(existingDar)) {
referenceId = dataAccessRequest.getReferenceId();
dataAccessRequestDAO.updateDraftToSubmittedForCollection(collectionId, referenceId);
Expand Down Expand Up @@ -280,6 +281,7 @@ public DataAccessRequest createProgressReport(
List<Integer> progressReportDatasetIds = progressReport.getDatasetIds();
Set<Integer> darDatasetIds =
dataAccessRequestDAO.findDatasetApprovalsByDar(parentDar.getReferenceId());

if (!darDatasetIds.containsAll(progressReportDatasetIds)) {
throw new BadRequestException(
"Progress report can only be created for approved datasets in the parent DAR");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.time.Instant;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.broadinstitute.consent.http.enumeration.AuditActions;
import org.broadinstitute.consent.http.enumeration.FileCategory;
import org.broadinstitute.consent.http.models.DaaAudit;
Expand Down Expand Up @@ -369,6 +370,56 @@ void testFindByDarReferenceId() {
assertFalse(daaIds.contains(daa3.getDaaId()));
}

@Test
void testFindDaaIdsByDatasetIds() {
Integer userId = createUserId();
Integer dacId = dacDAO.createDac(randomAlphabetic(5), randomAlphabetic(5), "", new Date());
Dataset dataset1 = createRandomDataset(userDAO.findUserById(userId), dacDAO.findById(dacId));
Dataset dataset2 = createRandomDataset(userDAO.findUserById(userId), dacDAO.findById(dacId));

// Ensure that the DAA is associated to the DAC
Integer daaId = daaDAO.createDaa(userId, Instant.now(), userId, Instant.now(), dacId);
daaDAO.createDacDaaRelation(dacId, daaId, userId);

Set<Integer> daaIds =
daaDAO.findDaaIdsByDatasetIds(List.of(dataset1.getDatasetId(), dataset2.getDatasetId()));
assertFalse(daaIds.isEmpty());
assertEquals(1, daaIds.size());
assertTrue(daaIds.contains(daaId));
}

@Test
void testFindDaaIdsByDatasetIds_dacNotAssociated() {
Integer userId = createUserId();
Integer dacId = dacDAO.createDac(randomAlphabetic(5), randomAlphabetic(5), "", new Date());
Dataset dataset1 = createRandomDataset(userDAO.findUserById(userId), dacDAO.findById(dacId));
Dataset dataset2 = createRandomDataset(userDAO.findUserById(userId), dacDAO.findById(dacId));

// Create a DAA but do not associate it to the DAC
daaDAO.createDaa(userId, Instant.now(), userId, Instant.now(), dacId);

Set<Integer> daaIds =
daaDAO.findDaaIdsByDatasetIds(List.of(dataset1.getDatasetId(), dataset2.getDatasetId()));
assertTrue(daaIds.isEmpty());
}

@Test
void testFindDaaIdsByDatasetIds_datasetsNotAssociated() {
Integer userId = createUserId();
Integer dacId = dacDAO.createDac(randomAlphabetic(5), randomAlphabetic(5), "", new Date());
Dataset dataset1 = createRandomDataset(userDAO.findUserById(userId), dacDAO.findById(dacId));
Dataset dataset2 = createRandomDataset(userDAO.findUserById(userId), dacDAO.findById(dacId));

// Create a DAA that is associated to a different DAC than the datasets are
Integer otherDacId = dacDAO.createDac(randomAlphabetic(5), randomAlphabetic(5), "", new Date());
Integer daaId = daaDAO.createDaa(userId, Instant.now(), userId, Instant.now(), otherDacId);
daaDAO.createDacDaaRelation(otherDacId, daaId, userId);

Set<Integer> daaIds =
daaDAO.findDaaIdsByDatasetIds(List.of(dataset1.getDatasetId(), dataset2.getDatasetId()));
assertTrue(daaIds.isEmpty());
}

private LibraryCard createRandomLibraryCard(User user) {
int lcId =
libraryCardDAO.insertLibraryCard(
Expand Down
Loading
Loading