├── .codeclimate.yml ├── .github ├── CODEOWNERS ├── CODEOWNERS.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── add_team_request.md │ ├── code_json_request.md │ └── outside_collaborator_request.md ├── dependabot.yml ├── pull_request_template.md └── workflows │ ├── actions │ └── set-database-params │ │ └── action.yml │ ├── build-deploy.yml │ ├── build.yml │ ├── contracts-build-deploy.yml │ ├── contracts-build.yml │ ├── contracts-deploy.yml │ ├── contracts-promote.yml │ ├── contracts-pull-request.yml │ ├── contracts-push-to-main.yml │ ├── contracts-sonarqube.yml │ ├── deploy-api-worker-microservices.yml │ ├── deploy-lambda.yml │ ├── deploy.yml │ ├── e2e-bfd-test.yml │ ├── e2e-test.yml │ ├── events-build-deploy.yml │ ├── events-build.yml │ ├── events-deploy.yml │ ├── events-promote.yml │ ├── events-pull-request.yml │ ├── events-push-to-main.yml │ ├── events-sonarqube.yml │ ├── fhir-test.yml │ ├── lib-build.yaml │ ├── libs-build.yml │ ├── libs-publish.yml │ ├── libs-pull-request.yml │ ├── libs-push-main.yml │ ├── libs-sonarqube.yml │ ├── microservices-deploy.yml │ ├── opt-out-export-deploy.yml │ ├── opt-out-export-unit.yml │ ├── opt-out-import-deploy.yml │ ├── opt-out-import-test-integration.yml │ ├── opt-out-import-unit.yml │ ├── opt-out-import-upload-test.yml │ ├── promote.yml │ ├── publish-lambdas.yml │ ├── publish-libs.yml │ ├── pull-request.yml │ ├── push-main.yml │ ├── release.yml │ ├── resources │ ├── get-organization.sql │ ├── insert-record.sql │ └── total-benes-served.sql │ ├── sonarqube.yml │ ├── start-job.yml │ └── unit-integration-test.yml ├── .gitignore ├── .gitleaks.toml ├── .pre-commit-config.yaml ├── .terraform-docs.yml ├── CODE_OF_CONDUCT.md ├── COMMUNITY.md ├── CONTRIBUTING.md ├── GOVERNANCE.md ├── LICENSE ├── Makefile ├── README.md ├── SECURITY.md ├── ab2d_dev_keystore.enc ├── api ├── Dockerfile ├── pom.xml └── src │ ├── main │ ├── java │ │ ├── gov │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── api │ │ │ │ ├── SpringBootApp.java │ │ │ │ ├── config │ │ │ │ ├── MDCFilter.java │ │ │ │ └── OpenAPIConfig.java │ │ │ │ ├── controller │ │ │ │ ├── AdminAPI.java │ │ │ │ ├── ErrorHandler.java │ │ │ │ ├── HealthAPI.java │ │ │ │ ├── InMaintenanceModeException.java │ │ │ │ ├── JobCompletedResponse.java │ │ │ │ ├── JobProcessingException.java │ │ │ │ ├── MaintenanceModeAPI.java │ │ │ │ ├── MaintenanceModeResponse.java │ │ │ │ ├── TooManyRequestsException.java │ │ │ │ ├── common │ │ │ │ │ ├── ApiCommon.java │ │ │ │ │ ├── ApiText.java │ │ │ │ │ ├── Common.java │ │ │ │ │ ├── FileDownloadCommon.java │ │ │ │ │ └── StatusCommon.java │ │ │ │ ├── v1 │ │ │ │ │ ├── BulkDataAccessAPIV1.java │ │ │ │ │ ├── CapabilityAPIV1.java │ │ │ │ │ ├── CapabilityStatementSTU3.java │ │ │ │ │ ├── FileDownloadAPIV1.java │ │ │ │ │ └── StatusAPIV1.java │ │ │ │ └── v2 │ │ │ │ │ ├── BulkDataAccessAPIV2.java │ │ │ │ │ ├── CapabilityAPIV2.java │ │ │ │ │ ├── CapabilityStatementR4.java │ │ │ │ │ ├── FileDownloadAPIV2.java │ │ │ │ │ └── StatusAPIV2.java │ │ │ │ ├── log │ │ │ │ └── LogstashHeaderFilter.java │ │ │ │ ├── remote │ │ │ │ └── JobClient.java │ │ │ │ ├── security │ │ │ │ ├── BadJWTTokenException.java │ │ │ │ ├── ClientNotEnabledException.java │ │ │ │ ├── CustomUserDetailsService.java │ │ │ │ ├── FilterChainExceptionHandler.java │ │ │ │ ├── InvalidAuthHeaderException.java │ │ │ │ ├── JwtConfig.java │ │ │ │ ├── JwtTokenAuthenticationFilter.java │ │ │ │ ├── MissingTokenException.java │ │ │ │ └── SecurityConfig.java │ │ │ │ └── util │ │ │ │ ├── ApiHealthChecker.java │ │ │ │ ├── Constants.java │ │ │ │ ├── HealthCheck.java │ │ │ │ ├── SwaggerConstants.java │ │ │ │ └── UtilMethods.java │ │ └── lombok.config │ └── resources │ │ ├── ab2d.p12 │ │ ├── application.properties │ │ ├── logback-access.xml │ │ └── logback.xml │ └── test │ ├── java │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── api │ │ ├── config │ │ └── OpenAPIConfigTest.java │ │ ├── controller │ │ ├── AdminAPIMaintenanceModeTests.java │ │ ├── AdminAPIPdpClientTests.java │ │ ├── AuthenticationTests.java │ │ ├── BulkDataAccessAPIIntegrationTests.java │ │ ├── BulkDataAccessAPIUnusualDataTests.java │ │ ├── BulkDataAccessAPIV2IntegrationTests.java │ │ ├── ErrorHandlerTest.java │ │ ├── HealthAPITest.java │ │ ├── InvalidTokenTest.java │ │ ├── MaintenanceModeAPITests.java │ │ ├── RoleTests.java │ │ ├── TLSTest.java │ │ ├── TestUtil.java │ │ ├── common │ │ │ ├── ApiCommonTest.java │ │ │ ├── CommonTest.java │ │ │ ├── FileDownloadCommonTest.java │ │ │ └── StatusCommonTest.java │ │ └── v2 │ │ │ └── StatusAPIV2Test.java │ │ ├── log │ │ └── LogstashHeaderFilterTest.java │ │ ├── remote │ │ └── JobClientMock.java │ │ ├── security │ │ ├── CustomUserDetailsServiceTest.java │ │ └── JwtAuthenticationFilterTest.java │ │ └── util │ │ ├── ApiHealthCheckerTest.java │ │ └── UtilMethodsTest.java │ └── resources │ ├── ab2d.p12 │ ├── application.properties │ ├── efsTestDir │ └── clientA │ │ ├── EOB-500.ndjson │ │ └── EOB-500.ndjson.gz │ ├── logback.xml │ ├── parent_org_and_legal_entity_20191031_111812.xls │ ├── test.ndjson │ └── ~$Attestation_Report_Sample.xlsx ├── bfd_sbx_hash_pepper.enc ├── code.json ├── common ├── pom.xml └── src │ ├── main │ ├── java │ │ ├── gov │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── common │ │ │ │ ├── config │ │ │ │ ├── EnvironmentConfig.java │ │ │ │ ├── LoggingConfig.java │ │ │ │ └── Mapping.java │ │ │ │ ├── dto │ │ │ │ └── PdpClientDTO.java │ │ │ │ ├── feign │ │ │ │ └── ContractFeignClient.java │ │ │ │ ├── health │ │ │ │ ├── DatabaseAvailable.java │ │ │ │ ├── FileSystemCheck.java │ │ │ │ ├── LoggingAvailable.java │ │ │ │ ├── MemoryUtilization.java │ │ │ │ └── UrlAvailable.java │ │ │ │ ├── model │ │ │ │ ├── PdpClient.java │ │ │ │ ├── Property.java │ │ │ │ ├── Role.java │ │ │ │ ├── SinceSource.java │ │ │ │ ├── TimestampBase.java │ │ │ │ └── TooFrequentInvocations.java │ │ │ │ ├── properties │ │ │ │ ├── PropertiesDTO.java │ │ │ │ ├── PropertiesService.java │ │ │ │ └── PropertiesServiceImpl.java │ │ │ │ ├── repository │ │ │ │ ├── PdpClientRepository.java │ │ │ │ ├── PropertiesRepository.java │ │ │ │ └── RoleRepository.java │ │ │ │ ├── service │ │ │ │ ├── ContractService.java │ │ │ │ ├── ContractServiceImpl.java │ │ │ │ ├── FeatureEngagement.java │ │ │ │ ├── InvalidClientInputException.java │ │ │ │ ├── InvalidContractException.java │ │ │ │ ├── InvalidPropertiesException.java │ │ │ │ ├── PdpClientService.java │ │ │ │ ├── PdpClientServiceImpl.java │ │ │ │ ├── ResourceNotFoundException.java │ │ │ │ ├── RoleService.java │ │ │ │ └── RoleServiceImpl.java │ │ │ │ └── util │ │ │ │ ├── AttestationStatus.java │ │ │ │ ├── Constants.java │ │ │ │ ├── DateUtil.java │ │ │ │ ├── GzipCompressUtils.java │ │ │ │ ├── HealthCheckUtil.java │ │ │ │ └── PropertyConstants.java │ │ └── lombok.config │ └── resources │ │ ├── application.common.properties │ │ └── db │ │ └── changelog │ │ ├── db.changelog-master.yaml │ │ ├── test_only │ │ ├── coverage-fake-partitions.sql │ │ ├── create-ab2d-analyst.sql │ │ └── truncate-fake-data.sql │ │ ├── v001 │ │ ├── ab2d-1069-recreate-coverage-table.sql │ │ ├── ab2d-1144-add-since-val.sql │ │ ├── ab2d-1377-add-aws-id.sql │ │ ├── ab2d-1377-add-env-id.sql │ │ ├── ab2d-2701-add-created-and-modified-values-to-test-user.sql │ │ ├── ab2d-2701-map-credentials-directly-to-contracts.sql │ │ ├── ab2d-599-rename-consent.sql │ │ ├── ab2d-777-resolve_diff_ids.sql │ │ ├── ab2d-828-increase-username-column-length.sql │ │ ├── ab2d-934-allow-for-zip-downloads.sql │ │ ├── ab2d_1167_add_column_to_opt_out_table.sql │ │ ├── add_admin_user.sql │ │ ├── add_attestor_role.sql │ │ ├── add_checksum_length_job_output.sql │ │ ├── add_concurrent_job_column.sql │ │ ├── add_contract2beneCache_toggle_property.sql │ │ ├── add_contract_number_to_job.sql │ │ ├── add_coverage_search.sql │ │ ├── add_created_modified_date.sql │ │ ├── add_downloaded_to_job_output.sql │ │ ├── add_hpms_info_to_contract.sql │ │ ├── add_ip_table.sql │ │ ├── add_last_success_to_coverage_period.sql │ │ ├── add_maintenance_mode_property.sql │ │ ├── add_mbi_to_coverage.sql │ │ ├── add_multicontract_data.sql │ │ ├── add_properties_data_01.sql │ │ ├── add_properties_table.sql │ │ ├── add_property_coverage_search.sql │ │ ├── add_sbx_accounts.sql │ │ ├── add_update_mode_to_contract.sql │ │ ├── add_zip_support_toggle_property.sql │ │ ├── create_opt_out_file_table.sql │ │ ├── drop-sponsor-ref-not-null.sql │ │ ├── log_event_schema.sql │ │ ├── modify_coverage_schema.sql │ │ ├── modify_hicn.sql │ │ ├── modify_hpms_ids.sql │ │ ├── remove_not_null_job_output.sql │ │ ├── remove_opt_out.sql │ │ ├── schema.sql │ │ ├── seed_data.sql │ │ ├── update_attestation_date.sql │ │ └── update_contract_numbers.sql │ │ ├── v2021 │ │ ├── add_coverage_delta.sql │ │ ├── add_coverage_search_override.sql │ │ ├── add_coverage_search_props.sql │ │ ├── add_fhir_version.sql │ │ ├── add_patient_eob_count.sql │ │ ├── add_started_by_column_to_job.sql │ │ ├── add_synthea_contracts.sql │ │ ├── create_partitioned_coverage_table.sql │ │ ├── delete_akamai_requests.sql │ │ ├── drop_old_coverage_table.sql │ │ ├── remove_current_admin.sql │ │ ├── remove_deprecated_properties.sql │ │ ├── remove_extra_users.sql │ │ ├── remove_sponsor_table.sql │ │ ├── replace_coverage_table.sql │ │ ├── rework_event_tables.sql │ │ ├── rework_search_event.sql │ │ ├── rework_user_account_username.sql │ │ ├── support_default_since.sql │ │ └── update_mode_and_contract_type.sql │ │ ├── v2022 │ │ ├── add_missing_job_view_grant.sql │ │ ├── contract-service-database-migration.sql │ │ ├── contract_coverage.sql │ │ ├── create-analyst-view.sql │ │ ├── downloaded_count.sql │ │ ├── event-service-database-migration.sql │ │ ├── job_contract_bus_key.sql │ │ ├── job_pdp_client_bus_key.sql │ │ └── properties-service-database-migration.sql │ │ ├── v2023 │ │ ├── add_columns_to_coverage.sql │ │ ├── add_optout_property.sql │ │ ├── create_current_mbi_table.sql │ │ ├── drop-unused-tables.sql │ │ └── extend_coverage_partition.sql │ │ ├── v2024 │ │ ├── ab2d_6151_rename_column.sql │ │ ├── add_until_column.sql │ │ └── misc_opt_out_attribution.sql │ │ └── v2025 │ │ ├── add_sequences.sql │ │ ├── alter_sequences.sql │ │ ├── migrate_to_ab2d_schema.sql │ │ ├── update_coverage_mbi_sync_proc.sql │ │ └── update_total_bene_served_procedure.sql │ └── test │ ├── java │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── common │ │ ├── SpringBootAppTest.java │ │ ├── config │ │ └── LoggingConfigTest.java │ │ ├── health │ │ ├── DatabaseAvailableTest.java │ │ ├── FileSystemCheckTest.java │ │ ├── LoggingAvailableTest.java │ │ ├── MemoryUtilizationTest.java │ │ └── UrlAvailableTest.java │ │ ├── properties │ │ ├── PropertiesServiceImplTest.java │ │ └── PropertyServiceStub.java │ │ ├── service │ │ ├── ContractServiceFeignImplTest.java │ │ ├── ContractServiceImplTest.java │ │ ├── ContractServiceStub.java │ │ ├── FeatureEngagementTest.java │ │ ├── InvalidClientInputExceptionTest.java │ │ ├── InvalidContractExceptionTest.java │ │ ├── InvalidPropertiesExceptionTest.java │ │ └── PdpClientServiceTest.java │ │ └── util │ │ ├── AB2DLocalstackContainer.java │ │ ├── AB2DPostgresqlContainer.java │ │ ├── AB2DSQSMockConfig.java │ │ ├── AttestationStatusTest.java │ │ ├── ContractServiceTestConfig.java │ │ ├── DataSetup.java │ │ ├── DateUtilTest.java │ │ ├── GzipCompressUtilsTest.java │ │ ├── HealthCheckUtilTest.java │ │ └── LiquibaseTestConfig.java │ └── resources │ ├── application.common.properties │ ├── error.ndjson │ ├── logback.xml │ ├── test-data │ ├── EOB-500.ndjson │ ├── EOB-500.ndjson.gz │ ├── meta-unknown-status.xml │ ├── meta.xml │ └── patientbundle.xml │ └── test.ndjson ├── contracts ├── CODE_OF_CONDUCT.md ├── COMMUNITY.md ├── CONTRIBUTING.md ├── Dockerfile ├── GOVERNANCE.md ├── LICENSE ├── README.md ├── SECURITY.md ├── build.gradle ├── code.json ├── docker-compose.yml ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── scripts │ ├── build-docker-image.sh │ ├── fn_get_temporary_aws_credentials_via_aws_sts_assume_role.sh │ └── fn_get_temporary_aws_credentials_via_cloudtamer_api.sh ├── settings.gradle └── src │ ├── main │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── contracts │ │ │ ├── SpringBootApp.java │ │ │ ├── config │ │ │ ├── AttestationConfig.java │ │ │ ├── EnvironmentConfig.java │ │ │ ├── OpenAPIConfig.java │ │ │ ├── SwaggerConstants.java │ │ │ └── WebClientConfig.java │ │ │ ├── controller │ │ │ ├── ContractController.java │ │ │ ├── ErrorHandler.java │ │ │ ├── ErrorMessage.java │ │ │ ├── HealthCheckController.java │ │ │ ├── InvalidContractException.java │ │ │ ├── InvalidContractParamException.java │ │ │ └── RemoteTimeoutException.java │ │ │ ├── hmsapi │ │ │ ├── HPMSAttestation.java │ │ │ ├── HPMSAuthResponse.java │ │ │ ├── HPMSEnrollment.java │ │ │ └── HPMSOrganizationInfo.java │ │ │ ├── model │ │ │ └── Property.java │ │ │ ├── processing │ │ │ └── ReportProcessingException.java │ │ │ ├── quartz │ │ │ ├── HPMSIngestJob.java │ │ │ └── HPMSIngestQuartzSetup.java │ │ │ ├── repository │ │ │ ├── ContractRepository.java │ │ │ └── PropertiesRepository.java │ │ │ └── service │ │ │ ├── AbstractHPMSService.java │ │ │ ├── AttestationUpdaterService.java │ │ │ ├── AttestationUpdaterServiceImpl.java │ │ │ ├── ContractService.java │ │ │ ├── ContractServiceImpl.java │ │ │ ├── FeatureEngagement.java │ │ │ ├── HPMSAuthService.java │ │ │ ├── HPMSAuthServiceImpl.java │ │ │ ├── HPMSFetcher.java │ │ │ ├── HPMSFetcherImpl.java │ │ │ ├── HealthcheckService.java │ │ │ └── HealthcheckServiceImpl.java │ └── resources │ │ ├── application.properties │ │ ├── db │ │ └── changelog │ │ │ ├── db.changelog-master.yaml │ │ │ ├── v2023 │ │ │ ├── contract-service-coverage-info.sql │ │ │ └── create_contract.sql │ │ │ └── v2025 │ │ │ ├── add_contract_sequence.sql │ │ │ └── alter_contract_sequence.sql │ │ ├── logback-access.xml │ │ └── logback.xml │ └── test │ ├── java │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── contracts │ │ ├── controller │ │ ├── ContractControllerTest.java │ │ └── HealthcheckControllerTest.java │ │ ├── service │ │ ├── AttestationUpdaterServiceTest.java │ │ ├── ContractServiceTest.java │ │ ├── HPMSAuthServiceTest.java │ │ ├── HPMSFetcherExceptionTest.java │ │ ├── HPMSFetcherTest.java │ │ ├── HPMSManualModeTest.java │ │ ├── HPMSMockedAuthTest.java │ │ ├── MockHpmsFetcher.java │ │ ├── MockWebClient.java │ │ └── ReportProcessingTest.java │ │ └── util │ │ ├── AB2DLocalstackContainer.java │ │ ├── AB2DPostgresqlContainer.java │ │ ├── AB2DSQSMockConfig.java │ │ └── AttestationStatusTest.java │ └── resources │ ├── Attestation_Report_Sample.xlsx │ ├── application.properties │ ├── init.sql │ └── parent_org_and_legal_entity_20191031_111812.xls ├── coverage ├── pom.xml └── src │ ├── main │ └── java │ │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── coverage │ │ ├── dto │ │ └── ClearCoverageCacheRequest.java │ │ ├── model │ │ ├── ContractForCoverageDTO.java │ │ ├── CoverageCount.java │ │ ├── CoverageJobStatus.java │ │ ├── CoverageMapping.java │ │ ├── CoverageMembership.java │ │ ├── CoveragePagingRequest.java │ │ ├── CoveragePagingResult.java │ │ ├── CoveragePeriod.java │ │ ├── CoverageSearch.java │ │ ├── CoverageSearchDiff.java │ │ ├── CoverageSearchEvent.java │ │ ├── CoverageSummary.java │ │ └── Identifiers.java │ │ ├── repository │ │ ├── CoverageDeltaRepository.java │ │ ├── CoveragePeriodRepository.java │ │ ├── CoverageSearchEventRepository.java │ │ ├── CoverageSearchRepository.java │ │ └── CoverageServiceRepository.java │ │ └── service │ │ ├── CoveragePeriodNotFoundException.java │ │ ├── CoverageService.java │ │ ├── CoverageServiceImpl.java │ │ └── InvalidJobStateTransition.java │ └── test │ ├── java │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── coverage │ │ ├── SpringBootCoverageTestApp.java │ │ ├── model │ │ ├── CoverageCountTest.java │ │ ├── CoverageDelta.java │ │ ├── CoverageMappingTest.java │ │ └── CoverageSearchTest.java │ │ ├── repository │ │ ├── CoverageDeltaTestRepository.java │ │ └── CoverageServiceRepositoryTest.java │ │ ├── service │ │ ├── CoverageServiceExceptionTest.java │ │ ├── CoverageServiceImplTest.java │ │ └── InsertionJob.java │ │ └── util │ │ ├── AB2DCoverageLocalstackContainer.java │ │ ├── AB2DCoveragePostgressqlContainer.java │ │ ├── Coverage.java │ │ └── CoverageDataSetup.java │ └── resources │ ├── application.coverage.properties │ └── logback.xml ├── docker-compose.jenkins.yml ├── docker-compose.yml ├── e2e-bfd-test ├── pom.xml └── src │ └── test │ ├── java │ └── gov │ │ └── cms │ │ └── ab2d │ │ ├── AB2DLocalstackContainer.java │ │ ├── AB2DPostgresqlContainer.java │ │ ├── SpringBootApp.java │ │ └── testjobs │ │ ├── CapabilityTest.java │ │ └── EndToEndBfdTests.java │ └── resources │ └── application.properties ├── e2e-test ├── pom.xml └── src │ └── test │ ├── assembly │ └── src.xml │ ├── java │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── e2etest │ │ ├── APIClient.java │ │ ├── Environment.java │ │ ├── JobUtil.java │ │ ├── TestLauncher.java │ │ ├── TestRunner.java │ │ └── TestRunnerParameterResolver.java │ └── resources │ ├── Attestation_Report_Sample.xlsx │ ├── dev-config.yml │ ├── impl-config.yml │ ├── local-config.yml │ ├── logback.xml │ ├── parent_org_and_legal_entity_20191031_111812.xls │ ├── prod-config.yml │ └── sbx-config.yml ├── events ├── CODE_OF_CONDUCT.md ├── COMMUNITY.md ├── CONTRIBUTING.md ├── Dockerfile ├── GOVERNANCE.md ├── Jenkinsfile.deployment ├── Jenkinsfile.testing ├── LICENSE ├── README.md ├── SECURITY.md ├── build.gradle ├── code.json ├── config │ └── checkstyle │ │ └── checkstyle.xml ├── docker-compose.yml ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── scripts │ ├── build-docker-image.sh │ ├── fn_get_temporary_aws_credentials_via_aws_sts_assume_role.sh │ ├── fn_get_temporary_aws_credentials_via_cloudtamer_api.sh │ ├── github-actions-build-docker-image.sh │ └── github-actions-release.sh ├── settings.gradle └── src │ ├── main │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── eventlogger │ │ │ ├── EnvironmentConfig.java │ │ │ ├── EventLogger.java │ │ │ ├── EventLoggingException.java │ │ │ ├── LogManager.java │ │ │ ├── SpringBootApp.java │ │ │ ├── api │ │ │ └── EventsListener.java │ │ │ ├── eventloggers │ │ │ ├── kinesis │ │ │ │ ├── KinesisConfig.java │ │ │ │ ├── KinesisEventLogger.java │ │ │ │ ├── KinesisEventProcessor.java │ │ │ │ └── KinesisMode.java │ │ │ ├── slack │ │ │ │ ├── SlackConfig.java │ │ │ │ └── SlackLogger.java │ │ │ └── sql │ │ │ │ ├── ApiRequestEventMapper.java │ │ │ │ ├── ApiResponseEventMapper.java │ │ │ │ ├── ContractSearchEventMapper.java │ │ │ │ ├── ErrorEventMapper.java │ │ │ │ ├── FileEventMapper.java │ │ │ │ ├── JobStatusChangeEventMapper.java │ │ │ │ ├── MetricsEventMapper.java │ │ │ │ ├── ReloadEventMapper.java │ │ │ │ ├── SqlEventLogger.java │ │ │ │ ├── SqlEventMapper.java │ │ │ │ └── SqlMapperConfig.java │ │ │ ├── reports │ │ │ └── sql │ │ │ │ ├── LoggerEventRepository.java │ │ │ │ └── LoggerEventSummary.java │ │ │ └── utils │ │ │ └── UtilMethods.java │ └── resources │ │ ├── application.properties │ │ └── db │ │ └── changelog │ │ ├── db.changelog-master.yaml │ │ ├── v2023 │ │ ├── create_events.sql │ │ └── set_sequences_value.sql │ │ └── v2025 │ │ └── alter_sequences.sql │ └── test │ ├── java │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── eventlogger │ │ ├── LogManagerTest.java │ │ ├── eventloggers │ │ ├── kinesis │ │ │ ├── FauxKinesisFirehose.java │ │ │ └── KinesisEventLoggerTest.java │ │ ├── slack │ │ │ └── SlackLoggerTest.java │ │ └── sql │ │ │ └── AllMapperEventTest.java │ │ ├── reports │ │ └── sql │ │ │ └── LoggerEventSummaryTest.java │ │ └── utils │ │ ├── AB2DLocalstackContainer.java │ │ ├── AB2DPostgresqlContainer.java │ │ ├── SendAndReceiveSqsEventTest.java │ │ └── UtilMethodsTest.java │ └── resources │ ├── application.properties │ └── init.sql ├── fhir-test ├── Dockerfile.fhir-test ├── README.md ├── config.json ├── docker-compose.inferno-background.yml ├── docker-compose.inferno.yml ├── nginx │ ├── nginx.background.conf │ └── nginx.conf └── run-fhir-test.sh ├── job ├── pom.xml └── src │ ├── main │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── job │ │ │ ├── dto │ │ │ ├── JobPollResult.java │ │ │ ├── StaleJob.java │ │ │ └── StartJobDTO.java │ │ │ ├── model │ │ │ ├── Job.java │ │ │ ├── JobOutput.java │ │ │ ├── JobStartedBy.java │ │ │ └── JobStatus.java │ │ │ ├── repository │ │ │ ├── JobOutputRepository.java │ │ │ └── JobRepository.java │ │ │ ├── service │ │ │ ├── InvalidJobAccessException.java │ │ │ ├── InvalidJobStateTransition.java │ │ │ ├── JobOutputMissingException.java │ │ │ ├── JobOutputService.java │ │ │ ├── JobOutputServiceImpl.java │ │ │ ├── JobService.java │ │ │ └── JobServiceImpl.java │ │ │ └── util │ │ │ └── JobUtil.java │ └── resources │ │ └── application.properties │ └── test │ ├── java │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── job │ │ ├── JobTestSpringBootApp.java │ │ ├── model │ │ └── JobTest.java │ │ ├── service │ │ ├── JobCleanup.java │ │ ├── JobOutputServiceTest.java │ │ ├── JobServiceTest.java │ │ └── MaxJobsTest.java │ │ └── util │ │ └── JobUtilTest.java │ └── resources │ ├── application.properties │ └── job-test.properties ├── lambdas ├── attribution-data-file-share │ ├── build.gradle │ └── src │ │ ├── main │ │ └── java │ │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── attributiondatashare │ │ │ ├── AttributionDataShareConstants.java │ │ │ ├── AttributionDataShareException.java │ │ │ ├── AttributionDataShareHandler.java │ │ │ └── AttributionDataShareHelper.java │ │ └── test │ │ └── java │ │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── attributiondatashare │ │ ├── AttributionDataShareHandlerTest.java │ │ ├── AttributionDataShareTest.java │ │ └── S3MockAPIExtension.java ├── audit │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── gov │ │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── audit │ │ │ │ ├── AuditEventHandler.java │ │ │ │ ├── AuditException.java │ │ │ │ └── FileUtil.java │ │ └── resources │ │ │ ├── application.properties │ │ │ └── log4j2.xml │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── audit │ │ │ ├── AuditTest.java │ │ │ ├── ExceptionTest.java │ │ │ └── FileUtilTest.java │ │ └── resources │ │ └── application.properties ├── build.gradle ├── config │ └── checkstyle.xml ├── coverage-counts │ ├── README.md │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ └── src │ │ ├── main │ │ ├── java │ │ │ └── gov │ │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── coveragecounts │ │ │ │ ├── CoverageCountException.java │ │ │ │ └── CoverageCountsHandler.java │ │ └── resources │ │ │ ├── application.properties │ │ │ └── log4j2.xml │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── coveragecounts │ │ │ └── InvokeTest.java │ │ └── resources │ │ └── application.properties ├── database-management │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── gov │ │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── databasemanagement │ │ │ │ ├── DatabaseManagementException.java │ │ │ │ ├── DatabaseManagementHandler.java │ │ │ │ └── DatabaseUtil.java │ │ └── resources │ │ │ ├── db │ │ │ └── changelog │ │ │ │ ├── 2023 │ │ │ │ ├── coverage_counts.sql │ │ │ │ ├── create-ab2d-analyst.sql │ │ │ │ └── grant_quicksight_select_coverage_count.sql │ │ │ │ └── changelog.yaml │ │ │ └── log4j2.xml │ │ └── test │ │ └── java │ │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── databasemanagement │ │ └── InvokeTest.java ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── lambda-lib │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── gov │ │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── lambdalibs │ │ │ │ ├── exceptions │ │ │ │ └── PropertiesException.java │ │ │ │ └── lib │ │ │ │ ├── FileUtil.java │ │ │ │ ├── ParameterStoreUtil.java │ │ │ │ └── PropertiesUtil.java │ │ └── resources │ │ │ ├── application.properties │ │ │ └── log4j.properties │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── lambdalibs │ │ │ ├── FileUtilTest.java │ │ │ └── PropLoadTest.java │ │ └── resources │ │ └── application.properties ├── lambda-test-utils │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── gov │ │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── testutils │ │ │ │ ├── AB2DLocalstackContainer.java │ │ │ │ ├── AB2DPostgresqlContainer.java │ │ │ │ └── TestContext.java │ │ └── resources │ │ │ ├── application.properties │ │ │ └── log4j.properties │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── testutils │ │ │ └── ContextTest.java │ │ └── resources │ │ └── application.properties ├── logback.xml ├── metrics-lambda │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── gov │ │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── metrics │ │ │ │ ├── CloudwatchEventHandler.java │ │ │ │ ├── Dimensions.java │ │ │ │ ├── EventDataException.java │ │ │ │ ├── MetricAlarm.java │ │ │ │ ├── MetricsLambdaException.java │ │ │ │ └── Trigger.java │ │ └── resources │ │ │ └── log4j2.xml │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── metrics │ │ │ ├── CloudwatchEventHandlerTest.java │ │ │ ├── DtoTest.java │ │ │ └── InvokeTest.java │ │ └── resources │ │ └── example-event.json ├── optout │ ├── build.gradle │ └── src │ │ ├── main │ │ └── java │ │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── optout │ │ │ ├── OptOutConstants.java │ │ │ ├── OptOutException.java │ │ │ ├── OptOutHandler.java │ │ │ ├── OptOutInformation.java │ │ │ ├── OptOutProcessor.java │ │ │ ├── OptOutResults.java │ │ │ ├── OptOutS3.java │ │ │ └── RecordStatus.java │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── optout │ │ │ ├── OptOutConstantsTest.java │ │ │ ├── OptOutHandlerTest.java │ │ │ ├── OptOutProcessorTest.java │ │ │ ├── OptOutResultsTest.java │ │ │ ├── OptOutS3Test.java │ │ │ └── S3MockAPIExtension.java │ │ └── resources │ │ ├── check-conf-file.sh │ │ ├── check-latest-out.sh │ │ ├── emptyDummy.txt │ │ ├── multipleMBIsOptOutDummy.txt │ │ ├── optOutDummy.txt │ │ └── sqsEvent.json ├── retrieve-hpms-counts │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── gov │ │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── retrievehpmscounts │ │ │ │ ├── AB2DSNSClientOverrideException.java │ │ │ │ └── HPMSCountsHandler.java │ │ └── resources │ │ │ ├── application.properties │ │ │ └── log4j2.xml │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── retrievehpmscounts │ │ │ └── InvokeTest.java │ │ └── resources │ │ ├── application.properties │ │ └── example-event.json └── settings.gradle ├── libs ├── CODE_OF_CONDUCT.md ├── COMMUNITY.md ├── CONTRIBUTING.md ├── GOVERNANCE.md ├── LICENSE ├── README.md ├── SECURITY.md ├── ab2d-aggregator │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ └── java │ │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── aggregator │ │ │ ├── Aggregator.java │ │ │ ├── AggregatorCallable.java │ │ │ ├── ClaimsStream.java │ │ │ ├── FileOutputType.java │ │ │ ├── FileReferenceHolder.java │ │ │ ├── FileUtils.java │ │ │ └── JobHelper.java │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── aggregator │ │ │ ├── AggregatorCallableTest.java │ │ │ ├── AggregatorTest.java │ │ │ ├── ClaimsStreamTest.java │ │ │ ├── FileDescriptorTest.java │ │ │ ├── FileOutputTypeTest.java │ │ │ └── FileUtilsTest.java │ │ └── resources │ │ └── logback-test.xml ├── ab2d-bfd │ ├── README.md │ ├── build.gradle │ ├── out │ │ └── production │ │ │ └── resources │ │ │ └── application.bfd.properties │ └── src │ │ ├── main │ │ ├── java │ │ │ └── gov │ │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── bfd │ │ │ │ └── client │ │ │ │ ├── BFDClient.java │ │ │ │ ├── BFDClientConfiguration.java │ │ │ │ ├── BFDClientImpl.java │ │ │ │ ├── BFDSearch.java │ │ │ │ ├── BFDSearchImpl.java │ │ │ │ ├── BfdClientVersions.java │ │ │ │ └── FhirBfdServer.java │ │ └── resources │ │ │ └── application.bfd.properties │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── bfd │ │ │ └── client │ │ │ ├── BFDClientConfigurationTest.java │ │ │ ├── BFDSearchImplTest.java │ │ │ ├── BlueButtonClientR4Test.java │ │ │ ├── BlueButtonClientSTU3Test.java │ │ │ ├── ConvertXmlToJson.java │ │ │ ├── FhirBfdServerTest.java │ │ │ ├── MockUtils.java │ │ │ └── SpringBootApp.java │ │ └── resources │ │ ├── application.bfd.properties │ │ ├── bb-test-data │ │ ├── coverage │ │ │ ├── 20140000008325.json │ │ │ └── 20140000009893.json │ │ ├── eob │ │ │ ├── 20010000001115.json │ │ │ ├── 20010000001116.json │ │ │ ├── 20140000008325.json │ │ │ ├── 20140000008325_10.json │ │ │ ├── 20140000008325_20.json │ │ │ ├── 20140000008325_30.json │ │ │ └── 20140000009893.json │ │ ├── meta.json │ │ ├── patient │ │ │ ├── 20010000001115.json │ │ │ ├── 20010000001116.json │ │ │ ├── 20140000008325.json │ │ │ ├── 20140000009893.json │ │ │ └── bundle │ │ │ │ └── patientbundle.json │ │ └── r4 │ │ │ ├── eobbundle.json │ │ │ ├── meta.json │ │ │ ├── patient.json │ │ │ └── patientmbi.json │ │ ├── bb.keystore │ │ ├── logback-test.xml │ │ ├── mitm_bfd_cert.key │ │ └── mitm_bfd_cert.pem ├── ab2d-contracts-client │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ └── java │ │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── contracts │ │ │ ├── model │ │ │ ├── Contract.java │ │ │ ├── ContractAPI.java │ │ │ ├── ContractDTO.java │ │ │ └── TimestampBase.java │ │ │ └── utils │ │ │ └── DateUtil.java │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── contracts │ │ │ ├── model │ │ │ ├── ContractDTOTest.java │ │ │ └── ContractTest.java │ │ │ └── utils │ │ │ └── DateUtilTest.java │ │ └── resources │ │ └── logback-test.xml ├── ab2d-events-client │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ └── java │ │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── eventclient │ │ │ ├── EventClientException.java │ │ │ ├── clients │ │ │ ├── EventClient.java │ │ │ ├── SQSConfig.java │ │ │ └── SQSEventClient.java │ │ │ ├── config │ │ │ └── Ab2dEnvironment.java │ │ │ ├── events │ │ │ ├── ApiRequestEvent.java │ │ │ ├── ApiResponseEvent.java │ │ │ ├── BeneficiarySearchEvent.java │ │ │ ├── ContractSearchEvent.java │ │ │ ├── ErrorEvent.java │ │ │ ├── FileEvent.java │ │ │ ├── JobStatusChangeEvent.java │ │ │ ├── JobSummaryEvent.java │ │ │ ├── LoggableEvent.java │ │ │ ├── MetricsEvent.java │ │ │ ├── ReloadEvent.java │ │ │ └── SlackEvents.java │ │ │ └── messages │ │ │ ├── AlertSQSMessage.java │ │ │ ├── GeneralSQSMessage.java │ │ │ ├── KinesisSQSMessage.java │ │ │ ├── LogAndTraceSQSMessage.java │ │ │ ├── SQSMessages.java │ │ │ ├── SlackSQSMessage.java │ │ │ ├── TraceAndAlertSQSMessage.java │ │ │ └── TraceSQSMessage.java │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── eventclient │ │ │ ├── SpringBootApp.java │ │ │ ├── config │ │ │ ├── AB2DLocalstackContainer.java │ │ │ ├── Ab2dEnvironmentTest.java │ │ │ └── SendSqsEventTest.java │ │ │ └── events │ │ │ ├── ApiRequestEventTest.java │ │ │ ├── ApiResponseEventTest.java │ │ │ ├── BeneficiarySearchEventTest.java │ │ │ ├── ContractSearchEventTest.java │ │ │ ├── ErrorEventTest.java │ │ │ ├── FileEventTest.java │ │ │ ├── JobStatusChangeEventTest.java │ │ │ ├── JobSummaryEventTest.java │ │ │ ├── LoggableEventTest.java │ │ │ ├── MetricsEventTest.java │ │ │ ├── ReloadEventTest.java │ │ │ └── SlackEventsTest.java │ │ └── resources │ │ └── application.properties ├── ab2d-fhir │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ └── java │ │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── fhir │ │ │ ├── BundleUtils.java │ │ │ ├── EobUtils.java │ │ │ ├── ExtensionUtils.java │ │ │ ├── FhirVersion.java │ │ │ ├── IdentifierUtils.java │ │ │ ├── PatientIdentifier.java │ │ │ ├── VersionNotSupported.java │ │ │ └── Versions.java │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── fhir │ │ │ ├── BundleUtilsTest.java │ │ │ ├── EobUtilsTest.java │ │ │ ├── ExtensionUtilsTest.java │ │ │ ├── FhirVersionTest.java │ │ │ ├── PatientIdentifierUtilsTest.java │ │ │ ├── VersionNotSupportedTest.java │ │ │ └── VersionsTest.java │ │ └── resources │ │ ├── data │ │ ├── r4patients.json │ │ └── stu3patients.json │ │ └── logback-test.xml ├── ab2d-filters │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ └── java │ │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── filter │ │ │ ├── EOBLoadUtilities.java │ │ │ ├── EobUtils.java │ │ │ ├── ExplanationOfBenefitTrimmer.java │ │ │ ├── ExplanationOfBenefitTrimmerR4.java │ │ │ ├── ExplanationOfBenefitTrimmerSTU3.java │ │ │ ├── FilterEob.java │ │ │ └── FilterOutByDate.java │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── filter │ │ │ ├── EOBLoadUtilitiesTest.java │ │ │ ├── EobUtilsTest.java │ │ │ ├── ExplanationOfBenefitTrimmerR4Test.java │ │ │ ├── ExplanationOfBenefitTrimmerSTU3Test.java │ │ │ ├── FilterOutByDateTest.java │ │ │ └── FilterTest.java │ │ └── resources │ │ ├── eobdata │ │ ├── EOB-for-Carrier-Claims.json │ │ ├── EOB-for-Carrier-R4.json │ │ ├── EOB-for-DME-Claims.json │ │ ├── EOB-for-DME-R4.json │ │ ├── EOB-for-HHA-Claims.json │ │ ├── EOB-for-HHA-R4.json │ │ ├── EOB-for-Hospice-Claims.json │ │ ├── EOB-for-Hospice-R4.json │ │ ├── EOB-for-Inpatient-Claims.json │ │ ├── EOB-for-Inpatient-R4.json │ │ ├── EOB-for-Outpatient-Claims.json │ │ ├── EOB-for-Outpatient-R4.json │ │ ├── EOB-for-Part-D-Claims.json │ │ ├── EOB-for-SNF-Claims.json │ │ └── EOB-for-SNF-R4.json │ │ ├── logback-test.xml │ │ └── testResults │ │ ├── 1.json │ │ ├── DME-Claims.json │ │ ├── HHA-Claims.json │ │ ├── Hospice-Claims.json │ │ ├── Impatient-Claims.json │ │ ├── Outpatient-Claims.json │ │ ├── Part-D-Claims.json │ │ ├── SNF-Claims.json │ │ └── carrier-claims.json ├── ab2d-properties-client │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── out │ │ └── production │ │ │ └── resources │ │ │ └── application.properties │ └── src │ │ ├── main │ │ ├── java │ │ │ └── gov │ │ │ │ └── cms │ │ │ │ └── ab2d │ │ │ │ └── properties │ │ │ │ └── client │ │ │ │ ├── PropertiesClient.java │ │ │ │ ├── PropertiesClientImpl.java │ │ │ │ ├── Property.java │ │ │ │ └── PropertyNotFoundException.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── properties │ │ │ └── client │ │ │ ├── PropertiesClientTest.java │ │ │ └── ProperyServiceMockTest.java │ │ └── resources │ │ └── logback-test.xml ├── ab2d-sns-client │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ └── java │ │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── snsclient │ │ │ ├── clients │ │ │ ├── SNSClient.java │ │ │ ├── SNSClientImpl.java │ │ │ └── SNSConfig.java │ │ │ ├── exception │ │ │ └── SNSClientException.java │ │ │ └── messages │ │ │ ├── AB2DServices.java │ │ │ ├── CoverageCountDTO.java │ │ │ └── Topics.java │ │ └── test │ │ ├── java │ │ └── gov │ │ │ └── cms │ │ │ └── ab2d │ │ │ └── snsclient │ │ │ └── config │ │ │ ├── AB2DLocalstackContainer.java │ │ │ ├── MessageObjectsTest.java │ │ │ ├── SendSnsTest.java │ │ │ └── SpringBootApp.java │ │ └── resources │ │ ├── application.properties │ │ └── logback-test.xml ├── build.gradle ├── code.json ├── config │ └── checkstyle.xml ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── lombok.config └── settings.gradle ├── ops └── services │ ├── .opentofu-version │ ├── 00-bootstrap │ ├── README.md │ ├── main.tf │ ├── tfplan │ ├── tofu.tf │ └── values │ │ ├── prod.sopsw.yaml │ │ └── test.sopsw.yaml │ ├── 10-config │ ├── README.md │ ├── main.tf │ ├── tofu.tf │ └── values │ │ ├── dev.sopsw.yaml │ │ ├── ephemeral.yaml │ │ ├── prod.sopsw.yaml │ │ ├── sandbox.sopsw.yaml │ │ └── test.sopsw.yaml │ ├── 10-core │ ├── README.md │ ├── database.tf │ ├── iam.tf │ ├── main.tf │ ├── tofu.tf │ └── variables.tf │ ├── 15-web │ ├── README.md │ ├── bucket.tf │ ├── main.tf │ ├── output.tf │ ├── redirects-function.js │ └── tofu.tf │ ├── 20-microservices │ ├── README.md │ ├── contracts.tf │ ├── data.tf │ ├── events.tf │ ├── main.tf │ ├── properties.tf │ ├── templates │ │ └── config │ │ │ └── iam │ │ │ └── chatbot_policy.json │ ├── tofu.tf │ └── variables.tf │ ├── 30-api │ ├── README.md │ ├── cloudwatch.tf │ ├── data.tf │ ├── iam.tf │ ├── main.tf │ ├── templates │ │ └── userdata.tpl │ ├── tfplan │ ├── tofu.tf │ └── variables.tf │ ├── 30-lambda │ ├── README.md │ ├── code │ │ ├── monitoring_audit_svc.py │ │ └── slack_lambda.py │ ├── data.tf │ ├── iam.tf │ ├── main.tf │ ├── optout-export.tf │ ├── optout-import.tf │ ├── tofu.tf │ └── variables.tf │ ├── 30-worker │ ├── README.md │ ├── data.tf │ ├── iam.tf │ ├── main.tf │ ├── tofu.tf │ └── variables.tf │ ├── 40-insights │ ├── README.md │ ├── analysis.tf │ ├── datasources.tf │ ├── ds_ab2d_statistics.tf │ ├── ds_benes_searched.tf │ ├── ds_benes_weekly_2.tf │ ├── ds_contracts.tf │ ├── ds_contracts_one_job_minimum.tf │ ├── ds_coverage_counts.tf │ ├── ds_eob_search_summary.tf │ ├── ds_eob_search_summary_2.tf │ ├── ds_eob_search_summary_event.tf │ ├── ds_job_view.tf │ ├── ds_uptime.tf │ ├── iam.tf │ ├── main.tf │ ├── network.tf │ ├── non-test-contracts.yml │ └── tofu.tf │ └── root.tofu.tf ├── pom.xml ├── scripts ├── ecr_migrate_images.py ├── rename-secrets.py └── run-fhir-tests.sh ├── settings.xml ├── src └── main │ └── resources │ └── checkstyle.xml └── worker ├── Dockerfile ├── pom.xml └── src ├── main ├── java │ └── gov │ │ └── cms │ │ └── ab2d │ │ └── worker │ │ ├── HealthAPI.java │ │ ├── SpringBootApp.java │ │ ├── bfdhealthcheck │ │ ├── BFDHealthCheck.java │ │ ├── BFDHealthCheckJob.java │ │ ├── BFDHealthCheckQuartzSetup.java │ │ └── HealthCheckData.java │ │ ├── config │ │ ├── AggregatorQueueConfig.java │ │ ├── AutoScalingService.java │ │ ├── AutoScalingServiceImpl.java │ │ ├── ContractToContractCoverageMapping.java │ │ ├── CoverageQueueConfig.java │ │ ├── JobHandler.java │ │ ├── JobMessageSource.java │ │ ├── RoundRobinBlockingQueue.java │ │ ├── SearchConfig.java │ │ ├── WorkerConfig.java │ │ └── WorkerFlowConfig.java │ │ ├── processor │ │ ├── ContractData.java │ │ ├── ContractProcessingException.java │ │ ├── ContractProcessor.java │ │ ├── ContractProcessorImpl.java │ │ ├── EobSearchResult.java │ │ ├── JobCancelledException.java │ │ ├── JobMeasure.java │ │ ├── JobPreProcessor.java │ │ ├── JobPreProcessorImpl.java │ │ ├── JobProcessor.java │ │ ├── JobProcessorImpl.java │ │ ├── JobProgressService.java │ │ ├── JobProgressServiceImpl.java │ │ ├── JobProgressUpdateService.java │ │ ├── PatientClaimsCollector.java │ │ ├── PatientClaimsProcessor.java │ │ ├── PatientClaimsProcessorImpl.java │ │ ├── PatientClaimsRequest.java │ │ ├── ProgressTracker.java │ │ ├── ProgressTrackerUpdate.java │ │ ├── StreamOutput.java │ │ └── coverage │ │ │ ├── CoverageDriver.java │ │ │ ├── CoverageDriverException.java │ │ │ ├── CoverageDriverImpl.java │ │ │ ├── CoverageLockWrapper.java │ │ │ ├── CoverageMappingCallable.java │ │ │ ├── CoverageProcessor.java │ │ │ ├── CoverageProcessorImpl.java │ │ │ ├── CoverageUpdateConfig.java │ │ │ ├── CoverageUtils.java │ │ │ ├── CoverageVerificationException.java │ │ │ └── check │ │ │ ├── CoverageCheckPredicate.java │ │ │ ├── CoverageNoDuplicatesCheck.java │ │ │ ├── CoveragePeriodsPresentCheck.java │ │ │ ├── CoveragePresentCheck.java │ │ │ ├── CoverageStableCheck.java │ │ │ ├── CoverageStableCheckHelper.java │ │ │ └── CoverageUpToDateCheck.java │ │ ├── quartz │ │ ├── CoverageCheckQuartzConfig.java │ │ ├── CoverageCheckQuartzJob.java │ │ ├── CoveragePeriodQuartzConfig.java │ │ └── CoveragePeriodQuartzJob.java │ │ ├── service │ │ ├── ContractWorkerClient.java │ │ ├── FileService.java │ │ ├── FileServiceImpl.java │ │ ├── JobChannelService.java │ │ ├── JobChannelServiceImpl.java │ │ ├── ShutDownService.java │ │ ├── ShutDownServiceImpl.java │ │ ├── WorkerService.java │ │ ├── WorkerServiceImpl.java │ │ └── coveragesnapshot │ │ │ ├── CoverageSnapshotService.java │ │ │ └── CoverageSnapshotServiceImpl.java │ │ ├── stuckjob │ │ ├── CancelStuckJob.java │ │ ├── CancelStuckJobsProcessor.java │ │ ├── CancelStuckJobsProcessorImpl.java │ │ └── StuckJobQuartzSetup.java │ │ └── util │ │ ├── FhirUtils.java │ │ └── HealthCheck.java └── resources │ ├── application.properties │ └── logback.xml └── test ├── java └── gov │ └── cms │ └── ab2d │ └── worker │ ├── TestUtil.java │ ├── bfdhealthcheck │ ├── BFDHealthCheckJobTest.java │ ├── BFDHealthCheckQuartzSetupTest.java │ └── BFDHealthCheckTest.java │ ├── config │ ├── AutoScalingServiceTest.java │ ├── JobHandlerTest.java │ ├── RoundRobinBlockingQueueTest.java │ └── SearchConfigTest.java │ ├── processor │ ├── AggregatorJobTest.java │ ├── BundleUtils.java │ ├── ContractProcessorImplTest.java │ ├── ContractProcessorInvalidPatientTest.java │ ├── ContractProcessorUnitTest.java │ ├── EobTestDataUtil.java │ ├── JobPreProcessorIntegrationTest.java │ ├── JobPreProcessorUnitTest.java │ ├── JobProcessorIntegrationTest.java │ ├── JobProcessorUnitTest.java │ ├── NewFilterLogicTest.java │ ├── PatientClaimsCollectorTest.java │ ├── PatientClaimsProcessorUnitTest.java │ ├── ProgressTrackerTest.java │ ├── StreamOutputTest.java │ ├── coverage │ │ ├── CoverageCheckIntegrationTest.java │ │ ├── CoverageDriverStub.java │ │ ├── CoverageDriverTest.java │ │ ├── CoverageDriverUnitTest.java │ │ ├── CoverageLockWrapperTest.java │ │ ├── CoverageMappingCallableTest.java │ │ ├── CoverageProcessorImplTest.java │ │ ├── CoverageProcessorIntTest.java │ │ ├── CoverageUpdateAndProcessorTest.java │ │ ├── LockThread.java │ │ └── check │ │ │ ├── CoverageCheckPredicatesDisableAlertTest.java │ │ │ ├── CoverageCheckPredicatesIntegrationTest.java │ │ │ └── CoverageCheckPredicatesUnitTest.java │ └── stub │ │ └── PatientClaimsProcessorStub.java │ ├── quartz │ ├── CoverageCheckQuartzJobTest.java │ └── CoveragePeriodQuartzJobTest.java │ ├── repository │ └── StubJobRepository.java │ ├── service │ ├── ContractWorkerClientTest.java │ ├── FileServiceImplTest.java │ ├── FileServiceIntegrationTest.java │ ├── JobChannelServiceImplTest.java │ ├── JobChannelStubServiceImpl.java │ ├── PerformanceTestingCoverageOperations.java │ ├── ShutdownServiceTest.java │ ├── WorkerServiceDisengagementTest.java │ ├── WorkerServiceImplTest.java │ ├── WorkerServiceStub.java │ ├── WorkerServiceTest.java │ └── coveragesnapshot │ │ └── CoverageSnapshotTest.java │ ├── stuckjob │ ├── CancelStuckJobTest.java │ └── CancelStuckJobsProcessorTest.java │ └── util │ ├── ContractWorkerClientMock.java │ ├── FhirUtilsTest.java │ └── WorkerDataSetup.java └── resources ├── application.properties ├── bb.keystore ├── file.txt └── test-data ├── EOB-for-Carrier-Claims.json └── EOB-for-Carrier-v2.json /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | version: "2" 2 | checks: 3 | method-lines: 4 | config: 5 | threshold: 35 6 | method-complexity: 7 | config: 8 | threshold: 10 -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @CMSgov/ab2d-devs 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/add_team_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Add Team to Repository Request Ticket 3 | about: Ticket for requesting team to be added to repository 4 | title: "[REQUEST]: " 5 | labels: # TODO: Add labels for categorization of requests 6 | assignees: # TODO: Add organization owner or help desk team 7 | --- 8 | 9 | ## Request a New Team to be Added to a Repository 10 | 11 | Please fill out the form below to request a new team to be added to a repository. 12 | 13 | ### Information Required 14 | 15 | Team Name: 16 | Reason for Access: 17 | 18 | ### Additional Notes (Optional) 19 | 20 | 21 | -------------------------------------------------------------------------------- /.github/workflows/contracts-pull-request.yml: -------------------------------------------------------------------------------- 1 | name: Contracts pull request 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - 'contracts/**' 7 | types: [opened, reopened, synchronize, ready_for_review] 8 | branches: 9 | - main 10 | 11 | permissions: 12 | contents: read 13 | id-token: write 14 | defaults: 15 | run: 16 | working-directory: ./contracts 17 | 18 | jobs: 19 | build: 20 | if: github.event.pull_request.draft == false 21 | secrets: inherit 22 | uses: ./.github/workflows/contracts-build.yml 23 | with: 24 | run_tests: true 25 | push_image: false 26 | 27 | sonarqube: 28 | if: github.event.pull_request.draft == false 29 | uses: ./.github/workflows/contracts-sonarqube.yml 30 | secrets: inherit 31 | 32 | -------------------------------------------------------------------------------- /.github/workflows/events-pull-request.yml: -------------------------------------------------------------------------------- 1 | name: Events pull request 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - 'events/**' 7 | types: [opened, reopened, synchronize, ready_for_review] 8 | branches: 9 | - main 10 | 11 | permissions: 12 | contents: read 13 | id-token: write 14 | defaults: 15 | run: 16 | working-directory: ./events 17 | 18 | jobs: 19 | build: 20 | if: github.event.pull_request.draft == false 21 | secrets: inherit 22 | uses: ./.github/workflows/events-build.yml 23 | with: 24 | run_tests: false # TODO Tests are broken; to be fixed in AB2D-6879 25 | push_image: false 26 | 27 | sonarqube: 28 | if: github.event.pull_request.draft == false 29 | uses: ./.github/workflows/events-sonarqube.yml 30 | secrets: inherit 31 | 32 | -------------------------------------------------------------------------------- /.github/workflows/libs-pull-request.yml: -------------------------------------------------------------------------------- 1 | name: Libs pull request jobs 2 | run-name: Libs-pull-request 3 | 4 | on: 5 | pull_request: 6 | 7 | permissions: 8 | contents: read 9 | id-token: write 10 | defaults: 11 | run: 12 | working-directory: ./libs 13 | 14 | jobs: 15 | build: 16 | if: github.event.pull_request.draft == false 17 | uses: ./.github/workflows/libs-build.yml 18 | secrets: inherit 19 | 20 | sonarqube: 21 | if: github.event.pull_request.draft == false 22 | uses: ./.github/workflows/libs-sonarqube.yml 23 | secrets: inherit -------------------------------------------------------------------------------- /.github/workflows/libs-push-main.yml: -------------------------------------------------------------------------------- 1 | name: Libs push to main 2 | run-name: Libs-push-to-main 3 | 4 | on: 5 | push: 6 | branches: 7 | - main 8 | 9 | permissions: 10 | contents: read 11 | id-token: write 12 | defaults: 13 | run: 14 | working-directory: ./libs 15 | 16 | jobs: 17 | build: 18 | uses: ./.github/workflows/libs-publish.yml 19 | with: 20 | forcePublish: true 21 | secrets: inherit 22 | 23 | sonarqube: 24 | secrets: inherit 25 | uses: ./.github/workflows/libs-sonarqube.yml -------------------------------------------------------------------------------- /.github/workflows/pull-request.yml: -------------------------------------------------------------------------------- 1 | name: pull request jobs 2 | 3 | on: 4 | pull_request: 5 | paths-ignore: 6 | - libs/** 7 | - lambdas/** 8 | - contracts/** 9 | - events/** 10 | permissions: 11 | id-token: write 12 | contents: read 13 | jobs: 14 | unit-integration-test: 15 | uses: ./.github/workflows/unit-integration-test.yml 16 | secrets: inherit 17 | build-deploy-api: 18 | uses: ./.github/workflows/build-deploy.yml 19 | with: 20 | environment: test 21 | module: api 22 | secrets: inherit 23 | build-deploy-worker: 24 | uses: ./.github/workflows/build-deploy.yml 25 | with: 26 | environment: test 27 | module: worker 28 | secrets: inherit 29 | e2e-test: 30 | needs: [build-deploy-api, build-deploy-worker] 31 | uses: ./.github/workflows/e2e-test.yml 32 | with: 33 | environment: test 34 | secrets: inherit 35 | -------------------------------------------------------------------------------- /.github/workflows/resources/get-organization.sql: -------------------------------------------------------------------------------- 1 | SELECT d.contract_name FROM contract.contract d 2 | INNER JOIN ${DATABASE_SCHEMA_NAME}.user_account e ON d.id = e.contract_id 3 | WHERE d.contract_number = '${CONTRACT_NUMBER}'; -------------------------------------------------------------------------------- /.github/workflows/resources/insert-record.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO ${DATABASE_SCHEMA_NAME}.job ( 2 | job_uuid, 3 | organization, 4 | created_at, 5 | expires_at, 6 | resource_types, 7 | status, 8 | status_message, 9 | request_url, 10 | progress, 11 | contract_number, 12 | since, 13 | until, 14 | fhir_version, 15 | started_by 16 | ) 17 | VALUES ( 18 | '${JOB_ID}', 19 | '${ORGANIZATION}', 20 | (select now()), 21 | (select now() + INTERVAL '1 day'), 22 | 'ExplanationOfBenefit', 23 | 'SUBMITTED', 24 | '0%', 25 | '${API_URL_PREFIX}/api/v1/fhir/Patient/$export?_outputFormat=application%252Ffhir%252Bndjson&_type=ExplanationOfBenefit', 26 | 0, 27 | '${CONTRACT_NUMBER}', 28 | '${SINCE}', 29 | ${UNTIL}, 30 | '${FHIR_VERSION}', 31 | 'JENKINS' 32 | ); 33 | -------------------------------------------------------------------------------- /.github/workflows/resources/total-benes-served.sql: -------------------------------------------------------------------------------- 1 | SET statement_timeout='30min'; CALL find_benes_served(); -------------------------------------------------------------------------------- /.gitleaks.toml: -------------------------------------------------------------------------------- 1 | title = "DASG Standard" 2 | 3 | [extend] 4 | useDefault = true 5 | 6 | [[rules]] 7 | id = "mbi-detection" 8 | description = "Detects a potential MBI pattern based on https://www.cms.gov/medicare/new-medicare-card/understanding-the-mbi.pdf" 9 | regex = '''\b((?i)[1-9][ACDEFGHJKMNPQRTUVWXY][ACDEFGHJKMNPQRTUVWXY\d]-?\d[ACDEFGHJKMNPQRTUVWXY][ACDEFGHJKMNPQRTUVWXY\d]\d-?[ACDEFGHJKMNPQRTUVWXY]{2}\d{2})\b''' 10 | 11 | 12 | [allowlist] 13 | escription = "Ignore test certificate file" 14 | paths = [ 15 | "libs/ab2d-bfd/src/test/resources/mitm_bfd_cert.key" 16 | ] -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/gitleaks/gitleaks 3 | rev: v8.19.2 4 | hooks: 5 | - id: gitleaks 6 | -------------------------------------------------------------------------------- /GOVERNANCE.md: -------------------------------------------------------------------------------- 1 | # Governance 2 | 3 | 5 | 6 | This project is governed by our [Community Guidelines](COMMUNITY.md) and [Code of Conduct](CODE_OF_CONDUCT.md). 7 | -------------------------------------------------------------------------------- /ab2d_dev_keystore.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/ab2d_dev_keystore.enc -------------------------------------------------------------------------------- /api/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM amazoncorretto:21-al2023-jdk 2 | WORKDIR /usr/src/ab2d-api 3 | ADD target/api-*-SNAPSHOT.jar /usr/src/ab2d-api/api.jar 4 | ADD target/newrelic/newrelic.jar /usr/src/ab2d-api/newrelic/newrelic.jar 5 | 6 | # When running in production with one container per EC2 instance these values are acceptable 7 | ENV JVM_INITIAL_RAM=40.0 8 | ENV JVM_MIN_RAM=20.0 9 | ENV JVM_MAX_RAM=80.0 10 | 11 | #Update Packages 12 | RUN yum update -y --security 13 | 14 | #JAVA Commands 15 | CMD java \ 16 | -XX:+UseContainerSupport \ 17 | -XX:InitialRAMPercentage=${JVM_INITIAL_RAM} \ 18 | -XX:MinRAMPercentage=${JVM_MIN_RAM} \ 19 | -XX:MaxRAMPercentage=${JVM_MAX_RAM} \ 20 | -javaagent:/usr/src/ab2d-api/newrelic/newrelic.jar \ 21 | -jar api.jar 22 | EXPOSE 8443 23 | -------------------------------------------------------------------------------- /api/src/main/java/gov/cms/ab2d/api/config/MDCFilter.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.api.config; 2 | 3 | import org.slf4j.MDC; 4 | import org.springframework.stereotype.Component; 5 | import org.springframework.web.filter.OncePerRequestFilter; 6 | 7 | import jakarta.servlet.FilterChain; 8 | import jakarta.servlet.ServletException; 9 | import jakarta.servlet.http.HttpServletRequest; 10 | import jakarta.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | 13 | @Component 14 | public class MDCFilter extends OncePerRequestFilter { 15 | 16 | @Override 17 | protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { 18 | MDC.clear(); 19 | 20 | filterChain.doFilter(httpServletRequest, httpServletResponse); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /api/src/main/java/gov/cms/ab2d/api/controller/InMaintenanceModeException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.api.controller; 2 | 3 | public class InMaintenanceModeException extends RuntimeException { 4 | 5 | public InMaintenanceModeException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /api/src/main/java/gov/cms/ab2d/api/controller/JobProcessingException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.api.controller; 2 | 3 | public class JobProcessingException extends RuntimeException { 4 | 5 | public JobProcessingException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /api/src/main/java/gov/cms/ab2d/api/controller/MaintenanceModeResponse.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.api.controller; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public class MaintenanceModeResponse { 9 | 10 | private final String maintenanceMode; 11 | } 12 | -------------------------------------------------------------------------------- /api/src/main/java/gov/cms/ab2d/api/controller/TooManyRequestsException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.api.controller; 2 | import lombok.Getter; 3 | import java.util.List; 4 | 5 | @Getter 6 | public class TooManyRequestsException extends RuntimeException { 7 | private List jobIds; 8 | 9 | public TooManyRequestsException(String msg) { 10 | super(msg); 11 | } 12 | 13 | public TooManyRequestsException(String msg, List jobIds) { 14 | super(msg); 15 | this.jobIds = jobIds; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /api/src/main/java/gov/cms/ab2d/api/security/BadJWTTokenException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.api.security; 2 | 3 | public class BadJWTTokenException extends RuntimeException { 4 | 5 | public BadJWTTokenException(String msg) { 6 | super(msg); 7 | } 8 | 9 | public BadJWTTokenException(String msg, Throwable cause) { 10 | super(msg, cause); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /api/src/main/java/gov/cms/ab2d/api/security/ClientNotEnabledException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.api.security; 2 | 3 | public class ClientNotEnabledException extends RuntimeException { 4 | 5 | public ClientNotEnabledException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /api/src/main/java/gov/cms/ab2d/api/security/InvalidAuthHeaderException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.api.security; 2 | 3 | public class InvalidAuthHeaderException extends RuntimeException { 4 | 5 | public InvalidAuthHeaderException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /api/src/main/java/gov/cms/ab2d/api/security/MissingTokenException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.api.security; 2 | 3 | public class MissingTokenException extends RuntimeException { 4 | 5 | public MissingTokenException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /api/src/main/java/gov/cms/ab2d/api/util/Constants.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.api.util; 2 | 3 | public final class Constants { 4 | 5 | public static final String GENERIC_FHIR_ERR_MSG = "The body will contain a FHIR " + 6 | "OperationOutcome resource in JSON format. " + 7 | "https://www.hl7.org/fhir/operationoutcome.html " + 8 | "Please refer to the body of the response for " + 9 | "details."; 10 | 11 | private Constants() { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /api/src/main/java/lombok.config: -------------------------------------------------------------------------------- 1 | config.stopBubbling = true 2 | lombok.addLombokGeneratedAnnotation = true -------------------------------------------------------------------------------- /api/src/main/resources/ab2d.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/api/src/main/resources/ab2d.p12 -------------------------------------------------------------------------------- /api/src/main/resources/logback-access.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | request_headers 8 | response_headers 9 | requested_url 10 | status_code 11 | 12 | 13 | Authorization 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /api/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /api/src/test/resources/ab2d.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/api/src/test/resources/ab2d.p12 -------------------------------------------------------------------------------- /api/src/test/resources/efsTestDir/clientA/EOB-500.ndjson.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/api/src/test/resources/efsTestDir/clientA/EOB-500.ndjson.gz -------------------------------------------------------------------------------- /api/src/test/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /api/src/test/resources/parent_org_and_legal_entity_20191031_111812.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/api/src/test/resources/parent_org_and_legal_entity_20191031_111812.xls -------------------------------------------------------------------------------- /api/src/test/resources/test.ndjson: -------------------------------------------------------------------------------- 1 | { 2 | "test": "value", 3 | "array": [ 4 | "val1", 5 | "val2" 6 | ] 7 | } -------------------------------------------------------------------------------- /api/src/test/resources/~$Attestation_Report_Sample.xlsx: -------------------------------------------------------------------------------- 1 | Dugan Kniesteadt Dugan Kniesteadt -------------------------------------------------------------------------------- /bfd_sbx_hash_pepper.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/bfd_sbx_hash_pepper.enc -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/config/EnvironmentConfig.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.config; 2 | 3 | import gov.cms.ab2d.eventclient.config.Ab2dEnvironment; 4 | import org.springframework.beans.factory.annotation.Value; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class EnvironmentConfig { 10 | 11 | /** 12 | * Parse execution environment passed in during 13 | * @param executionEnv string value of execution environment that must match the name of one {@link Ab2dEnvironment} 14 | * @return current ab2d environment 15 | */ 16 | @Bean 17 | public Ab2dEnvironment getEnvironment(@Value("${execution.env}") String executionEnv) { 18 | return Ab2dEnvironment.fromName(executionEnv); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/dto/PdpClientDTO.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.dto; 2 | 3 | import gov.cms.ab2d.contracts.model.ContractDTO; 4 | import jakarta.validation.constraints.NotNull; 5 | import lombok.Data; 6 | 7 | @Data 8 | public class PdpClientDTO { 9 | 10 | private Long id; 11 | 12 | @NotNull 13 | private String clientId; 14 | 15 | @NotNull 16 | private String organization; 17 | 18 | @NotNull 19 | private Boolean enabled; 20 | 21 | private String role; 22 | 23 | private ContractDTO contract; 24 | } 25 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/feign/ContractFeignClient.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.feign; 2 | 3 | import gov.cms.ab2d.contracts.model.ContractAPI; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | import org.springframework.context.annotation.Profile; 6 | 7 | @FeignClient(name = "contract", url = "${contract.base.url}") 8 | @Profile("prod") 9 | public interface ContractFeignClient extends ContractAPI { 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/health/LoggingAvailable.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.health; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | @Slf4j 6 | public final class LoggingAvailable { 7 | 8 | private LoggingAvailable() { } 9 | 10 | public static boolean canLog(org.slf4j.Logger logger) { 11 | try { 12 | if (!logger.isErrorEnabled()) { 13 | return false; 14 | } 15 | logger.info("Logging Health Check"); 16 | return true; 17 | } catch (Exception ex) { 18 | System.out.println("Logging failed health check"); 19 | return false; 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/model/TimestampBase.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.model; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import org.hibernate.annotations.CreationTimestamp; 6 | import org.hibernate.annotations.UpdateTimestamp; 7 | 8 | import jakarta.persistence.MappedSuperclass; 9 | import java.time.OffsetDateTime; 10 | 11 | @Getter 12 | @Setter 13 | @MappedSuperclass 14 | public abstract class TimestampBase { 15 | 16 | @CreationTimestamp 17 | private OffsetDateTime created; 18 | 19 | @UpdateTimestamp 20 | private OffsetDateTime modified; 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/model/TooFrequentInvocations.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.model; 2 | 3 | public class TooFrequentInvocations extends RuntimeException { 4 | 5 | public TooFrequentInvocations(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/properties/PropertiesDTO.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.properties; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import jakarta.validation.constraints.NotNull; 8 | 9 | @Data 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class PropertiesDTO { 13 | 14 | @NotNull 15 | private String key; 16 | 17 | @NotNull 18 | private String value; 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/repository/PdpClientRepository.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.repository; 2 | 3 | import gov.cms.ab2d.common.model.PdpClient; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.jpa.repository.Query; 6 | import org.springframework.lang.NonNull; 7 | import org.springframework.lang.Nullable; 8 | import org.springframework.stereotype.Repository; 9 | 10 | import java.util.List; 11 | 12 | @Repository 13 | public interface PdpClientRepository extends JpaRepository { 14 | 15 | @Nullable 16 | PdpClient findByClientId(@Nullable String clientId); 17 | 18 | @Query("SELECT u FROM PdpClient u WHERE u.contractId = :contractId") 19 | List findByContract(@NonNull Long contractId); 20 | 21 | List findAllByEnabledTrue(); 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/repository/PropertiesRepository.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.repository; 2 | 3 | import gov.cms.ab2d.common.model.Property; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.Optional; 7 | 8 | public interface PropertiesRepository extends JpaRepository { 9 | Optional findByKey(String key); 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/repository/RoleRepository.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.repository; 2 | 3 | import gov.cms.ab2d.common.model.Role; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.Optional; 7 | 8 | public interface RoleRepository extends JpaRepository { 9 | 10 | Optional findRoleByName(String name); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/service/ContractService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | 4 | import gov.cms.ab2d.contracts.model.Contract; 5 | import java.util.List; 6 | import java.util.Optional; 7 | 8 | public interface ContractService { 9 | 10 | List getAllAttestedContracts(); 11 | 12 | Optional getContractByContractNumber(String contractNumber); 13 | 14 | void updateContract(Contract contract); 15 | 16 | Contract getContractByContractId(Long contractId); 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/service/FeatureEngagement.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | public enum FeatureEngagement { 4 | IN_GEAR("engaged"), // default - feature is fully contributing 5 | NEUTRAL("idle"); // out of gear - feature is not in play 6 | 7 | private String serialValue; 8 | 9 | FeatureEngagement(String propValue) { 10 | serialValue = propValue; 11 | } 12 | 13 | public String getSerialValue() { 14 | return serialValue; 15 | } 16 | 17 | // Defaults to being IN_GEAR. 18 | public static FeatureEngagement fromString(String rawValue) { 19 | return "idle".equals(rawValue) ? NEUTRAL : IN_GEAR; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/service/InvalidClientInputException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | public class InvalidClientInputException extends RuntimeException { 4 | 5 | public InvalidClientInputException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/service/InvalidContractException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | public class InvalidContractException extends RuntimeException { 4 | 5 | public InvalidContractException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/service/InvalidPropertiesException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | public class InvalidPropertiesException extends RuntimeException { 4 | 5 | public InvalidPropertiesException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/service/ResourceNotFoundException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | public class ResourceNotFoundException extends RuntimeException { 4 | 5 | public ResourceNotFoundException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/service/RoleService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | import gov.cms.ab2d.common.model.Role; 4 | 5 | public interface RoleService { 6 | 7 | Role findRoleByName(String name); 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/service/RoleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | import gov.cms.ab2d.common.model.Role; 4 | import gov.cms.ab2d.common.repository.RoleRepository; 5 | import lombok.AllArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Service; 8 | 9 | @AllArgsConstructor 10 | @Service 11 | @Slf4j 12 | public class RoleServiceImpl implements RoleService { 13 | 14 | private final RoleRepository roleRepository; 15 | 16 | public Role findRoleByName(String name) { 17 | return roleRepository.findRoleByName(name).orElseThrow(() -> { 18 | log.error("Unable to find role with name {}", name); 19 | return new ResourceNotFoundException("Unable to find role with name: " + name); 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/gov/cms/ab2d/common/util/AttestationStatus.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.util; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public enum AttestationStatus { 7 | 8 | WITHOUT_ATTESTATION("Without Attestation"), 9 | ATTESTED("Attested"); 10 | 11 | private String value; 12 | 13 | AttestationStatus(String value) { 14 | this.value = value; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/lombok.config: -------------------------------------------------------------------------------- 1 | config.stopBubbling = true 2 | lombok.addLombokGeneratedAnnotation = true -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/test_only/create-ab2d-analyst.sql: -------------------------------------------------------------------------------- 1 | ------------------------------ 2 | -- Create ab2d_analyst user 3 | ------------------------------ 4 | DO 5 | $$ 6 | begin 7 | if not exists(SELECT * FROM pg_user WHERE usename = 'ab2d_analyst') THEN 8 | Create Role ab2d_analyst noinherit login password 'ab2d'; 9 | end if; 10 | end 11 | $$ -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/test_only/truncate-fake-data.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset earl_nolan:AB2D-2921 failOnError:true context:test 5 | truncate user_role; 6 | truncate user_account cascade; 7 | truncate contract cascade; 8 | 9 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/ab2d-1144-add-since-val.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset lsharshar:ab2d-1144-add-since-val failOnError:true 5 | -- ------------------------------------------------------------------------------------------------------------------- 6 | 7 | alter table job add column since TIMESTAMP WITH TIME ZONE; 8 | 9 | --rollback ALTER TABLE job DROP COLUMN IF EXISTS since; 10 | -- ------------------------------------------------------------------------------------------------------------------- 11 | 12 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/ab2d-2701-add-created-and-modified-values-to-test-user.sql: -------------------------------------------------------------------------------- 1 | -- Add created and modified values to test user 2 | 3 | UPDATE public.user_account 4 | SET 5 | created = CURRENT_TIMESTAMP(6)::TIMESTAMP WITHOUT TIME ZONE, 6 | modified = CURRENT_TIMESTAMP(6)::TIMESTAMP WITHOUT TIME ZONE 7 | WHERE username = 'EileenCFrierson@example.com'; 8 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/ab2d-599-rename-consent.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | 5 | --changeset spathiyil:ab2d-599-rename-consent-table-to-opt_out failOnError:true 6 | ALTER TABLE consent RENAME TO opt_out; 7 | ALTER TABLE opt_out RENAME CONSTRAINT "pk_consent" TO "pk_opt_out"; 8 | ALTER INDEX "ix_consent_hicn" RENAME TO "ix_opt_out_hicn"; 9 | 10 | --rollback ALTER TABLE opt_out RENAME TO consent; 11 | --rollback ALTER TABLE consent RENAME CONSTRAINT "pk_opt_out" TO "pk_consent"; 12 | --rollback ALTER INDEX "ix_opt_out_hicn" RENAME TO "ix_consent_hicn"; 13 | -- ------------------------------------------------------------------------------------------------------------------- 14 | 15 | 16 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/ab2d-777-resolve_diff_ids.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset lsharshar:ab2d-777-opt-out-resolve-ben-id-mbi failOnError:true 5 | ALTER TABLE opt_out ADD COLUMN mbi VARCHAR(255); 6 | ALTER TABLE opt_out ADD COLUMN ccw_id VARCHAR(255); 7 | 8 | --rollback ALTER TABLE opt_out DROP COLUMN IF EXISTS mbi; 9 | --rollback ALTER TABLE opt_out DROP COLUMN IF EXISTS ccw_id; 10 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/ab2d-828-increase-username-column-length.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | 5 | --changeset spathiyil:ab2d-828-increase-username-column-length failOnError:true 6 | ALTER TABLE user_account ALTER COLUMN username TYPE VARCHAR(255) 7 | 8 | --rollback ALTER TABLE user_account ALTER COLUMN username TYPE VARCHAR(64) 9 | -- ------------------------------------------------------------------------------------------------------------------- 10 | 11 | 12 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/ab2d-934-allow-for-zip-downloads.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset lsharshar:ab2d-934-allow-for-zip-downloads failOnError:true 5 | ALTER TABLE job ADD COLUMN output_format VARCHAR(255); 6 | 7 | --rollback ALTER TABLE job DROP COLUMN IF EXISTS output_format; 8 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/ab2d_1167_add_column_to_opt_out_table.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | 5 | --changeset spathiyil:ab2d_1167_add_column_to_opt_out_table failOnError:true 6 | ALTER TABLE opt_out 7 | ADD COLUMN filename VARCHAR(255) NOT NULL; 8 | 9 | --rollback ALTER TABLE opt_out DROP COLUMN filename; 10 | 11 | 12 | --changeset spathiyil:ab2d_1167_add_indexes_on_opt_out_table failOnError:true 13 | CREATE INDEX "ix_opt_out_ccw_id" ON opt_out (ccw_id); 14 | CREATE INDEX "ix_opt_out_ccw_id_hicn" ON opt_out (ccw_id, hicn); 15 | 16 | --rollback DROP INDEX "ix_opt_out_ccw_id"; 17 | --rollback DROP INDEX "ix_opt_out_ccw_id_hicn"; 18 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_attestor_role.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset adaykin:add_attestor_role failOnError:true 5 | INSERT INTO role (id, name) VALUES ((select nextval('hibernate_sequence')), 'ATTESTOR'); -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_checksum_length_job_output.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset adaykin:add_checksum_length_job_output failOnError:true 5 | ALTER TABLE job_output ADD COLUMN checksum VARCHAR(64) NOT NULL; 6 | ALTER TABLE job_output ADD COLUMN file_length BIGINT NOT NULL; 7 | 8 | --rollback ALTER TABLE job_output DROP COLUMN IF EXISTS checksum; ALTER TABLE job_output DROP COLUMN IF EXISTS file_length; 9 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_concurrent_job_column.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset adaykin:add_concurrent_job_column failOnError:true 5 | ALTER TABLE user_account ADD COLUMN max_parallel_jobs INT DEFAULT 1 NOT NULL; 6 | 7 | UPDATE user_account SET max_parallel_jobs = 3; 8 | 9 | UPDATE user_account SET max_parallel_jobs = 30 WHERE username = '0oa2t7wfhvB2qSqPg297'; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_contract2beneCache_toggle_property.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | 5 | --changeset spathiyil:add_contract2benecache_toggle_in_property_table failOnError:true 6 | INSERT INTO properties (id, key, value) VALUES((select nextval('hibernate_sequence')), 'ContractToBeneCachingOn', 'false'); 7 | 8 | 9 | --rollback DELETE FROM properties WHERE key = 'ContractToBeneCachingOn'; 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_contract_number_to_job.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE job ADD COLUMN contract_id BIGINT DEFAULT NULL; 2 | ALTER TABLE job ADD CONSTRAINT "fk_job_to_contract" FOREIGN KEY (contract_id) REFERENCES contract (id); -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_coverage_search.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset lsharshar:add_coverage_search_table failOnError:true 5 | CREATE TABLE coverage_search ( 6 | id BIGINT NOT NULL, 7 | bene_coverage_period_id INTEGER NOT NULL, 8 | attempts INTEGER NOT NULL DEFAULT 0, 9 | created timestamp 10 | ); 11 | 12 | ALTER TABLE coverage_search ADD CONSTRAINT "pk_coverage_search" PRIMARY KEY (id); 13 | ALTER TABLE coverage_search ADD CONSTRAINT "fk_coverage_search_bene_coverage_period" 14 | FOREIGN KEY (bene_coverage_period_id) REFERENCES bene_coverage_period(id); 15 | 16 | --rollback DROP TABLE coverage_search; 17 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_downloaded_to_job_output.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset adaykin:add_downloaded_to_job_output failOnError:true 5 | 6 | ALTER TABLE job_output ADD COLUMN downloaded boolean NOT NULL DEFAULT false; 7 | 8 | ALTER TABLE job_output ADD CONSTRAINT "uc_job_id_file_path" UNIQUE (job_id, file_path); -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_hpms_info_to_contract.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE contract 2 | ADD COLUMN hpms_parent_org_id BIGINT, 3 | ADD COLUMN hpms_parent_org_name VARCHAR(255), 4 | ADD COLUMN hpms_org_marketing_name VARCHAR(255); 5 | 6 | INSERT INTO properties (id, key, value) VALUES((select nextval('hibernate_sequence')), 'hpms.ingest.engaged', 'engaged'); -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_ip_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE sponsor_ip ( 2 | sponsor_id BIGINT NOT NULL, 3 | ip_address INET, 4 | PRIMARY KEY (sponsor_id, ip_address) 5 | ); 6 | 7 | ALTER TABLE sponsor_ip ADD CONSTRAINT "fk_sponsor_ip_to_sponsor" FOREIGN KEY (sponsor_id) REFERENCES sponsor (id); 8 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_last_success_to_coverage_period.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:add_last_success_to_coverage_period failOnError:true 5 | 6 | ALTER TABLE bene_coverage_period ADD COLUMN last_successful_job TIMESTAMP WITH TIME ZONE DEFAULT NULL; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_maintenance_mode_property.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO properties (id, key, value) VALUES((select nextval('hibernate_sequence')), 'maintenance.mode', 'false'); -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_properties_data_01.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset lhanekam:add_properties_data_01 failOnError:true 5 | 6 | INSERT INTO properties (id, key, value) VALUES((select nextval('hibernate_sequence')), 'worker.engaged', 'engaged'); 7 | 8 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_property_coverage_search.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:add_property_coverage_search failOnError:true 5 | 6 | INSERT INTO properties (id, key, value) VALUES((select nextval('hibernate_sequence')), 'coverage.update.discovery', 'idle'); 7 | INSERT INTO properties (id, key, value) VALUES((select nextval('hibernate_sequence')), 'coverage.update.queueing', 'idle'); -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_update_mode_to_contract.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE contract ADD COLUMN "update_mode" VARCHAR(32) NOT NULL DEFAULT('AUTOMATIC'); -- Is there a standard size for an enum? 32 is arbitrary 2 | 3 | -- Fix the test contracts 4 | update contract 5 | set update_mode = 'TEST' 6 | where contract_name like 'Z%'; 7 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/add_zip_support_toggle_property.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | 5 | --changeset spathiyil:ab2d_1110_add_zip_support_toggle_in_property_table failOnError:true 6 | INSERT INTO properties (id, key, value) VALUES((select nextval('hibernate_sequence')), 'ZipSupportOn', 'false'); 7 | 8 | --rollback DELETE FROM properties WHERE key = 'ZipSupportOn'; 9 | 10 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/create_opt_out_file_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE opt_out_file ( 2 | id BIGINT NOT NULL, 3 | filename VARCHAR(256) NOT NULL 4 | ); 5 | 6 | ALTER TABLE opt_out_file ADD CONSTRAINT "pk_opt_out_file" PRIMARY KEY (id); 7 | ALTER TABLE opt_out_file ADD CONSTRAINT "uc_opt_out_file_filename" UNIQUE (filename); 8 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/drop-sponsor-ref-not-null.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE contract ALTER COLUMN sponsor_id DROP NOT NULL; 2 | ALTER TABLE user_account ALTER COLUMN sponsor_id DROP NOT NULL; 3 | ALTER TABLE user_account ALTER COLUMN contract_id DROP NOT NULL; 4 | 5 | 6 | ALTER TABLE user_account ADD CONSTRAINT "fk_user_to_contract" FOREIGN KEY (contract_id) REFERENCES contract (id); 7 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/modify_hicn.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE opt_out ALTER COLUMN hicn DROP NOT NULL; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/modify_hpms_ids.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset adaykin:modify_hpms_ids failOnError:true 5 | 6 | UPDATE sponsor SET hpms_id = hpms_id * 10000; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/remove_not_null_job_output.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE job_output ALTER COLUMN fhir_resource_type DROP NOT NULL; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/remove_opt_out.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset lsharshar:remove_opt_out failOnError:true 5 | 6 | drop table opt_out_file; 7 | drop table opt_out; 8 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v001/update_attestation_date.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset lsharshar:AB2D-747-filter-out-claims-on-dates 5 | UPDATE contract SET attested_on='2000-01-01'; 6 | 7 | --rollback UPDATE contract SET attested_on='2019-11-01'; 8 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/add_coverage_delta.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset enolan:add_coverage_delta_table failOnError:true 5 | CREATE TABLE coverage_delta ( 6 | id BIGSERIAL NOT NULL, 7 | bene_coverage_period_id INTEGER NOT NULL, 8 | beneficiary_id VARCHAR(255) NOT NULL, 9 | type VARCHAR(32) NOT NULL, -- ADDED/REMOVED 10 | created timestamp 11 | ); 12 | 13 | ALTER TABLE coverage_delta ADD CONSTRAINT "pk_coverage_delta" PRIMARY KEY (id); 14 | ALTER TABLE coverage_delta ADD CONSTRAINT "fk_coverage_delta_bene_coverage_period" 15 | FOREIGN KEY (bene_coverage_period_id) REFERENCES bene_coverage_period(id); 16 | 17 | --rollback DROP TABLE coverage_delta; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/add_coverage_search_override.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:add_coverage_search_override failOnError:true 5 | 6 | INSERT INTO properties(id, key, value, created, modified) 7 | VALUES (nextval('hibernate_sequence'), 'coverage.update.override', 'false', current_timestamp, current_timestamp); -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/add_coverage_search_props.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:add_coverage_search_props failOnError:true 5 | 6 | INSERT INTO properties(id, key, value, created, modified) 7 | VALUES (nextval('hibernate_sequence'), 'coverage.update.months.past', '1', current_timestamp, current_timestamp), 8 | (nextval('hibernate_sequence'), 'coverage.update.stale.days', '7', current_timestamp, current_timestamp), 9 | (nextval('hibernate_sequence'), 'coverage.update.stuck.hours', '24', current_timestamp, current_timestamp) -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/add_fhir_version.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset lsharshar:add_fhir_version failOnError:true 5 | 6 | ALTER TABLE job ADD COLUMN fhir_version varchar(255); 7 | UPDATE job SET fhir_version = 'STU3' WHERE fhir_version IS NULL; 8 | ALTER TABLE job ALTER COLUMN fhir_version SET NOT NULL; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/add_patient_eob_count.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:add_patient_eob_count failOnError:true 5 | 6 | ALTER TABLE event_bene_search ADD COLUMN benes_with_eobs INT DEFAULT 0; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/add_started_by_column_to_job.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:add_started_by_column_to_job failOnError:true 5 | 6 | ALTER TABLE job ADD COLUMN started_by VARCHAR(32) NOT NULL DEFAULT 'PDP'; 7 | 8 | --rollback ALTER TABLE job DROP COLUMN manual -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/delete_akamai_requests.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:delete_akamai_records failOnError:true 5 | 6 | DELETE FROM event_api_response eap 7 | USING event_api_request ear 8 | WHERE ear.request_id = eap.request_id AND ear.url LIKE '%akamai%'; 9 | 10 | DELETE FROM event_api_request ear 11 | WHERE ear.url LIKE '%akamai%'; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/drop_old_coverage_table.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset sb-wnyffenegger:drop_old_coverage_table failOnError:true 5 | 6 | DROP TABLE coverage_deprecated; 7 | 8 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/remove_current_admin.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:remove_current_admin failOnError:true 5 | 6 | DELETE FROM user_role 7 | WHERE user_account_id = (SELECT id FROM user_account WHERE client_id = '0oa32rfir2xLtx7s2297'); 8 | 9 | DELETE FROM user_account 10 | WHERE client_id = '0oa32rfir2xLtx7s2297'; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/remove_deprecated_properties.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:remove_deprecated_properties failOnError:true 5 | 6 | DELETE FROM properties 7 | WHERE key IN ('coverage.update.stale.days', 'ContractToBeneCachingOn'); -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/remove_sponsor_table.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:remove_sponsor_table failOnError:true 5 | 6 | ALTER TABLE contract DROP CONSTRAINT fk_contract_to_sponsor; 7 | ALTER TABLE contract DROP COLUMN sponsor_id; 8 | 9 | ALTER TABLE user_account DROP CONSTRAINT fk_user_account_to_sponsor; 10 | ALTER TABLE user_account DROP COLUMN sponsor_id; 11 | 12 | ALTER TABLE sponsor_ip DROP CONSTRAINT fk_sponsor_ip_to_sponsor; 13 | DROP TABLE sponsor_ip; 14 | 15 | DROP TABLE sponsor; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/replace_coverage_table.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset sb-wnyffenegger:replace_coverage_table failOnError:true 5 | 6 | ALTER TABLE coverage RENAME TO coverage_deprecated; 7 | 8 | ALTER TABLE coverage_partitioned RENAME TO coverage; 9 | 10 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/rework_search_event.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:rework_bene_search_event failOnError:true 5 | 6 | 7 | ALTER TABLE event_bene_search RENAME num_in_contract TO benes_expected; 8 | ALTER TABLE event_bene_search RENAME num_searched TO benes_searched; 9 | ALTER TABLE event_bene_search RENAME num_errors TO benes_errored; 10 | 11 | ALTER TABLE event_bene_search ADD COLUMN benes_queued INTEGER DEFAULT 0; 12 | ALTER TABLE event_bene_search ADD COLUMN eobs_fetched INTEGER DEFAULT 0; 13 | ALTER TABLE event_bene_search ADD COLUMN eobs_written INTEGER DEFAULT 0; 14 | ALTER TABLE event_bene_search ADD COLUMN eob_files INTEGER DEFAULT 0; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/rework_user_account_username.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset wnyffenegger:rework_user_account_username failOnError:true 5 | 6 | ALTER TABLE user_account ADD COLUMN organization VARCHAR(255) NOT NULL DEFAULT ''; 7 | 8 | UPDATE user_account 9 | SET organization = sponsor.org_name 10 | FROM sponsor 11 | WHERE sponsor.id = user_account.sponsor_id; 12 | 13 | ALTER TABLE user_account ADD UNIQUE (organization); 14 | 15 | ALTER TABLE user_account DROP COLUMN first_name; 16 | ALTER TABLE user_account DROP COLUMN last_name; 17 | ALTER TABLE user_account DROP COLUMN email; 18 | 19 | ALTER TABLE user_account RENAME username TO client_id; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/support_default_since.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset lsharshar:support_default_since failOnError:true 5 | 6 | ALTER TABLE job ADD since_source VARCHAR(256); 7 | 8 | UPDATE job SET since_source = 'USER' where since IS NOT NULL; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2021/update_mode_and_contract_type.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset lsharshar:updatae_mode_and_contract_type failOnError:true 5 | 6 | ALTER TABLE contract ADD contract_type varchar(255) NOT NULL DEFAULT 'NORMAL'; 7 | UPDATE contract SET contract_type = 'CLASSIC_TEST' where update_mode = 'TEST'; 8 | UPDATE contract SET update_mode = 'NONE' where update_mode = 'TEST'; 9 | UPDATE contract SET contract_type = 'SYNTHEA' where contract_number LIKE 'Z1%'; 10 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2022/add_missing_job_view_grant.sql: -------------------------------------------------------------------------------- 1 | --changeset enolan:add_missing_job_view_grant failOnError:true 2 | GRANT SELECT ON job_view TO ab2d_analyst; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2022/contract_coverage.sql: -------------------------------------------------------------------------------- 1 | --liquibase formatted sql 2 | -- ------------------------------------------------------------------------------------------------------------------- 3 | 4 | --changeset enolan:contract_bus_key failOnError:true 5 | 6 | -- Create and populate the contract business key 7 | ALTER TABLE bene_coverage_period ADD COLUMN contract_number VARCHAR(255); 8 | UPDATE bene_coverage_period 9 | SET contract_number = c.contract_number 10 | FROM contract c 11 | WHERE contract_id = c.id; 12 | 13 | -- Enforce that a saved bene_coverage_period has a contract number 14 | ALTER TABLE bene_coverage_period ALTER "contract_number" SET NOT NULL; 15 | 16 | -- Foreign key is no longer needed. The business key will be used going forward 17 | ALTER TABLE bene_coverage_period DROP CONSTRAINT fk_bene_coverage_period_to_contract; 18 | ALTER TABLE bene_coverage_period DROP COLUMN contract_id; 19 | 20 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2022/downloaded_count.sql: -------------------------------------------------------------------------------- 1 | --changeset sb-keane:convert downloaded to integer, add last_download_at, 2 | 3 | alter table job_output 4 | alter column downloaded DROP DEFAULT; 5 | alter table job_output 6 | alter column downloaded type integer 7 | using case when downloaded = true then 1 else 0 end; 8 | alter table job_output 9 | alter column downloaded SET DEFAULT 0; 10 | 11 | alter table job_output 12 | add column last_download_at timestamp null; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2023/add_columns_to_coverage.sql: -------------------------------------------------------------------------------- 1 | --changeset 5567 sadibhatla 2 | -- adding additional columns to coverage table to support opt-out logic 3 | -- TODO : figure out the flat file structure and columns expected as part of the flat file that we need to ingest 4 | -- TODO : update more columns to add if needed 5 | 6 | ALTER TABLE coverage ADD COLUMN IF NOT EXISTS opt_out_flag BOOLEAN DEFAULT 'FALSE'; 7 | ALTER TABLE coverage ADD COLUMN IF NOT EXISTS effective_date TIMESTAMP; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2023/add_optout_property.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO property.properties( 2 | id, key, value, created, modified) 3 | SELECT nextval('hibernate_sequence'), 'OptOutOn', 'false', current_timestamp, current_timestamp 4 | WHERE 5 | NOT EXISTS ( 6 | SELECT * FROM property.properties 7 | WHERE key='OptOutOn' 8 | ); 9 | 10 | --rollback DELETE FROM properties WHERE key = 'OptOutOn'; 11 | -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2024/ab2d_6151_rename_column.sql: -------------------------------------------------------------------------------- 1 | DO $$ 2 | BEGIN 3 | IF EXISTS (SELECT 1 4 | FROM information_schema.columns 5 | WHERE table_schema = 'public' AND table_name = 'current_mbi' AND 6 | column_name = 'opt_out_flag') 7 | THEN 8 | ALTER TABLE public.current_mbi RENAME opt_out_flag TO share_data; 9 | END IF; 10 | END 11 | $$; -------------------------------------------------------------------------------- /common/src/main/resources/db/changelog/v2025/alter_sequences.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE public.user_account ALTER COLUMN id SET DEFAULT nextval('public.user_account_seq'); 2 | 3 | ALTER TABLE public.job ALTER COLUMN id SET DEFAULT nextval('public.job_seq'); 4 | 5 | ALTER TABLE public.job_output ALTER COLUMN id SET DEFAULT nextval('public.job_output_seq'); 6 | 7 | ALTER TABLE public.event_bene_coverage_search_status_change ALTER COLUMN id SET DEFAULT nextval('public.event_bene_coverage_search_status_change_seq'); 8 | 9 | ALTER TABLE public.bene_coverage_period ALTER COLUMN id SET DEFAULT nextval('public.bene_coverage_period_seq'); 10 | 11 | ALTER TABLE public.coverage_search ALTER COLUMN id SET DEFAULT nextval('public.coverage_search_seq'); 12 | 13 | ALTER TABLE public.role ALTER COLUMN id SET DEFAULT nextval('public.role_seq'); 14 | -------------------------------------------------------------------------------- /common/src/test/java/gov/cms/ab2d/common/health/LoggingAvailableTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.health; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.junit.jupiter.api.extension.ExtendWith; 5 | import org.mockito.Mock; 6 | import org.mockito.junit.jupiter.MockitoExtension; 7 | 8 | import static org.junit.jupiter.api.Assertions.*; 9 | import static org.mockito.Mockito.when; 10 | 11 | @ExtendWith(MockitoExtension.class) 12 | class LoggingAvailableTest { 13 | 14 | @Mock 15 | org.slf4j.Logger logger; 16 | 17 | @Test 18 | void canLog() { 19 | when(logger.isErrorEnabled()).thenReturn(true); 20 | assertTrue(LoggingAvailable.canLog(logger)); 21 | } 22 | 23 | @Test 24 | void canNotLog() { 25 | when(logger.isErrorEnabled()).thenReturn(false); 26 | assertFalse(LoggingAvailable.canLog(logger)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/src/test/java/gov/cms/ab2d/common/health/MemoryUtilizationTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.health; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.junit.jupiter.api.Assertions.*; 6 | 7 | public class MemoryUtilizationTest { 8 | 9 | public static final int ALLOCATABLE_MEMORY_MB = 2; 10 | public static final int UNALLOCATABLE_MEMORY_MB = (int) (Math.pow(2, 31) - 1); 11 | 12 | @Test 13 | void testMemory() { 14 | assertFalse(MemoryUtilization.outOfMemory(ALLOCATABLE_MEMORY_MB)); 15 | assertTrue(MemoryUtilization.outOfMemory(UNALLOCATABLE_MEMORY_MB)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/test/java/gov/cms/ab2d/common/service/FeatureEngagementTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import org.junit.jupiter.api.Test; 6 | 7 | class FeatureEngagementTest { 8 | 9 | @Test 10 | void test1() { 11 | FeatureEngagement featureEngagement = FeatureEngagement.fromString("idle"); 12 | assertEquals("NEUTRAL", featureEngagement.toString()); 13 | assertEquals("idle", featureEngagement.getSerialValue()); 14 | } 15 | 16 | @Test 17 | void test2() { 18 | FeatureEngagement featureEngagement = FeatureEngagement.fromString("random"); 19 | assertEquals("IN_GEAR", featureEngagement.toString()); 20 | assertEquals("engaged", featureEngagement.getSerialValue()); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /common/src/test/java/gov/cms/ab2d/common/service/InvalidClientInputExceptionTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertThrows; 4 | 5 | import org.junit.jupiter.api.Test; 6 | 7 | class InvalidClientInputExceptionTest { 8 | 9 | @Test 10 | void test() { 11 | assertThrows(RuntimeException.class, () -> { 12 | throw new InvalidClientInputException("test"); 13 | }); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /common/src/test/java/gov/cms/ab2d/common/service/InvalidContractExceptionTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertThrows; 4 | 5 | import org.junit.jupiter.api.Test; 6 | 7 | class InvalidContractExceptionTest { 8 | 9 | @Test 10 | void test() { 11 | assertThrows(RuntimeException.class, () -> { 12 | throw new InvalidContractException("test"); 13 | }); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /common/src/test/java/gov/cms/ab2d/common/service/InvalidPropertiesExceptionTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.service; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertThrows; 4 | 5 | import org.junit.jupiter.api.Test; 6 | 7 | class InvalidPropertiesExceptionTest { 8 | 9 | @Test 10 | void test() { 11 | assertThrows(RuntimeException.class, () -> { 12 | throw new InvalidPropertiesException("test"); 13 | }); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /common/src/test/java/gov/cms/ab2d/common/util/AttestationStatusTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.common.util; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.junit.jupiter.api.Assertions.assertEquals; 6 | 7 | class AttestationStatusTest { 8 | 9 | // Add better tests in future, for now just use this to meet coverage checks, it's being covered by HPMS module 10 | @Test 11 | void testAttestationStatus() { 12 | AttestationStatus attestationStatus = AttestationStatus.WITHOUT_ATTESTATION; 13 | assertEquals("Without Attestation", attestationStatus.getValue()); 14 | 15 | AttestationStatus attestationStatusAttested = AttestationStatus.ATTESTED; 16 | assertEquals("Attested", attestationStatusAttested.getValue()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/src/test/resources/error.ndjson: -------------------------------------------------------------------------------- 1 | { 2 | "error": "errorMsg", 3 | "array": [ 4 | "error code 1", 5 | "error code 2" 6 | ] 7 | } -------------------------------------------------------------------------------- /common/src/test/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /common/src/test/resources/test-data/EOB-500.ndjson.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/common/src/test/resources/test-data/EOB-500.ndjson.gz -------------------------------------------------------------------------------- /common/src/test/resources/test.ndjson: -------------------------------------------------------------------------------- 1 | { 2 | "test": "value", 3 | "array": [ 4 | "val1", 5 | "val2" 6 | ] 7 | } -------------------------------------------------------------------------------- /contracts/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM amazoncorretto:21-al2023-jdk 2 | WORKDIR /usr/src/ab2d-contracts 3 | ADD build/libs/contracts-*.jar /usr/src/ab2d-contracts/ab2d-contracts.jar 4 | CMD java -jar /usr/src/ab2d-contracts/ab2d-contracts.jar 5 | 6 | CMD java \ 7 | -XX:+UseContainerSupport \ 8 | -jar ab2d-contracts.jar 9 | 10 | EXPOSE 8070 11 | -------------------------------------------------------------------------------- /contracts/GOVERNANCE.md: -------------------------------------------------------------------------------- 1 | # Governance 2 | 3 | 5 | 6 | This project is governed by our [Community Guidelines](COMMUNITY.md) and [Code of Conduct](CODE_OF_CONDUCT.md). 7 | -------------------------------------------------------------------------------- /contracts/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/contracts/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /contracts/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /contracts/settings.gradle: -------------------------------------------------------------------------------- 1 | 2 | pluginManagement { 3 | repositories { 4 | maven { 5 | url = "${System.getenv().get("ARTIFACTORY_URL") ?: (System.getProperty('artifactory_contextUrl'))}" +"/ab2d-main" 6 | credentials { 7 | username = "${System.getenv().get("ARTIFACTORY_USER") ?: (System.getProperty('artifactory_user'))}" 8 | password = "${System.getenv().get("ARTIFACTORY_PASSWORD") ?: (System.getProperty('artifactory_password'))}" 9 | } 10 | } 11 | gradlePluginPortal() 12 | } 13 | } 14 | 15 | rootProject.name = 'ab2d-contracts' 16 | 17 | // buildFileName needs to be set for aws deploys but can completely breaks intellij 18 | if (System.getProperty("set.root.project.build.filename")!=null) { 19 | rootProject.buildFileName = 'ab2d-contracts' 20 | } 21 | 22 | 23 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/config/AttestationConfig.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.scheduling.annotation.EnableAsync; 5 | import org.springframework.scheduling.annotation.EnableScheduling; 6 | 7 | @Configuration 8 | @EnableAsync 9 | @EnableScheduling 10 | public class AttestationConfig { 11 | } 12 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/config/EnvironmentConfig.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.config; 2 | 3 | import gov.cms.ab2d.eventclient.config.Ab2dEnvironment; 4 | import org.springframework.beans.factory.annotation.Value; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class EnvironmentConfig { 10 | 11 | /** 12 | * Parse execution environment passed in during 13 | * @param executionEnv string value of execution environment that must match the name of one {@link Ab2dEnvironment} 14 | * @return current ab2d environment 15 | */ 16 | @Bean 17 | public Ab2dEnvironment getEnvironment(@Value("${execution.env}") String executionEnv) { 18 | return Ab2dEnvironment.fromName(executionEnv); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/config/WebClientConfig.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.http.client.reactive.ReactorClientHttpConnector; 6 | import org.springframework.web.reactive.function.client.WebClient; 7 | import reactor.netty.http.client.HttpClient; 8 | import reactor.netty.resources.ConnectionProvider; 9 | 10 | @Configuration 11 | public class WebClientConfig { 12 | 13 | @Bean 14 | public WebClient buildWebClient() { 15 | HttpClient httpClient = HttpClient.create(ConnectionProvider.newConnection()); 16 | 17 | return WebClient.builder() 18 | .clientConnector(new ReactorClientHttpConnector(httpClient)) 19 | .build(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/controller/ErrorMessage.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.controller; 2 | 3 | import java.util.Date; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | @Data 7 | @Builder 8 | public class ErrorMessage { 9 | private Date timestamp; 10 | private String path; 11 | private int code; 12 | private String message; 13 | } 14 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/controller/HealthCheckController.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.controller; 2 | 3 | import gov.cms.ab2d.contracts.service.HealthcheckService; 4 | import lombok.AllArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.http.ResponseEntity; 8 | import org.springframework.web.bind.annotation.GetMapping; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | 12 | @AllArgsConstructor 13 | @RestController 14 | public class HealthCheckController { 15 | 16 | private final HealthcheckService healthcheckService; 17 | 18 | @GetMapping("/health") 19 | public ResponseEntity getHealth() { 20 | 21 | return new ResponseEntity<>(healthcheckService.checkDatabaseConnection() 22 | ? HttpStatus.OK 23 | : HttpStatus.INTERNAL_SERVER_ERROR); 24 | } 25 | } -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/controller/InvalidContractException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.controller; 2 | 3 | public class InvalidContractException extends RuntimeException { 4 | public InvalidContractException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/controller/InvalidContractParamException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.controller; 2 | 3 | import org.springframework.http.HttpStatus; 4 | import org.springframework.web.bind.annotation.ResponseStatus; 5 | 6 | @ResponseStatus(value = HttpStatus.BAD_REQUEST) 7 | public class InvalidContractParamException extends RuntimeException { 8 | public InvalidContractParamException(String msg) { 9 | super(msg); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/controller/RemoteTimeoutException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.controller; 2 | 3 | public class RemoteTimeoutException extends RuntimeException { 4 | public RemoteTimeoutException(String msg) { 5 | super(msg); 6 | } 7 | } -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/hmsapi/HPMSAttestation.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.hmsapi; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @NoArgsConstructor // Needed for Jackson 8 | @AllArgsConstructor 9 | @Data 10 | public class HPMSAttestation { 11 | 12 | private String contractId; 13 | private boolean attested; 14 | private String attestationDate; 15 | } 16 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/hmsapi/HPMSAuthResponse.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.hmsapi; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class HPMSAuthResponse { 7 | 8 | private String accessToken; 9 | private int expires; 10 | } 11 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/hmsapi/HPMSOrganizationInfo.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.hmsapi; 2 | 3 | import gov.cms.ab2d.contracts.model.Contract; 4 | import lombok.*; 5 | 6 | @NoArgsConstructor // Needed for Jackson 7 | @AllArgsConstructor 8 | @Data 9 | public class HPMSOrganizationInfo { 10 | 11 | private String parentOrgName; 12 | private Integer parentOrgId; 13 | private String contractId; 14 | private String contractName; 15 | private String orgMarketingName; 16 | } 17 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/processing/ReportProcessingException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.processing; 2 | 3 | public class ReportProcessingException extends RuntimeException { 4 | 5 | public ReportProcessingException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/repository/ContractRepository.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.repository; 2 | 3 | 4 | import gov.cms.ab2d.contracts.model.Contract; 5 | import java.util.Optional; 6 | import org.springframework.data.jpa.repository.JpaRepository; 7 | import org.springframework.stereotype.Repository; 8 | 9 | @Repository 10 | public interface ContractRepository extends JpaRepository { 11 | Optional findContractByContractNumber(String contractNumber); 12 | } 13 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/repository/PropertiesRepository.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.repository; 2 | 3 | import gov.cms.ab2d.contracts.model.Property; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.stereotype.Repository; 7 | 8 | @Repository 9 | public interface PropertiesRepository extends JpaRepository { 10 | Optional findByKey(String key); 11 | } 12 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/service/AttestationUpdaterService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.service; 2 | 3 | public interface AttestationUpdaterService { 4 | 5 | void pollOrganizations(); 6 | } 7 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/service/ContractService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.service; 2 | 3 | import gov.cms.ab2d.contracts.model.Contract; 4 | import gov.cms.ab2d.contracts.model.ContractDTO; 5 | import java.util.List; 6 | 7 | public interface ContractService { 8 | void updateContract(ContractDTO contract); 9 | List getAllContracts(); 10 | Contract getContractByContractId(Long contractId); 11 | Contract getContractByContractNumber(String contractNumber); 12 | } 13 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/service/FeatureEngagement.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.service; 2 | 3 | public enum FeatureEngagement { 4 | IN_GEAR("engaged"), // default - feature is fully contributing 5 | NEUTRAL("idle"); // out of gear - feature is not in play 6 | 7 | private String serialValue; 8 | 9 | FeatureEngagement(String propValue) { 10 | serialValue = propValue; 11 | } 12 | 13 | public String getSerialValue() { 14 | return serialValue; 15 | } 16 | 17 | // Defaults to being IN_GEAR. 18 | public static FeatureEngagement fromString(String rawValue) { 19 | return "idle".equals(rawValue) ? NEUTRAL : IN_GEAR; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/service/HPMSAuthService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.service; 2 | 3 | import org.springframework.http.HttpHeaders; 4 | 5 | public interface HPMSAuthService { 6 | 7 | void buildAuthHeaders(HttpHeaders headers); 8 | } 9 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/service/HPMSFetcher.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.service; 2 | 3 | import gov.cms.ab2d.contracts.hmsapi.HPMSAttestation; 4 | import gov.cms.ab2d.contracts.hmsapi.HPMSEnrollment; 5 | import gov.cms.ab2d.contracts.hmsapi.HPMSOrganizationInfo; 6 | import java.util.List; 7 | import java.util.Set; 8 | import java.util.function.Consumer; 9 | 10 | public interface HPMSFetcher { 11 | 12 | List retrieveSponsorInfo(); 13 | 14 | Set retrieveAttestationInfo(List contractIds); 15 | 16 | Set retrieveEnrollmentInfo(List contractIds); 17 | } 18 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/service/HealthcheckService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.service; 2 | 3 | public interface HealthcheckService { 4 | 5 | boolean checkDatabaseConnection(); 6 | } 7 | -------------------------------------------------------------------------------- /contracts/src/main/java/gov/cms/ab2d/contracts/service/HealthcheckServiceImpl.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.service; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.jdbc.core.JdbcTemplate; 6 | import org.springframework.stereotype.Service; 7 | 8 | @AllArgsConstructor 9 | @Service 10 | @Slf4j 11 | public class HealthcheckServiceImpl implements HealthcheckService { 12 | 13 | private final JdbcTemplate jdbcTemplate; 14 | 15 | @Override 16 | public boolean checkDatabaseConnection() { 17 | try { 18 | jdbcTemplate.query("SELECT 1", x -> { 19 | }); 20 | } catch (Exception e) { 21 | log.error("Healthcheck failed", e); 22 | return false; 23 | } 24 | return true; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /contracts/src/main/resources/db/changelog/db.changelog-master.yaml: -------------------------------------------------------------------------------- 1 | databaseChangeLog: 2 | - include: 3 | file: db/changelog/v2023/create_contract.sql 4 | - include: 5 | file: db/changelog/v2023/contract-service-coverage-info.sql 6 | - include: 7 | file: db/changelog/v2025/add_contract_sequence.sql 8 | - include: 9 | file: db/changelog/v2025/alter_contract_sequence.sql 10 | -------------------------------------------------------------------------------- /contracts/src/main/resources/db/changelog/v2023/contract-service-coverage-info.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE contract.contract ADD COLUMN total_enrollment int; 2 | ALTER TABLE contract.contract ADD COLUMN medicare_eligible int; -------------------------------------------------------------------------------- /contracts/src/main/resources/db/changelog/v2025/add_contract_sequence.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE IF NOT EXISTS contract.contract_seq START 1 INCREMENT BY 50; 2 | SELECT setval('contract.contract_seq', COALESCE((SELECT MAX(id) FROM contract.contract), 1), true); 3 | -------------------------------------------------------------------------------- /contracts/src/main/resources/db/changelog/v2025/alter_contract_sequence.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE contract.contract ALTER COLUMN id SET DEFAULT nextval('contract.contract_seq'); -------------------------------------------------------------------------------- /contracts/src/main/resources/logback-access.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | request_headers 8 | response_headers 9 | requested_url 10 | status_code 11 | 12 | 13 | Authorization 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /contracts/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /contracts/src/test/java/gov/cms/ab2d/contracts/service/ReportProcessingTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.service; 2 | 3 | import gov.cms.ab2d.contracts.processing.ReportProcessingException; 4 | import org.junit.jupiter.api.Assertions; 5 | import org.junit.jupiter.api.Test; 6 | 7 | class ReportProcessingTest { 8 | @Test 9 | void instance() { 10 | Assertions.assertThrows(ReportProcessingException.class, () -> { 11 | throw new ReportProcessingException("test"); 12 | }); 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /contracts/src/test/java/gov/cms/ab2d/contracts/util/AttestationStatusTest.java: -------------------------------------------------------------------------------- 1 | //package gov.cms.ab2d.contract.util; 2 | // 3 | //import org.junit.jupiter.api.Test; 4 | // 5 | //class AttestationStatusTest { 6 | // 7 | // // Add better tests in future, for now just use this to meet coverage checks, it's being covered by HPMS module 8 | // @Test 9 | // void testAttestationStatus() { 10 | // AttestationStatus attestationStatus = AttestationStatus.WITHOUT_ATTESTATION; 11 | // assertEquals("Without Attestation", attestationStatus.getValue()); 12 | // 13 | // AttestationStatus attestationStatusAttested = AttestationStatus.ATTESTED; 14 | // assertEquals("Attested", attestationStatusAttested.getValue()); 15 | // } 16 | //} 17 | -------------------------------------------------------------------------------- /contracts/src/test/resources/Attestation_Report_Sample.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/contracts/src/test/resources/Attestation_Report_Sample.xlsx -------------------------------------------------------------------------------- /contracts/src/test/resources/parent_org_and_legal_entity_20191031_111812.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/contracts/src/test/resources/parent_org_and_legal_entity_20191031_111812.xls -------------------------------------------------------------------------------- /coverage/src/main/java/gov/cms/ab2d/coverage/dto/ClearCoverageCacheRequest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.coverage.dto; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class ClearCoverageCacheRequest { 7 | 8 | private String contractNumber; 9 | private Integer month; 10 | private Integer year; 11 | } 12 | -------------------------------------------------------------------------------- /coverage/src/main/java/gov/cms/ab2d/coverage/model/CoverageJobStatus.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.coverage.model; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public enum CoverageJobStatus { 7 | SUBMITTED, 8 | IN_PROGRESS, 9 | FAILED, 10 | SUCCESSFUL, 11 | CANCELLED; 12 | } 13 | -------------------------------------------------------------------------------- /coverage/src/main/java/gov/cms/ab2d/coverage/model/CoverageMembership.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.coverage.model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class CoverageMembership { 9 | private Identifiers identifiers; 10 | private int year; 11 | private int month; 12 | } 13 | -------------------------------------------------------------------------------- /coverage/src/main/java/gov/cms/ab2d/coverage/model/Identifiers.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.coverage.model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | 7 | import java.util.LinkedHashSet; 8 | 9 | @Getter 10 | @AllArgsConstructor 11 | @EqualsAndHashCode(onlyExplicitlyIncluded = true) 12 | public class Identifiers { 13 | 14 | @EqualsAndHashCode.Include 15 | private final long beneficiaryId; 16 | 17 | private final String currentMbi; 18 | 19 | // LinkedHashSet maintains order of mbis as they are added 20 | // we always add the current mbi first 21 | private final LinkedHashSet historicMbis; 22 | } 23 | -------------------------------------------------------------------------------- /coverage/src/main/java/gov/cms/ab2d/coverage/repository/CoveragePeriodRepository.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.coverage.repository; 2 | 3 | import gov.cms.ab2d.coverage.model.CoveragePeriod; 4 | import java.time.OffsetDateTime; 5 | import java.util.List; 6 | import java.util.Optional; 7 | import org.springframework.data.jpa.repository.JpaRepository; 8 | 9 | public interface CoveragePeriodRepository extends JpaRepository { 10 | 11 | List findAllByContractNumber(String contractNumber); 12 | 13 | List findAllByLastSuccessfulJobIsNull(); 14 | 15 | List findAllByMonthAndYearAndLastSuccessfulJobLessThanEqual(int month, int year, OffsetDateTime time); 16 | 17 | Optional findByContractNumberAndMonthAndYear(String contractNumber, int month, int year); 18 | 19 | List findAllByMonthAndYear(int month, int year); 20 | } 21 | -------------------------------------------------------------------------------- /coverage/src/main/java/gov/cms/ab2d/coverage/service/CoveragePeriodNotFoundException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.coverage.service; 2 | 3 | public class CoveragePeriodNotFoundException extends RuntimeException { 4 | 5 | public CoveragePeriodNotFoundException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /coverage/src/main/java/gov/cms/ab2d/coverage/service/InvalidJobStateTransition.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.coverage.service; 2 | 3 | public class InvalidJobStateTransition extends RuntimeException { 4 | 5 | public InvalidJobStateTransition(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /coverage/src/test/java/gov/cms/ab2d/coverage/SpringBootCoverageTestApp.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.coverage; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.boot.autoconfigure.domain.EntityScan; 6 | import org.springframework.context.annotation.PropertySource; 7 | 8 | @SpringBootApplication(scanBasePackages = { 9 | "gov.cms.ab2d.common", 10 | "gov.cms.ab2d.coverage", 11 | "gov.cms.ab2d.eventclient.clients" 12 | }) 13 | @PropertySource("classpath:application.coverage.properties") 14 | @EntityScan(basePackages = {"gov.cms.ab2d.contracts"}) 15 | public class SpringBootCoverageTestApp { 16 | 17 | public static void main(String [] args) { 18 | SpringApplication.run(SpringBootCoverageTestApp.class, args); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /coverage/src/test/java/gov/cms/ab2d/coverage/repository/CoverageDeltaTestRepository.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.coverage.repository; 2 | 3 | import gov.cms.ab2d.coverage.model.CoverageDelta; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface CoverageDeltaTestRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /coverage/src/test/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /e2e-test/src/test/java/gov/cms/ab2d/e2etest/JobUtil.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.e2etest; 2 | 3 | public class JobUtil { 4 | 5 | public static String getJobUuid(String url) { 6 | return url.substring(url.indexOf("/Job/") + 5, url.indexOf("/$status")); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /e2e-test/src/test/resources/Attestation_Report_Sample.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/e2e-test/src/test/resources/Attestation_Report_Sample.xlsx -------------------------------------------------------------------------------- /e2e-test/src/test/resources/dev-config.yml: -------------------------------------------------------------------------------- 1 | okta-url: 'https://test.idp.idm.cms.gov/oauth2/aus2r7y3gdaFMKBol297/v1/token' 2 | base-url: 'https://dev.ab2d.cms.gov' 3 | -------------------------------------------------------------------------------- /e2e-test/src/test/resources/impl-config.yml: -------------------------------------------------------------------------------- 1 | okta-url: 'https://test.idp.idm.cms.gov/oauth2/aus2r7y3gdaFMKBol297/v1/token' 2 | base-url: 'https://test.ab2d.cms.gov' 3 | -------------------------------------------------------------------------------- /e2e-test/src/test/resources/local-config.yml: -------------------------------------------------------------------------------- 1 | okta-url: 'https://test.idp.idm.cms.gov/oauth2/aus2r7y3gdaFMKBol297/v1/token' 2 | base-url: 'https://localhost' -------------------------------------------------------------------------------- /e2e-test/src/test/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /e2e-test/src/test/resources/parent_org_and_legal_entity_20191031_111812.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/e2e-test/src/test/resources/parent_org_and_legal_entity_20191031_111812.xls -------------------------------------------------------------------------------- /e2e-test/src/test/resources/prod-config.yml: -------------------------------------------------------------------------------- 1 | okta-url: 'https://idm.cms.gov/oauth2/aus2ytanytjdaF9cr297/v1/token' 2 | base-url: 'https://api.ab2d.cms.gov' -------------------------------------------------------------------------------- /e2e-test/src/test/resources/sbx-config.yml: -------------------------------------------------------------------------------- 1 | okta-url: 'https://test.idp.idm.cms.gov/oauth2/aus2r7y3gdaFMKBol297/v1/token' 2 | base-url: 'https://sandbox.ab2d.cms.gov' -------------------------------------------------------------------------------- /events/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM amazoncorretto:21-al2023-jdk 2 | WORKDIR /usr/src/ab2d-events 3 | ADD build/libs/*.jar /usr/src/ab2d-events/ab2d-event.jar 4 | 5 | CMD java \ 6 | -XX:+UseContainerSupport \ 7 | -jar ab2d-event.jar 8 | 9 | EXPOSE 8050 10 | -------------------------------------------------------------------------------- /events/GOVERNANCE.md: -------------------------------------------------------------------------------- 1 | # Governance 2 | 3 | 5 | 6 | This project is governed by our [Community Guidelines](COMMUNITY.md) and [Code of Conduct](CODE_OF_CONDUCT.md). 7 | -------------------------------------------------------------------------------- /events/Jenkinsfile.deployment: -------------------------------------------------------------------------------- 1 | pipeline { 2 | environment { 3 | ARTIFACTORY_URL = credentials('ARTIFACTORY_URL') 4 | } 5 | 6 | agent { 7 | label 'build' 8 | } 9 | 10 | tools { 11 | gradle "gradle-8.4" 12 | jdk 'openjdk17' 13 | } 14 | 15 | stages { 16 | 17 | stage ('Build Libraries') { 18 | steps { 19 | withCredentials([usernamePassword(credentialsId: 'artifactoryuserpass', usernameVariable: 'ARTIFACTORY_USER', passwordVariable: 'ARTIFACTORY_PASSWORD')]) { 20 | sh 'gradle -b build.gradle bootJar -Dset.root.project.build.filename=true ' 21 | } 22 | } 23 | } 24 | 25 | stage ('Build Docker Image') { 26 | steps { 27 | sh ' ./scripts/build-docker-image.sh' 28 | } 29 | } 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /events/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/events/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /events/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /events/scripts/github-actions-release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e # Turn on exit on error 4 | 5 | # Set default AWS region and tag 6 | 7 | # 8 | ######## update ECS service with new image ################ 9 | # 10 | aws ecs update-service --cluster $DEPLOYMENT_ENV-microservice-cluster --service ab2d-event-service --force-new-deployment 11 | -------------------------------------------------------------------------------- /events/settings.gradle: -------------------------------------------------------------------------------- 1 | 2 | pluginManagement { 3 | repositories { 4 | maven { 5 | url = "${System.getenv().get("ARTIFACTORY_URL") ?: (System.getProperty('artifactory_contextUrl'))}" +"/ab2d-main" 6 | credentials { 7 | username = "${System.getenv().get("ARTIFACTORY_USER") ?: (System.getProperty('artifactory_user'))}" 8 | password = "${System.getenv().get("ARTIFACTORY_PASSWORD") ?: (System.getProperty('artifactory_password'))}" 9 | } 10 | } 11 | gradlePluginPortal() 12 | } 13 | } 14 | 15 | rootProject.name = 'ab2d-events' 16 | 17 | // buildFileName needs to be set for aws deploys but can completely breaks intellij 18 | if (System.getProperty("set.root.project.build.filename")!=null) { 19 | rootProject.buildFileName = 'ab2d-events' 20 | } 21 | -------------------------------------------------------------------------------- /events/src/main/java/gov/cms/ab2d/eventlogger/EnvironmentConfig.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventlogger; 2 | 3 | import gov.cms.ab2d.eventclient.config.Ab2dEnvironment; 4 | import org.springframework.beans.factory.annotation.Value; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class EnvironmentConfig { 10 | 11 | /** 12 | * Parse execution environment passed in during 13 | * @param executionEnv string value of execution environment that must match the name of one {@link Ab2dEnvironment} 14 | * @return current ab2d environment 15 | */ 16 | @Bean 17 | public Ab2dEnvironment getEnvironment(@Value("${execution.env}") String executionEnv) { 18 | return Ab2dEnvironment.fromName(executionEnv); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /events/src/main/java/gov/cms/ab2d/eventlogger/EventLogger.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventlogger; 2 | 3 | import gov.cms.ab2d.eventclient.events.LoggableEvent; 4 | 5 | public interface EventLogger { 6 | void log(LoggableEvent event); 7 | } 8 | -------------------------------------------------------------------------------- /events/src/main/java/gov/cms/ab2d/eventlogger/EventLoggingException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventlogger; 2 | 3 | public class EventLoggingException extends RuntimeException { 4 | public EventLoggingException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /events/src/main/java/gov/cms/ab2d/eventlogger/SpringBootApp.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventlogger; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication( 7 | scanBasePackages = {"gov.cms.ab2d.eventlogger", "gov.cms.ab2d.eventclient"} 8 | ) 9 | public class SpringBootApp { 10 | public static void main(String[] args) { 11 | SpringApplication.run(SpringBootApp.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /events/src/main/java/gov/cms/ab2d/eventlogger/eventloggers/kinesis/KinesisMode.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventlogger.eventloggers.kinesis; 2 | 3 | public enum KinesisMode { 4 | NONE, 5 | SEND_EVENTS 6 | } 7 | -------------------------------------------------------------------------------- /events/src/main/java/gov/cms/ab2d/eventlogger/eventloggers/slack/SlackConfig.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventlogger.eventloggers.slack; 2 | 3 | import com.slack.api.Slack; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | @Configuration 8 | public class SlackConfig { 9 | @Bean 10 | public static Slack slackClient() { 11 | return Slack.getInstance(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /events/src/main/resources/db/changelog/db.changelog-master.yaml: -------------------------------------------------------------------------------- 1 | databaseChangeLog: 2 | - include: 3 | file: db/changelog/v2023/create_events.sql 4 | - include: 5 | file: db/changelog/v2023/set_sequences_value.sql 6 | - include: 7 | file: db/changelog/v2025/alter_sequences.sql -------------------------------------------------------------------------------- /events/src/main/resources/db/changelog/v2025/alter_sequences.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE event.event_api_request ALTER COLUMN id SET DEFAULT nextval('event.event_api_request_id_seq'); 2 | 3 | ALTER TABLE event.event_api_response ALTER COLUMN id SET DEFAULT nextval('event.event_api_response_id_seq'); 4 | 5 | ALTER TABLE event.event_bene_reload ALTER COLUMN id SET DEFAULT nextval('event.event_bene_reload_id_seq'); 6 | 7 | ALTER TABLE event.event_bene_search ALTER COLUMN id SET DEFAULT nextval('event.event_bene_search_id_seq'); 8 | 9 | ALTER TABLE event.event_error ALTER COLUMN id SET DEFAULT nextval('event.event_error_id_seq'); 10 | 11 | ALTER TABLE event.event_file ALTER COLUMN id SET DEFAULT nextval('event.event_file_id_seq'); 12 | 13 | ALTER TABLE event.event_job_status_change ALTER COLUMN id SET DEFAULT nextval('event.event_job_status_change_id_seq'); -------------------------------------------------------------------------------- /events/src/test/resources/init.sql: -------------------------------------------------------------------------------- 1 | CREATE SCHEMA event; 2 | -------------------------------------------------------------------------------- /fhir-test/Dockerfile.fhir-test: -------------------------------------------------------------------------------- 1 | FROM alpine:3.22 2 | 3 | RUN apk add --no-cache curl jq bash 4 | 5 | COPY ../fhir-test/config.json . 6 | COPY ../fhir-test/run-fhir-test.sh . 7 | 8 | RUN chmod +x run-fhir-test.sh 9 | 10 | RUN addgroup fhir && adduser -D inferno -G fhir 11 | USER inferno 12 | 13 | ENTRYPOINT ["./run-fhir-test.sh"] -------------------------------------------------------------------------------- /fhir-test/docker-compose.inferno-background.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | hl7_validator_service: 4 | image: infernocommunity/inferno-resource-validator 5 | environment: 6 | # Defines how long validator sessions last if unused, in minutes: 7 | # Negative values mean sessions never expire, 0 means sessions immediately expire 8 | SESSION_CACHE_DURATION: -1 9 | volumes: 10 | - ./data/igs:/app/igs 11 | nginx: 12 | image: nginx 13 | volumes: 14 | - ./nginx/nginx.background.conf:/etc/nginx/nginx.conf 15 | ports: 16 | - "80:80" 17 | command: [nginx, '-g', 'daemon off;'] 18 | depends_on: 19 | - hl7_validator_service 20 | redis: 21 | image: redis 22 | ports: 23 | - "6379:6379" 24 | volumes: 25 | - ./data/redis:/data 26 | command: redis-server --appendonly yes 27 | -------------------------------------------------------------------------------- /fhir-test/docker-compose.inferno.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | inferno: 4 | image: inferno:1 5 | volumes: 6 | - ./data:/opt/inferno/data 7 | depends_on: 8 | - hl7_validator_service 9 | worker: 10 | image: inferno:1 11 | volumes: 12 | - ./data:/opt/inferno/data 13 | command: bundle exec sidekiq -r ./worker.rb 14 | depends_on: 15 | - redis 16 | hl7_validator_service: 17 | extends: 18 | file: docker-compose.inferno-background.yml 19 | service: hl7_validator_service 20 | nginx: 21 | extends: 22 | file: docker-compose.inferno-background.yml 23 | service: nginx 24 | volumes: 25 | - ./nginx/nginx.conf:/etc/nginx/nginx.conf 26 | redis: 27 | extends: 28 | file: docker-compose.inferno-background.yml 29 | service: redis 30 | -------------------------------------------------------------------------------- /job/src/main/java/gov/cms/ab2d/job/dto/JobPollResult.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.job.dto; 2 | 3 | import gov.cms.ab2d.job.model.JobOutput; 4 | import gov.cms.ab2d.job.model.JobStatus; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | 8 | import java.time.OffsetDateTime; 9 | import java.util.List; 10 | 11 | @Data 12 | @AllArgsConstructor 13 | public class JobPollResult { 14 | private String requestUrl; 15 | private JobStatus status; 16 | private int progress; 17 | private String transactionTime; 18 | private OffsetDateTime expiresAt; 19 | private List jobOutputs; 20 | } 21 | -------------------------------------------------------------------------------- /job/src/main/java/gov/cms/ab2d/job/dto/StaleJob.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.job.dto; 2 | 3 | import lombok.Value; 4 | 5 | import jakarta.validation.constraints.NotNull; 6 | 7 | @Value 8 | public class StaleJob { 9 | @NotNull 10 | String jobUuid; 11 | @NotNull 12 | String organization; 13 | } 14 | -------------------------------------------------------------------------------- /job/src/main/java/gov/cms/ab2d/job/model/JobStartedBy.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.job.model; 2 | 3 | public enum JobStartedBy { 4 | PDP, 5 | JENKINS, 6 | DEVELOPER 7 | } 8 | -------------------------------------------------------------------------------- /job/src/main/java/gov/cms/ab2d/job/service/InvalidJobAccessException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.job.service; 2 | 3 | public class InvalidJobAccessException extends RuntimeException { 4 | 5 | public InvalidJobAccessException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /job/src/main/java/gov/cms/ab2d/job/service/InvalidJobStateTransition.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.job.service; 2 | 3 | public class InvalidJobStateTransition extends RuntimeException { 4 | 5 | public InvalidJobStateTransition(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /job/src/main/java/gov/cms/ab2d/job/service/JobOutputMissingException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.job.service; 2 | 3 | public class JobOutputMissingException extends RuntimeException { 4 | 5 | public JobOutputMissingException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /job/src/main/java/gov/cms/ab2d/job/service/JobOutputService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.job.service; 2 | 3 | import gov.cms.ab2d.job.model.Job; 4 | import gov.cms.ab2d.job.model.JobOutput; 5 | 6 | public interface JobOutputService { 7 | 8 | JobOutput updateJobOutput(JobOutput jobOutput); 9 | 10 | JobOutput findByFilePathAndJob(String filePath, Job job); 11 | } 12 | -------------------------------------------------------------------------------- /job/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.cloud.compatibility-verifier.enabled=false 2 | -------------------------------------------------------------------------------- /job/src/test/java/gov/cms/ab2d/job/service/JobCleanup.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.job.service; 2 | 3 | import gov.cms.ab2d.job.model.Job; 4 | import gov.cms.ab2d.job.repository.JobRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | public abstract class JobCleanup { 11 | 12 | @Autowired 13 | JobRepository jobRepository; 14 | 15 | private final List jobsToCleanup = new ArrayList<>(); 16 | 17 | protected void addJobForCleanup(Job job) { 18 | jobsToCleanup.add(job); 19 | } 20 | 21 | protected void jobCleanup() { 22 | jobsToCleanup.forEach(job -> { 23 | Job foundJob = jobRepository.findByJobUuid(job.getJobUuid()); 24 | jobRepository.delete(foundJob); 25 | }); 26 | jobRepository.flush(); 27 | jobsToCleanup.clear(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /job/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.profiles.active=mock-beans 2 | 3 | spring.cloud.compatibility-verifier.enabled=false -------------------------------------------------------------------------------- /job/src/test/resources/job-test.properties: -------------------------------------------------------------------------------- 1 | efs.mount=${java.io.tmpdir}/jobdownloads/ 2 | 3 | spring.datasource.url=${DB_URL}?rewriteBatchedInserts=true 4 | spring.datasource.username=${DB_USERNAME} 5 | spring.datasource.password=${DB_PASSWORD} 6 | 7 | spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false 8 | spring.datasource.driver-class-name=org.postgresql.Driver 9 | spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect 10 | 11 | spring.jpa.hibernate.ddl-auto=none 12 | spring.liquibase.enabled=true 13 | spring.liquibase.contexts=test 14 | spring.liquibase.liquibase-schema=public 15 | spring.liquibase.default-schema=ab2d 16 | 17 | logging.level.liquibase=WARN 18 | -------------------------------------------------------------------------------- /lambdas/attribution-data-file-share/src/main/java/gov/cms/ab2d/attributiondatashare/AttributionDataShareException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.attributiondatashare; 2 | 3 | public class AttributionDataShareException extends RuntimeException { 4 | public AttributionDataShareException(String message, Exception ex) { 5 | super(message, ex); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lambdas/audit/README.md: -------------------------------------------------------------------------------- 1 | On a configurable interval, cloudwatch triggers this lambda. As of writing that interval is every 2 hours. 2 | 3 | - Open the ab2d efs mount 4 | - Scan the filesystem for 5 | - Folders with a UUID as its name 6 | - Files that end with .ndjosn 7 | - If files are older that the time to live (72 hours currently) 8 | - Delete any files older than ttl 9 | - Delete empty folders 10 | 11 | 12 | -------------------------------------------------------------------------------- /lambdas/audit/src/main/java/gov/cms/ab2d/audit/AuditException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.audit; 2 | 3 | public class AuditException extends RuntimeException { 4 | public AuditException(String error) { 5 | super(error); 6 | } 7 | 8 | public AuditException(Exception exception) { 9 | super(exception); 10 | } 11 | 12 | public AuditException(String error, Exception exception) { 13 | super(error, exception); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lambdas/audit/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | AB2D_EFS_MOUNT=${AB2D_EFS_MOUNT:#{systemProperties['java.io.tmpdir']+'/jobdownloads'}}/ 2 | audit_files_ttl_hours=72 -------------------------------------------------------------------------------- /lambdas/audit/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /lambdas/audit/src/test/java/gov/cms/ab2d/audit/ExceptionTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.audit; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.junit.jupiter.api.Assertions.assertThrows; 6 | 7 | public class ExceptionTest { 8 | 9 | @Test 10 | void stringOnly() { 11 | assertThrows(AuditException.class, () -> { 12 | throw new AuditException("test"); 13 | }); 14 | } 15 | 16 | @Test 17 | void stringAndExceptionOnly() { 18 | assertThrows(AuditException.class, () -> { 19 | throw new AuditException("test", new Exception()); 20 | }); 21 | } 22 | 23 | @Test 24 | void exceptionOnly() { 25 | assertThrows(AuditException.class, () -> { 26 | throw new AuditException(new Exception()); 27 | }); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lambdas/audit/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | audit_files_ttl_hours=72 2 | 3 | -------------------------------------------------------------------------------- /lambdas/coverage-counts/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/lambdas/coverage-counts/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lambdas/coverage-counts/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /lambdas/coverage-counts/src/main/java/gov/cms/ab2d/coveragecounts/CoverageCountException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.coveragecounts; 2 | 3 | public class CoverageCountException extends RuntimeException { 4 | public CoverageCountException(Exception ex) { 5 | super(ex); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lambdas/coverage-counts/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/lambdas/coverage-counts/src/main/resources/application.properties -------------------------------------------------------------------------------- /lambdas/coverage-counts/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /lambdas/coverage-counts/src/test/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/lambdas/coverage-counts/src/test/resources/application.properties -------------------------------------------------------------------------------- /lambdas/database-management/src/main/java/gov/cms/ab2d/databasemanagement/DatabaseManagementException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.databasemanagement; 2 | 3 | public class DatabaseManagementException extends RuntimeException { 4 | public DatabaseManagementException(String message, Exception exception) { 5 | super(message, exception); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lambdas/database-management/src/main/resources/db/changelog/2023/coverage_counts.sql: -------------------------------------------------------------------------------- 1 | CREATE SCHEMA if not exists lambda; 2 | 3 | CREATE TABLE if not exists lambda.coverage_counts 4 | ( 5 | id bigserial NOT NULL, 6 | contract_number varchar NOT NULL, 7 | service varchar NOT NULL, 8 | count int NOT NULL, 9 | year smallint NOT NULL,-- could cause issues in 30,744 years 10 | month smallint NOT NULL, 11 | create_at timestamp NOT NULL, -- track when the row was written 12 | counted_at timestamp NOT NULL -- sent from the services, used as a version for a series of counts, also used to find newest counts 13 | ); 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /lambdas/database-management/src/main/resources/db/changelog/2023/create-ab2d-analyst.sql: -------------------------------------------------------------------------------- 1 | ------------------------------ 2 | -- Create ab2d_analyst user 3 | ------------------------------ 4 | DO 5 | $$ 6 | begin 7 | if not exists(SELECT * FROM pg_user WHERE usename = 'ab2d_analyst') THEN 8 | Create Role ab2d_analyst noinherit login password 'ab2d'; 9 | end if; 10 | end 11 | $$ -------------------------------------------------------------------------------- /lambdas/database-management/src/main/resources/db/changelog/2023/grant_quicksight_select_coverage_count.sql: -------------------------------------------------------------------------------- 1 | grant usage on schema lambda to ab2d_analyst; 2 | 3 | grant select on lambda.coverage_counts 4 | to ab2d_analyst -------------------------------------------------------------------------------- /lambdas/database-management/src/main/resources/db/changelog/changelog.yaml: -------------------------------------------------------------------------------- 1 | databaseChangeLog: 2 | - include: 3 | file: db/changelog/2023/coverage_counts.sql 4 | - include: 5 | file: db/changelog/2023/create-ab2d-analyst.sql 6 | - include: 7 | file: db/changelog/2023/grant_quicksight_select_coverage_count.sql 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /lambdas/database-management/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /lambdas/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/lambdas/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lambdas/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /lambdas/lambda-lib/README.md: -------------------------------------------------------------------------------- 1 | A small project to hold shared code for testing. 2 | 3 | TestContext will be useful for all lambda projects and if copied will likely drift in implementation over time. 4 | 5 | 6 | Tp use it for other lambda projects add this to the project's build.gradle 7 | `testImplementation project(':lambda-test-utils')` -------------------------------------------------------------------------------- /lambdas/lambda-lib/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | } 4 | 5 | version "$lambdalibsVersion" 6 | 7 | repositories { 8 | mavenCentral() 9 | } 10 | 11 | dependencies { 12 | implementation 'org.slf4j:slf4j-api:2.0.5' 13 | implementation 'org.slf4j:slf4j-reload4j:2.0.5' 14 | 15 | //test 16 | testImplementation 'org.slf4j:slf4j-api:2.0.6' 17 | testImplementation 'org.slf4j:slf4j-reload4j:2.0.6' 18 | testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.1' 19 | testImplementation 'org.junit.platform:junit-platform-commons:1.9.1' 20 | testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.1' 21 | implementation 'software.amazon.awssdk:ssm:2.25.7' 22 | 23 | } 24 | 25 | test { 26 | useJUnitPlatform() 27 | } 28 | 29 | sonarqube { 30 | properties { 31 | property 'sonar.coverage.exclusions', "**/ParameterStoreUtil.java" 32 | } 33 | } -------------------------------------------------------------------------------- /lambdas/lambda-lib/src/main/java/gov/cms/ab2d/lambdalibs/exceptions/PropertiesException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.lambdalibs.exceptions; 2 | 3 | public class PropertiesException extends RuntimeException { 4 | 5 | public PropertiesException(String error) { 6 | super(error); 7 | } 8 | 9 | public PropertiesException(Exception error) { 10 | super(error); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lambdas/lambda-lib/src/main/java/gov/cms/ab2d/lambdalibs/lib/FileUtil.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.lambdalibs.lib; 2 | 3 | import java.io.IOException; 4 | import java.nio.file.DirectoryStream; 5 | import java.nio.file.Files; 6 | import java.nio.file.LinkOption; 7 | import java.nio.file.Path; 8 | 9 | public class FileUtil { 10 | public static void deleteDirectoryRecursion(Path path) throws IOException { 11 | if (Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)) { 12 | try (DirectoryStream entries = Files.newDirectoryStream(path)) { 13 | for (Path entry : entries) { 14 | deleteDirectoryRecursion(entry); 15 | } 16 | } 17 | } 18 | if (Files.exists(path)) Files.delete(path); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lambdas/lambda-lib/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/lambdas/lambda-lib/src/main/resources/application.properties -------------------------------------------------------------------------------- /lambdas/lambda-lib/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=info, stdout 2 | log4j.appender.stdout=org.apache.log4j.ConsoleAppender 3 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 4 | log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n -------------------------------------------------------------------------------- /lambdas/lambda-lib/src/test/java/gov/cms/ab2d/lambdalibs/PropLoadTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.lambdalibs; 2 | 3 | import gov.cms.ab2d.lambdalibs.lib.PropertiesUtil; 4 | import org.junit.jupiter.api.Test; 5 | 6 | import java.util.Properties; 7 | 8 | import static org.junit.jupiter.api.Assertions.assertEquals; 9 | import static org.junit.jupiter.api.Assertions.assertNotNull; 10 | 11 | public class PropLoadTest { 12 | @Test 13 | void loadProps() { 14 | Properties props = PropertiesUtil.loadProps(); 15 | assertNotNull(props.getProperty("test.prop")); 16 | } 17 | 18 | @Test 19 | void overrideProps() { 20 | System.setProperty("test.prop.override", "test"); 21 | Properties props = PropertiesUtil.loadProps(); 22 | assertEquals("test", props.getProperty("test.prop.override")); 23 | } 24 | 25 | 26 | } 27 | 28 | -------------------------------------------------------------------------------- /lambdas/lambda-lib/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | test.prop="Only used by a test" 2 | test.prop.override="Only used by a test" -------------------------------------------------------------------------------- /lambdas/lambda-test-utils/README.md: -------------------------------------------------------------------------------- 1 | A simple lambda that converts Cloudwatch events to messages the event service can accept. 2 | -------------------------------------------------------------------------------- /lambdas/lambda-test-utils/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/lambdas/lambda-test-utils/src/main/resources/application.properties -------------------------------------------------------------------------------- /lambdas/lambda-test-utils/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=debug, stdout 2 | log4j.appender.stdout=org.apache.log4j.ConsoleAppender 3 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 4 | log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n -------------------------------------------------------------------------------- /lambdas/lambda-test-utils/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | test.prop="Only used by a test" 2 | test.prop.override="Only used by a test" -------------------------------------------------------------------------------- /lambdas/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /lambdas/metrics-lambda/README.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | A simple lambda that converts Cloudwatch events to messages the event service can accept. 3 | 4 | ## Overreaching objective 5 | 6 | AB2D occasionally has issues with services and upstream partners. 7 | To better track KPI these issues need to be recorded. 8 | There are currently 5 main areas of focus: BFD, HPMS, RDS, EFS, and API 9 | RDS, EFS, and API are monitored by cloudwatch alerts. Whenever there's an issue the alarm triggers and sends a message to this lambda 10 | HPMS and BFD issues are captured by the AB2D applications. 11 | 12 | All issues are sent to the event service which stores them in a metrics table. 13 | 14 | There are multiple quicksight dashboards to visualize the data. 15 | -------------------------------------------------------------------------------- /lambdas/metrics-lambda/src/main/java/gov/cms/ab2d/metrics/Dimensions.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.metrics; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Getter 9 | @Setter 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class Dimensions { 13 | private String value; 14 | private String name; 15 | } 16 | -------------------------------------------------------------------------------- /lambdas/metrics-lambda/src/main/java/gov/cms/ab2d/metrics/EventDataException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.metrics; 2 | 3 | public class EventDataException extends RuntimeException { 4 | public EventDataException(String error) { 5 | super(error); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lambdas/metrics-lambda/src/main/java/gov/cms/ab2d/metrics/MetricsLambdaException.java: -------------------------------------------------------------------------------- 1 | 2 | package gov.cms.ab2d.metrics; 3 | 4 | public class MetricsLambdaException extends RuntimeException { 5 | public MetricsLambdaException(String message) { 6 | super(message); 7 | } 8 | 9 | public MetricsLambdaException(String message, Throwable cause) { 10 | super(message, cause); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lambdas/metrics-lambda/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /lambdas/metrics-lambda/src/test/java/gov/cms/ab2d/metrics/CloudwatchEventHandlerTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.metrics; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static gov.cms.ab2d.metrics.CloudwatchEventHandler.deriveSqsQueueName; 6 | import static org.junit.jupiter.api.Assertions.*; 7 | 8 | class CloudwatchEventHandlerTest { 9 | 10 | @Test 11 | void testDeriveSqsQueueName() { 12 | assertEquals("ab2d-dev-events", deriveSqsQueueName("https://sqs.us-east-1.amazonaws.com/123456789/ab2d-dev-events")); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lambdas/metrics-lambda/src/test/resources/example-event.json: -------------------------------------------------------------------------------- 1 | { 2 | "Records": [ 3 | { 4 | "Sns": { 5 | "SignatureVersion": "1", 6 | "Timestamp": "2025-08-20T12:34:56.000Z", 7 | "MessageId": null, 8 | "Message": "{\"AlarmName\":\"ab2d-dev-test-alarm\",\"AlarmDescription\":\"test\",\"AWSAccountId\":\"1234\",\"AlarmConfigurationUpdatedTimestamp\":null,\"NewStateValue\":\"OK\",\"NewStateReason\":null,\"StateChangeTime\":\"2025-06-16T07:00:00.000+0100\",\"Region\":null,\"AlarmArn\":null,\"OldStateValue\":null,\"OKActions\":null,\"AlarmActions\":null,\"InsufficientDataActions\":null,\"Trigger\":{\"Dimensions\":null,\"MetricName\":null,\"Namespace\":\"test\",\"StatisticType\":null,\"Statistic\":null,\"Unit\":null,\"Period\":0,\"EvaluationPeriods\":null,\"ComparisonOperator\":null,\"Threshold\":0,\"TreatMissingData\":null,\"EvaluateLowSampleCountPercentile\":null}}" 9 | } 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /lambdas/optout/src/main/java/gov/cms/ab2d/optout/OptOutException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.optout; 2 | 3 | public class OptOutException extends RuntimeException { 4 | public OptOutException(String errorMessage, Exception exception) { 5 | super(errorMessage, exception); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lambdas/optout/src/main/java/gov/cms/ab2d/optout/OptOutInformation.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.optout; 2 | 3 | public class OptOutInformation { 4 | private final String mbi; 5 | private final boolean optOutFlag; 6 | public OptOutInformation(String mbi, boolean optOutFlag) { 7 | this.mbi = mbi; 8 | this.optOutFlag = optOutFlag; 9 | } 10 | public boolean getOptOutFlag() { 11 | return optOutFlag; 12 | } 13 | public String getMbi() { 14 | return mbi; 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /lambdas/optout/src/main/java/gov/cms/ab2d/optout/RecordStatus.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.optout; 2 | 3 | 4 | public enum RecordStatus { 5 | 6 | ACCEPTED("Accepted 00"), 7 | REJECTED("Rejected 02"); 8 | private final String status; 9 | RecordStatus(final String status) { 10 | this.status = status; 11 | } 12 | @Override 13 | public String toString() { 14 | return status; 15 | } 16 | 17 | } 18 | 19 | -------------------------------------------------------------------------------- /lambdas/optout/src/test/java/gov/cms/ab2d/optout/OptOutConstantsTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.optout; 2 | 3 | public class OptOutConstantsTest { 4 | public static final String TEST_ENDPOINT = "http://127.0.0.1:8001"; 5 | public static final String TEST_FILE_NAME = "optOutDummy.txt"; 6 | public static final String MULTIPLE_MBIS_TEST_FILE_NAME = "multipleMBIsOptOutDummy.txt"; 7 | public static final String TEST_BUCKET_PATH = "bfdeft01/ab2d"; 8 | public static final String TEST_BFD_BUCKET_NAME = "bfd-test-eft"; 9 | 10 | private OptOutConstantsTest() { 11 | } 12 | } -------------------------------------------------------------------------------- /lambdas/optout/src/test/resources/check-conf-file.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | # Echo to stderr 6 | err() { 7 | >&2 echo "$@" 8 | } 9 | 10 | conf_file=$1 11 | today=$(date +%Y%m%d) 12 | expected=$(mktemp) 13 | 14 | # Use head from gnu coreutils to remove trailing newline 15 | head -c-1 < "$expected" 16 | HDR_BENECONFIRM${today} 17 | 1S00E00JG37${today}YAccepted 00 18 | 7SP1D00AA00${today}NAccepted 00 19 | 2SY1D00AA00${today}YAccepted 00 20 | 7SF9C00AA00${today}NAccepted 00 21 | 7SF6F00AA00${today}NAccepted 00 22 | DUMMY000006${today}YAccepted 00 23 | DUMMY000007${today}NAccepted 00 24 | TRL_BENECONFIRM${today}0000000007 25 | EOF 26 | 27 | err "Testing confirmation file..." 28 | 29 | # Hide output to avoid revealing sensitive info 30 | if ! diff -u "$conf_file" "$expected" > /dev/null; then 31 | err "Confirmation file differs from expected" 32 | exit 1 33 | fi 34 | 35 | err "Confirmation file matches expected" 36 | -------------------------------------------------------------------------------- /lambdas/optout/src/test/resources/check-latest-out.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) 6 | 7 | latest=$(aws s3api list-objects-v2 \ 8 | --bucket bfd-test-eft \ 9 | --prefix bfdeft01/ab2d/out/T#EFT.ON.AB2D.NGD.CONF \ 10 | --query 'sort_by(Contents, &LastModified)[-1].Key' \ 11 | --output=text) 12 | aws s3 cp --no-progress s3://bfd-test-eft/$latest test-confirmation.txt 13 | bash "$SCRIPT_DIR/check-conf-file.sh" test-confirmation.txt 14 | -------------------------------------------------------------------------------- /lambdas/optout/src/test/resources/emptyDummy.txt: -------------------------------------------------------------------------------- 1 | HDR_BENEDATARSP20240123 2 | TRL_BENEDATARSP202401230000000000 -------------------------------------------------------------------------------- /lambdas/optout/src/test/resources/multipleMBIsOptOutDummy.txt: -------------------------------------------------------------------------------- 1 | HDR_BENEDATARSP20240123 2 | 1S00E00JG37Y 3 | 7SP1D00AA00N 4 | 2SY1D00AA00Y 5 | 7SF9C00AA00N 6 | 7SF6F00AA00N 7 | DUMMY000006,DUMMY000008Y 8 | DUMMY000007,DUMMY000009N 9 | TRL_BENEDATARSP202401230000000009 -------------------------------------------------------------------------------- /lambdas/optout/src/test/resources/optOutDummy.txt: -------------------------------------------------------------------------------- 1 | HDR_BENEDATARSP20240123 2 | 1S00E00JG37Y 3 | 7SP1D00AA00N 4 | 2SY1D00AA00Y 5 | 7SF9C00AA00N 6 | 7SF6F00AA00N 7 | DUMMY000006Y 8 | DUMMY000007N 9 | TRL_BENEDATARSP202401230000000007 -------------------------------------------------------------------------------- /lambdas/optout/src/test/resources/sqsEvent.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type" : "Notification", 3 | "MessageId" : "5da6e965-ca05-5123-8347-b72ad7893428", 4 | "TopicArn" : "arn:aws:sns:test", 5 | "Subject" : "Amazon S3 Notification", 6 | "Message" : "{\"Records\":[{\"eventVersion\":\"2.1\",\"eventSource\":\"aws:s3\",\"awsRegion\":\"us-east-1\",\"eventTime\":\"2024-02-20T21:36:11.419Z\",\"eventName\":\"ObjectCreated:Put\",\"s3\":{\"s3SchemaVersion\":\"1.0\",\"configurationId\":\"bfd-test-eft-inbound-received-s3-dpc\",\"bucket\":{\"name\":\"bfd-test-eft\",\"arn\":\"arn:aws:s3:::bfd-test-eft\"},\"object\":{\"key\":\"bfdeft01/ab2d/in/optOutDummy.txt\",\"size\":12}}}]}", 7 | "Timestamp" : "2024-02-20T21:36:12.405Z", 8 | "SignatureVersion" : "1", 9 | "Signature" : "TestSignature", 10 | "SigningCertURL" : "TestSigningCertURL", 11 | "UnsubscribeURL" : "TestUnsubscribeURL" 12 | } -------------------------------------------------------------------------------- /lambdas/retrieve-hpms-counts/README.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | Retrieve coverage counts from the contract service and send them to the coverage count lambda. 3 | 4 | ## Goal 5 | The contract service pulls contract information from HPMS on a schedule. That information also contains the coverage counts. 6 | Instead of adding another schedule and more dependencies to the contract service have a lambda handle requesting count updates. 7 | 8 | ## Overall design 9 | 10 | Make a GET request to contract service's /contracts endpoint. Loop through the results and extract the contract number and MedicareEligible count. 11 | Since HPMS only provides the current month's counts find the systems current month and year. 12 | Load all contract/count/year/month into a list of new CoverageCountDTO and send them to the coverage-counts lambda for storage. 13 | 14 | -------------------------------------------------------------------------------- /lambdas/retrieve-hpms-counts/src/main/java/gov/cms/ab2d/retrievehpmscounts/AB2DSNSClientOverrideException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.retrievehpmscounts; 2 | 3 | public class AB2DSNSClientOverrideException extends RuntimeException { 4 | public AB2DSNSClientOverrideException(String message, Throwable cause) { 5 | super(message, cause); 6 | } 7 | 8 | public AB2DSNSClientOverrideException(String message) { 9 | super(message); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lambdas/retrieve-hpms-counts/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | contract_service_url=http://localhost:8060 2 | 3 | -------------------------------------------------------------------------------- /lambdas/retrieve-hpms-counts/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /lambdas/retrieve-hpms-counts/src/test/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/lambdas/retrieve-hpms-counts/src/test/resources/application.properties -------------------------------------------------------------------------------- /lambdas/retrieve-hpms-counts/src/test/resources/example-event.json: -------------------------------------------------------------------------------- 1 | { 2 | "test": "trigger", 3 | "note": "Lambda pulls /contracts from contract_service_url." 4 | } 5 | -------------------------------------------------------------------------------- /lambdas/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'ab2d-lambdas' 2 | include 'metrics-lambda', 'audit', 'coverage-counts', 'database-management', 'lambda-lib', 'lambda-test-utils' 3 | include 'lambda-test-utils' 4 | include 'retrieve-hpms-counts' 5 | include 'optout' 6 | include 'attribution-data-file-share' 7 | 8 | -------------------------------------------------------------------------------- /libs/GOVERNANCE.md: -------------------------------------------------------------------------------- 1 | # Governance 2 | 3 | 5 | 6 | This project is governed by our [Community Guidelines](COMMUNITY.md) and [Code of Conduct](CODE_OF_CONDUCT.md). 7 | -------------------------------------------------------------------------------- /libs/ab2d-aggregator/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | } 4 | 5 | version "$aggregatorVersion" 6 | 7 | repositories { 8 | mavenCentral() 9 | } 10 | 11 | ext { 12 | jupiterVersion='5.9.3' 13 | } 14 | 15 | dependencies { 16 | implementation "org.apache.commons:commons-lang3:$commonsLangVersion" 17 | implementation "org.slf4j:slf4j-api:2.0.7" 18 | implementation "org.projectlombok:lombok:$lombokVersion" 19 | 20 | annotationProcessor "org.projectlombok:lombok:$lombokVersion" 21 | 22 | testImplementation "org.junit.jupiter:junit-jupiter-api:${jupiterVersion}" 23 | testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${jupiterVersion}" 24 | } 25 | 26 | test { 27 | useJUnitPlatform() 28 | } 29 | -------------------------------------------------------------------------------- /libs/ab2d-aggregator/src/main/java/gov/cms/ab2d/aggregator/FileReferenceHolder.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.aggregator; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | import java.io.File; 7 | 8 | /** 9 | * Holds the file and it's size. This enables us to manipulate ordering of files by only going to the file 10 | * system once. This is used for files that are finished streaming and in the finished directory and their size 11 | * won't change. 12 | */ 13 | @Getter 14 | @AllArgsConstructor 15 | public class FileReferenceHolder { 16 | private final File file; 17 | private final long size; 18 | } 19 | -------------------------------------------------------------------------------- /libs/ab2d-aggregator/src/test/java/gov/cms/ab2d/aggregator/FileDescriptorTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.aggregator; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import java.io.File; 6 | 7 | import static org.junit.jupiter.api.Assertions.assertEquals; 8 | 9 | class FileDescriptorTest { 10 | 11 | @Test 12 | void getData() { 13 | FileReferenceHolder fd = new FileReferenceHolder(new File("/tmp"), 10); 14 | assertEquals("/tmp", fd.getFile().getAbsolutePath()); 15 | assertEquals(10, fd.getSize()); 16 | } 17 | } -------------------------------------------------------------------------------- /libs/ab2d-aggregator/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /libs/ab2d-bfd/README.md: -------------------------------------------------------------------------------- 1 | # AB2D BFD 2 | 3 | This library implements the connection and configuration to BFD for AB2D. 4 | 5 | ## Using the Library 6 | 7 | Add to Maven Project 8 | 9 | ``` 10 | 11 | gov.cms.ab2d 12 | ab2d-bfd 13 | 1.0 14 | 15 | ``` 16 | 17 | Adding to Gradle 18 | 19 | ``` 20 | implementation "gov.cms.ab2d:ab2d-bfd:1.0" 21 | ``` 22 | 23 | -------------------------------------------------------------------------------- /libs/ab2d-bfd/out/production/resources/application.bfd.properties: -------------------------------------------------------------------------------- 1 | bfd.keystore.password=${AB2D_BFD_KEYSTORE_PASSWORD} 2 | bfd.keystore.location=${AB2D_BFD_KEYSTORE_LOCATION} 3 | bfd.url=${AB2D_BFD_URL:#{'https://prod-sbx.bfd.cms.gov'}} 4 | bfd.mbi.hash=https://bluebutton.cms.gov/resources/identifier/mbi-hash 5 | bfd.connectionTimeout=${AB2D_BFD_CONNECTION_TIMEOUT:5000} 6 | bfd.socketTimeout=${AB2D_BFD_SOCKET_TIMEOUT:30000} 7 | bfd.requestTimeout=${AB2D_BFD_REQUEST_TIMEOUT:5000} 8 | bfd.eob.pagesize=${AB2D_BFD_EOB_PAGE_SIZE:#{-1}} 9 | bfd.contract.to.bene.pagesize=${AB2D_BFD_C2B_PAGE_SIZE:4000} 10 | bfd.http.maxConnPerRoute=750 11 | bfd.http.maxConnTotal=750 12 | bfd.http.connTTL=60000 13 | 14 | #--- retry 15 | bfd.retry.maxAttempts=${AB2D_BFD_RETRY_MAX:6} 16 | bfd.retry.backoffDelay=${AB2D_BFD_RETRY_BACKOFF:100} 17 | -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/main/java/gov/cms/ab2d/bfd/client/BFDSearch.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.bfd.client; 2 | 3 | import gov.cms.ab2d.fhir.FhirVersion; 4 | import org.hl7.fhir.instance.model.api.IBaseBundle; 5 | 6 | import java.io.IOException; 7 | import java.time.OffsetDateTime; 8 | 9 | public interface BFDSearch { 10 | IBaseBundle searchEOB(long patientId, OffsetDateTime since, OffsetDateTime until, int pageSize, String bulkJobId, FhirVersion version, String contractNum) throws IOException; 11 | } 12 | -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/main/resources/application.bfd.properties: -------------------------------------------------------------------------------- 1 | bfd.keystore.password=${AB2D_BFD_KEYSTORE_PASSWORD} 2 | bfd.keystore.location=${AB2D_BFD_KEYSTORE_LOCATION} 3 | bfd.url=${AB2D_BFD_URL:#{'https://prod-sbx.bfd.cms.gov'}} 4 | bfd.mbi.hash=https://bluebutton.cms.gov/resources/identifier/mbi-hash 5 | bfd.connectionTimeout=${AB2D_BFD_CONNECTION_TIMEOUT:5000} 6 | bfd.socketTimeout=${AB2D_BFD_SOCKET_TIMEOUT:30000} 7 | bfd.requestTimeout=${AB2D_BFD_REQUEST_TIMEOUT:5000} 8 | bfd.eob.pagesize=${AB2D_BFD_EOB_PAGE_SIZE:#{-1}} 9 | bfd.contract.to.bene.pagesize=${AB2D_BFD_C2B_PAGE_SIZE:4000} 10 | bfd.http.maxConnPerRoute=750 11 | bfd.http.maxConnTotal=750 12 | bfd.http.connTTL=60000 13 | 14 | #--- retry 15 | bfd.retry.maxAttempts=${AB2D_BFD_RETRY_MAX:6} 16 | bfd.retry.backoffDelay=${AB2D_BFD_RETRY_BACKOFF:100} 17 | -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/java/gov/cms/ab2d/bfd/client/FhirBfdServerTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.bfd.client; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertNotNull; 5 | 6 | import org.junit.jupiter.api.Test; 7 | 8 | import gov.cms.ab2d.fhir.FhirVersion; 9 | 10 | class FhirBfdServerTest { 11 | 12 | @Test 13 | void testGetVersion() { 14 | assertEquals(FhirVersion.R4, new FhirBfdServer(FhirVersion.R4).getVersion()); 15 | } 16 | 17 | @Test 18 | void testGetGenericClient() { 19 | FhirBfdServer fhirBfdServer = new FhirBfdServer(FhirVersion.R4); 20 | 21 | // We intentionally test this method twice to increase code coverage, 22 | // since the first call of the method mutates the object. 23 | assertNotNull(fhirBfdServer.getGenericClient(null, "test")); 24 | assertNotNull(fhirBfdServer.getGenericClient(null, "test")); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/java/gov/cms/ab2d/bfd/client/SpringBootApp.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.bfd.client; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SpringBootApp { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SpringBootApp.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/resources/application.bfd.properties: -------------------------------------------------------------------------------- 1 | bfd.keystore.password=changeit 2 | bfd.keystore.location=/bb.keystore 3 | bfd.connectionTimeout=5000 4 | bfd.mbi.hash=https://bluebutton.cms.gov/resources/identifier/mbi-hash 5 | bfd.socketTimeout=5000 6 | bfd.requestTimeout=5000 7 | bfd.eob.pagesize=10 8 | bfd.contract.to.bene.pagesize=10 9 | bfd.http.maxConnPerRoute=2 10 | bfd.http.maxConnTotal=20 11 | bfd.http.connTTL=60000 12 | 13 | # Wipe db of row data before starting tests 14 | spring.liquibase.contexts=test 15 | 16 | 17 | #--- retry 18 | bfd.retry.maxAttempts=3 19 | bfd.retry.backoffDelay=100 20 | -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/resources/bb-test-data/eob/20010000001115.json: -------------------------------------------------------------------------------- 1 | {"resourceType":"Bundle","id":"c20130ee-5bf9-4c5a-b71b-70e814b67fc0","meta":{"lastUpdated":"2019-03-29T14:07:59.605-04:00"},"type":"searchset","link":[{"relation":"self","url":"http://localhost:8083/v1/fhir/ExplanationOfBenefit?patient=20010000001115&count=10&startIndex=0&excludeSAMHSA=true"},{"relation":"next","url":"http://localhost:8083/v1/fhir/ExplanationOfBenefit?patient=20010000001115&count=10&startIndex=10&excludeSAMHSA=true"}]} -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/resources/bb-test-data/eob/20010000001116.json: -------------------------------------------------------------------------------- 1 | {"resourceType":"Bundle","id":"c20130ee-5bf9-4c5a-b71b-70e814b67fc0","meta":{"lastUpdated":"2019-03-29T14:07:59.605-04:00"},"type":"searchset","link":[{"relation":"self","url":"http://localhost:8083/v1/fhir/ExplanationOfBenefit?patient=20010000001116&count=10&startIndex=0&excludeSAMHSA=true"},{"relation":"next","url":"http://localhost:8083/v1/fhir/ExplanationOfBenefit?patient=20010000001116&count=10&startIndex=10&excludeSAMHSA=true"}]} -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/resources/bb-test-data/patient/20010000001115.json: -------------------------------------------------------------------------------- 1 | {"resourceType":"Patient","id":"20010000001115","extension":[{"url":"https://bluebutton.cms.gov/resources/variables/race","valueCoding":{"system":"https://bluebutton.cms.gov/resources/variables/race","code":"1","display":"White"}}],"identifier":[{"system":"https://bluebutton.cms.gov/resources/variables/bene_id","value":"20010000001115"}],"name":[{"use":"usual","family":"Doe","given":["Jane","X"]}],"gender":"unknown","birthDate":"2014-06-01","address":[{"district":"999","state":"15","postalCode":"99999"}]} -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/resources/bb-test-data/patient/20010000001116.json: -------------------------------------------------------------------------------- 1 | {"resourceType":"Patient","id":"20010000001116","extension":[{"url":"https://bluebutton.cms.gov/resources/variables/race","valueCoding":{"system":"https://bluebutton.cms.gov/resources/variables/race","code":"1","display":"White"}}],"identifier":[{"system":"https://bluebutton.cms.gov/resources/variables/bene_id","value":"20010000001116"},{"system":"https://bluebutton.cms.gov/resources/identifier/mbi-hash","value":"2025fbc612a8848wjefowefoppof5652360ecd7430575491f4e018c5"}],"name":[{"use":"usual","family":"Doe","given":["Rachel","X"]}],"gender":"unknown","birthDate":"1982-03-04","address":[{"district":"123","state":"17","postalCode":"55599"}]} -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/resources/bb-test-data/patient/20140000008325.json: -------------------------------------------------------------------------------- 1 | {"resourceType":"Patient","id":"20140000008325","extension":[{"url":"https://bluebutton.cms.gov/resources/variables/race","valueCoding":{"system":"https://bluebutton.cms.gov/resources/variables/race","code":"1","display":"White"}}],"identifier":[{"system":"https://bluebutton.cms.gov/resources/variables/bene_id","value":"20140000008325"}],"name":[{"use":"usual","family":"Doe","given":["Jane","X"]}],"gender":"unknown","birthDate":"2014-06-01","address":[{"district":"999","state":"15","postalCode":"99999"}]} -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/resources/bb-test-data/patient/20140000009893.json: -------------------------------------------------------------------------------- 1 | {"resourceType":"Patient","id":"20140000009893","extension":[{"url":"https://bluebutton.cms.gov/resources/variables/race","valueCoding":{"system":"https://bluebutton.cms.gov/resources/variables/race","code":"1","display":"White"}}],"identifier":[{"system":"https://bluebutton.cms.gov/resources/variables/bene_id","value":"20140000009893"},{"system":"https://bluebutton.cms.gov/resources/identifier/mbi-hash","value":"fc463c4b2788ad575acf9194fc132c53cdad9b93d36955315d1af1ec7445d330"}],"name":[{"use":"usual","family":"Doe","given":["John","X"]}],"gender":"unknown","birthDate":"2014-06-01","address":[{"district":"999","state":"20","postalCode":"99999"}]} -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/resources/bb-test-data/r4/patientmbi.json: -------------------------------------------------------------------------------- 1 | { 2 | "resourceType": "Bundle", 3 | "id": "a6b7dcc2-d0f6-48f0-94a9-842c666446a2", 4 | "meta": { 5 | "lastUpdated": "2020-12-09T16:19:38.679+00:00" 6 | }, 7 | "type": "searchset", 8 | "link": [ 9 | { 10 | "relation": "self", 11 | "url": "https://prod-sbx.bfd.cms.gov/v2/fhir/Patient?_format=json&identifier=https%3A%2F%2Fbluebutton.cms.gov%2Fresources%2Fidentifier%2Fmbi-hash%7C832dd5dcf5941dcf28cc067c39bd071beb445edcf804aa6d402d4a6715d82ecd" 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/resources/bb.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/libs/ab2d-bfd/src/test/resources/bb.keystore -------------------------------------------------------------------------------- /libs/ab2d-bfd/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /libs/ab2d-contracts-client/README.md: -------------------------------------------------------------------------------- 1 | # Ab2d Contracts Client 2 | 3 | This library sets the format that Contract rest calls are sent and received. 4 | 5 | ### Apply Client to Service 6 | 7 | ### Gradle 8 | ``` 9 | implementation 'gov.cms.ab2d:ab2d-contracts-client:1.0' 10 | ``` 11 | 12 | ### Maven 13 | ``` 14 | 15 | gov.cms.ab2d 16 | ab2d-contracts-client 17 | 1.0 18 | 19 | ``` 20 | 3. Upgrade the contract client version in /AB2D-Filters/build.gradle to build changes 21 | ``` 22 | # Increase current version 23 | contractClientVersion='1.0' 24 | ``` 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /libs/ab2d-contracts-client/build.gradle: -------------------------------------------------------------------------------- 1 | repositories { 2 | mavenCentral() 3 | } 4 | version "$contractClientVersion" 5 | dependencies { 6 | implementation "org.projectlombok:lombok:${lombokVersion}" 7 | implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion" 8 | implementation "org.springframework.boot:spring-boot-starter-validation:$springBootVersion" 9 | implementation "org.springframework.boot:spring-boot-starter-web:$springBootVersion" 10 | annotationProcessor "org.projectlombok:lombok:${lombokVersion}" 11 | testImplementation "org.springframework.boot:spring-boot-starter-test:$springBootVersion" 12 | testImplementation "org.junit.jupiter:junit-jupiter-api" 13 | testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine" 14 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 15 | } 16 | 17 | test { 18 | useJUnitPlatform() 19 | } 20 | -------------------------------------------------------------------------------- /libs/ab2d-contracts-client/src/main/java/gov/cms/ab2d/contracts/model/ContractAPI.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.model; 2 | 3 | import java.util.List; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | import org.springframework.web.bind.annotation.PathVariable; 6 | import org.springframework.web.bind.annotation.PutMapping; 7 | import org.springframework.web.bind.annotation.RequestBody; 8 | import org.springframework.web.bind.annotation.RequestParam; 9 | 10 | public interface ContractAPI { 11 | @GetMapping("contracts") 12 | List getContracts(@RequestParam(value = "contractId", required = false) Long contractId); 13 | 14 | @PutMapping("contracts") 15 | void updateContract(@RequestBody ContractDTO contract); 16 | 17 | @GetMapping("contracts/{contractNumber}") 18 | ContractDTO getContractByNumber(@PathVariable("contractNumber") String contractNumber); 19 | } 20 | 21 | -------------------------------------------------------------------------------- /libs/ab2d-contracts-client/src/main/java/gov/cms/ab2d/contracts/model/TimestampBase.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.model; 2 | 3 | import java.time.OffsetDateTime; 4 | import jakarta.persistence.MappedSuperclass; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | import org.hibernate.annotations.CreationTimestamp; 8 | import org.hibernate.annotations.UpdateTimestamp; 9 | 10 | @Getter 11 | @Setter 12 | @MappedSuperclass 13 | public abstract class TimestampBase { 14 | 15 | @CreationTimestamp 16 | private OffsetDateTime created; 17 | 18 | @UpdateTimestamp 19 | private OffsetDateTime modified; 20 | } 21 | -------------------------------------------------------------------------------- /libs/ab2d-contracts-client/src/test/java/gov/cms/ab2d/contracts/model/ContractDTOTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.contracts.model; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertFalse; 4 | import static org.junit.jupiter.api.Assertions.assertTrue; 5 | 6 | import org.junit.jupiter.api.Test; 7 | 8 | class ContractDTOTest { 9 | 10 | @Test 11 | void testHasDateIssueCaseOne() { 12 | ContractDTO contractDTO = new ContractDTO(); 13 | contractDTO.setContractType(Contract.ContractType.CLASSIC_TEST); 14 | assertTrue(contractDTO.hasDateIssue()); 15 | } 16 | 17 | @Test 18 | void testHasDateIssueCaseTwo() { 19 | ContractDTO contractDTO = new ContractDTO(); 20 | contractDTO.setContractType(Contract.ContractType.NORMAL); 21 | assertFalse(contractDTO.hasDateIssue()); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /libs/ab2d-contracts-client/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/main/java/gov/cms/ab2d/eventclient/EventClientException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient; 2 | 3 | public class EventClientException extends RuntimeException { 4 | public EventClientException(String message) { 5 | super(message); 6 | } 7 | 8 | public EventClientException(String message, Throwable cause) { 9 | super(message, cause); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/main/java/gov/cms/ab2d/eventclient/clients/EventClient.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.clients; 2 | 3 | import gov.cms.ab2d.eventclient.config.Ab2dEnvironment; 4 | import gov.cms.ab2d.eventclient.events.LoggableEvent; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import java.util.List; 8 | @Repository 9 | public interface EventClient { 10 | 11 | enum LogType { 12 | SQL, 13 | KINESIS 14 | } 15 | 16 | void sendLogs(LoggableEvent requestEvent); 17 | 18 | void alert(String message, List environments); 19 | 20 | void trace(String message, List environments); 21 | 22 | void logAndAlert(LoggableEvent event, List environments); 23 | 24 | void logAndTrace(LoggableEvent event, List environments); 25 | 26 | void log(LogType type, LoggableEvent event); 27 | } 28 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/main/java/gov/cms/ab2d/eventclient/messages/AlertSQSMessage.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.messages; 2 | 3 | import gov.cms.ab2d.eventclient.config.Ab2dEnvironment; 4 | import java.util.List; 5 | 6 | import lombok.*; 7 | 8 | @EqualsAndHashCode(callSuper = true) 9 | @Data 10 | public class AlertSQSMessage extends SQSMessages { 11 | 12 | private String message; 13 | 14 | private List environments; 15 | 16 | public AlertSQSMessage() { } 17 | 18 | public AlertSQSMessage(String message, List environments) { 19 | super(); 20 | this.message = message; 21 | this.environments = environments; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/main/java/gov/cms/ab2d/eventclient/messages/GeneralSQSMessage.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.messages; 2 | 3 | import gov.cms.ab2d.eventclient.events.LoggableEvent; 4 | import lombok.*; 5 | 6 | @EqualsAndHashCode(callSuper = true) 7 | @Data 8 | public class GeneralSQSMessage extends SQSMessages { 9 | private LoggableEvent loggableEvent; 10 | 11 | public GeneralSQSMessage() { } 12 | 13 | public GeneralSQSMessage(LoggableEvent loggableEvent) { 14 | super(); 15 | this.loggableEvent = loggableEvent; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/main/java/gov/cms/ab2d/eventclient/messages/KinesisSQSMessage.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.messages; 2 | 3 | import gov.cms.ab2d.eventclient.events.LoggableEvent; 4 | import lombok.*; 5 | 6 | @EqualsAndHashCode(callSuper = true) 7 | @Data 8 | public class KinesisSQSMessage extends SQSMessages { 9 | private LoggableEvent loggableEvent; 10 | 11 | public KinesisSQSMessage() { } 12 | 13 | public KinesisSQSMessage(LoggableEvent loggableEvent) { 14 | super(); 15 | this.loggableEvent = loggableEvent; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/main/java/gov/cms/ab2d/eventclient/messages/LogAndTraceSQSMessage.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.messages; 2 | 3 | import gov.cms.ab2d.eventclient.config.Ab2dEnvironment; 4 | import gov.cms.ab2d.eventclient.events.LoggableEvent; 5 | import java.util.List; 6 | 7 | import lombok.*; 8 | 9 | @EqualsAndHashCode(callSuper = true) 10 | @Data 11 | public class LogAndTraceSQSMessage extends SQSMessages { 12 | 13 | private LoggableEvent loggableEvent; 14 | 15 | private List environments; 16 | 17 | public LogAndTraceSQSMessage() { } 18 | 19 | public LogAndTraceSQSMessage(LoggableEvent loggableEvent, List environments) { 20 | super(); 21 | this.loggableEvent = loggableEvent; 22 | this.environments = environments; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/main/java/gov/cms/ab2d/eventclient/messages/SlackSQSMessage.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.messages; 2 | 3 | import gov.cms.ab2d.eventclient.events.LoggableEvent; 4 | import lombok.*; 5 | 6 | @EqualsAndHashCode(callSuper = true) 7 | @Data 8 | public class SlackSQSMessage extends SQSMessages { 9 | private LoggableEvent loggableEvent; 10 | 11 | public SlackSQSMessage() { } 12 | 13 | public SlackSQSMessage(LoggableEvent loggableEvent) { 14 | super(); 15 | this.loggableEvent = loggableEvent; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/main/java/gov/cms/ab2d/eventclient/messages/TraceAndAlertSQSMessage.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.messages; 2 | 3 | import gov.cms.ab2d.eventclient.config.Ab2dEnvironment; 4 | import gov.cms.ab2d.eventclient.events.LoggableEvent; 5 | import java.util.List; 6 | 7 | import lombok.*; 8 | 9 | @EqualsAndHashCode(callSuper = true) 10 | @Data 11 | public class TraceAndAlertSQSMessage extends SQSMessages { 12 | 13 | private LoggableEvent loggableEvent; 14 | 15 | private List environments; 16 | 17 | public TraceAndAlertSQSMessage() { } 18 | 19 | public TraceAndAlertSQSMessage(LoggableEvent loggableEvent, List environments) { 20 | super(); 21 | this.loggableEvent = loggableEvent; 22 | this.environments = environments; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/main/java/gov/cms/ab2d/eventclient/messages/TraceSQSMessage.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.messages; 2 | 3 | import gov.cms.ab2d.eventclient.config.Ab2dEnvironment; 4 | import java.util.List; 5 | 6 | import lombok.*; 7 | 8 | @EqualsAndHashCode(callSuper = true) 9 | @Data 10 | public class TraceSQSMessage extends SQSMessages { 11 | 12 | private String message; 13 | 14 | private List environments; 15 | 16 | public TraceSQSMessage() { } 17 | 18 | public TraceSQSMessage(String message, List environments) { 19 | super(); 20 | this.message = message; 21 | this.environments = environments; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/test/java/gov/cms/ab2d/eventclient/SpringBootApp.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient; 2 | 3 | import gov.cms.ab2d.eventclient.config.Ab2dEnvironment; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.context.annotation.Bean; 7 | 8 | @SpringBootApplication(scanBasePackages = {"gov.cms.ab2d.eventclient"}) 9 | public class SpringBootApp { 10 | public static void main(String[] args) { 11 | SpringApplication.run(SpringBootApp.class, args); 12 | } 13 | 14 | @Bean 15 | public Ab2dEnvironment getEnvironment() { 16 | return Ab2dEnvironment.fromName("local"); 17 | } 18 | } 19 | 20 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/test/java/gov/cms/ab2d/eventclient/events/JobSummaryEventTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.events; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import java.time.OffsetDateTime; 6 | 7 | import org.junit.jupiter.api.Test; 8 | 9 | class JobSummaryEventTest { 10 | 11 | JobSummaryEvent jobSummaryEvent; 12 | OffsetDateTime now = OffsetDateTime.now(); 13 | 14 | @Test 15 | void testAsMessage() { 16 | jobSummaryEvent = new JobSummaryEvent(); 17 | jobSummaryEvent.setJobId("1234"); 18 | jobSummaryEvent.setSubmittedTime(now); 19 | jobSummaryEvent.setSuccessfullySearched(99); 20 | assertEquals(String.format("(1234) submitted at %s successfully searched 99", now.toString()), jobSummaryEvent.asMessage()); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/test/java/gov/cms/ab2d/eventclient/events/ReloadEventTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.events; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; 5 | 6 | import org.junit.jupiter.api.Test; 7 | 8 | class ReloadEventTest { 9 | 10 | ReloadEvent reloadEvent; 11 | 12 | @Test 13 | void testConstructor() { 14 | assertDoesNotThrow(() -> { 15 | new ReloadEvent(null, null, null, 0); 16 | new ReloadEvent("CMS", ReloadEvent.FileType.OPT_OUT, "fileName", 99); 17 | }); 18 | } 19 | 20 | @Test 21 | void testAsMessage() { 22 | reloadEvent = new ReloadEvent(); 23 | reloadEvent.setJobId("1234"); 24 | reloadEvent.setFileType(ReloadEvent.FileType.OPT_OUT); 25 | reloadEvent.setFileName("fileName"); 26 | assertEquals("(1234) OPT_OUT fileName", reloadEvent.asMessage()); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/test/java/gov/cms/ab2d/eventclient/events/SlackEventsTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.eventclient.events; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import org.junit.jupiter.api.Test; 6 | 7 | class SlackEventsTest { 8 | 9 | @Test 10 | void testEnum() { 11 | // We're just looking to get test coverage on the enum here. 12 | // We don't even really need to "test" anything of significance. 13 | assertEquals("API_AUTHNZ_ERROR", SlackEvents.API_AUTHNZ_ERROR.toString()); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /libs/ab2d-events-client/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.url=${DB_URL} 2 | spring.datasource.username=${DB_USERNAME} 3 | spring.datasource.password=${DB_PASSWORD} 4 | 5 | spring.datasource.driver-class-name=org.postgresql.Driver 6 | spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect 7 | 8 | spring.jpa.hibernate.ddl-auto=none 9 | 10 | cloud.aws.end-point.uri: ${AWS_URL:'http://localhost:4566'} 11 | cloud.aws.region.static=us-east-1 12 | cloud.aws.region.auto=false 13 | cloud.aws.stack.auto=false 14 | -------------------------------------------------------------------------------- /libs/ab2d-fhir/README.md: -------------------------------------------------------------------------------- 1 | # AB2D FHIR 2 | 3 | FHIR (Fast Healthcare Interoperability Resources) is a standard for exchanging healthcare information electronically. 4 | This FHIR Library is used to manage and process FHIR Data for AB2D. 5 | 6 | 7 | ## Using the Library 8 | 9 | Add to Maven Project 10 | ``` 11 | 12 | gov.cms.ab2d 13 | ab2d-fhir 14 | 1.0 15 | 16 | ``` 17 | 18 | Adding to Gradle 19 | ``` 20 | implementation "gov.cms.ab2d:ab2d-fhir:1.0" 21 | ``` -------------------------------------------------------------------------------- /libs/ab2d-fhir/src/main/java/gov/cms/ab2d/fhir/VersionNotSupported.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.fhir; 2 | 3 | /** 4 | * Thrown when a version is not supported by the code 5 | */ 6 | public class VersionNotSupported extends RuntimeException { 7 | public VersionNotSupported(String msg) { 8 | super(msg); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /libs/ab2d-fhir/src/test/java/gov/cms/ab2d/fhir/VersionNotSupportedTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.fhir; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertThrows; 4 | 5 | import org.junit.jupiter.api.Test; 6 | 7 | class VersionNotSupportedTest { 8 | 9 | @Test 10 | void testConstructor() { 11 | assertThrows(RuntimeException.class, () -> { 12 | throw new VersionNotSupported("test"); 13 | }); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /libs/ab2d-fhir/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /libs/ab2d-filters/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /libs/ab2d-properties-client/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/libs/ab2d-properties-client/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /libs/ab2d-properties-client/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /libs/ab2d-properties-client/out/production/resources/application.properties: -------------------------------------------------------------------------------- 1 | # This is the default value. The actual one should be pulled from the environment variable PROPERTIES_SERVICE_URL 2 | properties.service.url=http://localhost:8060 3 | -------------------------------------------------------------------------------- /libs/ab2d-properties-client/src/main/java/gov/cms/ab2d/properties/client/PropertiesClient.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.properties.client; 2 | 3 | import java.util.List; 4 | 5 | public interface PropertiesClient { 6 | List getAllProperties(); 7 | Property getProperty(String key); 8 | Property setProperty(String key, String value); 9 | void deleteProperty(String key); 10 | } 11 | -------------------------------------------------------------------------------- /libs/ab2d-properties-client/src/main/java/gov/cms/ab2d/properties/client/Property.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.properties.client; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class Property { 11 | private String key; 12 | private String value; 13 | } 14 | -------------------------------------------------------------------------------- /libs/ab2d-properties-client/src/main/java/gov/cms/ab2d/properties/client/PropertyNotFoundException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.properties.client; 2 | 3 | public class PropertyNotFoundException extends RuntimeException { 4 | public PropertyNotFoundException(String message) { 5 | super(message); 6 | } 7 | 8 | public PropertyNotFoundException(String message, Throwable ex) { 9 | super(message, ex); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /libs/ab2d-properties-client/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | # This is the default value. The actual one should be pulled from the environment variable PROPERTIES_SERVICE_URL 2 | properties.service.url=http://localhost:8060 3 | -------------------------------------------------------------------------------- /libs/ab2d-properties-client/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /libs/ab2d-sns-client/README.md: -------------------------------------------------------------------------------- 1 | # Ab2d Events Client 2 | 3 | This is a thin wrapper around the AWS SNS client to make using Localstack easier. 4 | It also 5 | * Provides a central location so share DTO classes 6 | * Topics enum contains all known topics 7 | * Handles appending enviroment to topic name 8 | 9 | ### Gradle 10 | 11 | ``` 12 | implementation 'gov.cms.ab2d:ab2d-sns-client:1.0' 13 | ``` 14 | 15 | ### Maven 16 | 17 | ``` 18 | 19 | gov.cms.ab2d 20 | ab2d-sns-client 21 | ${version} 22 | 23 | ``` 24 | 25 | ### Add New Message type or topic for ab2d-sns-client 26 | 27 | * Add a message object in gov/cms/ab2d/snsclient/messages 28 | * Add a new topics in gov/cms/ab2d/snsclient/messages/Topics 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /libs/ab2d-sns-client/src/main/java/gov/cms/ab2d/snsclient/clients/SNSClient.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.snsclient.clients; 2 | 3 | import com.fasterxml.jackson.core.JsonProcessingException; 4 | 5 | public interface SNSClient { 6 | 7 | void sendMessage(String topicName, Object message) throws JsonProcessingException; 8 | 9 | } 10 | -------------------------------------------------------------------------------- /libs/ab2d-sns-client/src/main/java/gov/cms/ab2d/snsclient/exception/SNSClientException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.snsclient.exception; 2 | 3 | public class SNSClientException extends RuntimeException { 4 | public SNSClientException(String message) { 5 | super(message); 6 | } 7 | 8 | public SNSClientException(String message, Throwable cause) { 9 | super(message, cause); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /libs/ab2d-sns-client/src/main/java/gov/cms/ab2d/snsclient/messages/AB2DServices.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.snsclient.messages; 2 | 3 | public enum AB2DServices { 4 | AB2D, 5 | BFD, 6 | HPMS 7 | } -------------------------------------------------------------------------------- /libs/ab2d-sns-client/src/main/java/gov/cms/ab2d/snsclient/messages/CoverageCountDTO.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.snsclient.messages; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | import lombok.ToString; 8 | 9 | import java.sql.Timestamp; 10 | 11 | @Getter 12 | @Setter 13 | @ToString 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | public class CoverageCountDTO { 17 | private String contractNumber; 18 | private String service; 19 | private int count; 20 | private int year; 21 | private int month; 22 | private Timestamp countedAt; 23 | } 24 | -------------------------------------------------------------------------------- /libs/ab2d-sns-client/src/main/java/gov/cms/ab2d/snsclient/messages/Topics.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.snsclient.messages; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public enum Topics { 7 | COVERAGE_COUNTS("coverage-count"); 8 | 9 | private final String value; 10 | 11 | Topics(String value) { 12 | this.value = value; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /libs/ab2d-sns-client/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | cloud.aws.end-point.uri:${AWS_URL:'http://localhost:4566'} 2 | ab2d.sns.topic-prefix=${AWS_SNS_TOPIC_PREFIX:ab2d-local} 3 | cloud.aws.region.static=us-east-1 4 | cloud.aws.region.auto=false 5 | cloud.aws.stack.auto=false 6 | -------------------------------------------------------------------------------- /libs/ab2d-sns-client/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /libs/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/libs/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /libs/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /libs/lombok.config: -------------------------------------------------------------------------------- 1 | config.stopBubbling = true 2 | lombok.addLombokGeneratedAnnotation = true -------------------------------------------------------------------------------- /libs/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'ab2d-libs' 2 | include 'ab2d-filters', 'ab2d-fhir', 'ab2d-aggregator', 'ab2d-bfd', 'ab2d-events-client', 'ab2d-properties-client', 'ab2d-contracts-client', 'ab2d-sns-client' 3 | -------------------------------------------------------------------------------- /ops/services/.opentofu-version: -------------------------------------------------------------------------------- 1 | 1.10.1 2 | -------------------------------------------------------------------------------- /ops/services/00-bootstrap/tfplan: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/ops/services/00-bootstrap/tfplan -------------------------------------------------------------------------------- /ops/services/10-config/tofu.tf: -------------------------------------------------------------------------------- 1 | ../root.tofu.tf -------------------------------------------------------------------------------- /ops/services/10-core/tofu.tf: -------------------------------------------------------------------------------- 1 | ../root.tofu.tf -------------------------------------------------------------------------------- /ops/services/10-core/variables.tf: -------------------------------------------------------------------------------- 1 | variable "aurora_snapshot" { 2 | default = null 3 | description = "Desired aurora snapshot on which the aurora cluser is based. Setting this is only meaningful on instantiation and is otherwise ignored." 4 | type = string 5 | } 6 | -------------------------------------------------------------------------------- /ops/services/15-web/output.tf: -------------------------------------------------------------------------------- 1 | output "domain_name" { 2 | description = "Default Domain Name for CloudFront Distribution" 3 | value = aws_cloudfront_distribution.this.domain_name 4 | } 5 | 6 | output "bucket_id" { 7 | description = "Default Domain Name for CloudFront Distribution" 8 | value = aws_s3_bucket.this.id 9 | } 10 | 11 | output "distribution_id" { 12 | description = "Default Domain Name for CloudFront Distribution" 13 | value = aws_cloudfront_distribution.this.id 14 | } 15 | -------------------------------------------------------------------------------- /ops/services/15-web/tofu.tf: -------------------------------------------------------------------------------- 1 | ../root.tofu.tf -------------------------------------------------------------------------------- /ops/services/20-microservices/templates/config/iam/chatbot_policy.json: -------------------------------------------------------------------------------- 1 | { 2 | "Statement": [ 3 | { 4 | "Action": [ 5 | "chatbot:UpdateSlackChannelConfiguration", 6 | "chatbot:UpdateChimeWebhookConfiguration", 7 | "chatbot:Describe*", 8 | "chatbot:DeleteSlackChannelConfiguration", 9 | "chatbot:CreateSlackChannelConfiguration", 10 | "chatbot:CreateChimeWebhookConfiguration" 11 | ], 12 | "Effect": "Allow", 13 | "Resource": "arn:aws:chatbot::${aws_account_number}:chat-configuration/slack-channel/${role_name}", 14 | "Sid": "" 15 | } 16 | ], 17 | "Version": "2012-10-17" 18 | } 19 | -------------------------------------------------------------------------------- /ops/services/20-microservices/tofu.tf: -------------------------------------------------------------------------------- 1 | ../root.tofu.tf -------------------------------------------------------------------------------- /ops/services/30-api/iam.tf: -------------------------------------------------------------------------------- 1 | data "aws_iam_role" "api" { 2 | name = "${local.service_prefix}-${local.service}" 3 | } 4 | -------------------------------------------------------------------------------- /ops/services/30-api/tfplan: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/ops/services/30-api/tfplan -------------------------------------------------------------------------------- /ops/services/30-api/tofu.tf: -------------------------------------------------------------------------------- 1 | ../root.tofu.tf -------------------------------------------------------------------------------- /ops/services/30-api/variables.tf: -------------------------------------------------------------------------------- 1 | variable "override_task_definition_arn" { 2 | default = null 3 | description = "Use to override the task definition managed by this solution" 4 | type = string 5 | } 6 | 7 | variable "api_service_image_tag" { 8 | default = null 9 | description = "Desired image tag for the api service stored in ECR" 10 | type = string 11 | } 12 | 13 | variable "force_api_deployment" { 14 | default = false 15 | description = "Override to force a api deployment. Api deployments are automatic when `var.api_service_image_tag` is specified." 16 | type = bool 17 | } 18 | -------------------------------------------------------------------------------- /ops/services/30-lambda/tofu.tf: -------------------------------------------------------------------------------- 1 | ../root.tofu.tf -------------------------------------------------------------------------------- /ops/services/30-lambda/variables.tf: -------------------------------------------------------------------------------- 1 | variable "release_version" { 2 | default = "1.1.0-aurora" 3 | description = "Release version for common lambdas stored in artifactory" 4 | type = string 5 | } 6 | -------------------------------------------------------------------------------- /ops/services/30-worker/data.tf: -------------------------------------------------------------------------------- 1 | data "aws_efs_file_system" "this" { 2 | file_system_id = module.platform.ssm.core.efs_file_system_id.value 3 | } 4 | 5 | data "aws_efs_access_point" "this" { 6 | access_point_id = module.platform.ssm.core.efs_access_point_id.value 7 | } 8 | 9 | data "aws_rds_cluster" "this" { 10 | cluster_identifier = local.service_prefix 11 | } 12 | 13 | data "aws_security_group" "db" { 14 | tags = { 15 | Name = "${local.service_prefix}-db" 16 | } 17 | vpc_id = local.vpc_id 18 | } 19 | 20 | data "aws_security_group" "efs" { 21 | name = "ab2d-${local.parent_env}-efs" 22 | vpc_id = local.vpc_id 23 | } 24 | 25 | data "aws_security_group" "worker" { 26 | name = "${local.service_prefix}-worker" 27 | } 28 | 29 | data "aws_ecr_image" "worker" { 30 | repository_name = "ab2d-worker" 31 | image_tag = var.worker_service_image_tag 32 | most_recent = var.worker_service_image_tag == null ? true : null 33 | } 34 | -------------------------------------------------------------------------------- /ops/services/30-worker/iam.tf: -------------------------------------------------------------------------------- 1 | data "aws_iam_role" "worker" { 2 | name = "${local.service_prefix}-${local.service}" 3 | } 4 | -------------------------------------------------------------------------------- /ops/services/30-worker/tofu.tf: -------------------------------------------------------------------------------- 1 | ../root.tofu.tf -------------------------------------------------------------------------------- /ops/services/30-worker/variables.tf: -------------------------------------------------------------------------------- 1 | variable "override_task_definition_arn" { 2 | default = null 3 | description = "Use to override the task definition managed by this solution" 4 | type = string 5 | } 6 | 7 | variable "worker_service_image_tag" { 8 | default = null 9 | description = "Desired image tag for the worker service stored in ECR" 10 | type = string 11 | } 12 | 13 | variable "force_worker_deployment" { 14 | default = false 15 | description = "Override to force a worker deployment. Worker deployments are automatic when `var.worker_service_image_tag` is specified." 16 | type = bool 17 | } 18 | -------------------------------------------------------------------------------- /ops/services/40-insights/tofu.tf: -------------------------------------------------------------------------------- 1 | ../root.tofu.tf -------------------------------------------------------------------------------- /scripts/run-fhir-tests.sh: -------------------------------------------------------------------------------- 1 | # Set up inferno server 2 | docker build -t inferno:1 https://github.com/inferno-framework/bulk-data-test-kit.git#5bd61db090c5911792f33e12dca6981d7e22f9a0 3 | docker compose -f ../ab2d/fhir-test/docker-compose.inferno.yml run inferno bundle exec inferno migrate 4 | docker compose -f ../ab2d/fhir-test/docker-compose.inferno.yml up -d 5 | sleep 10 6 | docker stop fhir-test-hl7_validator_service-1 7 | 8 | # Run the tests 9 | docker build --no-cache -t fhir-test -f ../ab2d/fhir-test/Dockerfile.fhir-test . 10 | docker run --network=bridge --rm \ 11 | -e BULK_URL="$BULK_URL" \ 12 | -e TOKEN_URL="$TOKEN_URL" \ 13 | -e CLIENT_ID="$CLIENT_ID" \ 14 | -e CLIENT_SECRET="$CLIENT_SECRET" \ 15 | fhir-test -------------------------------------------------------------------------------- /worker/Dockerfile: -------------------------------------------------------------------------------- 1 | #AWS Corretto and AL2 2 | FROM amazoncorretto:21-al2023-jdk 3 | WORKDIR /usr/src/ab2d-worker 4 | ADD target/worker-*-SNAPSHOT-exe.jar /usr/src/ab2d-worker/worker.jar 5 | ADD target/newrelic/newrelic.jar /usr/src/ab2d-worker/newrelic/newrelic.jar 6 | 7 | # When running in production with one container per EC2 instance these values are acceptable 8 | ENV JVM_INITIAL_RAM=40.0 9 | ENV JVM_MIN_RAM=20.0 10 | ENV JVM_MAX_RAM=80.0 11 | 12 | #Update Packages 13 | RUN yum update -y --security 14 | 15 | #JAVA commands 16 | CMD java \ 17 | -XX:+UseContainerSupport \ 18 | -XX:InitialRAMPercentage=${JVM_INITIAL_RAM} \ 19 | -XX:MinRAMPercentage=${JVM_MIN_RAM} \ 20 | -XX:MaxRAMPercentage=${JVM_MAX_RAM} \ 21 | -javaagent:/usr/src/ab2d-worker/newrelic/newrelic.jar \ 22 | -jar worker.jar 23 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/bfdhealthcheck/BFDHealthCheckJob.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.bfdhealthcheck; 2 | 3 | 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.quartz.DisallowConcurrentExecution; 7 | import org.quartz.JobExecutionContext; 8 | import org.springframework.scheduling.quartz.QuartzJobBean; 9 | 10 | @Slf4j 11 | @RequiredArgsConstructor 12 | @DisallowConcurrentExecution 13 | public class BFDHealthCheckJob extends QuartzJobBean { 14 | 15 | private final BFDHealthCheck bfdHealthCheck; 16 | 17 | @Override 18 | protected void executeInternal(JobExecutionContext jobExecutionContext) { 19 | bfdHealthCheck.checkBFDHealth(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/bfdhealthcheck/HealthCheckData.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.bfdhealthcheck; 2 | 3 | import gov.cms.ab2d.fhir.FhirVersion; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class HealthCheckData { 8 | enum Status { 9 | UP, DOWN 10 | } 11 | private int consecutiveSuccesses; 12 | private int consecutiveFailures; 13 | private FhirVersion version; 14 | private Status status = Status.UP; 15 | 16 | public HealthCheckData(FhirVersion version) { 17 | this.version = version; 18 | } 19 | 20 | public void incrementFailures() { 21 | consecutiveFailures++; 22 | } 23 | 24 | public void incrementSuccesses() { 25 | consecutiveSuccesses++; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/config/AutoScalingService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.config; 2 | 3 | /** 4 | * The service that is responsible for gradual resizing of the patient processor thread pool 5 | * in response to load. See documentation for the implementing class for more details. 6 | */ 7 | public interface AutoScalingService { 8 | 9 | void autoscale(); 10 | 11 | int getCorePoolSize(); 12 | 13 | int getMaxPoolSize(); 14 | 15 | double getScaleToMaxTime(); 16 | } 17 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/ContractProcessingException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor; 2 | 3 | public class ContractProcessingException extends RuntimeException { 4 | 5 | public ContractProcessingException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/ContractProcessor.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor; 2 | 3 | import gov.cms.ab2d.job.model.Job; 4 | import gov.cms.ab2d.job.model.JobOutput; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Execute a job from start to finish. Where the {@link JobProcessor} handles the high level 10 | * phases of a {@link Job}, this class handles the nuts and bolts. For example, loading enrollment, 11 | * queueing requests to BFD, processing request results, etc. 12 | */ 13 | public interface ContractProcessor { 14 | List process(Job job); 15 | } 16 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/EobSearchResult.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | import org.hl7.fhir.instance.model.api.IBaseResource; 6 | 7 | import java.util.List; 8 | 9 | @RequiredArgsConstructor 10 | @Getter 11 | public class EobSearchResult { 12 | private final String jobId; 13 | private final String contractNum; 14 | private final List eobs; 15 | } 16 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/JobCancelledException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor; 2 | 3 | public class JobCancelledException extends RuntimeException { 4 | 5 | public JobCancelledException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/JobPreProcessor.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor; 2 | 3 | import gov.cms.ab2d.job.model.Job; 4 | 5 | public interface JobPreProcessor { 6 | 7 | Job preprocess(String jobUuid); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/JobProcessor.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor; 2 | 3 | import gov.cms.ab2d.job.model.Job; 4 | 5 | public interface JobProcessor { 6 | 7 | Job process(String jobUuid); 8 | } 9 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/JobProgressService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor; 2 | 3 | /** 4 | * Read only API for fetching the current status of a job. 5 | */ 6 | public interface JobProgressService { 7 | 8 | ProgressTracker getStatus(String jobUuid); 9 | } 10 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/JobProgressUpdateService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor; 2 | 3 | /** 4 | * Write only interface for the channel implementation to update jobs. 5 | */ 6 | public interface JobProgressUpdateService { 7 | void addMeasure(String jobUuid, JobMeasure measure, long value); 8 | 9 | /* 10 | * A hack to prime the implementation with a jobguid in order to avoid dealing with distributed computing issues. 11 | * We take advantage of the fact that the actual tracking is done in the same VM as the worker. 12 | * 13 | * If the JopProgress is ever deployed as it's own microservice, then this method goes away and another technique 14 | * would need ot be used to insure consistency. 15 | */ 16 | void initJob(String jobUuid); 17 | } 18 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/PatientClaimsProcessor.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor; 2 | 3 | import java.util.concurrent.Future; 4 | 5 | /** 6 | * Process a single {@link PatientClaimsRequest} at a time. 7 | */ 8 | public interface PatientClaimsProcessor { 9 | Future process(PatientClaimsRequest request); 10 | } 11 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/coverage/CoverageDriverException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor.coverage; 2 | 3 | public class CoverageDriverException extends RuntimeException { 4 | 5 | public CoverageDriverException(String message) { 6 | super(message); 7 | } 8 | 9 | public CoverageDriverException(String message, Throwable cause) { 10 | super(message, cause); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/coverage/CoverageUpdateConfig.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor.coverage; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.ToString; 7 | 8 | @Getter 9 | @AllArgsConstructor 10 | @ToString 11 | public class CoverageUpdateConfig { 12 | 13 | // Number of months into the past to go looking to update 14 | private final int pastMonthsToUpdate; 15 | 16 | // Number of days that job is running 17 | private final int stuckHours; 18 | 19 | private final boolean override; 20 | } 21 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/coverage/CoverageVerificationException.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor.coverage; 2 | 3 | import java.util.List; 4 | 5 | public class CoverageVerificationException extends RuntimeException { 6 | 7 | private final List issues; 8 | 9 | public CoverageVerificationException(String message, List issues) { 10 | super(message); 11 | 12 | this.issues = issues; 13 | } 14 | 15 | public CoverageVerificationException(String message, Throwable cause, List issues) { 16 | super(message, cause); 17 | 18 | this.issues = issues; 19 | } 20 | 21 | public String getAlertMessage() { 22 | return String.join(",\n\t", issues); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/processor/coverage/check/CoverageCheckPredicate.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor.coverage.check; 2 | 3 | import gov.cms.ab2d.contracts.model.ContractDTO; 4 | import gov.cms.ab2d.coverage.model.CoverageCount; 5 | import gov.cms.ab2d.coverage.service.CoverageService; 6 | import java.util.List; 7 | import java.util.Map; 8 | import java.util.function.Predicate; 9 | import lombok.AllArgsConstructor; 10 | 11 | @SuppressWarnings("checkstyle:VisibilityModifier") 12 | @AllArgsConstructor 13 | public abstract class CoverageCheckPredicate implements Predicate { 14 | 15 | protected final CoverageService coverageService; 16 | protected final Map> coverageCounts; 17 | protected final List issues; 18 | } 19 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/service/FileService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.service; 2 | 3 | import java.io.File; 4 | import java.nio.file.Path; 5 | 6 | public interface FileService { 7 | 8 | Path createDirectory(Path outputDir); 9 | 10 | String generateChecksum(File file); 11 | } 12 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/service/JobChannelService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.service; 2 | 3 | import gov.cms.ab2d.worker.processor.JobMeasure; 4 | 5 | public interface JobChannelService { 6 | 7 | void sendUpdate(String jobId, JobMeasure measure, long value); 8 | } 9 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/service/JobChannelServiceImpl.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.service; 2 | 3 | import gov.cms.ab2d.worker.processor.JobMeasure; 4 | import gov.cms.ab2d.worker.processor.JobProgressUpdateService; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Service; 7 | 8 | @Service 9 | @RequiredArgsConstructor 10 | public class JobChannelServiceImpl implements JobChannelService { 11 | 12 | private final JobProgressUpdateService jobProgressUpdateService; 13 | 14 | @Override 15 | public void sendUpdate(String jobUuid, JobMeasure measure, long value) { 16 | jobProgressUpdateService.addMeasure(jobUuid, measure, value); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/service/ShutDownService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.service; 2 | 3 | import java.util.List; 4 | 5 | public interface ShutDownService { 6 | 7 | void resetInProgressJobs(List jobsInProgress); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/service/WorkerService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.service; 2 | 3 | import gov.cms.ab2d.common.service.FeatureEngagement; 4 | import gov.cms.ab2d.job.model.Job; 5 | 6 | public interface WorkerService { 7 | 8 | Job process(String jobId); 9 | 10 | FeatureEngagement getEngagement(); 11 | } 12 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/service/coveragesnapshot/CoverageSnapshotService.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.service.coveragesnapshot; 2 | 3 | import gov.cms.ab2d.snsclient.messages.AB2DServices; 4 | 5 | import java.util.Set; 6 | 7 | public interface CoverageSnapshotService { 8 | 9 | void sendCoverageCounts(AB2DServices services, Set contracts); 10 | 11 | void sendCoverageCounts(AB2DServices services, String contract, int count, int year, int month); 12 | } 13 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/stuckjob/CancelStuckJob.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.stuckjob; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.quartz.DisallowConcurrentExecution; 6 | import org.quartz.JobExecutionContext; 7 | import org.quartz.JobExecutionException; 8 | import org.springframework.scheduling.quartz.QuartzJobBean; 9 | 10 | @Slf4j 11 | @RequiredArgsConstructor 12 | @DisallowConcurrentExecution 13 | public class CancelStuckJob extends QuartzJobBean { 14 | 15 | private final CancelStuckJobsProcessor processor; 16 | 17 | @Override 18 | protected void executeInternal(JobExecutionContext context) throws JobExecutionException { 19 | processor.process(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /worker/src/main/java/gov/cms/ab2d/worker/stuckjob/CancelStuckJobsProcessor.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.stuckjob; 2 | 3 | public interface CancelStuckJobsProcessor { 4 | 5 | void process(); 6 | } 7 | -------------------------------------------------------------------------------- /worker/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /worker/src/test/java/gov/cms/ab2d/worker/TestUtil.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker; 2 | 3 | import gov.cms.ab2d.filter.FilterOutByDate; 4 | 5 | public final class TestUtil { 6 | 7 | private TestUtil() { 8 | } 9 | 10 | public static FilterOutByDate.DateRange getOpenRange() { 11 | return FilterOutByDate.getDateRange(1, 2019, 12, 2030); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /worker/src/test/java/gov/cms/ab2d/worker/bfdhealthcheck/BFDHealthCheckJobTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.bfdhealthcheck; 2 | 3 | import static org.mockito.Mockito.mock; 4 | import static org.mockito.Mockito.verify; 5 | 6 | import org.junit.jupiter.api.Test; 7 | import org.quartz.JobExecutionContext; 8 | 9 | class BFDHealthCheckJobTest { 10 | 11 | @Test 12 | void test() { 13 | BFDHealthCheck bfhHealthCheck = mock(BFDHealthCheck.class); 14 | BFDHealthCheckJob bfdHealthCheckJob = new BFDHealthCheckJob(bfhHealthCheck); 15 | JobExecutionContext jobExecutionContext = mock(JobExecutionContext.class); 16 | bfdHealthCheckJob.executeInternal(jobExecutionContext); 17 | verify(bfhHealthCheck).checkBFDHealth(); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /worker/src/test/java/gov/cms/ab2d/worker/bfdhealthcheck/BFDHealthCheckQuartzSetupTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.bfdhealthcheck; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; 4 | import static org.mockito.Mockito.mock; 5 | import static org.mockito.Mockito.when; 6 | 7 | import org.junit.jupiter.api.Test; 8 | import org.quartz.JobDetail; 9 | import org.quartz.JobKey; 10 | 11 | class BFDHealthCheckQuartzSetupTest { 12 | 13 | @Test 14 | void test() { 15 | String schedule = "0 1 1 ? * *"; 16 | BFDHealthCheckQuartzSetup bfdHealthCheckQuartzSetup = new BFDHealthCheckQuartzSetup(schedule); 17 | JobDetail jobDetail = mock(JobDetail.class); 18 | when(jobDetail.getKey()).thenReturn(new JobKey("name")); 19 | assertDoesNotThrow(() -> { 20 | bfdHealthCheckQuartzSetup.bfdHealthCheckJobDetail(); 21 | bfdHealthCheckQuartzSetup.bfdHealthCheckJobTrigger(jobDetail); 22 | }); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /worker/src/test/java/gov/cms/ab2d/worker/processor/stub/PatientClaimsProcessorStub.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.processor.stub; 2 | 3 | import gov.cms.ab2d.worker.processor.PatientClaimsProcessor; 4 | import gov.cms.ab2d.worker.processor.PatientClaimsRequest; 5 | import gov.cms.ab2d.worker.processor.ProgressTrackerUpdate; 6 | import org.springframework.scheduling.annotation.AsyncResult; 7 | 8 | import java.util.concurrent.Future; 9 | 10 | public class PatientClaimsProcessorStub implements PatientClaimsProcessor { 11 | 12 | @Override 13 | public Future process(PatientClaimsRequest request) { 14 | ProgressTrackerUpdate update = new ProgressTrackerUpdate(); 15 | 16 | update.addEobFetchedCount(1); 17 | update.incPatientProcessCount(); 18 | update.incPatientsWithEobsCount(); 19 | update.addEobProcessedCount(1); 20 | return AsyncResult.forValue(update); 21 | } 22 | } -------------------------------------------------------------------------------- /worker/src/test/java/gov/cms/ab2d/worker/service/ContractWorkerClientTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.service; 2 | 3 | import static org.mockito.Mockito.mock; 4 | import static org.mockito.Mockito.verify; 5 | 6 | import org.junit.jupiter.api.Test; 7 | 8 | import gov.cms.ab2d.common.service.ContractService; 9 | 10 | class ContractWorkerClientTest { 11 | 12 | @Test 13 | void testGetContractByContractNumber() { 14 | ContractService contractService = mock(ContractService.class); 15 | ContractWorkerClient contractWorkerClient = new ContractWorkerClient(contractService); 16 | contractWorkerClient.getContractByContractNumber("1234"); 17 | verify(contractService).getContractByContractNumber("1234"); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /worker/src/test/java/gov/cms/ab2d/worker/service/JobChannelServiceImplTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.service; 2 | 3 | import static org.mockito.Mockito.mock; 4 | import static org.mockito.Mockito.verify; 5 | 6 | import org.junit.jupiter.api.Test; 7 | 8 | import gov.cms.ab2d.worker.processor.JobProgressUpdateService; 9 | 10 | class JobChannelServiceImplTest { 11 | 12 | @Test 13 | void testSendUpdate() { 14 | JobProgressUpdateService jobProgressUpdateService = mock(JobProgressUpdateService.class); 15 | JobChannelServiceImpl jobChannelServiceImpl = new JobChannelServiceImpl(jobProgressUpdateService); 16 | jobChannelServiceImpl.sendUpdate(null, null, 0); 17 | verify(jobProgressUpdateService).addMeasure(null, null, 0); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /worker/src/test/java/gov/cms/ab2d/worker/service/JobChannelStubServiceImpl.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.service; 2 | 3 | import gov.cms.ab2d.worker.processor.JobMeasure; 4 | import gov.cms.ab2d.worker.processor.JobProgressUpdateService; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.context.annotation.Primary; 7 | import org.springframework.stereotype.Service; 8 | 9 | @RequiredArgsConstructor 10 | @Primary // Insures selection for tests, this bean is not there for deployed code. 11 | @Service 12 | public class JobChannelStubServiceImpl implements JobChannelService { 13 | 14 | private final JobProgressUpdateService jobProgressUpdateService; 15 | 16 | @Override 17 | public void sendUpdate(String jobUuid, JobMeasure measure, long value) { 18 | jobProgressUpdateService.addMeasure(jobUuid, measure, value); 19 | } 20 | } 21 | 22 | -------------------------------------------------------------------------------- /worker/src/test/java/gov/cms/ab2d/worker/stuckjob/CancelStuckJobTest.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.stuckjob; 2 | 3 | import static org.mockito.Mockito.mock; 4 | import static org.mockito.Mockito.verify; 5 | 6 | import org.junit.jupiter.api.Test; 7 | import org.quartz.JobExecutionContext; 8 | 9 | class CancelStuckJobTest { 10 | 11 | @Test 12 | void test() throws Exception { 13 | CancelStuckJobsProcessor cancelStuckJobsProcessor = mock(CancelStuckJobsProcessor.class); 14 | JobExecutionContext jobExecutionContext = mock(JobExecutionContext.class); 15 | CancelStuckJob cancelStuckJob = new CancelStuckJob(cancelStuckJobsProcessor); 16 | cancelStuckJob.executeInternal(jobExecutionContext); 17 | verify(cancelStuckJobsProcessor).process(); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /worker/src/test/java/gov/cms/ab2d/worker/util/ContractWorkerClientMock.java: -------------------------------------------------------------------------------- 1 | package gov.cms.ab2d.worker.util; 2 | 3 | import gov.cms.ab2d.contracts.model.ContractDTO; 4 | import gov.cms.ab2d.contracts.model.Contract; 5 | import gov.cms.ab2d.worker.service.ContractWorkerClient; 6 | import java.time.OffsetDateTime; 7 | import org.springframework.context.annotation.Primary; 8 | import org.springframework.stereotype.Component; 9 | 10 | @Primary 11 | @Component 12 | public class ContractWorkerClientMock extends ContractWorkerClient { 13 | 14 | public ContractWorkerClientMock() { 15 | super(null); 16 | } 17 | 18 | 19 | public ContractDTO getContractByContractNumber(String contractNumber) { 20 | return new ContractDTO(null, contractNumber, contractNumber, OffsetDateTime.now(), Contract.ContractType.NORMAL, 0, 0); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /worker/src/test/resources/bb.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CMSgov/ab2d/9e6542e203bda6d91ead143e8602545e151e8081/worker/src/test/resources/bb.keystore -------------------------------------------------------------------------------- /worker/src/test/resources/file.txt: -------------------------------------------------------------------------------- 1 | some text 2 | --------------------------------------------------------------------------------