diff --git a/gpcc-mocks/src/main/java/uk/nhs/adaptors/gpccmocks/sds/SdsController.java b/gpcc-mocks/src/main/java/uk/nhs/adaptors/gpccmocks/sds/SdsController.java index 98e336ff..c2d3e47d 100644 --- a/gpcc-mocks/src/main/java/uk/nhs/adaptors/gpccmocks/sds/SdsController.java +++ b/gpcc-mocks/src/main/java/uk/nhs/adaptors/gpccmocks/sds/SdsController.java @@ -1,6 +1,5 @@ package uk.nhs.adaptors.gpccmocks.sds; -import static org.springframework.http.HttpStatus.ACCEPTED; import static org.springframework.http.HttpStatus.OK; import static uk.nhs.adaptors.gpccmocks.common.ControllerHelpers.getHostAndPortFromRequest; @@ -13,7 +12,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import lombok.RequiredArgsConstructor; diff --git a/service/build.gradle b/service/build.gradle index aa3d6eb2..9cbca724 100644 --- a/service/build.gradle +++ b/service/build.gradle @@ -38,6 +38,9 @@ dependencies { implementation "org.springframework.cloud:spring-cloud-starter-gateway" implementation "ca.uhn.hapi.fhir:hapi-fhir-structures-dstu3:8.4.0" implementation "com.heroku.sdk:env-keystore:1.1.12" + implementation 'com.github.spullara.mustache.java:compiler:0.9.14' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' implementation "org.apache.commons:commons-lang3:3.19.0" implementation 'org.jetbrains:annotations:26.0.2' diff --git a/service/src/intTest/java/uk/nhs/adaptors/gpc/consumer/sds/SdsClientComponentTest.java b/service/src/intTest/java/uk/nhs/adaptors/gpc/consumer/sds/SdsClientComponentTest.java index 7be39ec8..ace84f29 100644 --- a/service/src/intTest/java/uk/nhs/adaptors/gpc/consumer/sds/SdsClientComponentTest.java +++ b/service/src/intTest/java/uk/nhs/adaptors/gpc/consumer/sds/SdsClientComponentTest.java @@ -36,6 +36,7 @@ import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -46,6 +47,7 @@ import com.github.tomakehurst.wiremock.client.WireMock; import reactor.core.publisher.Mono; +import uk.nhs.adaptors.gpc.consumer.common.OperationOutcomes; import uk.nhs.adaptors.gpc.consumer.common.ResourceReader; import uk.nhs.adaptors.gpc.consumer.gpc.exception.GpConnectException; import uk.nhs.adaptors.gpc.consumer.sds.configuration.SdsConfiguration; diff --git a/service/src/main/java/uk/nhs/adaptors/gpc/consumer/common/OperationOutcomeModel.java b/service/src/main/java/uk/nhs/adaptors/gpc/consumer/common/OperationOutcomeModel.java new file mode 100644 index 00000000..13c420da --- /dev/null +++ b/service/src/main/java/uk/nhs/adaptors/gpc/consumer/common/OperationOutcomeModel.java @@ -0,0 +1,12 @@ +package uk.nhs.adaptors.gpc.consumer.common; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class OperationOutcomeModel { + private String fhirCode; + private String spineCode; + private String message; +} diff --git a/service/src/main/java/uk/nhs/adaptors/gpc/consumer/common/OperationOutcomes.java b/service/src/main/java/uk/nhs/adaptors/gpc/consumer/common/OperationOutcomes.java new file mode 100644 index 00000000..7870864d --- /dev/null +++ b/service/src/main/java/uk/nhs/adaptors/gpc/consumer/common/OperationOutcomes.java @@ -0,0 +1,18 @@ +package uk.nhs.adaptors.gpc.consumer.common; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +public class OperationOutcomes { + public static final String OPERATION_OUTCOME = "operationOutcome"; + + public static ResponseEntity internalServerError(String message) { + var model = OperationOutcomeModel.builder() + .fhirCode("exception") + .spineCode("INTERNAL_SERVER_ERROR") + .message(message) + .build(); + var body = TemplateUtils.fillTemplate(OPERATION_OUTCOME, model); + return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR); + } +} \ No newline at end of file diff --git a/service/src/main/java/uk/nhs/adaptors/gpc/consumer/common/TemplateUtils.java b/service/src/main/java/uk/nhs/adaptors/gpc/consumer/common/TemplateUtils.java new file mode 100644 index 00000000..5f0326c9 --- /dev/null +++ b/service/src/main/java/uk/nhs/adaptors/gpc/consumer/common/TemplateUtils.java @@ -0,0 +1,32 @@ +package uk.nhs.adaptors.gpc.consumer.common; + +import com.github.mustachejava.DefaultMustacheFactory; +import com.github.mustachejava.Mustache; +import com.github.mustachejava.MustacheFactory; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.io.StringWriter; + +@Slf4j +public class TemplateUtils { + private static final String TEMPLATES_RESOURCE_ROOT = "templates"; + private static final String TEMPLATES_EXTENSION = ".mustache"; + private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TemplateUtils.class); + + @SneakyThrows + public static String fillTemplate(String templateName, Object content) { + var template = loadTemplate(templateName + TEMPLATES_EXTENSION); + StringWriter writer = new StringWriter(); + template.execute(writer, content).flush(); + var output = writer.toString(); + + log.debug("Template {} with parameters {} produced output\n{}", template, content, output); + return output; + } + + private static Mustache loadTemplate(String templateName) { + MustacheFactory mustacheFactory = new DefaultMustacheFactory(TEMPLATES_RESOURCE_ROOT); + return mustacheFactory.compile(templateName); + } +} \ No newline at end of file diff --git a/service/src/main/java/uk/nhs/adaptors/gpc/consumer/sds/SdsClient.java b/service/src/main/java/uk/nhs/adaptors/gpc/consumer/sds/SdsClient.java index dbab9f3e..07021eb9 100644 --- a/service/src/main/java/uk/nhs/adaptors/gpc/consumer/sds/SdsClient.java +++ b/service/src/main/java/uk/nhs/adaptors/gpc/consumer/sds/SdsClient.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient.RequestHeadersSpec; @@ -17,6 +18,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; +import uk.nhs.adaptors.gpc.consumer.common.OperationOutcomes; import uk.nhs.adaptors.gpc.consumer.sds.builder.SdsRequestBuilder; @Component @@ -150,6 +152,18 @@ private Mono performRequest(RequestHeadersSpec callForMigrateStructuredRecordWithOutcome(String fromOdsCode, String correlationId) { + try { + var sdsDeviceRequest = sdsRequestBuilder.buildMigrateStructuredRecordAsDeviceRequest(fromOdsCode, correlationId); + var sdsEndpointRequest = sdsRequestBuilder.buildMigrateStructuredRecordEndpointRequest(fromOdsCode, correlationId); + + var data = retrieveData(sdsDeviceRequest, sdsEndpointRequest).block(); + return ResponseEntity.ok("Success"); + } catch (Exception ex) { + return OperationOutcomes.internalServerError("Internal error: " + ex.getMessage()); + } + } + @Builder @Getter @EqualsAndHashCode