Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/service-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ jobs:
is_deployment: ${{ github.ref == 'refs/heads/main' }}
requires_localstack: true
image_prefix: repo/
java_version: "25"
ecr_alias: repo/re-registration-service
secrets: inherit

Expand Down
2 changes: 1 addition & 1 deletion services/re-registration-service/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM eclipse-temurin:21-jre-alpine-3.23
FROM eclipse-temurin:25-jre-alpine-3.23

RUN apk update && \
apk -u list && \
Expand Down
98 changes: 30 additions & 68 deletions services/re-registration-service/build.gradle
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
plugins {
id 'org.springframework.boot' version '3.2.1'
id 'io.spring.dependency-management' version '1.1.4'
id 'org.springframework.boot' version '4.0.3'
id 'io.spring.dependency-management' version '1.1.7'
id 'java'
id 'jacoco'
id 'com.github.spotbugs' version '6.0.6'
id "org.sonarqube" version "4.4.1.3373"
}

group = 'uk.nhs.prm.repo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '21'

configurations {
compileOnly {
Expand All @@ -21,57 +19,58 @@ repositories {
mavenCentral()
}

java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
}
}

//Without this task two jars are built, the additional "-plain.jar" is not needed
// for more details refer to: https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable.and-plain-archives
jar {
enabled = false
}

dependencies {
implementation('com.google.guava:guava') { version { strictly '32.1.3-jre' } }

implementation('org.yaml:snakeyaml') { version { strictly '2.2' } }

implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'

implementation('io.netty:netty-buffer') { version { strictly '4.1.104.Final' } }
implementation('io.netty:netty-codec') { version { strictly '4.1.104.Final' } }
implementation('io.netty:netty-codec-http') { version { strictly '4.1.104.Final' } }
implementation('io.netty:netty-codec-http2') { version { strictly '4.1.104.Final' } }
implementation('io.netty:netty-common') { version { strictly '4.1.104.Final' } }
implementation('io.netty:netty-handler') { version { strictly '4.1.104.Final' } }
implementation('io.netty:netty-resolver') { version { strictly '4.1.104.Final' } }
implementation('io.netty:netty-transport') { version { strictly '4.1.104.Final' } }
implementation('io.netty:netty-transport-classes-epoll') { version { strictly '4.1.104.Final' } }
implementation('io.netty:netty-transport-native-unix-common') { version { strictly '4.1.104.Final' } }
implementation 'org.yaml:snakeyaml:2.5'

implementation('io.netty:netty-buffer') { version { strictly '4.2.9.Final' } }
implementation('io.netty:netty-codec') { version { strictly '4.2.9.Final' } }
implementation('io.netty:netty-codec-http') { version { strictly '4.2.9.Final' } }
implementation('io.netty:netty-codec-http2') { version { strictly '4.2.9.Final' } }
implementation('io.netty:netty-common') { version { strictly '4.2.9.Final' } }
implementation('io.netty:netty-handler') { version { strictly '4.2.9.Final' } }
implementation('io.netty:netty-resolver') { version { strictly '4.2.9.Final' } }
implementation('io.netty:netty-transport') { version { strictly '4.2.9.Final' } }
implementation('io.netty:netty-transport-classes-epoll') { version { strictly '4.2.9.Final' } }
implementation('io.netty:netty-transport-native-unix-common') { version { strictly '4.2.9.Final' } }

implementation 'com.amazonaws:amazon-sqs-java-messaging-lib:1.1.2'
implementation 'com.fasterxml.jackson.core:jackson-databind'

implementation platform('software.amazon.awssdk:bom:2.18.41')
implementation 'com.amazonaws:amazon-sqs-java-messaging-lib:2.1.4'

implementation platform('software.amazon.awssdk:bom:2.41.14')
implementation 'software.amazon.awssdk:cloudwatch'
implementation 'software.amazon.awssdk:sqs'
implementation 'software.amazon.awssdk:sns'
implementation 'software.amazon.awssdk:dynamodb'

implementation group: 'javax.inject', name: 'javax.inject', version: '1'
implementation 'org.springframework:spring-jms:5.3.19'
implementation 'com.google.code.gson:gson:2.10.1'
implementation 'io.github.resilience4j:resilience4j-retry:1.7.1'
implementation 'com.google.code.gson:gson:2.13.2'
implementation 'io.github.resilience4j:resilience4j-retry:2.3.0'

implementation 'net.logstash.logback:logstash-logback-encoder:7.2'
implementation 'net.logstash.logback:logstash-logback-encoder:9.0'

compileOnly 'org.projectlombok:lombok:1.18.24'
compileOnly 'org.projectlombok:lombok:1.18.42'
annotationProcessor 'org.projectlombok:lombok'

implementation 'com.github.spotbugs:spotbugs-annotations:4.8.3'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.boot:spring-boot-test'

testImplementation "org.mockito:mockito-core:3.+"
testImplementation 'org.wiremock:wiremock-standalone:3.3.1'
testImplementation 'org.awaitility:awaitility:4.2.0'
testImplementation 'org.wiremock:wiremock-standalone:3.13.2'
testImplementation 'org.awaitility:awaitility:4.3.0'
}

test {
Expand Down Expand Up @@ -129,43 +128,6 @@ jacocoTestCoverageVerification {
}
}

spotbugs {
toolVersion = '4.8.3'
}

spotbugsMain {
ignoreFailures = true
reports {
html {
enabled = true
destination = file("$buildDir/reports/spotbugs/main/spotbugs.html")
stylesheet = 'fancy-hist.xsl'
}
}
}

spotbugsTest {
ignoreFailures = true
reports {
html {
enabled = true
destination = file("$buildDir/reports/spotbugs/test/spotbugs.html")
stylesheet = 'fancy-hist.xsl'
}
}
}

