From 2c40a8c2b8c9806eb2f9c80b6027e094e4263e4c Mon Sep 17 00:00:00 2001 From: rushtong Date: Mon, 23 Feb 2026 14:21:37 -0500 Subject: [PATCH 01/22] feat: refactoring to remove unused objects (dataset/elections) --- .../consent/http/ConsentModule.java | 6 +- .../consent/http/db/ElectionDAO.java | 19 ------ .../consent/http/models/DatasetMetrics.java | 18 ------ .../consent/http/service/MetricsService.java | 64 +++---------------- src/main/resources/assets/api-docs.yaml | 23 +------ .../assets/paths/metricsDatasetById.yaml | 22 +++++++ .../assets/schemas/DatasetMetrics.yaml | 6 -- .../consent/http/db/ElectionDAOTest.java | 35 +++++----- .../http/service/MetricsServiceTest.java | 47 +++----------- 9 files changed, 59 insertions(+), 181 deletions(-) create mode 100644 src/main/resources/assets/paths/metricsDatasetById.yaml diff --git a/src/main/java/org/broadinstitute/consent/http/ConsentModule.java b/src/main/java/org/broadinstitute/consent/http/ConsentModule.java index 481ac91280..393f7b75ea 100644 --- a/src/main/java/org/broadinstitute/consent/http/ConsentModule.java +++ b/src/main/java/org/broadinstitute/consent/http/ConsentModule.java @@ -537,11 +537,7 @@ MailMessageDAO providesMailMessageDAO() { @Provides MetricsService providesMetricsService() { - return new MetricsService( - providesDatasetDAO(), - providesDataAccessRequestDAO(), - providesDARCollectionDAO(), - providesElectionDAO()); + return new MetricsService(providesDatasetDAO(), providesDataAccessRequestDAO()); } @Provides diff --git a/src/main/java/org/broadinstitute/consent/http/db/ElectionDAO.java b/src/main/java/org/broadinstitute/consent/http/db/ElectionDAO.java index 4fbbed4a0b..f253341b29 100644 --- a/src/main/java/org/broadinstitute/consent/http/db/ElectionDAO.java +++ b/src/main/java/org/broadinstitute/consent/http/db/ElectionDAO.java @@ -151,25 +151,6 @@ List findOpenElectionsByReferenceIds( @BindList(value = "referenceIds", onEmpty = EmptyHandling.NULL_STRING) List referenceIds); - @SqlQuery( - """ - SELECT distinct * - FROM election e - INNER JOIN - (SELECT reference_id, MAX(create_date) max_date - FROM election e WHERE LOWER(e.election_type) = LOWER(:type) - GROUP BY reference_id) election_view - ON election_view.max_date = e.create_date - AND election_view.reference_id = e.reference_id - WHERE e.reference_id in () - AND LOWER(e.election_type) = LOWER(:type) - """) - @UseRowMapper(SimpleElectionMapper.class) - List findLastElectionsByReferenceIdsAndType( - @BindList(value = "referenceIds", onEmpty = EmptyHandling.NULL_STRING) - List referenceIds, - @Bind("type") String type); - @SqlQuery( """ SELECT e.* FROM election e diff --git a/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java b/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java index a0d3fb9f17..fe77f6dd6f 100644 --- a/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java +++ b/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java @@ -5,17 +5,7 @@ public class DatasetMetrics { - private Dataset dataset; private List dars; - private List elections; - - public Dataset getDataset() { - return dataset; - } - - public void setDataset(Dataset dataset) { - this.dataset = dataset; - } public List getDars() { return dars; @@ -24,12 +14,4 @@ public List getDars() { public void setDars(List dars) { this.dars = dars; } - - public List getElections() { - return elections; - } - - public void setElections(List elections) { - this.elections = elections; - } } diff --git a/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java b/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java index f3eb6785bd..b3ed8e8525 100644 --- a/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java +++ b/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java @@ -4,39 +4,22 @@ import com.google.inject.Inject; import jakarta.ws.rs.NotFoundException; import java.sql.Timestamp; -import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Function; -import java.util.stream.Collectors; -import org.broadinstitute.consent.http.db.DarCollectionDAO; import org.broadinstitute.consent.http.db.DataAccessRequestDAO; import org.broadinstitute.consent.http.db.DatasetDAO; -import org.broadinstitute.consent.http.db.ElectionDAO; -import org.broadinstitute.consent.http.models.DarCollection; import org.broadinstitute.consent.http.models.DataAccessRequest; import org.broadinstitute.consent.http.models.Dataset; import org.broadinstitute.consent.http.models.DatasetMetrics; -import org.broadinstitute.consent.http.models.Election; public class MetricsService { private final DatasetDAO dataSetDAO; private final DataAccessRequestDAO darDAO; - private final DarCollectionDAO darCollectionDAO; - private final ElectionDAO electionDAO; @Inject - public MetricsService( - DatasetDAO dataSetDAO, - DataAccessRequestDAO darDAO, - DarCollectionDAO darCollectionDAO, - ElectionDAO electionDAO) { + public MetricsService(DatasetDAO dataSetDAO, DataAccessRequestDAO darDAO) { this.dataSetDAO = dataSetDAO; this.darDAO = darDAO; - this.darCollectionDAO = darCollectionDAO; - this.electionDAO = electionDAO; } public static class DarMetricsSummary { @@ -47,12 +30,12 @@ public static class DarMetricsSummary { @JsonProperty final String nonTechRus; @JsonProperty final String referenceId; - public DarMetricsSummary(DataAccessRequest dar, String darCode) { - if (dar != null && dar.data != null) { + public DarMetricsSummary(DataAccessRequest dar) { + if (dar != null && dar.getData() != null) { this.updateDate = dar.getUpdateDate(); - this.projectTitle = dar.data.getProjectTitle(); - this.darCode = darCode; - this.nonTechRus = dar.data.getNonTechRus(); + this.projectTitle = dar.getData().getProjectTitle(); + this.darCode = dar.getDarCode(); + this.nonTechRus = dar.getData().getNonTechRus(); this.referenceId = dar.getReferenceId(); } else { this.updateDate = null; @@ -78,38 +61,9 @@ public DatasetMetrics generateDatasetMetrics(Integer datasetId) { // can be converted to jsonb in query // convert all dars into smaller objects that only contain the information needed List dars = darDAO.findApprovedDARsByDatasetId(datasetId); - List darCollectionIds = dars.stream().map(DataAccessRequest::getCollectionId).toList(); - List darCollections = - darCollectionIds.isEmpty() - ? List.of() - : darCollectionDAO.findDARCollectionByCollectionIds(darCollectionIds); - Map collectionMap = - darCollections.stream() - .collect(Collectors.toMap(DarCollection::getDarCollectionId, Function.identity())); - - List darInfo = - dars.stream() - .map( - dar -> { - DarCollection collection = collectionMap.get(dar.getCollectionId()); - String darCode = Objects.nonNull(collection) ? collection.getDarCode() : null; - return new DarMetricsSummary(dar, darCode); - }) - .collect(Collectors.toList()); - - // if there are associated dars, find associated access elections so we know how many and which - // dars are approved/denied - List referenceIds = - dars.stream().map(dar -> (dar.referenceId)).collect(Collectors.toList()); - if (!referenceIds.isEmpty()) { - List elections = - electionDAO.findLastElectionsByReferenceIdsAndType(referenceIds, "DataAccess"); - metrics.setElections(elections); - } else { - metrics.setElections(Collections.emptyList()); - } - metrics.setDataset(dataset); - metrics.setDars(darInfo); + List darMetricsSummaries = + dars.stream().map(DarMetricsSummary::new).toList(); + metrics.setDars(darMetricsSummaries); return metrics; } } diff --git a/src/main/resources/assets/api-docs.yaml b/src/main/resources/assets/api-docs.yaml index 182a0e99ca..faff444270 100644 --- a/src/main/resources/assets/api-docs.yaml +++ b/src/main/resources/assets/api-docs.yaml @@ -914,28 +914,7 @@ paths: /api/ontology: $ref: './paths/ontology.yaml' /metrics/dataset/{datasetId}: - get: - summary: Dataset Metrics - description: get dars and elections associated with datasetId - parameters: - - name: datasetId - in: path - required: true - schema: - type: integer - tags: - - Metrics - responses: - 200: - description: Dataset Metrics - content: - application/json: - schema: - $ref: './schemas/DatasetMetrics.yaml' - 404: - description: Dataset with specified ID does not exist - 500: - description: Internal Server Error + $ref: './paths/metricsDatasetById.yaml' /liveness: $ref: './paths/liveness.yaml' /ontology/search: diff --git a/src/main/resources/assets/paths/metricsDatasetById.yaml b/src/main/resources/assets/paths/metricsDatasetById.yaml new file mode 100644 index 0000000000..fafe43ef0a --- /dev/null +++ b/src/main/resources/assets/paths/metricsDatasetById.yaml @@ -0,0 +1,22 @@ +get: + summary: Dataset Metrics + description: get Data Access Requests associated to a datasetId + parameters: + - name: datasetId + in: path + required: true + schema: + type: integer + tags: + - Metrics + responses: + 200: + description: Dataset Metrics + content: + application/json: + schema: + $ref: '../schemas/DatasetMetrics.yaml' + 404: + description: Dataset with specified ID does not exist + 500: + description: Internal Server Error diff --git a/src/main/resources/assets/schemas/DatasetMetrics.yaml b/src/main/resources/assets/schemas/DatasetMetrics.yaml index 16c21863bc..974dfcd349 100644 --- a/src/main/resources/assets/schemas/DatasetMetrics.yaml +++ b/src/main/resources/assets/schemas/DatasetMetrics.yaml @@ -1,12 +1,6 @@ type: object properties: - dataset: - $ref: './Dataset.yaml' dars: type: array items: $ref: './DarMetric.yaml' - elections: - type: array - items: - $ref: './Election.yaml' diff --git a/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java b/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java index bc940dabfd..c73493e0e2 100644 --- a/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java +++ b/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java @@ -359,23 +359,24 @@ void testInsertExtendedElection() { assertEquals(e.getElectionId(), election.getElectionId()); } - @Test - void testFindLastElectionsByReferenceIdsAndType() { - DataAccessRequest dar = createDataAccessRequestV3(); - Dataset d = createDataset(); - electionDAO.insertElection( - ElectionType.DATA_ACCESS.getValue(), - ElectionStatus.OPEN.getValue(), - new Date(), - dar.getReferenceId(), - d.getDatasetId()); - List elections = - electionDAO.findLastElectionsByReferenceIdsAndType( - Collections.singletonList(dar.getReferenceId()), ElectionType.DATA_ACCESS.getValue()); - assertNotNull(elections); - assertFalse(elections.isEmpty()); - assertEquals(1, elections.size()); - } + // @Test + // void testFindLastElectionsByReferenceIdsAndType() { + // DataAccessRequest dar = createDataAccessRequestV3(); + // Dataset d = createDataset(); + // electionDAO.insertElection( + // ElectionType.DATA_ACCESS.getValue(), + // ElectionStatus.OPEN.getValue(), + // new Date(), + // dar.getReferenceId(), + // d.getDatasetId()); + // List elections = + // electionDAO.findLastElectionsByReferenceIdsAndType( + // Collections.singletonList(dar.getReferenceId()), + // ElectionType.DATA_ACCESS.getValue()); + // assertNotNull(elections); + // assertFalse(elections.isEmpty()); + // assertEquals(1, elections.size()); + // } @Test void testFindLastElectionsByReferenceIds() { diff --git a/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java b/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java index 504987820b..ee369ef77a 100644 --- a/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java +++ b/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java @@ -3,25 +3,20 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; import jakarta.ws.rs.NotFoundException; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; import org.broadinstitute.consent.http.AbstractTestHelper; -import org.broadinstitute.consent.http.db.DarCollectionDAO; import org.broadinstitute.consent.http.db.DataAccessRequestDAO; import org.broadinstitute.consent.http.db.DatasetDAO; -import org.broadinstitute.consent.http.db.ElectionDAO; -import org.broadinstitute.consent.http.models.DarCollection; import org.broadinstitute.consent.http.models.DataAccessRequest; import org.broadinstitute.consent.http.models.DataAccessRequestData; import org.broadinstitute.consent.http.models.Dataset; import org.broadinstitute.consent.http.models.DatasetMetrics; -import org.broadinstitute.consent.http.models.Election; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -34,49 +29,32 @@ class MetricsServiceTest extends AbstractTestHelper { @Mock private DataAccessRequestDAO darDAO; - @Mock private DarCollectionDAO darCollectionDAO; - - @Mock private ElectionDAO electionDAO; - private MetricsService service; - private void initService() { - service = new MetricsService(dataSetDAO, darDAO, darCollectionDAO, electionDAO); + @BeforeEach + void initService() { + service = new MetricsService(dataSetDAO, darDAO); } @Test void testGenerateDatasetMetrics() { DataAccessRequest dar = generateDar(); - List election = generateElection(dar.getReferenceId()); Dataset dataset = generateDataset(); - DarCollection collection = new DarCollection(); - collection.setDarCode("DAR-" + randomInt(1, 999999999)); when(dataSetDAO.findDatasetById(dataset.getDatasetId())).thenReturn(dataset); when(darDAO.findApprovedDARsByDatasetId(any())).thenReturn(List.of(dar)); - when(darCollectionDAO.findDARCollectionByCollectionIds(any())).thenReturn(List.of(collection)); - when(electionDAO.findLastElectionsByReferenceIdsAndType(any(), eq("DataAccess"))) - .thenReturn(election); - initService(); DatasetMetrics metrics = service.generateDatasetMetrics(1); - assertEquals(metrics.getDars().get(0).projectTitle, dar.getData().getProjectTitle()); - assertEquals(metrics.getDars().get(0).darCode, collection.getDarCode()); - assertEquals(metrics.getElections(), election); - assertEquals(metrics.getDataset(), dataset); + assertEquals(dar.getData().getProjectTitle(), metrics.getDars().getFirst().projectTitle); + assertEquals(dar.getDarCode(), metrics.getDars().getFirst().darCode); } @Test void testGenerateDatasetMetricsNotFound() { when(dataSetDAO.findDatasetById(any())).thenReturn(null); - initService(); - assertThrows( - NotFoundException.class, - () -> { - service.generateDatasetMetrics(1); - }); + assertThrows(NotFoundException.class, () -> service.generateDatasetMetrics(1)); } private DataAccessRequest generateDar() { @@ -89,6 +67,7 @@ private DataAccessRequest generateDar() { dar.setDatasetIds(datasetIds); data.setReferenceId(referenceId); data.setProjectTitle(UUID.randomUUID().toString()); + dar.setDarCode("DAR-" + randomInt(1, 100)); dar.setData(data); return dar; } @@ -100,14 +79,4 @@ private Dataset generateDataset() { d.setName(UUID.randomUUID().toString()); return d; } - - private List generateElection(String ref) { - ArrayList list = new ArrayList<>(); - Election e = new Election(); - e.setElectionId(1); - e.setReferenceId(ref); - e.setElectionType("DataAccess"); - list.add(e); - return list; - } } From c425a4fb36450c004fe4038a1c8548f37a42c1a1 Mon Sep 17 00:00:00 2001 From: rushtong Date: Mon, 23 Feb 2026 15:06:39 -0500 Subject: [PATCH 02/22] feat: deprecate the old; replace with new API --- .../http/resources/MetricsResource.java | 22 +++++++- .../consent/http/service/MetricsService.java | 16 +++--- src/main/resources/assets/api-docs.yaml | 2 + .../assets/paths/darSummariesByDatasetId.yaml | 24 +++++++++ .../http/resources/MetricsResourceTest.java | 52 +++++++++++++++++-- 5 files changed, 101 insertions(+), 15 deletions(-) create mode 100644 src/main/resources/assets/paths/darSummariesByDatasetId.yaml diff --git a/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java b/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java index 4b6f853069..4c445e2adf 100644 --- a/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java +++ b/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java @@ -1,15 +1,20 @@ package org.broadinstitute.consent.http.resources; import com.google.inject.Inject; +import io.dropwizard.auth.Auth; +import jakarta.annotation.security.PermitAll; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.Response; +import java.util.List; import org.broadinstitute.consent.http.models.DatasetMetrics; +import org.broadinstitute.consent.http.models.DuosUser; import org.broadinstitute.consent.http.service.MetricsService; +import org.broadinstitute.consent.http.service.MetricsService.DarMetricsSummary; -@Path("/metrics") +@Path("{api : (api/)?}metrics") public class MetricsResource extends Resource { private final MetricsService metricsService; @@ -19,6 +24,7 @@ public MetricsResource(MetricsService metricsService) { this.metricsService = metricsService; } + @Deprecated(forRemoval = true, since = "2026-02-23") @GET @Path("/dataset/{datasetId}") @Produces("application/json") @@ -30,4 +36,18 @@ public Response getDatasetMetricsData(@PathParam("datasetId") Integer datasetId) return createExceptionResponse(e); } } + + @GET + @Path("/dar-summaries/{datasetId}") + @Produces("application/json") + @PermitAll + public Response getDarSummaryData( + @Auth DuosUser user, @PathParam("datasetId") Integer datasetId) { + try { + List summaries = metricsService.generateDarSummaries(datasetId); + return Response.ok().entity(summaries).build(); + } catch (Exception e) { + return createExceptionResponse(e); + } + } } diff --git a/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java b/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java index b3ed8e8525..ee5de867dd 100644 --- a/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java +++ b/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java @@ -48,22 +48,18 @@ public DarMetricsSummary(DataAccessRequest dar) { } public DatasetMetrics generateDatasetMetrics(Integer datasetId) { - DatasetMetrics metrics = new DatasetMetrics(); + List darMetricsSummaries = generateDarSummaries(datasetId); + metrics.setDars(darMetricsSummaries); + return metrics; + } - // get datasetDTO with properties and data use restrictions + public List generateDarSummaries(Integer datasetId) { Dataset dataset = dataSetDAO.findDatasetById(datasetId); if (dataset == null) { throw new NotFoundException("Dataset with specified ID does not exist."); } - - // find dars with the given datasetId in their list of datasetIds, datasetId is a String so it - // can be converted to jsonb in query - // convert all dars into smaller objects that only contain the information needed List dars = darDAO.findApprovedDARsByDatasetId(datasetId); - List darMetricsSummaries = - dars.stream().map(DarMetricsSummary::new).toList(); - metrics.setDars(darMetricsSummaries); - return metrics; + return dars.stream().map(DarMetricsSummary::new).toList(); } } diff --git a/src/main/resources/assets/api-docs.yaml b/src/main/resources/assets/api-docs.yaml index faff444270..e5ae22b8dc 100644 --- a/src/main/resources/assets/api-docs.yaml +++ b/src/main/resources/assets/api-docs.yaml @@ -715,6 +715,8 @@ paths: description: Server error. /api/match/purpose/batch/: $ref: './paths/getMatchesForLatestDataAccessElectionsByPurposeIds.yaml' + /api/metrics/dar-summaries/{datasetId}: + $ref: './paths/darSummariesByDatasetId.yaml' /api/user: $ref: './paths/user.yaml' /api/user/me: diff --git a/src/main/resources/assets/paths/darSummariesByDatasetId.yaml b/src/main/resources/assets/paths/darSummariesByDatasetId.yaml new file mode 100644 index 0000000000..2e9620d965 --- /dev/null +++ b/src/main/resources/assets/paths/darSummariesByDatasetId.yaml @@ -0,0 +1,24 @@ +get: + summary: DAR Summary Metrics + description: get Data Access Request Summaries associated to a datasetId + parameters: + - name: datasetId + in: path + required: true + schema: + type: integer + tags: + - Metrics + responses: + 200: + description: Dataset Metrics + content: + application/json: + schema: + type: array + items: + $ref: '../schemas/DarMetric.yaml' + 404: + description: Dataset with specified ID does not exist + 500: + description: Internal Server Error diff --git a/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java b/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java index 2ed7af8a62..dfc6b5549a 100644 --- a/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java +++ b/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java @@ -5,10 +5,19 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; +import com.google.api.client.http.HttpStatusCodes; import jakarta.ws.rs.NotFoundException; import jakarta.ws.rs.core.Response; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import org.broadinstitute.consent.http.AbstractTestHelper; +import org.broadinstitute.consent.http.models.DataAccessRequest; +import org.broadinstitute.consent.http.models.DataAccessRequestData; import org.broadinstitute.consent.http.models.DatasetMetrics; +import org.broadinstitute.consent.http.models.DuosUser; import org.broadinstitute.consent.http.service.MetricsService; +import org.broadinstitute.consent.http.service.MetricsService.DarMetricsSummary; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -16,14 +25,15 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class MetricsResourceTest { +class MetricsResourceTest extends AbstractTestHelper { @Mock private MetricsService service; + @Mock private DuosUser duosUser; private MetricsResource resource; @BeforeEach - void initResource() { + void setUp() { resource = new MetricsResource(service); } @@ -32,8 +42,9 @@ void testGetDatasetMetricsData() { DatasetMetrics metrics = new DatasetMetrics(); when(service.generateDatasetMetrics(any())).thenReturn(metrics); + @SuppressWarnings("removal") Response response = resource.getDatasetMetricsData(1); - assertEquals(200, response.getStatus()); + assertEquals(HttpStatusCodes.STATUS_CODE_OK, response.getStatus()); assertFalse(response.getEntity().toString().isEmpty()); } @@ -41,7 +52,40 @@ void testGetDatasetMetricsData() { void testGetDatasetMetricsDataNotFound() { when(service.generateDatasetMetrics(any())).thenThrow(new NotFoundException()); + @SuppressWarnings("removal") Response response = resource.getDatasetMetricsData(1); - assertEquals(404, response.getStatus()); + assertEquals(HttpStatusCodes.STATUS_CODE_NOT_FOUND, response.getStatus()); + } + + @Test + void testGenerateDarSummaries() { + DataAccessRequest dar = generateDar(); + when(service.generateDarSummaries(any())).thenReturn(List.of(new DarMetricsSummary(dar))); + + Response response = resource.getDarSummaryData(duosUser, 1); + assertEquals(HttpStatusCodes.STATUS_CODE_OK, response.getStatus()); + } + + @Test + void testGenerateDarSummariesNotFound() { + when(service.generateDarSummaries(any())).thenThrow(new NotFoundException()); + + Response response = resource.getDarSummaryData(duosUser, 1); + assertEquals(HttpStatusCodes.STATUS_CODE_NOT_FOUND, response.getStatus()); + } + + private DataAccessRequest generateDar() { + String referenceId = UUID.randomUUID().toString(); + List datasetIds = Collections.singletonList(1); + DataAccessRequest dar = new DataAccessRequest(); + dar.setId(1); + dar.setReferenceId(referenceId); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setDatasetIds(datasetIds); + data.setReferenceId(referenceId); + data.setProjectTitle(UUID.randomUUID().toString()); + dar.setDarCode("DAR-" + randomInt(1, 100)); + dar.setData(data); + return dar; } } From 309976c88603310324ab2bc0b8e41815a2dbe0ed Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 10:04:54 -0500 Subject: [PATCH 03/22] feat: refactoring, expired state, new query --- .../consent/http/db/DataAccessRequestDAO.java | 46 +++++++++++++++++++ .../http/models/DarMetricsSummary.java | 35 ++++++++++++++ .../consent/http/models/DatasetMetrics.java | 1 - .../http/resources/MetricsResource.java | 2 +- .../consent/http/service/MetricsService.java | 30 +----------- .../http/resources/MetricsResourceTest.java | 2 +- 6 files changed, 85 insertions(+), 31 deletions(-) create mode 100644 src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java diff --git a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java index 5891350889..7e698c20bf 100644 --- a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java +++ b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java @@ -101,6 +101,52 @@ AND dar.collection_id NOT IN ( """) List findApprovedDARsByDatasetId(@Bind("datasetId") Integer datasetId); + /** + * This query finds DARs submitted on dar-dataset combinations where the most recent vote is true + * similar to {@link #findApprovedDARsByDatasetId(Integer datasetId) findApprovedDARsByDatasetId}. + * The primary difference is that we want to include expired DARs to show in dataset usage + * metrics. + * + * @param datasetId The dataset id + * @return List of approved DARs for the dataset + */ + @UseRowReducer(DataAccessRequestReducer.class) + @SqlQuery( + """ + SELECT dar.id, dar.reference_id, dar.collection_id, dar.parent_id, dar.user_id, + dar.create_date, dar.submission_date, dar.update_date, dar.data, dar.era_commons_id, + dar.approving_so_id, dar.approving_so_timestamp, dar.requires_so_approval, + dar.closeout_so_approval_timestamp, dar.closeout_approving_so_id, + dd.dataset_id, collection.dar_code + FROM data_access_request dar + LEFT JOIN dar_collection collection on collection.collection_id = dar.collection_id + INNER JOIN dar_dataset dd ON dd.reference_id = dar.reference_id + INNER JOIN ( + SELECT DISTINCT e.reference_id, e.dataset_id, LAST_VALUE(v.vote) + OVER( + PARTITION BY e.reference_id, e.dataset_id + ORDER BY v.create_date + RANGE BETWEEN + UNBOUNDED PRECEDING AND + UNBOUNDED FOLLOWING + ) last_vote + FROM election e + INNER JOIN vote v ON e.election_id = v.election_id AND v.vote IS NOT NULL + AND LOWER(e.election_type) = 'dataaccess' + AND LOWER(v.type) IN ('final', 'radar_approve')) final_access_vote ON final_access_vote.reference_id = dar.reference_id AND final_access_vote.dataset_id = dd.dataset_id + WHERE dd.dataset_id = :datasetId + AND dar.submission_date IS NOT NULL + AND final_access_vote.last_vote = TRUE + AND (LOWER(dar.data->>'status') != 'archived' OR dar.data->>'status' IS NULL) + -- Exclude DARs that have a closeoutSupplement + AND dar.collection_id NOT IN ( + SELECT DISTINCT collection_id + FROM data_access_request + WHERE data ->> 'closeoutSupplement' IS NOT NULL) + """) + List findSummaryMetricApprovedDARsByDatasetId( + @Bind("datasetId") Integer datasetId); + /** * This query finds dataset ids on dar-dataset combinations where the most recent vote is true. * This includes datasets that are a part of expired DARs, UNLIKE findApprovedDARsByDatasetId. The diff --git a/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java b/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java new file mode 100644 index 0000000000..69a7eb7b97 --- /dev/null +++ b/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java @@ -0,0 +1,35 @@ +package org.broadinstitute.consent.http.models; + +import java.sql.Timestamp; +import java.time.Instant; +import java.time.temporal.ChronoUnit; + +public class DarMetricsSummary { + + final Timestamp updateDate; + final String projectTitle; + final String darCode; + final String nonTechRus; + final String referenceId; + final Boolean expired; + + public DarMetricsSummary(DataAccessRequest dar) { + Instant instant = Instant.now().minus(1, ChronoUnit.YEARS); + Timestamp lastYear = Timestamp.from(instant); + if (dar != null && dar.getData() != null) { + this.updateDate = dar.getUpdateDate(); + this.projectTitle = dar.getData().getProjectTitle(); + this.darCode = dar.getDarCode(); + this.nonTechRus = dar.getData().getNonTechRus(); + this.referenceId = dar.getReferenceId(); + this.expired = dar.getSubmissionDate().before(lastYear); + } else { + this.updateDate = null; + this.projectTitle = null; + this.darCode = null; + this.nonTechRus = null; + this.referenceId = null; + this.expired = null; + } + } +} diff --git a/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java b/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java index fe77f6dd6f..7133d4ccd4 100644 --- a/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java +++ b/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java @@ -1,7 +1,6 @@ package org.broadinstitute.consent.http.models; import java.util.List; -import org.broadinstitute.consent.http.service.MetricsService.DarMetricsSummary; public class DatasetMetrics { diff --git a/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java b/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java index 4c445e2adf..97f5ef0439 100644 --- a/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java +++ b/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java @@ -9,10 +9,10 @@ import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.Response; import java.util.List; +import org.broadinstitute.consent.http.models.DarMetricsSummary; import org.broadinstitute.consent.http.models.DatasetMetrics; import org.broadinstitute.consent.http.models.DuosUser; import org.broadinstitute.consent.http.service.MetricsService; -import org.broadinstitute.consent.http.service.MetricsService.DarMetricsSummary; @Path("{api : (api/)?}metrics") public class MetricsResource extends Resource { diff --git a/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java b/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java index ee5de867dd..82881ad7d4 100644 --- a/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java +++ b/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java @@ -1,12 +1,11 @@ package org.broadinstitute.consent.http.service; -import com.fasterxml.jackson.annotation.JsonProperty; import com.google.inject.Inject; import jakarta.ws.rs.NotFoundException; -import java.sql.Timestamp; import java.util.List; import org.broadinstitute.consent.http.db.DataAccessRequestDAO; import org.broadinstitute.consent.http.db.DatasetDAO; +import org.broadinstitute.consent.http.models.DarMetricsSummary; import org.broadinstitute.consent.http.models.DataAccessRequest; import org.broadinstitute.consent.http.models.Dataset; import org.broadinstitute.consent.http.models.DatasetMetrics; @@ -22,31 +21,6 @@ public MetricsService(DatasetDAO dataSetDAO, DataAccessRequestDAO darDAO) { this.darDAO = darDAO; } - public static class DarMetricsSummary { - - final Timestamp updateDate; - @JsonProperty final String projectTitle; - @JsonProperty final String darCode; - @JsonProperty final String nonTechRus; - @JsonProperty final String referenceId; - - public DarMetricsSummary(DataAccessRequest dar) { - if (dar != null && dar.getData() != null) { - this.updateDate = dar.getUpdateDate(); - this.projectTitle = dar.getData().getProjectTitle(); - this.darCode = dar.getDarCode(); - this.nonTechRus = dar.getData().getNonTechRus(); - this.referenceId = dar.getReferenceId(); - } else { - this.updateDate = null; - this.projectTitle = null; - this.darCode = null; - this.nonTechRus = null; - this.referenceId = null; - } - } - } - public DatasetMetrics generateDatasetMetrics(Integer datasetId) { DatasetMetrics metrics = new DatasetMetrics(); List darMetricsSummaries = generateDarSummaries(datasetId); @@ -59,7 +33,7 @@ public List generateDarSummaries(Integer datasetId) { if (dataset == null) { throw new NotFoundException("Dataset with specified ID does not exist."); } - List dars = darDAO.findApprovedDARsByDatasetId(datasetId); + List dars = darDAO.findSummaryMetricApprovedDARsByDatasetId(datasetId); return dars.stream().map(DarMetricsSummary::new).toList(); } } diff --git a/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java b/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java index dfc6b5549a..cdbe72fb1f 100644 --- a/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java +++ b/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java @@ -12,12 +12,12 @@ import java.util.List; import java.util.UUID; import org.broadinstitute.consent.http.AbstractTestHelper; +import org.broadinstitute.consent.http.models.DarMetricsSummary; import org.broadinstitute.consent.http.models.DataAccessRequest; import org.broadinstitute.consent.http.models.DataAccessRequestData; import org.broadinstitute.consent.http.models.DatasetMetrics; import org.broadinstitute.consent.http.models.DuosUser; import org.broadinstitute.consent.http.service.MetricsService; -import org.broadinstitute.consent.http.service.MetricsService.DarMetricsSummary; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; From 61bc0ee5bcbe7f97d84fb6b94fdfe021cb3ad33c Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 10:51:56 -0500 Subject: [PATCH 04/22] fixes --- .../http/models/DarMetricsSummary.java | 45 +++++++++---------- .../http/service/MetricsServiceTest.java | 11 +++-- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java b/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java index 69a7eb7b97..2c8c93a67c 100644 --- a/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java +++ b/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java @@ -4,32 +4,31 @@ import java.time.Instant; import java.time.temporal.ChronoUnit; -public class DarMetricsSummary { - - final Timestamp updateDate; - final String projectTitle; - final String darCode; - final String nonTechRus; - final String referenceId; - final Boolean expired; +public record DarMetricsSummary( + Timestamp updateDate, + String projectTitle, + String darCode, + String nonTechRus, + String referenceId, + Boolean expired) { public DarMetricsSummary(DataAccessRequest dar) { + this( + dar != null && dar.getData() != null ? dar.getUpdateDate() : null, + dar != null && dar.getData() != null ? dar.getData().getProjectTitle() : null, + dar != null && dar.getData() != null ? dar.getDarCode() : null, + dar != null && dar.getData() != null ? dar.getData().getNonTechRus() : null, + dar != null && dar.getData() != null ? dar.getReferenceId() : null, + computeExpired(dar)); + } + + private static Boolean computeExpired(DataAccessRequest dar) { + // If the DAR or its submission date is null, we consider it expired for metrics purposes + if (dar == null || dar.getSubmissionDate() == null) { + return true; + } Instant instant = Instant.now().minus(1, ChronoUnit.YEARS); Timestamp lastYear = Timestamp.from(instant); - if (dar != null && dar.getData() != null) { - this.updateDate = dar.getUpdateDate(); - this.projectTitle = dar.getData().getProjectTitle(); - this.darCode = dar.getDarCode(); - this.nonTechRus = dar.getData().getNonTechRus(); - this.referenceId = dar.getReferenceId(); - this.expired = dar.getSubmissionDate().before(lastYear); - } else { - this.updateDate = null; - this.projectTitle = null; - this.darCode = null; - this.nonTechRus = null; - this.referenceId = null; - this.expired = null; - } + return dar.getSubmissionDate().before(lastYear); } } diff --git a/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java b/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java index ee369ef77a..16da729be5 100644 --- a/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java +++ b/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import jakarta.ws.rs.NotFoundException; @@ -42,12 +43,14 @@ void testGenerateDatasetMetrics() { Dataset dataset = generateDataset(); when(dataSetDAO.findDatasetById(dataset.getDatasetId())).thenReturn(dataset); - when(darDAO.findApprovedDARsByDatasetId(any())).thenReturn(List.of(dar)); + when(darDAO.findSummaryMetricApprovedDARsByDatasetId(any())).thenReturn(List.of(dar)); - DatasetMetrics metrics = service.generateDatasetMetrics(1); + DatasetMetrics metrics = service.generateDatasetMetrics(dataset.getDatasetId()); - assertEquals(dar.getData().getProjectTitle(), metrics.getDars().getFirst().projectTitle); - assertEquals(dar.getDarCode(), metrics.getDars().getFirst().darCode); + assertEquals(dar.getData().getProjectTitle(), metrics.getDars().getFirst().projectTitle()); + assertEquals(dar.getDarCode(), metrics.getDars().getFirst().darCode()); + verify(dataSetDAO).findDatasetById(dataset.getDatasetId()); + verify(darDAO).findSummaryMetricApprovedDARsByDatasetId(dataset.getDatasetId()); } @Test From c9b4531bdb091694201a067df94a9e2eb1deaa61 Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 13:25:08 -0500 Subject: [PATCH 05/22] tests and some logic fixes --- .../consent/http/db/DataAccessRequestDAO.java | 5 +- .../http/models/DarMetricsSummary.java | 16 ++- .../http/db/DataAccessRequestDAOTest.java | 92 ++++++++++++ .../http/models/DarMetricsSummaryTest.java | 135 ++++++++++++++++++ 4 files changed, 237 insertions(+), 11 deletions(-) create mode 100644 src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java diff --git a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java index 7e698c20bf..711a778509 100644 --- a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java +++ b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java @@ -139,10 +139,7 @@ AND LOWER(v.type) IN ('final', 'radar_approve')) final_access_vote ON final_acce AND final_access_vote.last_vote = TRUE AND (LOWER(dar.data->>'status') != 'archived' OR dar.data->>'status' IS NULL) -- Exclude DARs that have a closeoutSupplement - AND dar.collection_id NOT IN ( - SELECT DISTINCT collection_id - FROM data_access_request - WHERE data ->> 'closeoutSupplement' IS NOT NULL) + AND data ->> 'closeoutSupplement' IS NULL """) List findSummaryMetricApprovedDARsByDatasetId( @Bind("datasetId") Integer datasetId); diff --git a/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java b/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java index 2c8c93a67c..ab83bf77bc 100644 --- a/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java +++ b/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java @@ -1,8 +1,9 @@ package org.broadinstitute.consent.http.models; import java.sql.Timestamp; -import java.time.Instant; -import java.time.temporal.ChronoUnit; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; public record DarMetricsSummary( Timestamp updateDate, @@ -14,11 +15,11 @@ public record DarMetricsSummary( public DarMetricsSummary(DataAccessRequest dar) { this( - dar != null && dar.getData() != null ? dar.getUpdateDate() : null, + dar != null ? dar.getUpdateDate() : null, dar != null && dar.getData() != null ? dar.getData().getProjectTitle() : null, - dar != null && dar.getData() != null ? dar.getDarCode() : null, + dar != null ? dar.getDarCode() : null, dar != null && dar.getData() != null ? dar.getData().getNonTechRus() : null, - dar != null && dar.getData() != null ? dar.getReferenceId() : null, + dar != null ? dar.getReferenceId() : null, computeExpired(dar)); } @@ -27,8 +28,9 @@ private static Boolean computeExpired(DataAccessRequest dar) { if (dar == null || dar.getSubmissionDate() == null) { return true; } - Instant instant = Instant.now().minus(1, ChronoUnit.YEARS); - Timestamp lastYear = Timestamp.from(instant); + LocalDateTime oneYearAgo = LocalDateTime.now().minusYears(1); + ZonedDateTime zonedDateTime = oneYearAgo.atZone(ZoneId.systemDefault()); + Timestamp lastYear = Timestamp.from(zonedDateTime.toInstant()); return dar.getSubmissionDate().before(lastYear); } } diff --git a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java index 37cade0b88..7233a69a43 100644 --- a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java +++ b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java @@ -12,6 +12,9 @@ import java.sql.Timestamp; import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; @@ -814,6 +817,95 @@ void testFindApprovedDARsByDatasetId_ExcludeCloseouts() { assertTrue(noApprovedDARs.isEmpty()); } + @Test + void testFindSummaryMetricApprovedDARsByDatasetId() { + // Create a dataset to request access to + Dataset dataset = createDataset(); + + // Create a dar collection + User user = createUserWithInstitution(); + Integer approvedCollectionId = + darCollectionDAO.insertDarCollection( + "DAR-" + randomInt(1, 10), user.getUserId(), new Date()); + + // Create an approved DAR on a dataset + DataAccessRequest approvedDAR = createDataAccessRequest(user.getUserId(), approvedCollectionId); + dataAccessRequestDAO.insertDARDatasetRelation( + approvedDAR.getReferenceId(), dataset.getDatasetId()); + Election election = + createDataAccessElection(approvedDAR.getReferenceId(), dataset.getDatasetId()); + Vote vote = createFinalVote(dataset.getCreateUserId(), election.getElectionId()); + Date now = new Date(); + updateVote(true, "", now, vote.getVoteId(), false, election.getElectionId(), now, false); + + // Create an unsubmitted DAR on a dataset + DataAccessRequest unsubmittedDAR = createDraftDataAccessRequest(); + dataAccessRequestDAO.insertDARDatasetRelation( + unsubmittedDAR.getReferenceId(), dataset.getDatasetId()); + + // Create a closeout DAR from the approved DAR + DataAccessRequest closeoutDAR = + createProgressReport( + user.getEraCommonsId(), user.getUserId(), approvedCollectionId, approvedDAR.getId()); + CloseoutSupplement closeout = + new CloseoutSupplement(List.of("Reason"), "Other Reason", user.getUserId()); + closeoutDAR.getData().setCloseoutSupplement(closeout); + dataAccessRequestDAO.updateDataByReferenceId( + closeoutDAR.getReferenceId(), + user.getUserId(), + now, + now, + closeoutDAR.getData(), + randomAlphabetic(10)); + + // Create a very old approved DAR that SHOULD be included in the summary metrics + Integer expiredCollectionId = + darCollectionDAO.insertDarCollection( + "DAR-" + randomInt(11, 20), user.getUserId(), new Date()); + String expiredReferenceId = UUID.randomUUID().toString(); + LocalDateTime twoYearsAgo = LocalDateTime.now().minusYears(2); + ZonedDateTime zonedDateTime = twoYearsAgo.atZone(ZoneId.systemDefault()); + Timestamp submissionDate = Timestamp.from(zonedDateTime.toInstant()); + dataAccessRequestDAO.insertDataAccessRequest( + expiredCollectionId, + expiredReferenceId, + user.getUserId(), + submissionDate, + submissionDate, + submissionDate, + createDataAccessRequestData(), + randomAlphabetic(10)); + dataAccessRequestDAO.insertDARDatasetRelation(expiredReferenceId, dataset.getDatasetId()); + Integer expiredElectionId = + electionDAO.insertElection( + ElectionType.DATA_ACCESS.getValue(), + ElectionStatus.OPEN.getValue(), + submissionDate, + expiredReferenceId, + dataset.getDatasetId()); + + createDataAccessElection(expiredReferenceId, dataset.getDatasetId()); + Vote expiredVote = createFinalVote(dataset.getCreateUserId(), expiredElectionId); + updateVote( + true, "", now, expiredVote.getVoteId(), false, expiredElectionId, submissionDate, false); + + List summaryDARs = + dataAccessRequestDAO.findSummaryMetricApprovedDARsByDatasetId(dataset.getDatasetId()); + assertFalse(summaryDARs.isEmpty()); + assertTrue( + summaryDARs.stream() + .anyMatch(dar -> dar.getReferenceId().equals(approvedDAR.getReferenceId()))); + assertTrue( + summaryDARs.stream() + .noneMatch(dar -> dar.getReferenceId().equals(unsubmittedDAR.getReferenceId()))); + assertTrue( + summaryDARs.stream() + .noneMatch(dar -> dar.getReferenceId().equals(closeoutDAR.getReferenceId()))); + assertTrue( + summaryDARs.stream().anyMatch(dar -> dar.getReferenceId().equals(expiredReferenceId))); + assertEquals(2, summaryDARs.size()); + } + // findAllDraftDataAccessRequests should exclude archived DARs @Test void testFindAllDraftsArchived() { diff --git a/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java b/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java new file mode 100644 index 0000000000..04f8603033 --- /dev/null +++ b/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java @@ -0,0 +1,135 @@ +package org.broadinstitute.consent.http.models; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.UUID; +import org.broadinstitute.consent.http.AbstractTestHelper; +import org.junit.jupiter.api.Test; + +class DarMetricsSummaryTest extends AbstractTestHelper { + + @Test + void testConstructor_null() { + DarMetricsSummary summary = new DarMetricsSummary(null); + assertNull(summary.updateDate()); + assertNull(summary.projectTitle()); + assertNull(summary.darCode()); + assertNull(summary.nonTechRus()); + assertNull(summary.referenceId()); + assertTrue(summary.expired()); + } + + @Test + void testConstructor_updateDate() { + DataAccessRequest dar = new DataAccessRequest(); + dar.setUpdateDate(Timestamp.from(Instant.now())); + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertNotNull(summary.updateDate()); + assertNull(summary.projectTitle()); + assertNull(summary.darCode()); + assertNull(summary.nonTechRus()); + assertNull(summary.referenceId()); + assertTrue(summary.expired()); + } + + @Test + void testConstructor_projectTitle() { + DataAccessRequest dar = new DataAccessRequest(); + DataAccessRequestData data = new DataAccessRequestData(); + data.setProjectTitle(randomAlphabetic(10)); + dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEquals(dar.getUpdateDate(), summary.updateDate()); + assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); + assertEquals(dar.getDarCode(), summary.darCode()); + assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); + assertEquals(dar.getReferenceId(), summary.referenceId()); + assertTrue(summary.expired()); + } + + @Test + void testConstructor_darCode() { + DataAccessRequest dar = new DataAccessRequest(); + dar.setDarCode(randomAlphabetic(10)); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEquals(dar.getUpdateDate(), summary.updateDate()); + assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); + assertEquals(dar.getDarCode(), summary.darCode()); + assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); + assertEquals(dar.getReferenceId(), summary.referenceId()); + assertTrue(summary.expired()); + } + + @Test + void testConstructor_nonTechRus() { + DataAccessRequest dar = new DataAccessRequest(); + DataAccessRequestData data = new DataAccessRequestData(); + data.setNonTechRus(randomAlphabetic(10)); + dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEquals(dar.getUpdateDate(), summary.updateDate()); + assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); + assertEquals(dar.getDarCode(), summary.darCode()); + assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); + assertEquals(dar.getReferenceId(), summary.referenceId()); + assertTrue(summary.expired()); + } + + @Test + void testConstructor_referenceId() { + DataAccessRequest dar = new DataAccessRequest(); + dar.setReferenceId(UUID.randomUUID().toString()); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEquals(dar.getUpdateDate(), summary.updateDate()); + assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); + assertEquals(dar.getDarCode(), summary.darCode()); + assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); + assertEquals(dar.getReferenceId(), summary.referenceId()); + assertTrue(summary.expired()); + } + + @Test + void testConstructor_notExpired() { + DataAccessRequest dar = new DataAccessRequest(); + dar.setSubmissionDate(Timestamp.from(Instant.now())); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEquals(dar.getUpdateDate(), summary.updateDate()); + assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); + assertEquals(dar.getDarCode(), summary.darCode()); + assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); + assertEquals(dar.getReferenceId(), summary.referenceId()); + assertFalse(summary.expired()); + } + + @Test + void testConstructor_isExpired() { + DataAccessRequest dar = new DataAccessRequest(); + LocalDateTime oneYearAgo = LocalDateTime.now().minusYears(2); + ZonedDateTime zonedDateTime = oneYearAgo.atZone(ZoneId.systemDefault()); + dar.setSubmissionDate(Timestamp.from(zonedDateTime.toInstant())); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEquals(dar.getUpdateDate(), summary.updateDate()); + assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); + assertEquals(dar.getDarCode(), summary.darCode()); + assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); + assertEquals(dar.getReferenceId(), summary.referenceId()); + assertTrue(summary.expired()); + } +} From 1687f4b07bcd3e7e4302169f94709081c8a5a9a9 Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 13:29:30 -0500 Subject: [PATCH 06/22] drive-by cleanup --- .../consent/http/db/DataAccessRequestDAO.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java index 711a778509..10224be6d2 100644 --- a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java +++ b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java @@ -348,11 +348,6 @@ void updateDataByReferenceId( """) void deleteByReferenceId(@Bind("referenceId") String referenceId); - @SqlUpdate("DELETE FROM data_access_request WHERE reference_id IN ()") - void deleteByReferenceIds( - @BindList(value = "referenceIds", onEmpty = EmptyHandling.NULL_STRING) - List referenceIds); - @SqlUpdate( """ UPDATE data_access_request @@ -537,16 +532,6 @@ INSERT INTO dar_dataset (reference_id, dataset_id) """) void deleteDARDatasetRelationByReferenceId(@Bind("referenceId") String referenceId); - /** - * Delete rows which have a referenceId that is in the list referenceIds - * - * @param referenceIds List - */ - @SqlUpdate("DELETE FROM dar_dataset WHERE reference_id in ()") - void deleteDARDatasetRelationByReferenceIds( - @BindList(value = "referenceIds", onEmpty = EmptyHandling.NULL_STRING) - List referenceIds); - /** * Returns all dataset_ids that match any of the referenceIds inside the "referenceIds" list * From ac7bd253e947c61f25bcb1a8e09dcbf9b97c7037 Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 13:31:57 -0500 Subject: [PATCH 07/22] deprecation note in swagger doc --- src/main/resources/assets/paths/metricsDatasetById.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/paths/metricsDatasetById.yaml b/src/main/resources/assets/paths/metricsDatasetById.yaml index fafe43ef0a..ca457d7763 100644 --- a/src/main/resources/assets/paths/metricsDatasetById.yaml +++ b/src/main/resources/assets/paths/metricsDatasetById.yaml @@ -1,6 +1,9 @@ get: summary: Dataset Metrics - description: get Data Access Requests associated to a datasetId + deprecated: true + description: | + Get Data Access Requests associated to a datasetId. Scheduled for removal. + Deprecated in favor of /api/metrics/dar-summaries/{datasetId} parameters: - name: datasetId in: path From 5e0412687393be786fd3729dd9d56221b55f9cbd Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 13:35:16 -0500 Subject: [PATCH 08/22] sonar warning --- .../consent/http/resources/MetricsResource.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java b/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java index 97f5ef0439..b22121f31a 100644 --- a/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java +++ b/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java @@ -24,6 +24,11 @@ public MetricsResource(MetricsService metricsService) { this.metricsService = metricsService; } + /** + * @deprecated + * @param datasetId the id of the dataset for which to generate metrics + * @return Response containing DatasetMetrics for the given datasetId + */ @Deprecated(forRemoval = true, since = "2026-02-23") @GET @Path("/dataset/{datasetId}") From bde9e914ea19b7e7771b48a464b09b3e1f527aba Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 13:35:29 -0500 Subject: [PATCH 09/22] rm commented code --- .../consent/http/db/ElectionDAOTest.java | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java b/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java index c73493e0e2..3121e40977 100644 --- a/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java +++ b/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java @@ -359,25 +359,6 @@ void testInsertExtendedElection() { assertEquals(e.getElectionId(), election.getElectionId()); } - // @Test - // void testFindLastElectionsByReferenceIdsAndType() { - // DataAccessRequest dar = createDataAccessRequestV3(); - // Dataset d = createDataset(); - // electionDAO.insertElection( - // ElectionType.DATA_ACCESS.getValue(), - // ElectionStatus.OPEN.getValue(), - // new Date(), - // dar.getReferenceId(), - // d.getDatasetId()); - // List elections = - // electionDAO.findLastElectionsByReferenceIdsAndType( - // Collections.singletonList(dar.getReferenceId()), - // ElectionType.DATA_ACCESS.getValue()); - // assertNotNull(elections); - // assertFalse(elections.isEmpty()); - // assertEquals(1, elections.size()); - // } - @Test void testFindLastElectionsByReferenceIds() { Dac dac = createDac(); From eeb65b47e767f714944f3550f0b2505211133647 Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 13:36:09 -0500 Subject: [PATCH 10/22] sonar warning --- .../http/db/DataAccessRequestDAOTest.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java index 7233a69a43..f591619cb8 100644 --- a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java +++ b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java @@ -84,9 +84,9 @@ void testFindAllDrafts() { List newDars = dataAccessRequestDAO.findAllDraftDataAccessRequests(); assertFalse(newDars.isEmpty()); assertEquals(1, newDars.size()); - assertTrue(newDars.get(0).getDraft()); - assertNull(newDars.get(0).getDarCode()); - assertFalse(newDars.get(0).getProgressReport()); + assertTrue(newDars.getFirst().getDraft()); + assertNull(newDars.getFirst().getDarCode()); + assertFalse(newDars.getFirst().getProgressReport()); } @Test @@ -100,7 +100,7 @@ void testFindAllDraftsByUserId() { List newDars = dataAccessRequestDAO.findAllDraftsByUserId(dar.getUserId()); assertFalse(newDars.isEmpty()); assertEquals(1, newDars.size()); - assertNull(newDars.get(0).getDarCode()); + assertNull(newDars.getFirst().getDarCode()); List missingDars = dataAccessRequestDAO.findAllDraftsByUserId(0); assertTrue(missingDars.isEmpty()); @@ -113,7 +113,7 @@ void updateDraftToNonDraft() { List draftDars1 = dataAccessRequestDAO.findAllDraftDataAccessRequests(); assertFalse(draftDars1.isEmpty()); assertEquals(1, draftDars1.size()); - DataAccessRequestData darData = draftDars1.get(0).getData(); + DataAccessRequestData darData = draftDars1.getFirst().getData(); dataAccessRequestDAO.updateDataByReferenceId( dar.referenceId, dar.userId, new Date(), new Date(), darData, randomAlphabetic(10)); List draftDars2 = dataAccessRequestDAO.findAllDraftDataAccessRequests(); @@ -132,13 +132,13 @@ void updateNonDraftToDraft() { List draftDars2 = dataAccessRequestDAO.findAllDraftDataAccessRequests(); assertFalse(draftDars2.isEmpty()); assertEquals(1, draftDars2.size()); - assertEquals(dar.getDarCode(), draftDars2.get(0).getDarCode()); + assertEquals(dar.getDarCode(), draftDars2.getFirst().getDarCode()); } @Test void updateDraftToNonDraftByCollectionId() { DarCollection darColl = createDarCollection(); - DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).get(0); + DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).getFirst(); dataAccessRequestDAO.updateDataByReferenceId( dar.referenceId, dar.userId, null, new Date(), dar.getData(), randomAlphabetic(10)); @@ -158,7 +158,7 @@ void updateDraftToNonDraftByCollectionId() { @Test void testDataAccessRequestSubmissionDateAbsent() { DarCollection darColl = createDarCollection(); - DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).get(0); + DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).getFirst(); dataAccessRequestDAO.updateDataByReferenceId( dar.referenceId, dar.userId, null, new Date(), dar.getData(), randomAlphabetic(10)); @@ -172,7 +172,7 @@ void testDataAccessRequestSubmissionDateAbsent() { @Test void testDataAccessRequestSubmissionDatePresent() { DarCollection darColl = createDarCollection(); - DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).get(0); + DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).getFirst(); dataAccessRequestDAO.updateDataByReferenceId( dar.referenceId, dar.userId, new Date(), new Date(), dar.getData(), randomAlphabetic(10)); @@ -188,7 +188,7 @@ void testDataAccessRequestSubmissionDatePresent() { @Test void updateNonDraftToDraftByCollectionId() { DarCollection darColl = createDarCollection(); - DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).get(0); + DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).getFirst(); dar = dataAccessRequestDAO.findByReferenceId(dar.getReferenceId()); assertFalse(dar.getDraft()); @@ -470,7 +470,7 @@ void testFindAllFilterArchived() { dataAccessRequestDAO.archiveByReferenceIds(List.of(testDar1.getReferenceId())); List returnedDARs = dataAccessRequestDAO.findAllDataAccessRequests(); assertEquals(1, returnedDARs.size()); - assertNotNull(returnedDARs.get(0).getDarCode()); + assertNotNull(returnedDARs.getFirst().getDarCode()); } // See: https://broadworkbench.atlassian.net/browse/DUOS-2182 @@ -498,14 +498,14 @@ void testEnsureOnlyDataAccessRequestsByDatasetIdReturnsJustForSpecificDatasetId( List dars = dataAccessRequestDAO.findApprovedDARsByDatasetId(dataset1.getDatasetId()); assertEquals(1, dars.size()); - assertTrue(dars.get(0).getDatasetIds().contains(dataset1.getDatasetId())); - assertEquals(darCode1, dars.get(0).getDarCode()); + assertTrue(dars.getFirst().getDatasetIds().contains(dataset1.getDatasetId())); + assertEquals(darCode1, dars.getFirst().getDarCode()); List returnedDARs = dataAccessRequestDAO.findApprovedDARsByDatasetId(dataset2.getDatasetId()); assertEquals(1, returnedDARs.size()); - assertTrue(returnedDARs.get(0).getDatasetIds().contains(dataset2.getDatasetId())); - assertEquals(darCode2, returnedDARs.get(0).getDarCode()); + assertTrue(returnedDARs.getFirst().getDatasetIds().contains(dataset2.getDatasetId())); + assertEquals(darCode2, returnedDARs.getFirst().getDarCode()); } @Test @@ -547,7 +547,7 @@ void testFindAllApprovedDataAccessRequestsByDatasetId() { testDar1.getUserId(), dataAccessRequestDAO .findApprovedDARsByDatasetId(dataset1.getDatasetId()) - .get(0) + .getFirst() .getUserId()); assertEquals( 1, dataAccessRequestDAO.findApprovedDARsByDatasetId(dataset2.getDatasetId()).size()); @@ -555,7 +555,7 @@ void testFindAllApprovedDataAccessRequestsByDatasetId() { testDar2.getUserId(), dataAccessRequestDAO .findApprovedDARsByDatasetId(dataset2.getDatasetId()) - .get(0) + .getFirst() .getUserId()); Election e3 = createDataAccessElection(testDar3.getReferenceId(), dataset2.getDatasetId()); @@ -794,7 +794,7 @@ void testFindApprovedDARsByDatasetId_ExcludeCloseouts() { List approvedDARs = dataAccessRequestDAO.findApprovedDARsByDatasetId(dataset.getDatasetId()); assertEquals(1, approvedDARs.size()); - assertEquals(parentDAR.getReferenceId(), approvedDARs.get(0).getReferenceId()); + assertEquals(parentDAR.getReferenceId(), approvedDARs.getFirst().getReferenceId()); // Create a closeout DAR from the parent DAR DataAccessRequest closeoutDAR = @@ -969,7 +969,7 @@ void testFindByReferenceIdsArchived() { @Test void createProgressReport() { DarCollection darCollection = createDarCollection(); - DataAccessRequest dar = new ArrayList<>(darCollection.getDars().values()).get(0); + DataAccessRequest dar = new ArrayList<>(darCollection.getDars().values()).getFirst(); DataAccessRequest progressReport = createProgressReport( createUser().getEraCommonsId(), From f94eee225d76f5f7ca665dc8d656bc937716ff39 Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 13:49:45 -0500 Subject: [PATCH 11/22] test simplification --- .../http/models/DarMetricsSummaryTest.java | 60 +++++++------------ 1 file changed, 21 insertions(+), 39 deletions(-) diff --git a/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java b/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java index 04f8603033..0b4fc11ab9 100644 --- a/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java +++ b/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java @@ -1,8 +1,6 @@ package org.broadinstitute.consent.http.models; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -32,13 +30,11 @@ void testConstructor_null() { void testConstructor_updateDate() { DataAccessRequest dar = new DataAccessRequest(); dar.setUpdateDate(Timestamp.from(Instant.now())); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); - assertNotNull(summary.updateDate()); - assertNull(summary.projectTitle()); - assertNull(summary.darCode()); - assertNull(summary.nonTechRus()); - assertNull(summary.referenceId()); - assertTrue(summary.expired()); + assertEntityEquivalence(dar, summary, true); } @Test @@ -47,13 +43,9 @@ void testConstructor_projectTitle() { DataAccessRequestData data = new DataAccessRequestData(); data.setProjectTitle(randomAlphabetic(10)); dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); - assertEquals(dar.getUpdateDate(), summary.updateDate()); - assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); - assertEquals(dar.getDarCode(), summary.darCode()); - assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); - assertEquals(dar.getReferenceId(), summary.referenceId()); - assertTrue(summary.expired()); + assertEntityEquivalence(dar, summary, true); } @Test @@ -62,13 +54,9 @@ void testConstructor_darCode() { dar.setDarCode(randomAlphabetic(10)); DataAccessRequestData data = new DataAccessRequestData(); dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); - assertEquals(dar.getUpdateDate(), summary.updateDate()); - assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); - assertEquals(dar.getDarCode(), summary.darCode()); - assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); - assertEquals(dar.getReferenceId(), summary.referenceId()); - assertTrue(summary.expired()); + assertEntityEquivalence(dar, summary, true); } @Test @@ -77,13 +65,9 @@ void testConstructor_nonTechRus() { DataAccessRequestData data = new DataAccessRequestData(); data.setNonTechRus(randomAlphabetic(10)); dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); - assertEquals(dar.getUpdateDate(), summary.updateDate()); - assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); - assertEquals(dar.getDarCode(), summary.darCode()); - assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); - assertEquals(dar.getReferenceId(), summary.referenceId()); - assertTrue(summary.expired()); + assertEntityEquivalence(dar, summary, true); } @Test @@ -92,13 +76,9 @@ void testConstructor_referenceId() { dar.setReferenceId(UUID.randomUUID().toString()); DataAccessRequestData data = new DataAccessRequestData(); dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); - assertEquals(dar.getUpdateDate(), summary.updateDate()); - assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); - assertEquals(dar.getDarCode(), summary.darCode()); - assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); - assertEquals(dar.getReferenceId(), summary.referenceId()); - assertTrue(summary.expired()); + assertEntityEquivalence(dar, summary, true); } @Test @@ -107,13 +87,9 @@ void testConstructor_notExpired() { dar.setSubmissionDate(Timestamp.from(Instant.now())); DataAccessRequestData data = new DataAccessRequestData(); dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); - assertEquals(dar.getUpdateDate(), summary.updateDate()); - assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); - assertEquals(dar.getDarCode(), summary.darCode()); - assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); - assertEquals(dar.getReferenceId(), summary.referenceId()); - assertFalse(summary.expired()); + assertEntityEquivalence(dar, summary, false); } @Test @@ -124,12 +100,18 @@ void testConstructor_isExpired() { dar.setSubmissionDate(Timestamp.from(zonedDateTime.toInstant())); DataAccessRequestData data = new DataAccessRequestData(); dar.setData(data); + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEntityEquivalence(dar, summary, true); + } + + private void assertEntityEquivalence( + DataAccessRequest dar, DarMetricsSummary summary, Boolean expectedExpired) { assertEquals(dar.getUpdateDate(), summary.updateDate()); assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); assertEquals(dar.getDarCode(), summary.darCode()); assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); assertEquals(dar.getReferenceId(), summary.referenceId()); - assertTrue(summary.expired()); + assertEquals(expectedExpired, summary.expired()); } } From 50aff79e6d8eab976b7270b52fa577bf87c829ec Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 13:51:49 -0500 Subject: [PATCH 12/22] test simplification --- .../consent/http/models/DarMetricsSummaryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java b/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java index 0b4fc11ab9..67edd2a3a3 100644 --- a/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java +++ b/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java @@ -106,7 +106,7 @@ void testConstructor_isExpired() { } private void assertEntityEquivalence( - DataAccessRequest dar, DarMetricsSummary summary, Boolean expectedExpired) { + DataAccessRequest dar, DarMetricsSummary summary, boolean expectedExpired) { assertEquals(dar.getUpdateDate(), summary.updateDate()); assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); assertEquals(dar.getDarCode(), summary.darCode()); From ced1193c6fb396f575f42f6252646f1f407a1586 Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 14:02:10 -0500 Subject: [PATCH 13/22] suppress unused - we always need a user for @Auth-ed methods --- .../broadinstitute/consent/http/resources/MetricsResource.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java b/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java index b22121f31a..536d60bb82 100644 --- a/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java +++ b/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java @@ -42,6 +42,7 @@ public Response getDatasetMetricsData(@PathParam("datasetId") Integer datasetId) } } + @SuppressWarnings("unused") @GET @Path("/dar-summaries/{datasetId}") @Produces("application/json") From 9d72fed6b09b15869c33e1baa24858710224d4e8 Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 14:02:38 -0500 Subject: [PATCH 14/22] address sonar warnings --- .../consent/http/db/ElectionDAOTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java b/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java index 3121e40977..29876e1bd0 100644 --- a/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java +++ b/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java @@ -73,7 +73,7 @@ void testFindElectionByDacId() { List foundElections = electionDAO.findOpenElectionsByDacId(dac.getDacId()); assertNotNull(foundElections); - assertEquals(election.getElectionId(), foundElections.get(0).getElectionId()); + assertEquals(election.getElectionId(), foundElections.getFirst().getElectionId()); } @Test @@ -230,7 +230,7 @@ void testFindElectionByDacIdWithNoAssociation() { List foundElections = electionDAO.findOpenElectionsByDacId(dac.getDacId()); assertNotNull(foundElections); - assertEquals(election.getElectionId(), foundElections.get(0).getElectionId()); + assertEquals(election.getElectionId(), foundElections.getFirst().getElectionId()); } @Test @@ -407,7 +407,7 @@ void testFindElectionsByVoteIdsAndType_DataAccess() { List elections = electionDAO.findElectionsByVoteIdsAndType(voteIds, "dataaccess"); assertEquals(1, elections.size()); - assertEquals(accessElection.getElectionId(), elections.get(0).getElectionId()); + assertEquals(accessElection.getElectionId(), elections.getFirst().getElectionId()); } @Test @@ -426,7 +426,7 @@ void testFindElectionsByVoteIdsAndType_RP() { List elections = electionDAO.findElectionsByVoteIdsAndType(voteIds, "rp"); assertEquals(1, elections.size()); - assertEquals(rpElection.getElectionId(), elections.get(0).getElectionId()); + assertEquals(rpElection.getElectionId(), elections.getFirst().getElectionId()); } @Test @@ -447,7 +447,7 @@ void testFindElectionsWithCardHoldingUsersByElectionIds() { electionDAO.findElectionsWithCardHoldingUsersByElectionIds(electionIds); assertEquals(1, elections.size()); - assertEquals(elections.get(0).getElectionId(), lcElection.getElectionId()); + assertEquals(elections.getFirst().getElectionId(), lcElection.getElectionId()); } @Test From b35ebc965e2a1dd848a78f406a94a017b80d7bba Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 14:11:42 -0500 Subject: [PATCH 15/22] dar metric swagger update --- src/main/resources/assets/schemas/DarMetric.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/assets/schemas/DarMetric.yaml b/src/main/resources/assets/schemas/DarMetric.yaml index 369b33e3f7..84e652dc79 100644 --- a/src/main/resources/assets/schemas/DarMetric.yaml +++ b/src/main/resources/assets/schemas/DarMetric.yaml @@ -12,3 +12,6 @@ properties: nonTechRus: type: string description: The DAR non-technical research use statement + expired: + type: boolean + description: Whether the DAR is expired From efa62d0c86947212eca50835df8fd675d4a197c3 Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 14:19:07 -0500 Subject: [PATCH 16/22] test updates --- .../consent/http/models/DarMetricsSummaryTest.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java b/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java index 67edd2a3a3..3864dbe98c 100644 --- a/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java +++ b/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java @@ -16,7 +16,7 @@ class DarMetricsSummaryTest extends AbstractTestHelper { @Test - void testConstructor_null() { + void testConstructor_nullDar() { DarMetricsSummary summary = new DarMetricsSummary(null); assertNull(summary.updateDate()); assertNull(summary.projectTitle()); @@ -26,6 +26,18 @@ void testConstructor_null() { assertTrue(summary.expired()); } + @Test + void testConstructor_nullDarData() { + DataAccessRequest dar = new DataAccessRequest(); + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertNull(summary.updateDate()); + assertNull(summary.projectTitle()); + assertNull(summary.darCode()); + assertNull(summary.nonTechRus()); + assertNull(summary.referenceId()); + assertTrue(summary.expired()); + } + @Test void testConstructor_updateDate() { DataAccessRequest dar = new DataAccessRequest(); From 3e6e83fc3227ef6c36a97c35f33909f617d441f7 Mon Sep 17 00:00:00 2001 From: rushtong Date: Tue, 24 Feb 2026 15:05:03 -0500 Subject: [PATCH 17/22] add operation ids --- src/main/resources/assets/paths/darSummariesByDatasetId.yaml | 1 + src/main/resources/assets/paths/metricsDatasetById.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/resources/assets/paths/darSummariesByDatasetId.yaml b/src/main/resources/assets/paths/darSummariesByDatasetId.yaml index 2e9620d965..bc73d2ba87 100644 --- a/src/main/resources/assets/paths/darSummariesByDatasetId.yaml +++ b/src/main/resources/assets/paths/darSummariesByDatasetId.yaml @@ -1,5 +1,6 @@ get: summary: DAR Summary Metrics + operationId: darSummariesByDatasetId description: get Data Access Request Summaries associated to a datasetId parameters: - name: datasetId diff --git a/src/main/resources/assets/paths/metricsDatasetById.yaml b/src/main/resources/assets/paths/metricsDatasetById.yaml index ca457d7763..51afa7ec73 100644 --- a/src/main/resources/assets/paths/metricsDatasetById.yaml +++ b/src/main/resources/assets/paths/metricsDatasetById.yaml @@ -1,5 +1,6 @@ get: summary: Dataset Metrics + operationId: metricsByDatasetId deprecated: true description: | Get Data Access Requests associated to a datasetId. Scheduled for removal. From 3e394f60443b2cae2073e308363fcaba5c1725fe Mon Sep 17 00:00:00 2001 From: rushtong Date: Wed, 25 Feb 2026 10:17:58 -0500 Subject: [PATCH 18/22] PR feedback --- .../broadinstitute/consent/http/db/DataAccessRequestDAO.java | 2 +- .../broadinstitute/consent/http/service/MetricsService.java | 3 ++- .../consent/http/db/DataAccessRequestDAOTest.java | 5 +++-- .../consent/http/service/MetricsServiceTest.java | 5 +++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java index 10224be6d2..561f32c680 100644 --- a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java +++ b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java @@ -141,7 +141,7 @@ AND LOWER(v.type) IN ('final', 'radar_approve')) final_access_vote ON final_acce -- Exclude DARs that have a closeoutSupplement AND data ->> 'closeoutSupplement' IS NULL """) - List findSummaryMetricApprovedDARsByDatasetId( + List findSummaryMetricApprovedDARsByDatasetIdIncludesExpired( @Bind("datasetId") Integer datasetId); /** diff --git a/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java b/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java index 82881ad7d4..27b9d9faa4 100644 --- a/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java +++ b/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java @@ -33,7 +33,8 @@ public List generateDarSummaries(Integer datasetId) { if (dataset == null) { throw new NotFoundException("Dataset with specified ID does not exist."); } - List dars = darDAO.findSummaryMetricApprovedDARsByDatasetId(datasetId); + List dars = + darDAO.findSummaryMetricApprovedDARsByDatasetIdIncludesExpired(datasetId); return dars.stream().map(DarMetricsSummary::new).toList(); } } diff --git a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java index f591619cb8..c9872b26e3 100644 --- a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java +++ b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java @@ -818,7 +818,7 @@ void testFindApprovedDARsByDatasetId_ExcludeCloseouts() { } @Test - void testFindSummaryMetricApprovedDARsByDatasetId() { + void testFindSummaryMetricApprovedDARsByDatasetIdIncludesExpired() { // Create a dataset to request access to Dataset dataset = createDataset(); @@ -890,7 +890,8 @@ void testFindSummaryMetricApprovedDARsByDatasetId() { true, "", now, expiredVote.getVoteId(), false, expiredElectionId, submissionDate, false); List summaryDARs = - dataAccessRequestDAO.findSummaryMetricApprovedDARsByDatasetId(dataset.getDatasetId()); + dataAccessRequestDAO.findSummaryMetricApprovedDARsByDatasetIdIncludesExpired( + dataset.getDatasetId()); assertFalse(summaryDARs.isEmpty()); assertTrue( summaryDARs.stream() diff --git a/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java b/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java index 16da729be5..0861529e2c 100644 --- a/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java +++ b/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java @@ -43,14 +43,15 @@ void testGenerateDatasetMetrics() { Dataset dataset = generateDataset(); when(dataSetDAO.findDatasetById(dataset.getDatasetId())).thenReturn(dataset); - when(darDAO.findSummaryMetricApprovedDARsByDatasetId(any())).thenReturn(List.of(dar)); + when(darDAO.findSummaryMetricApprovedDARsByDatasetIdIncludesExpired(any())) + .thenReturn(List.of(dar)); DatasetMetrics metrics = service.generateDatasetMetrics(dataset.getDatasetId()); assertEquals(dar.getData().getProjectTitle(), metrics.getDars().getFirst().projectTitle()); assertEquals(dar.getDarCode(), metrics.getDars().getFirst().darCode()); verify(dataSetDAO).findDatasetById(dataset.getDatasetId()); - verify(darDAO).findSummaryMetricApprovedDARsByDatasetId(dataset.getDatasetId()); + verify(darDAO).findSummaryMetricApprovedDARsByDatasetIdIncludesExpired(dataset.getDatasetId()); } @Test From 5b2b966beca7238f854561fe3925f76101715bf6 Mon Sep 17 00:00:00 2001 From: rushtong Date: Wed, 25 Feb 2026 10:33:33 -0500 Subject: [PATCH 19/22] PR feedback --- .../consent/http/models/DarMetricsSummary.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java b/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java index ab83bf77bc..f366ec242f 100644 --- a/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java +++ b/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java @@ -1,9 +1,6 @@ package org.broadinstitute.consent.http.models; import java.sql.Timestamp; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; public record DarMetricsSummary( Timestamp updateDate, @@ -20,17 +17,6 @@ public DarMetricsSummary(DataAccessRequest dar) { dar != null ? dar.getDarCode() : null, dar != null && dar.getData() != null ? dar.getData().getNonTechRus() : null, dar != null ? dar.getReferenceId() : null, - computeExpired(dar)); - } - - private static Boolean computeExpired(DataAccessRequest dar) { - // If the DAR or its submission date is null, we consider it expired for metrics purposes - if (dar == null || dar.getSubmissionDate() == null) { - return true; - } - LocalDateTime oneYearAgo = LocalDateTime.now().minusYears(1); - ZonedDateTime zonedDateTime = oneYearAgo.atZone(ZoneId.systemDefault()); - Timestamp lastYear = Timestamp.from(zonedDateTime.toInstant()); - return dar.getSubmissionDate().before(lastYear); + dar == null || dar.getSubmissionDate() == null || dar.getExpired()); } } From a87c6f1d1c440623c0fa07aac7eebf0deba686ed Mon Sep 17 00:00:00 2001 From: Gregory Rushton Date: Wed, 25 Feb 2026 10:39:25 -0500 Subject: [PATCH 20/22] Update src/main/resources/assets/schemas/DarMetric.yaml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/main/resources/assets/schemas/DarMetric.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/assets/schemas/DarMetric.yaml b/src/main/resources/assets/schemas/DarMetric.yaml index 84e652dc79..ddaa6544ed 100644 --- a/src/main/resources/assets/schemas/DarMetric.yaml +++ b/src/main/resources/assets/schemas/DarMetric.yaml @@ -15,3 +15,6 @@ properties: expired: type: boolean description: Whether the DAR is expired + referenceId: + type: string + description: The reference identifier for the DAR From a6ccb67e4549ef5e7b1e628a2e468e5f6ba2d217 Mon Sep 17 00:00:00 2001 From: rushtong Date: Wed, 25 Feb 2026 12:52:49 -0500 Subject: [PATCH 21/22] Include closeouts in results. --- .../consent/http/db/DataAccessRequestDAO.java | 16 ++++++++++-- .../http/db/DataAccessRequestDAOTest.java | 25 +++++++++++++++---- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java index 561f32c680..e2e93287f6 100644 --- a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java +++ b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java @@ -138,8 +138,20 @@ AND LOWER(v.type) IN ('final', 'radar_approve')) final_access_vote ON final_acce AND dar.submission_date IS NOT NULL AND final_access_vote.last_vote = TRUE AND (LOWER(dar.data->>'status') != 'archived' OR dar.data->>'status' IS NULL) - -- Exclude DARs that have a closeoutSupplement - AND data ->> 'closeoutSupplement' IS NULL + -- Pull in all closeouts for this dataset. Closeouts do not have elections, + -- but we want to include them in the dataset usage metrics. + UNION + SELECT dar.id, dar.reference_id, dar.collection_id, dar.parent_id, dar.user_id, + dar.create_date, dar.submission_date, dar.update_date, dar.data, dar.era_commons_id, + dar.approving_so_id, dar.approving_so_timestamp, dar.requires_so_approval, + dar.closeout_so_approval_timestamp, dar.closeout_approving_so_id, + dd.dataset_id, collection.dar_code + FROM data_access_request dar + LEFT JOIN dar_collection collection on collection.collection_id = dar.collection_id + INNER JOIN dar_dataset dd ON dd.reference_id = dar.reference_id + WHERE dd.dataset_id = :datasetId + AND dar.submission_date IS NOT NULL + AND data ->> 'closeoutSupplement' IS NOT NULL """) List findSummaryMetricApprovedDARsByDatasetIdIncludesExpired( @Bind("datasetId") Integer datasetId); diff --git a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java index c9872b26e3..43dd075f30 100644 --- a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java +++ b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java @@ -843,10 +843,20 @@ void testFindSummaryMetricApprovedDARsByDatasetIdIncludesExpired() { dataAccessRequestDAO.insertDARDatasetRelation( unsubmittedDAR.getReferenceId(), dataset.getDatasetId()); - // Create a closeout DAR from the approved DAR + // Create a Progress Report on the approved DAR + DataAccessRequest prDAR = createDataAccessRequest(user.getUserId(), approvedCollectionId); + dataAccessRequestDAO.insertDARDatasetRelation( + prDAR.getReferenceId(), dataset.getDatasetId()); + Election prElection = + createDataAccessElection(prDAR.getReferenceId(), dataset.getDatasetId()); + Vote prVote = createFinalVote(dataset.getCreateUserId(), prElection.getElectionId()); + updateVote(true, "", now, prVote.getVoteId(), false, prElection.getElectionId(), now, false); + + // Create a closeout DAR from the PR DAR DataAccessRequest closeoutDAR = createProgressReport( - user.getEraCommonsId(), user.getUserId(), approvedCollectionId, approvedDAR.getId()); + user.getEraCommonsId(), user.getUserId(), approvedCollectionId, prDAR.getId()); + dataAccessRequestDAO.insertDARDatasetRelation(closeoutDAR.getReferenceId(), dataset.getDatasetId()); CloseoutSupplement closeout = new CloseoutSupplement(List.of("Reason"), "Other Reason", user.getUserId()); closeoutDAR.getData().setCloseoutSupplement(closeout); @@ -893,18 +903,23 @@ void testFindSummaryMetricApprovedDARsByDatasetIdIncludesExpired() { dataAccessRequestDAO.findSummaryMetricApprovedDARsByDatasetIdIncludesExpired( dataset.getDatasetId()); assertFalse(summaryDARs.isEmpty()); + // Only DAR that should not be returned + assertTrue( + summaryDARs.stream() + .noneMatch(dar -> dar.getReferenceId().equals(unsubmittedDAR.getReferenceId()))); + // All other DARs should be returned assertTrue( summaryDARs.stream() .anyMatch(dar -> dar.getReferenceId().equals(approvedDAR.getReferenceId()))); assertTrue( summaryDARs.stream() - .noneMatch(dar -> dar.getReferenceId().equals(unsubmittedDAR.getReferenceId()))); + .anyMatch(dar -> dar.getReferenceId().equals(prDAR.getReferenceId()))); assertTrue( summaryDARs.stream() - .noneMatch(dar -> dar.getReferenceId().equals(closeoutDAR.getReferenceId()))); + .anyMatch(dar -> dar.getReferenceId().equals(closeoutDAR.getReferenceId()))); assertTrue( summaryDARs.stream().anyMatch(dar -> dar.getReferenceId().equals(expiredReferenceId))); - assertEquals(2, summaryDARs.size()); + assertEquals(4, summaryDARs.size()); } // findAllDraftDataAccessRequests should exclude archived DARs From a5b174b7baf632375100598971ca412eba8662d9 Mon Sep 17 00:00:00 2001 From: rushtong Date: Wed, 25 Feb 2026 12:54:16 -0500 Subject: [PATCH 22/22] spotless --- .../consent/http/db/DataAccessRequestDAOTest.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java index 43dd075f30..1155f90a29 100644 --- a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java +++ b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java @@ -845,10 +845,8 @@ void testFindSummaryMetricApprovedDARsByDatasetIdIncludesExpired() { // Create a Progress Report on the approved DAR DataAccessRequest prDAR = createDataAccessRequest(user.getUserId(), approvedCollectionId); - dataAccessRequestDAO.insertDARDatasetRelation( - prDAR.getReferenceId(), dataset.getDatasetId()); - Election prElection = - createDataAccessElection(prDAR.getReferenceId(), dataset.getDatasetId()); + dataAccessRequestDAO.insertDARDatasetRelation(prDAR.getReferenceId(), dataset.getDatasetId()); + Election prElection = createDataAccessElection(prDAR.getReferenceId(), dataset.getDatasetId()); Vote prVote = createFinalVote(dataset.getCreateUserId(), prElection.getElectionId()); updateVote(true, "", now, prVote.getVoteId(), false, prElection.getElectionId(), now, false); @@ -856,7 +854,8 @@ void testFindSummaryMetricApprovedDARsByDatasetIdIncludesExpired() { DataAccessRequest closeoutDAR = createProgressReport( user.getEraCommonsId(), user.getUserId(), approvedCollectionId, prDAR.getId()); - dataAccessRequestDAO.insertDARDatasetRelation(closeoutDAR.getReferenceId(), dataset.getDatasetId()); + dataAccessRequestDAO.insertDARDatasetRelation( + closeoutDAR.getReferenceId(), dataset.getDatasetId()); CloseoutSupplement closeout = new CloseoutSupplement(List.of("Reason"), "Other Reason", user.getUserId()); closeoutDAR.getData().setCloseoutSupplement(closeout); @@ -912,8 +911,7 @@ void testFindSummaryMetricApprovedDARsByDatasetIdIncludesExpired() { summaryDARs.stream() .anyMatch(dar -> dar.getReferenceId().equals(approvedDAR.getReferenceId()))); assertTrue( - summaryDARs.stream() - .anyMatch(dar -> dar.getReferenceId().equals(prDAR.getReferenceId()))); + summaryDARs.stream().anyMatch(dar -> dar.getReferenceId().equals(prDAR.getReferenceId()))); assertTrue( summaryDARs.stream() .anyMatch(dar -> dar.getReferenceId().equals(closeoutDAR.getReferenceId())));