Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Results Metadata Update #972

Merged
merged 10 commits into from
Mar 27, 2024
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package gov.hhs.cdc.trustedintermediary.e2e


import spock.lang.Specification

import java.nio.file.Files
Expand All @@ -17,7 +18,6 @@ class MetadataTest extends Specification {
given:
def expectedStatusCode = 200
def inboundSubmissionId = UUID.randomUUID().toString()
def outboundSubmissionId = "1234567890"
saquino0827 marked this conversation as resolved.
Show resolved Hide resolved
def orderClient = new EndpointClient("/v1/etor/orders")
def labOrderJsonFileString = Files.readString(Path.of("../examples/Test/Orders/002_ORM_O01.fhir"))

Expand All @@ -29,8 +29,9 @@ class MetadataTest extends Specification {

when:
def inboundMetadataResponse = metadataClient.get(inboundSubmissionId, true)
def outboundMetadataResponse = metadataClient.get(outboundSubmissionId, true)
saquino0827 marked this conversation as resolved.
Show resolved Hide resolved
def inboundParsedJsonBody = JsonParsing.parseContent(inboundMetadataResponse)
def outboundSubmissionId = inboundParsedJsonBody.issue[8].diagnostics
def outboundMetadataResponse = metadataClient.get(outboundSubmissionId, true)
def outboundParsedJsonBody = JsonParsing.parseContent(outboundMetadataResponse)

then:
Expand All @@ -42,10 +43,13 @@ class MetadataTest extends Specification {
[
"sender name",
"receiver name",
"order ingestion",
"ingestion",
"payload hash",
"delivery status",
"status message"
"status message",
"message type",
"outbound submission id",
"inbound submission id"
].each { String metadataKey ->
def issue = (inboundParsedJsonBody.issue as List).find( {issue -> issue.details.text == metadataKey })
assert issue != null
Expand All @@ -58,7 +62,6 @@ class MetadataTest extends Specification {
given:
def expectedStatusCode = 200
def inboundSubmissionId = UUID.randomUUID().toString()
def outboundSubmissionId = "1234567890"
def resultClient = new EndpointClient("/v1/etor/results")
def labResult = Files.readString(Path.of("../examples/Test/Results/001_ORU_R01.fhir"))

Expand All @@ -70,8 +73,9 @@ class MetadataTest extends Specification {

when:
def inboundMetadataResponse = metadataClient.get(inboundSubmissionId, true)
def outboundMetadataResponse = metadataClient.get(outboundSubmissionId, true)
def inboundParsedJsonBody = JsonParsing.parseContent(inboundMetadataResponse)
def outboundSubmissionId = inboundParsedJsonBody.issue[8].diagnostics
def outboundMetadataResponse = metadataClient.get(outboundSubmissionId, true)
def outboundParsedJsonBody = JsonParsing.parseContent(outboundMetadataResponse)

then:
Expand All @@ -83,10 +87,13 @@ class MetadataTest extends Specification {
[
"sender name",
"receiver name",
"result ingestion",
"ingestion",
"payload hash",
"delivery status",
"status message"
"status message",
"message type",
"outbound submission id",
"inbound submission id"
].each { String metadataKey ->
def issue = (inboundParsedJsonBody.issue as List).find( {issue -> issue.details.text == metadataKey })
assert issue != null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import gov.hhs.cdc.trustedintermediary.etor.messages.SendMessageHelper;
import gov.hhs.cdc.trustedintermediary.etor.messages.UnableToSendMessageException;
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadata;
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataConverter;
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataException;
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataOrchestrator;
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataStorage;
Expand All @@ -38,6 +39,7 @@
import gov.hhs.cdc.trustedintermediary.external.database.PostgresDao;
import gov.hhs.cdc.trustedintermediary.external.hapi.HapiMessageConverterHelper;
import gov.hhs.cdc.trustedintermediary.external.hapi.HapiOrderConverter;
import gov.hhs.cdc.trustedintermediary.external.hapi.HapiPartnerMetadataConverter;
import gov.hhs.cdc.trustedintermediary.external.hapi.HapiResultConverter;
import gov.hhs.cdc.trustedintermediary.external.localfile.FilePartnerMetadataStorage;
import gov.hhs.cdc.trustedintermediary.external.localfile.MockRSEndpointClient;
Expand Down Expand Up @@ -81,8 +83,7 @@ public class EtorDomainRegistration implements DomainConnector {
@Inject Logger logger;
@Inject DomainResponseHelper domainResponseHelper;
@Inject PartnerMetadataOrchestrator partnerMetadataOrchestrator;

@Inject OrderConverter orderConverter;
@Inject PartnerMetadataConverter partnerMetadataConverter;

@Inject HapiFhir fhir;

Expand Down Expand Up @@ -122,6 +123,8 @@ public Map<HttpEndpoint, Function<DomainRequest, DomainResponse>> domainRegistra
// Metadata
ApplicationContext.register(
PartnerMetadataOrchestrator.class, PartnerMetadataOrchestrator.getInstance());
ApplicationContext.register(
PartnerMetadataConverter.class, HapiPartnerMetadataConverter.getInstance());
// Validation rules
ApplicationContext.register(RuleLoader.class, RuleLoader.getInstance());
ApplicationContext.register(RuleEngine.class, RuleEngine.getInstance());
Expand Down Expand Up @@ -214,7 +217,7 @@ DomainResponse handleMetadata(DomainRequest request) {
}

FhirMetadata<?> responseObject =
orderConverter.extractPublicMetadataToOperationOutcome(
partnerMetadataConverter.extractPublicMetadataToOperationOutcome(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pulling this out of the order converter!

metadata.get(), metadataId);

return domainResponseHelper.constructOkResponseFromString(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package gov.hhs.cdc.trustedintermediary.etor.metadata.partner;

import gov.hhs.cdc.trustedintermediary.etor.operationoutcomes.FhirMetadata;

public interface PartnerMetadataConverter {

/**
* This method will convert {@link PartnerMetadata} and convert it into an {@link
* org.hl7.fhir.r4.model.OperationOutcome}
*
* @param metadata
* @param requestedId
* @return
*/
FhirMetadata<?> extractPublicMetadataToOperationOutcome(
PartnerMetadata metadata, String requestedId);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package gov.hhs.cdc.trustedintermediary.etor.orders;

import gov.hhs.cdc.trustedintermediary.etor.demographics.Demographics;
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadata;
import gov.hhs.cdc.trustedintermediary.etor.operationoutcomes.FhirMetadata;

/** Interface for converting things to orders and things in orders. */
public interface OrderConverter {
Expand All @@ -13,7 +11,4 @@ public interface OrderConverter {
Order<?> addContactSectionToPatientResource(Order<?> order);

Order<?> addEtorProcessingTag(Order<?> message);

FhirMetadata<?> extractPublicMetadataToOperationOutcome(
PartnerMetadata metadata, String requestedId);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package gov.hhs.cdc.trustedintermediary.external.hapi;

import gov.hhs.cdc.trustedintermediary.etor.demographics.Demographics;
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadata;
import gov.hhs.cdc.trustedintermediary.etor.operationoutcomes.FhirMetadata;
import gov.hhs.cdc.trustedintermediary.etor.operationoutcomes.HapiFhirMetadata;
import gov.hhs.cdc.trustedintermediary.etor.orders.Order;
import gov.hhs.cdc.trustedintermediary.etor.orders.OrderConverter;
import gov.hhs.cdc.trustedintermediary.wrappers.Logger;
Expand All @@ -18,7 +15,6 @@
import org.hl7.fhir.r4.model.Identifier;
import org.hl7.fhir.r4.model.MessageHeader;
import org.hl7.fhir.r4.model.Meta;
import org.hl7.fhir.r4.model.OperationOutcome;
import org.hl7.fhir.r4.model.Patient;
import org.hl7.fhir.r4.model.Provenance;
import org.hl7.fhir.r4.model.Reference;
Expand Down Expand Up @@ -206,68 +202,4 @@ private Provenance createProvenanceResource(Date orderDate) {

return provenance;
}

@Override
public FhirMetadata<?> extractPublicMetadataToOperationOutcome(
PartnerMetadata metadata, String requestedId) {
var operation = new OperationOutcome();

operation.setId(requestedId);
operation.getIssue().add(createInformationIssueComponent("sender name", metadata.sender()));
operation
.getIssue()
.add(createInformationIssueComponent("receiver name", metadata.receiver()));

String ingestion = null;
String delivered = null;
if (metadata.timeReceived() != null) {
ingestion = metadata.timeReceived().toString();
}
if (metadata.timeDelivered() != null) {
delivered = metadata.timeDelivered().toString();
}

operation
.getIssue()
.add(
createInformationIssueComponent(
String.format(
"%s ingestion",
metadata.messageType().toString().toLowerCase()),
ingestion));

operation.getIssue().add(createInformationIssueComponent("payload hash", metadata.hash()));
operation
.getIssue()
.add(
createInformationIssueComponent(
String.format(
"%s delivered",
metadata.messageType().toString().toLowerCase()),
delivered));
operation
.getIssue()
.add(
createInformationIssueComponent(
"delivery status", metadata.deliveryStatus().toString()));

operation
.getIssue()
.add(createInformationIssueComponent("status message", metadata.failureReason()));

return new HapiFhirMetadata(operation);
}

protected OperationOutcome.OperationOutcomeIssueComponent createInformationIssueComponent(
String details, String diagnostics) {
OperationOutcome.OperationOutcomeIssueComponent issue =
new OperationOutcome.OperationOutcomeIssueComponent();

issue.setSeverity(OperationOutcome.IssueSeverity.INFORMATION);
issue.setCode(OperationOutcome.IssueType.INFORMATIONAL);
issue.getDetails().setText(details);
issue.setDiagnostics(diagnostics);

return issue;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package gov.hhs.cdc.trustedintermediary.external.hapi;

import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadata;
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataConverter;
import gov.hhs.cdc.trustedintermediary.etor.operationoutcomes.FhirMetadata;
import gov.hhs.cdc.trustedintermediary.etor.operationoutcomes.HapiFhirMetadata;
import org.hl7.fhir.r4.model.OperationOutcome;

public class HapiPartnerMetadataConverter implements PartnerMetadataConverter {

private static final HapiPartnerMetadataConverter INSTANCE = new HapiPartnerMetadataConverter();

public static HapiPartnerMetadataConverter getInstance() {
return INSTANCE;
}

private HapiPartnerMetadataConverter() {}

@Override
public FhirMetadata<?> extractPublicMetadataToOperationOutcome(
Fixed Show fixed Hide fixed
luis-pabon-tf marked this conversation as resolved.
Show resolved Hide resolved
PartnerMetadata metadata, String requestedId) {
var operation = new OperationOutcome();

operation.setId(requestedId);
operation.getIssue().add(createInformationIssueComponent("sender name", metadata.sender()));
operation
.getIssue()
.add(createInformationIssueComponent("receiver name", metadata.receiver()));

String ingestion = null;
String delivered = null;
if (metadata.timeReceived() != null) {
ingestion = metadata.timeReceived().toString();
}
if (metadata.timeDelivered() != null) {
delivered = metadata.timeDelivered().toString();
}

operation.getIssue().add(createInformationIssueComponent("ingestion", ingestion));

operation.getIssue().add(createInformationIssueComponent("payload hash", metadata.hash()));
operation.getIssue().add(createInformationIssueComponent("delivered", delivered));
operation
.getIssue()
.add(
createInformationIssueComponent(
"delivery status", metadata.deliveryStatus().toString()));

operation
.getIssue()
.add(createInformationIssueComponent("status message", metadata.failureReason()));

operation
.getIssue()
.add(
createInformationIssueComponent(
"message type", metadata.messageType().toString()));

operation
.getIssue()
.add(
createInformationIssueComponent(
"outbound submission id", metadata.sentSubmissionId()));

operation
.getIssue()
.add(
createInformationIssueComponent(
"inbound submission id", metadata.receivedSubmissionId()));

return new HapiFhirMetadata(operation);
}

protected OperationOutcome.OperationOutcomeIssueComponent createInformationIssueComponent(
String details, String diagnostics) {
OperationOutcome.OperationOutcomeIssueComponent issue =
new OperationOutcome.OperationOutcomeIssueComponent();

issue.setSeverity(OperationOutcome.IssueSeverity.INFORMATION);
issue.setCode(OperationOutcome.IssueType.INFORMATIONAL);
issue.getDetails().setText(details);
issue.setDiagnostics(diagnostics);

return issue;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.UUID;

/**
* A mock implementation of the RSEndpointClient interface that doesn't require a connection to
Expand Down Expand Up @@ -37,7 +38,7 @@ public String requestWatersEndpoint(String body, String bearerToken)
} catch (IOException e) {
throw new ReportStreamEndpointClientException("Error writing the lab order", e);
}
return "{ \"submissionId\": \"1234567890\" }";
return "{ \"submissionId\": \"" + UUID.randomUUID() + "\" }";
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import gov.hhs.cdc.trustedintermediary.etor.demographics.PatientDemographicsResp
import gov.hhs.cdc.trustedintermediary.etor.messages.MessageRequestHandler
import gov.hhs.cdc.trustedintermediary.etor.messages.UnableToSendMessageException
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadata
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataConverter
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataException
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataMessageType
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataOrchestrator
Expand Down Expand Up @@ -240,9 +241,9 @@ class EtorDomainRegistrationTest extends Specification {
mockResponseHelper.constructOkResponseFromString(_ as String) >> new DomainResponse(expectedStatusCode)
TestApplicationContext.register(DomainResponseHelper, mockResponseHelper)

def mockOrderConverter = Mock(OrderConverter)
mockOrderConverter.extractPublicMetadataToOperationOutcome(_ as PartnerMetadata, _ as String) >> Mock(FhirMetadata)
TestApplicationContext.register(OrderConverter, mockOrderConverter)
def mockPartnerMetadataConverter = Mock(PartnerMetadataConverter)
mockPartnerMetadataConverter.extractPublicMetadataToOperationOutcome(_ as PartnerMetadata, _ as String) >> Mock(FhirMetadata)
TestApplicationContext.register(PartnerMetadataConverter, mockPartnerMetadataConverter)

def mockFhir = Mock(HapiFhir)
mockFhir.encodeResourceToJson(_) >> ""
Expand Down
Loading
Loading