spotbugsIntegration {
ignoreFailures = true
reports {
html {
enabled = true
destination = file("$buildDir/reports/spotbugs/integration/spotbugs.html")
stylesheet = 'fancy-hist.xsl'
}
}
}

sonar {
properties {
property "sonar.projectKey", "NHSDigital_orphaned-record-continuity"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
services:
localstack:
container_name: "localstack-re-registration-service"
image: localstack/localstack
image: localstack/localstack:4.14.0
ports:
- "4566:4566"
network_mode: bridge
Expand Down
3 changes: 1 addition & 2 deletions services/re-registration-service/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
version: "2.2"
services:
default:
links:
- localstack:localstack
localstack:
image: localstack/localstack
image: localstack/localstack:4.14.0
ports:
- "4566:4566"
environment:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package uk.nhs.prm.repo.re_registration;

import com.amazonaws.services.sqs.AmazonSQSAsync;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -9,6 +8,7 @@
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import software.amazon.awssdk.services.sqs.SqsClient;
import uk.nhs.prm.repo.re_registration.data.ActiveSuspensionsDb;
import uk.nhs.prm.repo.re_registration.infra.LocalStackAwsConfig;
import uk.nhs.prm.repo.re_registration.model.ActiveSuspensionsMessage;
Expand All @@ -27,7 +27,7 @@
@ContextConfiguration(classes = LocalStackAwsConfig.class)
public class ActiveSuspensionsIntegrationTest {
@Autowired
private AmazonSQSAsync amazonSQSAsync;
private SqsClient sqs;

@Autowired
ActiveSuspensionsDb activeSuspensionsDb;
Expand All @@ -38,9 +38,6 @@ public class ActiveSuspensionsIntegrationTest {
@Value("${aws.reRegistrationsQueueName}")
private String reRegistrationsQueueName;

@Autowired
private AmazonSQSAsync sqs;

private static final String NHS_NUMBER = "0987654321";
private static final String PREVIOUS_ODS_CODE = "OLD001";
private static final String NEWLY_REGISTERED_ODS_CODE = "NEW001";
Expand Down Expand Up @@ -77,8 +74,8 @@ void shouldDeleteRecordFromActiveSuspensionsDbWhenRecordFoundByNhsNumber() {
}

private void sendMessage(String queueName, String messageBody) {
var queueUrl = amazonSQSAsync.getQueueUrl(queueName).getQueueUrl();
amazonSQSAsync.sendMessage(queueUrl, messageBody);
var queueUrl = sqs.getQueueUrl(builder -> builder.queueName(queueName)).queueUrl();
sqs.sendMessage(builder -> builder.queueUrl(queueUrl).messageBody(messageBody));
}

private String getActiveSuspensionsMessage() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package uk.nhs.prm.repo.re_registration;

import com.amazonaws.services.sqs.AmazonSQSAsync;
import com.amazonaws.services.sqs.model.CreateQueueRequest;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -12,13 +8,18 @@
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;
import software.amazon.awssdk.services.sqs.model.Message;
import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;
import uk.nhs.prm.repo.re_registration.infra.LocalStackAwsConfig;
import uk.nhs.prm.repo.re_registration.logging.TestLogAppender;
import uk.nhs.prm.repo.re_registration.message_publishers.ReRegistrationAuditPublisher;
import uk.nhs.prm.repo.re_registration.model.ReRegistrationEvent;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

Expand All @@ -32,26 +33,22 @@
public class ReRegistrationsIntegrationTest {

@Autowired
private AmazonSQSAsync amazonSQSAsync;
private SqsClient sqs;

@Autowired
ReRegistrationAuditPublisher publisher;

@Value("${aws.reRegistrationsQueueName}")
private String reRegistrationsQueueName;


private String getReRegistrationsEvent() {
return new ReRegistrationEvent("1234567890", "ABC123", UUID.randomUUID().toString(), "2017-11-01T15:00:33+00:00").toJsonString();
}

private void createQueue(String queueName) {
CreateQueueRequest createQueueRequest = new CreateQueueRequest();
createQueueRequest.setQueueName(queueName);
HashMap<String, String> attributes = new HashMap<>();
createQueueRequest.withAttributes(attributes);
amazonSQSAsync.createQueue(reRegistrationsQueueName);

sqs.createQueue(CreateQueueRequest.builder()
.queueName(queueName)
.build());
}

@Test
Expand All @@ -68,29 +65,24 @@ void shouldReceiveAndLogAndAcknowledgeReRegistrationsEvent() {
assertThat(receiveLog).isNotNull();
});


var messages = receiveMessages(reRegistrationsQueueName);

assertThat(messages).isEmpty();
}


private void sendMessage(String queueName, String messageBody) {
var queueUrl = getQueueUrl(queueName);
amazonSQSAsync.sendMessage(queueUrl, messageBody);
sqs.sendMessage(builder -> builder.queueUrl(queueUrl).messageBody(messageBody));
}

private String getQueueUrl(String queueName) {
return amazonSQSAsync.getQueueUrl(queueName).getQueueUrl();
return sqs.getQueueUrl(builder -> builder.queueName(queueName)).queueUrl();
}

@Test
private List<Message> receiveMessages(String queueName) {
String queueUrl = amazonSQSAsync.getQueueUrl(queueName).getQueueUrl();

var receiveMessageRequest = new ReceiveMessageRequest().withQueueUrl(queueUrl);
return amazonSQSAsync.receiveMessage(receiveMessageRequest).getMessages();
String queueUrl = getQueueUrl(queueName);
var receiveMessageRequest = ReceiveMessageRequest.builder()
.queueUrl(queueUrl)
.build();
return sqs.receiveMessage(receiveMessageRequest).messages();
}

}

Loading
Loading