From aa2eb727f8674019760326fbd13dfce3ad835a92 Mon Sep 17 00:00:00 2001 From: Katy Ekey Date: Tue, 31 Mar 2026 13:35:54 -0400 Subject: [PATCH 1/4] feat!: Add summary endpoint for report SBUL passing rates by developer [#OCD-5224] --- .../web/controller/ReportDataController.java | 13 ----- .../ServiceBaseUrlListReportController.java | 57 +++++++++++++++++++ .../chpl/report/ReportDataManager.java | 6 ++ .../ServiceBaseUrlListReportService.java | 36 ++++++++++-- .../UrlUptimeMonitorSummary.java | 21 +++++++ 5 files changed, 116 insertions(+), 17 deletions(-) create mode 100644 chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java create mode 100644 chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/UrlUptimeMonitorSummary.java diff --git a/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ReportDataController.java b/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ReportDataController.java index 770f6b7505..4e841b7838 100644 --- a/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ReportDataController.java +++ b/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ReportDataController.java @@ -19,7 +19,6 @@ import gov.healthit.chpl.report.listing.UniqueListingCount; import gov.healthit.chpl.report.product.ProductByAcb; import gov.healthit.chpl.report.product.UniqueProductCount; -import gov.healthit.chpl.report.servicebaseurllistreport.UrlUptimeMonitorEx; import gov.healthit.chpl.report.surveillance.CapCounts; import gov.healthit.chpl.report.surveillance.NonconformityCounts; import gov.healthit.chpl.report.surveillance.SurveillanceActivityCounts; @@ -431,18 +430,6 @@ public ReportDataController(ReportDataManager reportDataManager, return reportDataManager.getDirectReviewCounts(); } - @Operation(summary = "Retrieves the data used to generate the Service Base Url List report.", - description = "Retrieves the data used to generate the Service Base Url List report.", - security = { - @SecurityRequirement(name = SwaggerSecurityRequirement.API_KEY) - }) - @LogMethodUsage - @RequestMapping(value = "/service-base-url-list", method = RequestMethod.GET, produces = "application/json; charset=utf-8") - public @ResponseBody List getUrlUptimeMonitors() { - return reportDataManager.getUrlUptimeMonitors(); - } - - @Operation(summary = "Retrieves the data used to generate the Attestations report.", description = "Retrieves the data used to generate the Attestations report.", security = { diff --git a/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java b/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java new file mode 100644 index 0000000000..e3e4e5f8a9 --- /dev/null +++ b/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java @@ -0,0 +1,57 @@ +package gov.healthit.chpl.web.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import gov.healthit.chpl.report.ReportDataManager; +import gov.healthit.chpl.report.servicebaseurllistreport.UrlUptimeMonitorEx; +import gov.healthit.chpl.report.servicebaseurllistreport.UrlUptimeMonitorSummary; +import gov.healthit.chpl.util.LogMethodUsage; +import gov.healthit.chpl.util.SwaggerSecurityRequirement; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@Tag(name = "report-data/service-base-url-list", description = "Allows retrieval of data used by SBUL reports.") +@RestController +@RequestMapping("/report-data/service-base-url-list") +public class ServiceBaseUrlListReportController { + private ReportDataManager reportDataManager; + + @Autowired + public ServiceBaseUrlListReportController(ReportDataManager reportDataManager) { + this.reportDataManager = reportDataManager; + } + + @Operation(summary = "Retrieves the data used to generate the Service Base Url List report.", + description = "Retrieves the data used to generate the Service Base Url List report.", + security = { + @SecurityRequirement(name = SwaggerSecurityRequirement.API_KEY) + }) + @LogMethodUsage + @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json; charset=utf-8") + public @ResponseBody List getUrlUptimeMonitors() { + return reportDataManager.getUrlUptimeMonitors(); + } + + @Operation(summary = "Retrieves the data used to generate the Service Base Url List uptime summaries by Developer and URL.", + description = "Retrieves the data used to generate the Service Base Url List uptime summaries by Developer and URL.", + security = { + @SecurityRequirement(name = SwaggerSecurityRequirement.API_KEY) + }) + @LogMethodUsage + @RequestMapping(value = "/summary", method = RequestMethod.GET, produces = "application/json; charset=utf-8") + public @ResponseBody List getUrlUptimeMonitorsSummaries( + @RequestParam(name = "numDaysAgo", required = false, defaultValue = "30") Integer numDaysAgo) { + return reportDataManager.getUrlUptimeMonitorsSummaries(numDaysAgo); + } + +} diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/ReportDataManager.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/ReportDataManager.java index c5b5edead1..7ef58968b5 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/ReportDataManager.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/ReportDataManager.java @@ -27,6 +27,7 @@ import gov.healthit.chpl.report.realworldtesting.RealWorldTestingReportDataService; import gov.healthit.chpl.report.servicebaseurllistreport.ServiceBaseUrlListReportService; import gov.healthit.chpl.report.servicebaseurllistreport.UrlUptimeMonitorEx; +import gov.healthit.chpl.report.servicebaseurllistreport.UrlUptimeMonitorSummary; import gov.healthit.chpl.report.surveillance.CapCounts; import gov.healthit.chpl.report.surveillance.NonconformityCounts; import gov.healthit.chpl.report.surveillance.SurveillanceActivityCounts; @@ -294,6 +295,11 @@ public List getUrlUptimeMonitors() { return serviceBaseUrlListReportService.getUrlUptimeMonitors(); } + @Synchronized("lock") + public List getUrlUptimeMonitorsSummaries(Integer numDaysAgo) { + return serviceBaseUrlListReportService.getUrlUptimeMonitorsSummaries(numDaysAgo); + } + @Synchronized("lock") public RealWorldTestingReportDataService getRealWorldTestingReportDataService() { return realWorldTestingReportDataService; diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java index 0eb3b1f237..fbefce03a4 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java @@ -7,29 +7,30 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import gov.healthit.chpl.developer.search.DeveloperSearchService; import gov.healthit.chpl.domain.IdNamePair; import gov.healthit.chpl.exception.EntityRetrievalException; import gov.healthit.chpl.manager.CertificationBodyManager; import gov.healthit.chpl.scheduler.job.urluptime.UrlUptimeMonitor; import gov.healthit.chpl.scheduler.job.urluptime.UrlUptimeMonitorDAO; +import gov.healthit.chpl.scheduler.job.urluptime.UrlUptimeMonitorTest; import gov.healthit.chpl.scheduler.job.urluptime.UrlUptimeMonitorTestDAO; import lombok.extern.log4j.Log4j2; @Log4j2 @Component public class ServiceBaseUrlListReportService { + private static final Double CONVERT_TO_PERCENT = 100.0; + private UrlUptimeMonitorDAO urlUptimeMonitorDAO; private UrlUptimeMonitorTestDAO urlUptimeMonitorTestDAO; - private DeveloperSearchService developerSearchService; private CertificationBodyManager certificationBodyManager; @Autowired - public ServiceBaseUrlListReportService(UrlUptimeMonitorDAO urlUptimeMonitorDAO, UrlUptimeMonitorTestDAO urlUptimeMonitorTestDAO, DeveloperSearchService developerSearchService, + public ServiceBaseUrlListReportService(UrlUptimeMonitorDAO urlUptimeMonitorDAO, + UrlUptimeMonitorTestDAO urlUptimeMonitorTestDAO, CertificationBodyManager certificationBodyManager) { this.urlUptimeMonitorDAO = urlUptimeMonitorDAO; this.urlUptimeMonitorTestDAO = urlUptimeMonitorTestDAO; - this.developerSearchService = developerSearchService; this.certificationBodyManager = certificationBodyManager; } @@ -48,6 +49,18 @@ public List getUrlUptimeMonitors() { .toList(); } + public List getUrlUptimeMonitorsSummaries(Integer numDaysAgo) { + LocalDateTime minTestCheckTime = LocalDateTime.now().minusDays(numDaysAgo); + return (List) urlUptimeMonitorDAO.getAll().stream() + .map(monitor -> UrlUptimeMonitorSummary.builder() + .developer(monitor.getDeveloper()) + .url(monitor.getUrl()) + .acbs(getAssocatedAcbs(monitor)) + .percentPassed(calculatePercentPassedSince(monitor.getId(), minTestCheckTime)) + .build()) + .toList(); + } + private List getAssocatedAcbs(UrlUptimeMonitor monitor) { if (monitor.getDelimitedAcbIds() == null || monitor.getDelimitedAcbIds().equals("")) { return List.of(); @@ -66,4 +79,19 @@ private List getAssocatedAcbs(UrlUptimeMonitor monitor) { .map(acb -> new IdNamePair(acb.getId(), acb.getName())) .toList(); } + + private Double calculatePercentPassedSince(Long monitorId, LocalDateTime minTestCheckTime) { + List uptimeTestsWithinTimeWindow = urlUptimeMonitorTestDAO.getChplUptimeMonitorTests(monitorId).stream() + .filter(test -> test.getCheckTime().isAfter(minTestCheckTime)) + .toList(); + long totalTests = uptimeTestsWithinTimeWindow.size(); + long passedTests = uptimeTestsWithinTimeWindow.stream() + .filter(test -> test.getPassed()) + .count(); + + if (passedTests == 0 || totalTests == 0) { + return 0.0; + } + return (passedTests / totalTests) * CONVERT_TO_PERCENT; + } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/UrlUptimeMonitorSummary.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/UrlUptimeMonitorSummary.java new file mode 100644 index 0000000000..e8b4d99489 --- /dev/null +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/UrlUptimeMonitorSummary.java @@ -0,0 +1,21 @@ +package gov.healthit.chpl.report.servicebaseurllistreport; + +import java.util.List; + +import gov.healthit.chpl.domain.Developer; +import gov.healthit.chpl.domain.IdNamePair; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UrlUptimeMonitorSummary { + private Developer developer; + private String url; + private Double percentPassed; + private List acbs; +} From fd1fb7fa00a96c4dca9c09587c19ac8a6c4241a3 Mon Sep 17 00:00:00 2001 From: Katy Ekey Date: Tue, 31 Mar 2026 15:05:16 -0400 Subject: [PATCH 2/4] fix: Use floating point math correctly [#OCD-5224] --- .../entity/developer/DeveloperEntitySimple.java | 13 ++++++------- .../ServiceBaseUrlListReportService.java | 9 +++++---- .../UrlUptimeMonitorSummary.java | 4 ---- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/entity/developer/DeveloperEntitySimple.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/entity/developer/DeveloperEntitySimple.java index 9ea9dd962e..baa331561a 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/entity/developer/DeveloperEntitySimple.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/entity/developer/DeveloperEntitySimple.java @@ -1,5 +1,10 @@ package gov.healthit.chpl.entity.developer; +import org.hibernate.annotations.Immutable; + +import gov.healthit.chpl.domain.Developer; +import gov.healthit.chpl.domain.contact.PointOfContact; +import gov.healthit.chpl.entity.EntityAudit; import jakarta.persistence.Basic; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -7,12 +12,6 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; - -import org.hibernate.annotations.Immutable; - -import gov.healthit.chpl.domain.Developer; -import gov.healthit.chpl.domain.contact.PointOfContact; -import gov.healthit.chpl.entity.EntityAudit; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -48,7 +47,7 @@ public class DeveloperEntitySimple extends EntityAudit { @Column(length = 300, nullable = true) private String website; - @Column(name="self_developer") + @Column(name = "self_developer") private Boolean selfDeveloper; @Basic(optional = true) diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java index fbefce03a4..3f2ce82cd8 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java @@ -1,6 +1,7 @@ package gov.healthit.chpl.report.servicebaseurllistreport; import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.List; @@ -50,12 +51,12 @@ public List getUrlUptimeMonitors() { } public List getUrlUptimeMonitorsSummaries(Integer numDaysAgo) { - LocalDateTime minTestCheckTime = LocalDateTime.now().minusDays(numDaysAgo); + LocalDateTime minTestCheckTime = LocalDateTime.now().minusDays(numDaysAgo).truncatedTo(ChronoUnit.DAYS); + LOGGER.info("Finding URL Uptime Monitor Tests that happened on or after " + minTestCheckTime); return (List) urlUptimeMonitorDAO.getAll().stream() .map(monitor -> UrlUptimeMonitorSummary.builder() .developer(monitor.getDeveloper()) .url(monitor.getUrl()) - .acbs(getAssocatedAcbs(monitor)) .percentPassed(calculatePercentPassedSince(monitor.getId(), minTestCheckTime)) .build()) .toList(); @@ -82,7 +83,7 @@ private List getAssocatedAcbs(UrlUptimeMonitor monitor) { private Double calculatePercentPassedSince(Long monitorId, LocalDateTime minTestCheckTime) { List uptimeTestsWithinTimeWindow = urlUptimeMonitorTestDAO.getChplUptimeMonitorTests(monitorId).stream() - .filter(test -> test.getCheckTime().isAfter(minTestCheckTime)) + .filter(test -> test.getCheckTime().isEqual(minTestCheckTime) || test.getCheckTime().isAfter(minTestCheckTime)) .toList(); long totalTests = uptimeTestsWithinTimeWindow.size(); long passedTests = uptimeTestsWithinTimeWindow.stream() @@ -92,6 +93,6 @@ private Double calculatePercentPassedSince(Long monitorId, LocalDateTime minTest if (passedTests == 0 || totalTests == 0) { return 0.0; } - return (passedTests / totalTests) * CONVERT_TO_PERCENT; + return ((double) passedTests / totalTests) * CONVERT_TO_PERCENT; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/UrlUptimeMonitorSummary.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/UrlUptimeMonitorSummary.java index e8b4d99489..1505bf4847 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/UrlUptimeMonitorSummary.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/UrlUptimeMonitorSummary.java @@ -1,9 +1,6 @@ package gov.healthit.chpl.report.servicebaseurllistreport; -import java.util.List; - import gov.healthit.chpl.domain.Developer; -import gov.healthit.chpl.domain.IdNamePair; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -17,5 +14,4 @@ public class UrlUptimeMonitorSummary { private Developer developer; private String url; private Double percentPassed; - private List acbs; } From 5407ef2f72a1ff325f5688c95dd8a0a9fa072b36 Mon Sep 17 00:00:00 2001 From: Katy Ekey Date: Thu, 2 Apr 2026 10:18:13 -0400 Subject: [PATCH 3/4] feat: Allow querying a range of time for uptime summaries [#OCD-5224] --- .../ServiceBaseUrlListReportController.java | 10 ++++++---- .../healthit/chpl/report/ReportDataManager.java | 4 ++-- .../ServiceBaseUrlListReportService.java | 16 ++++++++++------ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java b/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java index e3e4e5f8a9..b38512014f 100644 --- a/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java +++ b/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java @@ -43,15 +43,17 @@ public ServiceBaseUrlListReportController(ReportDataManager reportDataManager) { } @Operation(summary = "Retrieves the data used to generate the Service Base Url List uptime summaries by Developer and URL.", - description = "Retrieves the data used to generate the Service Base Url List uptime summaries by Developer and URL.", + description = "Retrieves the data used to generate the Service Base Url List uptime summaries by Developer and URL. " + + "Returns uptime summaries for the last 30 days by default, which can be adjusted using the parameters.", security = { @SecurityRequirement(name = SwaggerSecurityRequirement.API_KEY) }) @LogMethodUsage - @RequestMapping(value = "/summary", method = RequestMethod.GET, produces = "application/json; charset=utf-8") + @RequestMapping(value = "/uptime-summary", method = RequestMethod.GET, produces = "application/json; charset=utf-8") public @ResponseBody List getUrlUptimeMonitorsSummaries( - @RequestParam(name = "numDaysAgo", required = false, defaultValue = "30") Integer numDaysAgo) { - return reportDataManager.getUrlUptimeMonitorsSummaries(numDaysAgo); + @RequestParam(name = "numDaysAgoMin", required = false, defaultValue = "0") Integer numDaysAgoMin, + @RequestParam(name = "numDaysAgoMin", required = false, defaultValue = "30") Integer numDaysAgoMax) { + return reportDataManager.getUrlUptimeMonitorsSummaries(numDaysAgoMin, numDaysAgoMax); } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/ReportDataManager.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/ReportDataManager.java index 7ef58968b5..161fd13b35 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/ReportDataManager.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/ReportDataManager.java @@ -296,8 +296,8 @@ public List getUrlUptimeMonitors() { } @Synchronized("lock") - public List getUrlUptimeMonitorsSummaries(Integer numDaysAgo) { - return serviceBaseUrlListReportService.getUrlUptimeMonitorsSummaries(numDaysAgo); + public List getUrlUptimeMonitorsSummaries(Integer numDaysAgoMin, Integer numDaysAgoMax) { + return serviceBaseUrlListReportService.getUrlUptimeMonitorsSummaries(numDaysAgoMin, numDaysAgoMax); } @Synchronized("lock") diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java index 3f2ce82cd8..3516f3d8b4 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/report/servicebaseurllistreport/ServiceBaseUrlListReportService.java @@ -50,14 +50,16 @@ public List getUrlUptimeMonitors() { .toList(); } - public List getUrlUptimeMonitorsSummaries(Integer numDaysAgo) { - LocalDateTime minTestCheckTime = LocalDateTime.now().minusDays(numDaysAgo).truncatedTo(ChronoUnit.DAYS); - LOGGER.info("Finding URL Uptime Monitor Tests that happened on or after " + minTestCheckTime); + public List getUrlUptimeMonitorsSummaries(Integer numDaysAgoMin, Integer numDaysAgoMax) { + LocalDateTime minTestCheckTime = LocalDateTime.now().minusDays(numDaysAgoMax).truncatedTo(ChronoUnit.DAYS); + LocalDateTime maxTestCheckTime = LocalDateTime.now().minusDays(numDaysAgoMin).truncatedTo(ChronoUnit.DAYS); + + LOGGER.info("Finding URL Uptime Monitor Tests that happened between " + minTestCheckTime + " and " + maxTestCheckTime); return (List) urlUptimeMonitorDAO.getAll().stream() .map(monitor -> UrlUptimeMonitorSummary.builder() .developer(monitor.getDeveloper()) .url(monitor.getUrl()) - .percentPassed(calculatePercentPassedSince(monitor.getId(), minTestCheckTime)) + .percentPassed(calculatePercentPassedBetween(monitor.getId(), minTestCheckTime, maxTestCheckTime)) .build()) .toList(); } @@ -81,9 +83,11 @@ private List getAssocatedAcbs(UrlUptimeMonitor monitor) { .toList(); } - private Double calculatePercentPassedSince(Long monitorId, LocalDateTime minTestCheckTime) { + private Double calculatePercentPassedBetween(Long monitorId, LocalDateTime minTestCheckTime, LocalDateTime maxTestCheckTime) { List uptimeTestsWithinTimeWindow = urlUptimeMonitorTestDAO.getChplUptimeMonitorTests(monitorId).stream() - .filter(test -> test.getCheckTime().isEqual(minTestCheckTime) || test.getCheckTime().isAfter(minTestCheckTime)) + .filter(test -> + (test.getCheckTime().isEqual(minTestCheckTime) || test.getCheckTime().isAfter(minTestCheckTime)) + && (test.getCheckTime().isEqual(maxTestCheckTime) || test.getCheckTime().isBefore(maxTestCheckTime))) .toList(); long totalTests = uptimeTestsWithinTimeWindow.size(); long passedTests = uptimeTestsWithinTimeWindow.stream() From d7169c49db346a97c9f22e063503acaff2a3bf3d Mon Sep 17 00:00:00 2001 From: Katy Ekey Date: Thu, 2 Apr 2026 10:59:34 -0400 Subject: [PATCH 4/4] fix: Typo in param name [#OCD-5224] --- .../chpl/web/controller/ServiceBaseUrlListReportController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java b/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java index b38512014f..4e49626f83 100644 --- a/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java +++ b/chpl/chpl-api/src/main/java/gov/healthit/chpl/web/controller/ServiceBaseUrlListReportController.java @@ -52,7 +52,7 @@ public ServiceBaseUrlListReportController(ReportDataManager reportDataManager) { @RequestMapping(value = "/uptime-summary", method = RequestMethod.GET, produces = "application/json; charset=utf-8") public @ResponseBody List getUrlUptimeMonitorsSummaries( @RequestParam(name = "numDaysAgoMin", required = false, defaultValue = "0") Integer numDaysAgoMin, - @RequestParam(name = "numDaysAgoMin", required = false, defaultValue = "30") Integer numDaysAgoMax) { + @RequestParam(name = "numDaysAgoMax", required = false, defaultValue = "30") Integer numDaysAgoMax) { return reportDataManager.getUrlUptimeMonitorsSummaries(numDaysAgoMin, numDaysAgoMax); }