diff --git a/build.gradle b/build.gradle index 8b9f71c..05e5bdb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.springframework.boot' version "2.7.6" + id 'org.springframework.boot' version '3.2.8' id 'com.jfrog.artifactory' version '4.33.1' apply false id "org.sonarqube" version "4.1.0.3113" id "gov.cms.ab2d.plugin" version "1.0.2" @@ -8,43 +8,43 @@ plugins { id 'org.cyclonedx.bom' version '1.7.4' apply true } -version="1.0.1" +version="2.0.0" group = "gov.cms.ab2d" ext { - springCloudAwsVersion = '2.4.4' + lombokVersion = '1.18.34' + springCloudAwsVersion = '3.1.1' + springBootVersion='3.2.8' + testContainerVersion='1.20.1' } allprojects { apply plugin: "org.cyclonedx.bom" dependencies { - implementation 'org.springframework.boot:spring-boot-starter-quartz:2.7.6' + implementation 'gov.cms.ab2d:ab2d-events-client:3.2.5' + implementation 'gov.cms.ab2d:ab2d-contracts-client:2.0.0' + implementation 'gov.cms.ab2d:ab2d-properties-client:2.0.0' + implementation "io.awspring.cloud:spring-cloud-aws:${springCloudAwsVersion}" + implementation "io.awspring.cloud:spring-cloud-aws-dependencies:${springCloudAwsVersion}" + implementation "io.awspring.cloud:spring-cloud-aws-starter:${springCloudAwsVersion}" + implementation "io.awspring.cloud:spring-cloud-aws-starter-sqs:${springCloudAwsVersion}" implementation 'net.logstash.logback:logstash-logback-encoder:7.3' - implementation 'org.springframework.boot:spring-boot-starter-webflux:2.7.6' - testImplementation 'org.springframework.boot:spring-boot-starter-test:2.7.6' - testImplementation 'org.mockito:mockito-inline:5.2.0' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa:2.7.6' - implementation 'org.springframework.boot:spring-boot-starter-validation:2.7.6' - implementation 'org.springframework.boot:spring-boot-starter-web:2.7.6' + implementation 'org.liquibase:liquibase-core:4.23.0' implementation 'org.postgresql:postgresql:42.7.3' - implementation 'org.liquibase:liquibase-core:4.22.0' - implementation 'gov.cms.ab2d:ab2d-events-client:1.12.9' - implementation 'gov.cms.ab2d:ab2d-contracts-client:1.2.4' - implementation 'gov.cms.ab2d:ab2d-properties-client:1.2.5' - implementation "io.awspring.cloud:spring-cloud-aws-dependencies:$springCloudAwsVersion" - implementation "io.awspring.cloud:spring-cloud-aws-core:${springCloudAwsVersion}" - implementation "io.awspring.cloud:spring-cloud-aws-autoconfigure:${springCloudAwsVersion}" - implementation "io.awspring.cloud:spring-cloud-starter-aws:${springCloudAwsVersion}" - implementation "io.awspring.cloud:spring-cloud-aws-messaging:${springCloudAwsVersion}" - implementation 'org.springdoc:springdoc-openapi-ui:1.7.0' - testImplementation 'org.testcontainers:testcontainers:1.18.1' - testImplementation 'org.testcontainers:postgresql:1.18.1' - testImplementation 'org.testcontainers:junit-jupiter:1.18.1' - testImplementation 'org.testcontainers:localstack:1.18.1' - testImplementation 'org.projectlombok:lombok:1.18.28' - compileOnly 'org.projectlombok:lombok:1.18.26' - implementation(platform(annotationProcessor("org.projectlombok:lombok:1.18.26"))) - annotationProcessor("org.projectlombok:lombok:1.18.26") + implementation "org.springframework.boot:spring-boot-starter-quartz:${springBootVersion}" + implementation "org.springframework.boot:spring-boot-starter-webflux:${springBootVersion}" + implementation "org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}" + implementation "org.springframework.boot:spring-boot-starter-validation:${springBootVersion}" + implementation "org.springframework.boot:spring-boot-starter-web:${springBootVersion}" + implementation 'org.springframework:spring-context:6.2.1' + implementation 'org.springdoc:springdoc-openapi-ui:1.8.0' + testImplementation 'org.mockito:mockito-inline:5.2.0' + testImplementation "org.springframework.boot:spring-boot-starter-test:${springBootVersion}" + testImplementation "org.testcontainers:localstack:${testContainerVersion}" + testImplementation "org.projectlombok:lombok:${lombokVersion}" + compileOnly "org.projectlombok:lombok:${lombokVersion}" + implementation(platform(annotationProcessor("org.projectlombok:lombok:${lombokVersion}"))) + annotationProcessor("org.projectlombok:lombok:${lombokVersion}") } cyclonedxBom { diff --git a/src/main/java/gov/cms/ab2d/contracts/controller/ErrorHandler.java b/src/main/java/gov/cms/ab2d/contracts/controller/ErrorHandler.java index 1ddc43c..5e234c6 100644 --- a/src/main/java/gov/cms/ab2d/contracts/controller/ErrorHandler.java +++ b/src/main/java/gov/cms/ab2d/contracts/controller/ErrorHandler.java @@ -5,7 +5,7 @@ import gov.cms.ab2d.eventclient.events.ApiResponseEvent; import gov.cms.ab2d.eventclient.events.ErrorEvent; import java.util.HashMap; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/gov/cms/ab2d/contracts/controller/RemoteTimeoutException.java b/src/main/java/gov/cms/ab2d/contracts/controller/RemoteTimeoutException.java new file mode 100644 index 0000000..f7e23f3 --- /dev/null +++ b/src/main/java/gov/cms/ab2d/contracts/controller/RemoteTimeoutException.java @@ -0,0 +1,7 @@ +package gov.cms.ab2d.contracts.controller; + +public class RemoteTimeoutException extends RuntimeException { + public RemoteTimeoutException(String msg) { + super(msg); + } +} \ No newline at end of file diff --git a/src/main/java/gov/cms/ab2d/contracts/model/Property.java b/src/main/java/gov/cms/ab2d/contracts/model/Property.java index 9e3b2e6..3579a85 100644 --- a/src/main/java/gov/cms/ab2d/contracts/model/Property.java +++ b/src/main/java/gov/cms/ab2d/contracts/model/Property.java @@ -5,13 +5,13 @@ import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; import java.time.OffsetDateTime; @Entity diff --git a/src/main/java/gov/cms/ab2d/contracts/service/HPMSAuthServiceImpl.java b/src/main/java/gov/cms/ab2d/contracts/service/HPMSAuthServiceImpl.java index 0701249..715bec9 100644 --- a/src/main/java/gov/cms/ab2d/contracts/service/HPMSAuthServiceImpl.java +++ b/src/main/java/gov/cms/ab2d/contracts/service/HPMSAuthServiceImpl.java @@ -1,5 +1,6 @@ package gov.cms.ab2d.contracts.service; +import gov.cms.ab2d.contracts.controller.RemoteTimeoutException; import gov.cms.ab2d.eventclient.clients.EventClient; import gov.cms.ab2d.eventclient.clients.SQSEventClient; import gov.cms.ab2d.eventclient.events.ErrorEvent; @@ -9,13 +10,12 @@ import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseCookie; -import org.springframework.remoting.RemoteTimeoutException; import org.springframework.stereotype.Service; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.client.WebClient; diff --git a/src/main/java/gov/cms/ab2d/contracts/service/HPMSFetcherImpl.java b/src/main/java/gov/cms/ab2d/contracts/service/HPMSFetcherImpl.java index cc2da3f..62c9080 100644 --- a/src/main/java/gov/cms/ab2d/contracts/service/HPMSFetcherImpl.java +++ b/src/main/java/gov/cms/ab2d/contracts/service/HPMSFetcherImpl.java @@ -8,7 +8,7 @@ import java.util.Arrays; import java.util.List; import java.util.Set; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.ParameterizedTypeReference; diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 321a530..134257f 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -3,3 +3,5 @@ databaseChangeLog: file: db/changelog/v2023/create_contract.sql - include: file: db/changelog/v2023/contract-service-coverage-info.sql + - include: + file: db/changelog/v2025/add_sequence.sql diff --git a/src/main/resources/db/changelog/v2025/add_sequence.sql b/src/main/resources/db/changelog/v2025/add_sequence.sql new file mode 100644 index 0000000..f45990e --- /dev/null +++ b/src/main/resources/db/changelog/v2025/add_sequence.sql @@ -0,0 +1,3 @@ +CREATE SEQUENCE IF NOT EXISTS contract.contract_seq START 1 INCREMENT BY 50; +SELECT setval('contract.contract_seq', COALESCE((SELECT MAX(id) FROM contract.contract), 1), true); +ALTER TABLE contract.contract ALTER COLUMN id SET DEFAULT nextval('contract.contract_seq'); diff --git a/src/test/java/gov/cms/ab2d/contracts/service/HPMSMockedAuthTest.java b/src/test/java/gov/cms/ab2d/contracts/service/HPMSMockedAuthTest.java index ab75665..5fd6c46 100644 --- a/src/test/java/gov/cms/ab2d/contracts/service/HPMSMockedAuthTest.java +++ b/src/test/java/gov/cms/ab2d/contracts/service/HPMSMockedAuthTest.java @@ -1,6 +1,6 @@ package gov.cms.ab2d.contracts.service; -import gov.cms.ab2d.contracts.SpringBootApp; +import gov.cms.ab2d.contracts.controller.RemoteTimeoutException; import gov.cms.ab2d.contracts.util.AB2DPostgresqlContainer; import gov.cms.ab2d.eventclient.clients.SQSEventClient; import gov.cms.ab2d.contracts.hmsapi.HPMSAuthResponse; @@ -13,7 +13,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.remoting.RemoteTimeoutException; + import org.springframework.test.context.TestPropertySource; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClientResponseException; diff --git a/src/test/java/gov/cms/ab2d/contracts/util/AB2DLocalstackContainer.java b/src/test/java/gov/cms/ab2d/contracts/util/AB2DLocalstackContainer.java index 4eb5b63..9265ec6 100644 --- a/src/test/java/gov/cms/ab2d/contracts/util/AB2DLocalstackContainer.java +++ b/src/test/java/gov/cms/ab2d/contracts/util/AB2DLocalstackContainer.java @@ -8,7 +8,7 @@ @Slf4j public class AB2DLocalstackContainer extends LocalStackContainer { - private static final DockerImageName IMAGE_VERSION = DockerImageName.parse("localstack/localstack:1.0.2"); + private static final DockerImageName IMAGE_VERSION = DockerImageName.parse("localstack/localstack:3.5.0"); public AB2DLocalstackContainer() { super(IMAGE_VERSION); @@ -22,6 +22,6 @@ public void start() { super.withServices(Service.SQS); super.start(); System.setProperty("AWS_SQS_URL", - "localhost:" + this.getMappedPort(EnabledService.named("SQS").getPort())); + "http://localhost:" + this.getMappedPort(EnabledService.named("SQS").getPort())); } } diff --git a/src/test/java/gov/cms/ab2d/contracts/util/AB2DSQSMockConfig.java b/src/test/java/gov/cms/ab2d/contracts/util/AB2DSQSMockConfig.java index 65abb43..3995cd9 100644 --- a/src/test/java/gov/cms/ab2d/contracts/util/AB2DSQSMockConfig.java +++ b/src/test/java/gov/cms/ab2d/contracts/util/AB2DSQSMockConfig.java @@ -1,14 +1,11 @@ package gov.cms.ab2d.contracts.util; -import com.amazonaws.services.sqs.AmazonSQSAsync; import gov.cms.ab2d.eventclient.clients.SQSEventClient; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.test.mock.mockito.MockBean; -import io.awspring.cloud.messaging.config.SimpleMessageListenerContainerFactory; -import io.awspring.cloud.messaging.listener.QueueMessageHandler; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; +import software.amazon.awssdk.services.sqs.SqsAsyncClient; import static org.mockito.Mockito.mock; @@ -22,26 +19,13 @@ public class AB2DSQSMockConfig { } @MockBean - AmazonSQSAsync amazonSQSAsync; + SqsAsyncClient amazonSQSAsync; @MockBean SQSEventClient sQSEventClient; - @Bean - @Primary - public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory() { - SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory(); - factory.setAutoStartup(false); - return factory; - } - - @Bean - public QueueMessageHandler messageHandler() { - return mock(QueueMessageHandler.class); - } - @Bean("mockAmazonSQS") - public AmazonSQSAsync amazonSQSAsync() { - return mock(AmazonSQSAsync.class); + public SqsAsyncClient amazonSQSAsync() { + return mock(SqsAsyncClient.class); } } \ No newline at end of file diff --git a/src/test/resources/init.sql b/src/test/resources/init.sql index 42b2b16..eeb8489 100644 --- a/src/test/resources/init.sql +++ b/src/test/resources/init.sql @@ -20,4 +20,5 @@ ALTER TABLE ONLY contract.contract ALTER TABLE ONLY contract.contract ADD CONSTRAINT contract_pkey PRIMARY KEY (id); -CREATE SEQUENCE hibernate_sequence START 1; \ No newline at end of file +CREATE SEQUENCE hibernate_sequence START 1; +CREATE SEQUENCE IF NOT EXISTS contract_seq START 1; \ No newline at end of file