From 37ecd8db5bd2d8059bba9dd2ec7d8b7b8f59136f Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Thu, 9 Jan 2025 14:16:31 +0530 Subject: [PATCH 01/23] [WIP] Add Procedure router --- .../java/org/openmrs/eip/fhir/Constants.java | 6 + .../org/openmrs/eip/fhir/FhirResource.java | 4 + .../routes/resources/ProcedureRouter.java | 97 ++++++++ .../resources/ServiceRequestRouter.java | 4 +- .../fhir/routes/resources/models/Concept.java | 27 +++ .../routes/resources/models/Encounter.java | 27 +++ .../fhir/routes/resources/models/Order.java | 217 ++++++++++++++++++ .../fhir/routes/resources/models/Orderer.java | 27 +++ .../fhir/routes/resources/models/Patient.java | 27 +++ 9 files changed, 435 insertions(+), 1 deletion(-) create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java index ff75a77b1..fd1e8533b 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java @@ -22,6 +22,12 @@ public final class Constants { public static final String TEST_ORDER_TYPE_UUID = "52a447d3-a64a-11e3-9aeb-50e549534c5e"; + public static final String IMAGING_ORDER_TYPE_UUID = "8d2aff07-55e6-4a4a-8878-72b9eb36a3b8"; + + public static final String PROCEDURE_ORDER_TYPE_UUID = "67a92e56-0f88-11ea-8d71-362b9e155667"; + + public static final String MEDICAL_SUPPLY_ORDER_TYPE_UUID = "67a92bd6-0f88-11ea-8d71-362b9e155667"; + public static final String DRUG_ORDER_TYPE_UUID = "131168f4-15f5-102d-96e4-000c29c2a5d7"; private Constants() { diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java index 4aed10963..2f5b275fa 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java @@ -33,6 +33,10 @@ public enum FhirResource { SERVICEREQUEST("direct:fhir-handler-servicerequest", "direct:fhir-servicerequest", "orders", "test_order"), + PROCEDURE("direct:fhir-handler-procedure", "direct:fhir-procedure", "orders", "procedure_order"), + + MEDICALSUPPLY("direct:fhir-handler-medicalsupply", "direct:fhir-medicalsupply", "orders", "medical_supplies_order"), + TASK("direct:fhir-handler-task", "direct:fhir-task", "fhir_task"); private final String[] tables; diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java new file mode 100644 index 000000000..9acfaef46 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -0,0 +1,97 @@ +package org.openmrs.eip.fhir.routes.resources; + +import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; +import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; +import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; + +import java.util.Collections; +import java.util.Date; + +import org.apache.camel.LoggingLevel; +import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.CodeableConcept; +import org.hl7.fhir.r4.model.Coding; +import org.hl7.fhir.r4.model.Encounter; +import org.hl7.fhir.r4.model.HumanName; +import org.hl7.fhir.r4.model.Identifier; +import org.hl7.fhir.r4.model.Patient; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.ServiceRequest; +import org.hl7.fhir.r4.model.StringType; +import org.openmrs.eip.fhir.FhirResource; +import org.openmrs.eip.fhir.routes.resources.models.Order; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@Component +public class ProcedureRouter extends BaseFhirResourceRouter { + + ProcedureRouter() { + super(FhirResource.PROCEDURE); + } + + @Override + public void configure() throws Exception { + from(FhirResource.PROCEDURE.incomingUrl()).routeId("fhir-procedure-router").filter(isSupportedTable()).toD( + "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .filter(simple("${body[0]['uuid']} == '" + PROCEDURE_ORDER_TYPE_UUID + "'")) + .log(LoggingLevel.INFO, + "Processing ProcedureRouter ${exchangeProperty.event.tableName} message uuid ${body[0]['uuid']}") + .toD( + "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) + .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) + .to(FhirResource.PROCEDURE.outgoingUrl()).when(simple("${body[0]['order_action']} == 'DISCONTINUE'")) + .toD( + "sql:SELECT uuid FROM orders WHERE order_id = ${body[0]['previous_order_id']}?dataSource=#openmrsDataSource") + .toD("fhir:read/resourceById?resourceClass=ServiceRequest&stringId=${body[0]['uuid']}") + .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).to(FhirResource.PROCEDURE.outgoingUrl()).otherwise() + .setHeader("Authorization", constant("Basic YWRtaW46QWRtaW4xMjM=")) + .setHeader("CamelHttpMethod", constant("GET")) + .log(LoggingLevel.INFO, "ProcedureRouter order uuid: ${exchangeProperty.event.identifier}") + .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") + .process(exchange -> { + log.info("Response in ProcedureRouter: {}", exchange.getMessage().getBody(String.class)); + ObjectMapper objectMapper = new ObjectMapper(); + Order order = objectMapper.readValue(exchange.getMessage().getBody(String.class), Order.class); + log.info("Order in ProcedureRouter: {}", order); + + Bundle bundle = new Bundle(); + Patient patient = new Patient(); + patient.setId(order.getPatient().getUuid()); + patient.setActive(true); + patient.setName(Collections.singletonList(new HumanName().setFamily(order.getPatient().getDisplay()) + .setGiven(Collections.singletonList(new StringType(order.getPatient().getDisplay()))))); + patient.setIdentifier(Collections.singletonList(new Identifier() + .setUse(Identifier.IdentifierUse.OFFICIAL).setValue(order.getPatient().getDisplay()))); + patient.setBirthDate(new Date()); + bundle.addEntry().setResource(patient); + + Encounter encounter = new Encounter(); + encounter.setId(order.getEncounter().getUuid()); + encounter.setPartOf(new Reference().setReference("Encounter/" + order.getEncounter().getUuid())); + bundle.addEntry().setResource(encounter); + + ServiceRequest serviceRequest = new ServiceRequest(); + serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.ACTIVE); + serviceRequest.setIntent(ServiceRequest.ServiceRequestIntent.ORDER); + serviceRequest.setCode(new CodeableConcept(new Coding().setCode(order.getConcept().getUuid()) + .setDisplay(order.getConcept().getDisplayString())) + .setText(order.getConcept().getDisplayString())); + serviceRequest.setSubject(new Reference().setReference("Patient/" + order.getPatient().getUuid()) + .setType("Patient").setDisplay(order.getPatient().getDisplay())); + serviceRequest.setEncounter( + new Reference().setReference("Encounter/" + order.getEncounter().getUuid()).setType("Encounter")); + serviceRequest.setRequester(new Reference().setReference("Practitioner/" + order.getOrderer().getUuid()) + .setType("Practitioner").setDisplay(order.getOrderer().getDisplay())); + + bundle.addEntry().setResource(serviceRequest); + + exchange.getMessage().setBody(bundle); + + }).log(LoggingLevel.INFO, "Response in ProcedureRouter: ${body}") + .setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) + .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ServiceRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ServiceRequestRouter.java index 488b282e4..61af0a4a4 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ServiceRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ServiceRequestRouter.java @@ -1,6 +1,7 @@ package org.openmrs.eip.fhir.routes.resources; import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; +import static org.openmrs.eip.fhir.Constants.IMAGING_ORDER_TYPE_UUID; import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; import static org.openmrs.eip.fhir.Constants.TEST_ORDER_TYPE_UUID; @@ -19,7 +20,8 @@ public class ServiceRequestRouter extends BaseFhirResourceRouter { public void configure() throws Exception { from(FhirResource.SERVICEREQUEST.incomingUrl()).routeId("fhir-servicerequest-router").filter(isSupportedTable()).toD( "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") - .filter(simple("${body[0]['uuid']} == '" + TEST_ORDER_TYPE_UUID + "'")) + .filter(simple("${body[0]['uuid']} == '" + TEST_ORDER_TYPE_UUID + "' || ${body[0]['uuid']} == '" + + IMAGING_ORDER_TYPE_UUID + "'")) .log(LoggingLevel.INFO, "Processing ${exchangeProperty.event.tableName} message") .toD( "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java new file mode 100644 index 000000000..4d08227ba --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java @@ -0,0 +1,27 @@ +package org.openmrs.eip.fhir.routes.resources.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class Concept { + + public String uuid; + + public String displayString; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getDisplayString() { + return displayString; + } + + public void setDisplayString(String displayString) { + this.displayString = displayString; + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java new file mode 100644 index 000000000..1b004fa52 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java @@ -0,0 +1,27 @@ +package org.openmrs.eip.fhir.routes.resources.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class Encounter { + + public String uuid; + + public String display; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java new file mode 100644 index 000000000..b1d2f6837 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java @@ -0,0 +1,217 @@ +package org.openmrs.eip.fhir.routes.resources.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class Order { + + public String uuid; + + public String orderNumber; + + public String accessionNumber; + + public Patient patient; + + public Concept concept; + + public String action; + + public Object previousOrder; + + public String dateActivated; + + public Object scheduledDate; + + public Object dateStopped; + + public Object autoExpireDate; + + public Encounter encounter; + + public Orderer orderer; + + public Object orderReason; + + public Object orderReasonNonCoded; + + public String urgency; + + public Object instructions; + + public Object commentToFulfiller; + + public String display; + + public String type; + + public String resourceVersion; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getOrderNumber() { + return orderNumber; + } + + public void setOrderNumber(String orderNumber) { + this.orderNumber = orderNumber; + } + + public String getAccessionNumber() { + return accessionNumber; + } + + public void setAccessionNumber(String accessionNumber) { + this.accessionNumber = accessionNumber; + } + + public Patient getPatient() { + return patient; + } + + public void setPatient(Patient patient) { + this.patient = patient; + } + + public Concept getConcept() { + return concept; + } + + public void setConcept(Concept concept) { + this.concept = concept; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public Object getPreviousOrder() { + return previousOrder; + } + + public void setPreviousOrder(Object previousOrder) { + this.previousOrder = previousOrder; + } + + public String getDateActivated() { + return dateActivated; + } + + public void setDateActivated(String dateActivated) { + this.dateActivated = dateActivated; + } + + public Object getScheduledDate() { + return scheduledDate; + } + + public void setScheduledDate(Object scheduledDate) { + this.scheduledDate = scheduledDate; + } + + public Object getDateStopped() { + return dateStopped; + } + + public void setDateStopped(Object dateStopped) { + this.dateStopped = dateStopped; + } + + public Object getAutoExpireDate() { + return autoExpireDate; + } + + public void setAutoExpireDate(Object autoExpireDate) { + this.autoExpireDate = autoExpireDate; + } + + public Encounter getEncounter() { + return encounter; + } + + public void setEncounter(Encounter encounter) { + this.encounter = encounter; + } + + public Orderer getOrderer() { + return orderer; + } + + public void setOrderer(Orderer orderer) { + this.orderer = orderer; + } + + public Object getOrderReason() { + return orderReason; + } + + public void setOrderReason(Object orderReason) { + this.orderReason = orderReason; + } + + public Object getOrderReasonNonCoded() { + return orderReasonNonCoded; + } + + public void setOrderReasonNonCoded(Object orderReasonNonCoded) { + this.orderReasonNonCoded = orderReasonNonCoded; + } + + public String getUrgency() { + return urgency; + } + + public void setUrgency(String urgency) { + this.urgency = urgency; + } + + public Object getInstructions() { + return instructions; + } + + public void setInstructions(Object instructions) { + this.instructions = instructions; + } + + public Object getCommentToFulfiller() { + return commentToFulfiller; + } + + public void setCommentToFulfiller(Object commentToFulfiller) { + this.commentToFulfiller = commentToFulfiller; + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getResourceVersion() { + return resourceVersion; + } + + public void setResourceVersion(String resourceVersion) { + this.resourceVersion = resourceVersion; + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java new file mode 100644 index 000000000..bb29b5019 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java @@ -0,0 +1,27 @@ +package org.openmrs.eip.fhir.routes.resources.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class Orderer { + + public String uuid; + + public String display; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java new file mode 100644 index 000000000..858dac223 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java @@ -0,0 +1,27 @@ +package org.openmrs.eip.fhir.routes.resources.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class Patient { + + public String uuid; + + public String display; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } +} From 6398896f8faa4b24f2e6ab794822f56ee56d14ce Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Thu, 9 Jan 2025 20:25:57 +0530 Subject: [PATCH 02/23] [WIP] Add MedicalSupply orders support --- .../java/org/openmrs/eip/fhir/Constants.java | 2 +- .../org/openmrs/eip/fhir/FhirResource.java | 2 +- .../routes/resources/ProcedureProcessor.java | 45 ++++++++++++ .../routes/resources/ProcedureRouter.java | 69 +++++-------------- .../resources/SupplyRequestProcessor.java | 58 ++++++++++++++++ .../routes/resources/SupplyRequestRouter.java | 42 +++++++++++ .../fhir/routes/resources/models/Concept.java | 10 +-- 7 files changed, 171 insertions(+), 57 deletions(-) create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java index fd1e8533b..494558b8e 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java @@ -26,7 +26,7 @@ public final class Constants { public static final String PROCEDURE_ORDER_TYPE_UUID = "67a92e56-0f88-11ea-8d71-362b9e155667"; - public static final String MEDICAL_SUPPLY_ORDER_TYPE_UUID = "67a92bd6-0f88-11ea-8d71-362b9e155667"; + public static final String SUPPLY_REQUEST_ORDER_TYPE_UUID = "67a92bd6-0f88-11ea-8d71-362b9e155667"; public static final String DRUG_ORDER_TYPE_UUID = "131168f4-15f5-102d-96e4-000c29c2a5d7"; diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java index 2f5b275fa..3e5e37034 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java @@ -35,7 +35,7 @@ public enum FhirResource { PROCEDURE("direct:fhir-handler-procedure", "direct:fhir-procedure", "orders", "procedure_order"), - MEDICALSUPPLY("direct:fhir-handler-medicalsupply", "direct:fhir-medicalsupply", "orders", "medical_supplies_order"), + SUPPLYREQUEST("direct:fhir-handler-supplyrequest", "direct:fhir-supplyrequest", "orders", "medical_supplies_order"), TASK("direct:fhir-handler-task", "direct:fhir-task", "fhir_task"); diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java new file mode 100644 index 000000000..5880544da --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java @@ -0,0 +1,45 @@ +/* + * Copyright © 2021, Ozone HIS + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.openmrs.eip.fhir.routes.resources; + +import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; + +import org.apache.camel.CamelExecutionException; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.CodeableConcept; +import org.hl7.fhir.r4.model.Coding; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.ServiceRequest; +import org.hl7.fhir.r4.model.SupplyRequest; +import org.openmrs.eip.fhir.routes.resources.models.Order; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@Component +public class ProcedureProcessor implements Processor { + + @Override + public void process(Exchange exchange) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); + + SupplyRequest supplyRequest = new SupplyRequest(); + + exchange.getMessage().setBody(supplyRequest); + } + catch (Exception e) { + throw new CamelExecutionException("Error processing ServiceRequest", exchange, e); + } + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index 9acfaef46..8b38f026b 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -14,12 +14,14 @@ import org.hl7.fhir.r4.model.Encounter; import org.hl7.fhir.r4.model.HumanName; import org.hl7.fhir.r4.model.Identifier; +import org.hl7.fhir.r4.model.Narrative; import org.hl7.fhir.r4.model.Patient; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.ServiceRequest; import org.hl7.fhir.r4.model.StringType; import org.openmrs.eip.fhir.FhirResource; import org.openmrs.eip.fhir.routes.resources.models.Order; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; @@ -31,66 +33,33 @@ public class ProcedureRouter extends BaseFhirResourceRouter { super(FhirResource.PROCEDURE); } + @Autowired + private ProcedureProcessor procedureProcessor; + @Override public void configure() throws Exception { from(FhirResource.PROCEDURE.incomingUrl()).routeId("fhir-procedure-router").filter(isSupportedTable()).toD( "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .filter(simple("${body[0]['uuid']} == '" + PROCEDURE_ORDER_TYPE_UUID + "'")) - .log(LoggingLevel.INFO, - "Processing ProcedureRouter ${exchangeProperty.event.tableName} message uuid ${body[0]['uuid']}") + .log(LoggingLevel.INFO, "Processing ProcedureRouter ${exchangeProperty.event.tableName}") .toD( "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") - .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) + .log(LoggingLevel.INFO, "ProcedureRouter event body uuid ${body[0]['uuid']}").choice() + .when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) - .to(FhirResource.PROCEDURE.outgoingUrl()).when(simple("${body[0]['order_action']} == 'DISCONTINUE'")) - .toD( - "sql:SELECT uuid FROM orders WHERE order_id = ${body[0]['previous_order_id']}?dataSource=#openmrsDataSource") - .toD("fhir:read/resourceById?resourceClass=ServiceRequest&stringId=${body[0]['uuid']}") - .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).to(FhirResource.PROCEDURE.outgoingUrl()).otherwise() - .setHeader("Authorization", constant("Basic YWRtaW46QWRtaW4xMjM=")) + .to(FhirResource.PROCEDURE.outgoingUrl()) + // .when(simple("${body[0]['order_action']} == 'DISCONTINUE'")) + // .toD( + // "sql:SELECT uuid FROM orders WHERE order_id = ${body[0]['previous_order_id']}?dataSource=#openmrsDataSource") + // .setHeader("Authorization", constant("Basic YWRtaW46QWRtaW4xMjM=")) + // .setHeader("CamelHttpMethod", constant("GET")) + // .log(LoggingLevel.INFO, "DISCONTINUE ProcedureRouter order uuid: ${exchangeProperty.event.identifier} and ${body[0]['uuid']}") + // .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${body[0]['uuid']}").process(procedureProcessor) + // .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).to(FhirResource.PROCEDURE.outgoingUrl()) + .otherwise().setHeader("Authorization", constant("Basic YWRtaW46QWRtaW4xMjM=")) .setHeader("CamelHttpMethod", constant("GET")) - .log(LoggingLevel.INFO, "ProcedureRouter order uuid: ${exchangeProperty.event.identifier}") .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") - .process(exchange -> { - log.info("Response in ProcedureRouter: {}", exchange.getMessage().getBody(String.class)); - ObjectMapper objectMapper = new ObjectMapper(); - Order order = objectMapper.readValue(exchange.getMessage().getBody(String.class), Order.class); - log.info("Order in ProcedureRouter: {}", order); - - Bundle bundle = new Bundle(); - Patient patient = new Patient(); - patient.setId(order.getPatient().getUuid()); - patient.setActive(true); - patient.setName(Collections.singletonList(new HumanName().setFamily(order.getPatient().getDisplay()) - .setGiven(Collections.singletonList(new StringType(order.getPatient().getDisplay()))))); - patient.setIdentifier(Collections.singletonList(new Identifier() - .setUse(Identifier.IdentifierUse.OFFICIAL).setValue(order.getPatient().getDisplay()))); - patient.setBirthDate(new Date()); - bundle.addEntry().setResource(patient); - - Encounter encounter = new Encounter(); - encounter.setId(order.getEncounter().getUuid()); - encounter.setPartOf(new Reference().setReference("Encounter/" + order.getEncounter().getUuid())); - bundle.addEntry().setResource(encounter); - - ServiceRequest serviceRequest = new ServiceRequest(); - serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.ACTIVE); - serviceRequest.setIntent(ServiceRequest.ServiceRequestIntent.ORDER); - serviceRequest.setCode(new CodeableConcept(new Coding().setCode(order.getConcept().getUuid()) - .setDisplay(order.getConcept().getDisplayString())) - .setText(order.getConcept().getDisplayString())); - serviceRequest.setSubject(new Reference().setReference("Patient/" + order.getPatient().getUuid()) - .setType("Patient").setDisplay(order.getPatient().getDisplay())); - serviceRequest.setEncounter( - new Reference().setReference("Encounter/" + order.getEncounter().getUuid()).setType("Encounter")); - serviceRequest.setRequester(new Reference().setReference("Practitioner/" + order.getOrderer().getUuid()) - .setType("Practitioner").setDisplay(order.getOrderer().getDisplay())); - - bundle.addEntry().setResource(serviceRequest); - - exchange.getMessage().setBody(bundle); - - }).log(LoggingLevel.INFO, "Response in ProcedureRouter: ${body}") + .process(procedureProcessor) .setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java new file mode 100644 index 000000000..a0392ebb0 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java @@ -0,0 +1,58 @@ +/* + * Copyright © 2021, Ozone HIS + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.openmrs.eip.fhir.routes.resources; + +import org.apache.camel.CamelExecutionException; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.hl7.fhir.r4.model.CodeableConcept; +import org.hl7.fhir.r4.model.Coding; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.ServiceRequest; +import org.openmrs.eip.fhir.routes.resources.models.Order; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@Component +public class SupplyRequestProcessor implements Processor { + + private static final Logger log = LoggerFactory.getLogger(SupplyRequestProcessor.class); + + @Override + public void process(Exchange exchange) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); + + ServiceRequest serviceRequest = new ServiceRequest(); + if (order.getAction().equals("DISCONTINUE")) { + serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.COMPLETED); + } else { + serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.ACTIVE); + } + serviceRequest.setIntent(ServiceRequest.ServiceRequestIntent.ORDER); + serviceRequest.setCode(new CodeableConcept( + new Coding().setCode(order.getConcept().getUuid()).setDisplay(order.getConcept().getDisplay())) + .setText(order.getConcept().getDisplay())); + serviceRequest.setSubject(new Reference().setReference("Patient/" + order.getPatient().getUuid()) + .setType("Patient").setDisplay(order.getPatient().getDisplay())); + serviceRequest.setEncounter( + new Reference().setReference("Encounter/" + order.getEncounter().getUuid()).setType("Encounter")); + serviceRequest.setRequester(new Reference().setReference("Practitioner/" + order.getOrderer().getUuid()) + .setType("Practitioner").setDisplay(order.getOrderer().getDisplay())); + + exchange.getMessage().setBody(serviceRequest); + } + catch (Exception e) { + throw new CamelExecutionException("Error processing ServiceRequest", exchange, e); + } + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java new file mode 100644 index 000000000..e5abded1a --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -0,0 +1,42 @@ +package org.openmrs.eip.fhir.routes.resources; + +import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; +import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; +import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; +import static org.openmrs.eip.fhir.Constants.SUPPLY_REQUEST_ORDER_TYPE_UUID; + +import org.apache.camel.LoggingLevel; +import org.openmrs.eip.fhir.FhirResource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SupplyRequestRouter extends BaseFhirResourceRouter { + + SupplyRequestRouter() { + super(FhirResource.SUPPLYREQUEST); + } + + @Autowired + private SupplyRequestProcessor supplyRequestProcessor; + + @Override + public void configure() throws Exception { + from(FhirResource.SUPPLYREQUEST.incomingUrl()).routeId("fhir-procedure-router").filter(isSupportedTable()).toD( + "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .filter(simple("${body[0]['uuid']} == '" + SUPPLY_REQUEST_ORDER_TYPE_UUID + "'")) + .log(LoggingLevel.INFO, "Processing SupplyRequestRouter ${exchangeProperty.event.tableName}") + .toD( + "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .log(LoggingLevel.INFO, "ProcedureRouter event body uuid ${body[0]['uuid']}").choice() + .when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) + .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) + .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise() + .setHeader("Authorization", constant("Basic YWRtaW46QWRtaW4xMjM=")) + .setHeader("CamelHttpMethod", constant("GET")) + .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") + .process(supplyRequestProcessor) + .setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) + .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java index 4d08227ba..b157a8560 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java @@ -7,7 +7,7 @@ public class Concept { public String uuid; - public String displayString; + public String display; public String getUuid() { return uuid; @@ -17,11 +17,11 @@ public void setUuid(String uuid) { this.uuid = uuid; } - public String getDisplayString() { - return displayString; + public String getDisplay() { + return display; } - public void setDisplayString(String displayString) { - this.displayString = displayString; + public void setDisplay(String display) { + this.display = display; } } From 550280ccf8ecd44799ce9116c4443a8edae70961 Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Fri, 10 Jan 2025 15:31:10 +0530 Subject: [PATCH 03/23] Fix --- .../routes/resources/ProcedureProcessor.java | 25 +++++++++++++------ .../resources/SupplyRequestProcessor.java | 22 +++------------- .../routes/resources/SupplyRequestRouter.java | 7 +++--- 3 files changed, 25 insertions(+), 29 deletions(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java index 5880544da..9158a5d92 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java @@ -12,15 +12,11 @@ import org.apache.camel.CamelExecutionException; import org.apache.camel.Exchange; import org.apache.camel.Processor; -import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.CodeableConcept; import org.hl7.fhir.r4.model.Coding; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.ServiceRequest; -import org.hl7.fhir.r4.model.SupplyRequest; import org.openmrs.eip.fhir.routes.resources.models.Order; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; @@ -34,12 +30,27 @@ public void process(Exchange exchange) { ObjectMapper objectMapper = new ObjectMapper(); Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); - SupplyRequest supplyRequest = new SupplyRequest(); + ServiceRequest serviceRequest = new ServiceRequest(); + if (order.getAction().equals("DISCONTINUE")) { + serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.COMPLETED); + } else { + serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.ACTIVE); + } + serviceRequest.setIntent(ServiceRequest.ServiceRequestIntent.ORDER); + serviceRequest.setCode(new CodeableConcept( + new Coding().setCode(order.getConcept().getUuid()).setDisplay(order.getConcept().getDisplay())) + .setText(order.getConcept().getDisplay())); + serviceRequest.setSubject(new Reference().setReference("Patient/" + order.getPatient().getUuid()) + .setType("Patient").setDisplay(order.getPatient().getDisplay())); + serviceRequest.setEncounter( + new Reference().setReference("Encounter/" + order.getEncounter().getUuid()).setType("Encounter")); + serviceRequest.setRequester(new Reference().setReference("Practitioner/" + order.getOrderer().getUuid()) + .setType("Practitioner").setDisplay(order.getOrderer().getDisplay())); - exchange.getMessage().setBody(supplyRequest); + exchange.getMessage().setBody(serviceRequest); } catch (Exception e) { - throw new CamelExecutionException("Error processing ServiceRequest", exchange, e); + throw new CamelExecutionException("Error transforming Order to ServiceRequest", exchange, e); } } } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java index a0392ebb0..f78af1d15 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java @@ -14,6 +14,7 @@ import org.hl7.fhir.r4.model.Coding; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.ServiceRequest; +import org.hl7.fhir.r4.model.SupplyRequest; import org.openmrs.eip.fhir.routes.resources.models.Order; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,27 +33,12 @@ public void process(Exchange exchange) { ObjectMapper objectMapper = new ObjectMapper(); Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); - ServiceRequest serviceRequest = new ServiceRequest(); - if (order.getAction().equals("DISCONTINUE")) { - serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.COMPLETED); - } else { - serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.ACTIVE); - } - serviceRequest.setIntent(ServiceRequest.ServiceRequestIntent.ORDER); - serviceRequest.setCode(new CodeableConcept( - new Coding().setCode(order.getConcept().getUuid()).setDisplay(order.getConcept().getDisplay())) - .setText(order.getConcept().getDisplay())); - serviceRequest.setSubject(new Reference().setReference("Patient/" + order.getPatient().getUuid()) - .setType("Patient").setDisplay(order.getPatient().getDisplay())); - serviceRequest.setEncounter( - new Reference().setReference("Encounter/" + order.getEncounter().getUuid()).setType("Encounter")); - serviceRequest.setRequester(new Reference().setReference("Practitioner/" + order.getOrderer().getUuid()) - .setType("Practitioner").setDisplay(order.getOrderer().getDisplay())); + SupplyRequest supplyRequest = new SupplyRequest(); - exchange.getMessage().setBody(serviceRequest); + exchange.getMessage().setBody(supplyRequest); } catch (Exception e) { - throw new CamelExecutionException("Error processing ServiceRequest", exchange, e); + throw new CamelExecutionException("Error transforming Order to SupplyRequest", exchange, e); } } } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index e5abded1a..94645d235 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -1,7 +1,6 @@ package org.openmrs.eip.fhir.routes.resources; import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; -import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; import static org.openmrs.eip.fhir.Constants.SUPPLY_REQUEST_ORDER_TYPE_UUID; @@ -22,13 +21,13 @@ public class SupplyRequestRouter extends BaseFhirResourceRouter { @Override public void configure() throws Exception { - from(FhirResource.SUPPLYREQUEST.incomingUrl()).routeId("fhir-procedure-router").filter(isSupportedTable()).toD( + from(FhirResource.SUPPLYREQUEST.incomingUrl()).routeId("fhir-supplyrequest-router").filter(isSupportedTable()).toD( "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .filter(simple("${body[0]['uuid']} == '" + SUPPLY_REQUEST_ORDER_TYPE_UUID + "'")) .log(LoggingLevel.INFO, "Processing SupplyRequestRouter ${exchangeProperty.event.tableName}") .toD( "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") - .log(LoggingLevel.INFO, "ProcedureRouter event body uuid ${body[0]['uuid']}").choice() + .log(LoggingLevel.INFO, "SupplyRequestRouter event body uuid ${body[0]['uuid']}").choice() .when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise() @@ -37,6 +36,6 @@ public void configure() throws Exception { .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") .process(supplyRequestProcessor) .setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) - .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); + .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).endChoice().end(); } } From 07d048091e36bb06dc20c29ac91360b87911cd02 Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Fri, 10 Jan 2025 18:51:35 +0530 Subject: [PATCH 04/23] Add MedicalSupply support --- .../routes/resources/SupplyProcessor.java | 57 +++++++++++++++++++ .../resources/SupplyRequestProcessor.java | 44 -------------- .../routes/resources/SupplyRequestRouter.java | 4 +- .../fhir/routes/resources/models/Order.java | 20 +++++++ .../resources/models/QuantityUnits.java | 27 +++++++++ 5 files changed, 106 insertions(+), 46 deletions(-) create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java delete mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java new file mode 100644 index 000000000..f5f450d1b --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java @@ -0,0 +1,57 @@ +/* + * Copyright © 2021, Ozone HIS + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.openmrs.eip.fhir.routes.resources; + +import java.util.Collections; + +import org.apache.camel.CamelExecutionException; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.hl7.fhir.r4.model.CodeableConcept; +import org.hl7.fhir.r4.model.Coding; +import org.hl7.fhir.r4.model.Quantity; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.SupplyRequest; +import org.openmrs.eip.fhir.routes.resources.models.Order; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@Component +public class SupplyProcessor implements Processor { + + @Override + public void process(Exchange exchange) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); + + SupplyRequest supplyRequest = new SupplyRequest(); + supplyRequest.setId(order.getUuid()); + // supplyRequest.setItem(new CodeableConcept( + // new Coding().setCode(order.getConcept().getUuid()).setDisplay(order.getConcept().getDisplay())) + // .setText(order.getConcept().getDisplay())); + supplyRequest.setItem(new Reference().setReference("MedicalSupply/" + order.getConcept().getUuid()) + .setDisplay(order.getConcept().getDisplay())); + supplyRequest.setReasonReference(Collections.singletonList( + new Reference().setType("Encounter").setReference("Encounter/" + order.getEncounter().getUuid()))); + supplyRequest + .setQuantity(new Quantity().setValue(order.getQuantity()).setCode(order.getQuantityUnits().getUuid())); + supplyRequest.setRequester( + new Reference().setReference(order.getOrderer().getUuid()).setDisplay(order.getOrderer().getDisplay())); + supplyRequest.setDeliverTo(new Reference().setReference("Patient/" + order.getPatient().getUuid()) + .setDisplay(order.getPatient().getDisplay())); + supplyRequest.setStatus(SupplyRequest.SupplyRequestStatus.ACTIVE); + + exchange.getMessage().setBody(supplyRequest); + } + catch (Exception e) { + throw new CamelExecutionException("Error transforming Order to SupplyRequest", exchange, e); + } + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java deleted file mode 100644 index f78af1d15..000000000 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestProcessor.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright © 2021, Ozone HIS - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.openmrs.eip.fhir.routes.resources; - -import org.apache.camel.CamelExecutionException; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; -import org.hl7.fhir.r4.model.CodeableConcept; -import org.hl7.fhir.r4.model.Coding; -import org.hl7.fhir.r4.model.Reference; -import org.hl7.fhir.r4.model.ServiceRequest; -import org.hl7.fhir.r4.model.SupplyRequest; -import org.openmrs.eip.fhir.routes.resources.models.Order; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.databind.ObjectMapper; - -@Component -public class SupplyRequestProcessor implements Processor { - - private static final Logger log = LoggerFactory.getLogger(SupplyRequestProcessor.class); - - @Override - public void process(Exchange exchange) { - try { - ObjectMapper objectMapper = new ObjectMapper(); - Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); - - SupplyRequest supplyRequest = new SupplyRequest(); - - exchange.getMessage().setBody(supplyRequest); - } - catch (Exception e) { - throw new CamelExecutionException("Error transforming Order to SupplyRequest", exchange, e); - } - } -} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index 94645d235..f13ee9e09 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -17,7 +17,7 @@ public class SupplyRequestRouter extends BaseFhirResourceRouter { } @Autowired - private SupplyRequestProcessor supplyRequestProcessor; + private SupplyProcessor supplyProcessor; @Override public void configure() throws Exception { @@ -34,7 +34,7 @@ public void configure() throws Exception { .setHeader("Authorization", constant("Basic YWRtaW46QWRtaW4xMjM=")) .setHeader("CamelHttpMethod", constant("GET")) .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") - .process(supplyRequestProcessor) + .process(supplyProcessor) .setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).endChoice().end(); } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java index b1d2f6837..c3b026687 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java @@ -47,6 +47,26 @@ public class Order { public String resourceVersion; + public float quantity; + + public QuantityUnits quantityUnits; + + public float getQuantity() { + return quantity; + } + + public void setQuantity(float quantity) { + this.quantity = quantity; + } + + public QuantityUnits getQuantityUnits() { + return quantityUnits; + } + + public void setQuantityUnits(QuantityUnits quantityUnits) { + this.quantityUnits = quantityUnits; + } + public String getUuid() { return uuid; } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java new file mode 100644 index 000000000..39c329bbe --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java @@ -0,0 +1,27 @@ +package org.openmrs.eip.fhir.routes.resources.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class QuantityUnits { + + public String uuid; + + public String display; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } +} From 3ea0a724ecb8bf89b2cd4759796657c46487267a Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Mon, 13 Jan 2025 14:54:16 +0530 Subject: [PATCH 05/23] Remove table from FhirResource listen tables for MedicalSupply --- .../src/main/java/org/openmrs/eip/fhir/FhirResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java index 3e5e37034..dbcb00f75 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java @@ -35,7 +35,7 @@ public enum FhirResource { PROCEDURE("direct:fhir-handler-procedure", "direct:fhir-procedure", "orders", "procedure_order"), - SUPPLYREQUEST("direct:fhir-handler-supplyrequest", "direct:fhir-supplyrequest", "orders", "medical_supplies_order"), + SUPPLYREQUEST("direct:fhir-handler-supplyrequest", "direct:fhir-supplyrequest", "orders"), TASK("direct:fhir-handler-task", "direct:fhir-task", "fhir_task"); From 8927840333c725dc87423a242c31c7549d21c94f Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Mon, 13 Jan 2025 17:32:11 +0530 Subject: [PATCH 06/23] Refactor --- .../src/main/java/org/openmrs/eip/fhir/FhirResource.java | 2 +- .../org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java index dbcb00f75..eecf734ef 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java @@ -33,7 +33,7 @@ public enum FhirResource { SERVICEREQUEST("direct:fhir-handler-servicerequest", "direct:fhir-servicerequest", "orders", "test_order"), - PROCEDURE("direct:fhir-handler-procedure", "direct:fhir-procedure", "orders", "procedure_order"), + PROCEDURE("direct:fhir-handler-procedure", "direct:fhir-procedure", "orders"), SUPPLYREQUEST("direct:fhir-handler-supplyrequest", "direct:fhir-supplyrequest", "orders"), diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java index f5f450d1b..3e43281ae 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java @@ -33,9 +33,6 @@ public void process(Exchange exchange) { SupplyRequest supplyRequest = new SupplyRequest(); supplyRequest.setId(order.getUuid()); - // supplyRequest.setItem(new CodeableConcept( - // new Coding().setCode(order.getConcept().getUuid()).setDisplay(order.getConcept().getDisplay())) - // .setText(order.getConcept().getDisplay())); supplyRequest.setItem(new Reference().setReference("MedicalSupply/" + order.getConcept().getUuid()) .setDisplay(order.getConcept().getDisplay())); supplyRequest.setReasonReference(Collections.singletonList( From f3a2aacf644485b15d59a780c17bf343e8c36f7f Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Tue, 14 Jan 2025 18:27:51 +0530 Subject: [PATCH 07/23] Add lombok and remove hardcoings --- camel-openmrs-fhir/pom.xml | 5 + .../routes/resources/ProcedureRouter.java | 43 +--- .../routes/resources/SupplyRequestRouter.java | 18 +- .../fhir/routes/resources/models/Concept.java | 23 +-- .../routes/resources/models/Encounter.java | 22 +- .../fhir/routes/resources/models/Order.java | 191 +----------------- .../fhir/routes/resources/models/Orderer.java | 23 +-- .../fhir/routes/resources/models/Patient.java | 23 +-- .../resources/models/QuantityUnits.java | 23 +-- .../src/main/resources/application.properties | 5 + 10 files changed, 74 insertions(+), 302 deletions(-) create mode 100644 camel-openmrs-fhir/src/main/resources/application.properties diff --git a/camel-openmrs-fhir/pom.xml b/camel-openmrs-fhir/pom.xml index 1e4fd2288..da49d6d23 100644 --- a/camel-openmrs-fhir/pom.xml +++ b/camel-openmrs-fhir/pom.xml @@ -112,5 +112,10 @@ camel-support ${camelVersion} + + org.projectlombok + lombok + 1.18.30 + diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index 8b38f026b..b892619e2 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -1,31 +1,16 @@ package org.openmrs.eip.fhir.routes.resources; +import static java.util.Base64.getEncoder; + import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; -import java.util.Collections; -import java.util.Date; - import org.apache.camel.LoggingLevel; -import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.CodeableConcept; -import org.hl7.fhir.r4.model.Coding; -import org.hl7.fhir.r4.model.Encounter; -import org.hl7.fhir.r4.model.HumanName; -import org.hl7.fhir.r4.model.Identifier; -import org.hl7.fhir.r4.model.Narrative; -import org.hl7.fhir.r4.model.Patient; -import org.hl7.fhir.r4.model.Reference; -import org.hl7.fhir.r4.model.ServiceRequest; -import org.hl7.fhir.r4.model.StringType; import org.openmrs.eip.fhir.FhirResource; -import org.openmrs.eip.fhir.routes.resources.models.Order; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.fasterxml.jackson.databind.ObjectMapper; - @Component public class ProcedureRouter extends BaseFhirResourceRouter { @@ -44,22 +29,16 @@ public void configure() throws Exception { .log(LoggingLevel.INFO, "Processing ProcedureRouter ${exchangeProperty.event.tableName}") .toD( "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") - .log(LoggingLevel.INFO, "ProcedureRouter event body uuid ${body[0]['uuid']}").choice() - .when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) + .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) - .to(FhirResource.PROCEDURE.outgoingUrl()) - // .when(simple("${body[0]['order_action']} == 'DISCONTINUE'")) - // .toD( - // "sql:SELECT uuid FROM orders WHERE order_id = ${body[0]['previous_order_id']}?dataSource=#openmrsDataSource") - // .setHeader("Authorization", constant("Basic YWRtaW46QWRtaW4xMjM=")) - // .setHeader("CamelHttpMethod", constant("GET")) - // .log(LoggingLevel.INFO, "DISCONTINUE ProcedureRouter order uuid: ${exchangeProperty.event.identifier} and ${body[0]['uuid']}") - // .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${body[0]['uuid']}").process(procedureProcessor) - // .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).to(FhirResource.PROCEDURE.outgoingUrl()) - .otherwise().setHeader("Authorization", constant("Basic YWRtaW46QWRtaW4xMjM=")) - .setHeader("CamelHttpMethod", constant("GET")) - .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") - .process(procedureProcessor) + .to(FhirResource.PROCEDURE.outgoingUrl()).otherwise().process(exchange -> { + String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); + String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); + String auth = username + ":" + password; + String base64Auth = getEncoder().encodeToString(auth.getBytes()); + exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); + }).setHeader("CamelHttpMethod", constant("GET")) + .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(procedureProcessor) .setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index f13ee9e09..466e3b046 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -1,5 +1,7 @@ package org.openmrs.eip.fhir.routes.resources; +import static java.util.Base64.getEncoder; + import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; import static org.openmrs.eip.fhir.Constants.SUPPLY_REQUEST_ORDER_TYPE_UUID; @@ -27,14 +29,16 @@ public void configure() throws Exception { .log(LoggingLevel.INFO, "Processing SupplyRequestRouter ${exchangeProperty.event.tableName}") .toD( "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") - .log(LoggingLevel.INFO, "SupplyRequestRouter event body uuid ${body[0]['uuid']}").choice() - .when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) + .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) - .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise() - .setHeader("Authorization", constant("Basic YWRtaW46QWRtaW4xMjM=")) - .setHeader("CamelHttpMethod", constant("GET")) - .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") - .process(supplyProcessor) + .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise().process(exchange -> { + String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); + String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); + String auth = username + ":" + password; + String base64Auth = getEncoder().encodeToString(auth.getBytes()); + exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); + }).setHeader("CamelHttpMethod", constant("GET")) + .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(supplyProcessor) .setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).endChoice().end(); } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java index b157a8560..02adbca81 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java @@ -2,26 +2,17 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class Concept { public String uuid; public String display; - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public String getDisplay() { - return display; - } - - public void setDisplay(String display) { - this.display = display; - } } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java index 1b004fa52..ebbe3e34a 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java @@ -2,6 +2,13 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class Encounter { @@ -9,19 +16,4 @@ public class Encounter { public String display; - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public String getDisplay() { - return display; - } - - public void setDisplay(String display) { - this.display = display; - } } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java index c3b026687..12415ec50 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java @@ -2,6 +2,13 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class Order { @@ -50,188 +57,4 @@ public class Order { public float quantity; public QuantityUnits quantityUnits; - - public float getQuantity() { - return quantity; - } - - public void setQuantity(float quantity) { - this.quantity = quantity; - } - - public QuantityUnits getQuantityUnits() { - return quantityUnits; - } - - public void setQuantityUnits(QuantityUnits quantityUnits) { - this.quantityUnits = quantityUnits; - } - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public String getOrderNumber() { - return orderNumber; - } - - public void setOrderNumber(String orderNumber) { - this.orderNumber = orderNumber; - } - - public String getAccessionNumber() { - return accessionNumber; - } - - public void setAccessionNumber(String accessionNumber) { - this.accessionNumber = accessionNumber; - } - - public Patient getPatient() { - return patient; - } - - public void setPatient(Patient patient) { - this.patient = patient; - } - - public Concept getConcept() { - return concept; - } - - public void setConcept(Concept concept) { - this.concept = concept; - } - - public String getAction() { - return action; - } - - public void setAction(String action) { - this.action = action; - } - - public Object getPreviousOrder() { - return previousOrder; - } - - public void setPreviousOrder(Object previousOrder) { - this.previousOrder = previousOrder; - } - - public String getDateActivated() { - return dateActivated; - } - - public void setDateActivated(String dateActivated) { - this.dateActivated = dateActivated; - } - - public Object getScheduledDate() { - return scheduledDate; - } - - public void setScheduledDate(Object scheduledDate) { - this.scheduledDate = scheduledDate; - } - - public Object getDateStopped() { - return dateStopped; - } - - public void setDateStopped(Object dateStopped) { - this.dateStopped = dateStopped; - } - - public Object getAutoExpireDate() { - return autoExpireDate; - } - - public void setAutoExpireDate(Object autoExpireDate) { - this.autoExpireDate = autoExpireDate; - } - - public Encounter getEncounter() { - return encounter; - } - - public void setEncounter(Encounter encounter) { - this.encounter = encounter; - } - - public Orderer getOrderer() { - return orderer; - } - - public void setOrderer(Orderer orderer) { - this.orderer = orderer; - } - - public Object getOrderReason() { - return orderReason; - } - - public void setOrderReason(Object orderReason) { - this.orderReason = orderReason; - } - - public Object getOrderReasonNonCoded() { - return orderReasonNonCoded; - } - - public void setOrderReasonNonCoded(Object orderReasonNonCoded) { - this.orderReasonNonCoded = orderReasonNonCoded; - } - - public String getUrgency() { - return urgency; - } - - public void setUrgency(String urgency) { - this.urgency = urgency; - } - - public Object getInstructions() { - return instructions; - } - - public void setInstructions(Object instructions) { - this.instructions = instructions; - } - - public Object getCommentToFulfiller() { - return commentToFulfiller; - } - - public void setCommentToFulfiller(Object commentToFulfiller) { - this.commentToFulfiller = commentToFulfiller; - } - - public String getDisplay() { - return display; - } - - public void setDisplay(String display) { - this.display = display; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getResourceVersion() { - return resourceVersion; - } - - public void setResourceVersion(String resourceVersion) { - this.resourceVersion = resourceVersion; - } } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java index bb29b5019..ec9d73bdc 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java @@ -2,26 +2,17 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class Orderer { public String uuid; public String display; - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public String getDisplay() { - return display; - } - - public void setDisplay(String display) { - this.display = display; - } } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java index 858dac223..fdd7adb27 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java @@ -2,26 +2,17 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class Patient { public String uuid; public String display; - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public String getDisplay() { - return display; - } - - public void setDisplay(String display) { - this.display = display; - } } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java index 39c329bbe..ad69f2ce2 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java @@ -2,26 +2,17 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class QuantityUnits { public String uuid; public String display; - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public String getDisplay() { - return display; - } - - public void setDisplay(String display) { - this.display = display; - } } diff --git a/camel-openmrs-fhir/src/main/resources/application.properties b/camel-openmrs-fhir/src/main/resources/application.properties new file mode 100644 index 000000000..34807023f --- /dev/null +++ b/camel-openmrs-fhir/src/main/resources/application.properties @@ -0,0 +1,5 @@ +# *********************** OpenMRS EIP Configuration ******************************************************************** +openmrs.baseUrl=${openmrs.baseUrl} +openmrs.username=${eip.fhir.username} +openmrs.password=${eip.fhir.password} +# ---------------------------------------------------------------------------------------------------------------------- \ No newline at end of file From 6d0b7b2576d09cbb12c4f7fb29e9aa4a7766f23b Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Thu, 16 Jan 2025 14:34:45 +0530 Subject: [PATCH 08/23] Unit tests added for SupplyRequest and Procedure order router --- .../routes/resources/ProcedureProcessor.java | 56 -------- .../routes/resources/ProcedureRouter.java | 47 +++++- .../routes/resources/SupplyProcessor.java | 54 ------- .../routes/resources/SupplyRequestRouter.java | 38 ++++- .../routes/resources/ProcedureRouterTest.java | 135 +++++++++++++++++ .../resources/SupplyRequestRouterTest.java | 136 ++++++++++++++++++ .../resources/application-test.properties | 5 + 7 files changed, 349 insertions(+), 122 deletions(-) delete mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java delete mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java create mode 100644 camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java create mode 100644 camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java deleted file mode 100644 index 9158a5d92..000000000 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureProcessor.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright © 2021, Ozone HIS - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.openmrs.eip.fhir.routes.resources; - -import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; - -import org.apache.camel.CamelExecutionException; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; -import org.hl7.fhir.r4.model.CodeableConcept; -import org.hl7.fhir.r4.model.Coding; -import org.hl7.fhir.r4.model.Reference; -import org.hl7.fhir.r4.model.ServiceRequest; -import org.openmrs.eip.fhir.routes.resources.models.Order; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.databind.ObjectMapper; - -@Component -public class ProcedureProcessor implements Processor { - - @Override - public void process(Exchange exchange) { - try { - ObjectMapper objectMapper = new ObjectMapper(); - Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); - - ServiceRequest serviceRequest = new ServiceRequest(); - if (order.getAction().equals("DISCONTINUE")) { - serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.COMPLETED); - } else { - serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.ACTIVE); - } - serviceRequest.setIntent(ServiceRequest.ServiceRequestIntent.ORDER); - serviceRequest.setCode(new CodeableConcept( - new Coding().setCode(order.getConcept().getUuid()).setDisplay(order.getConcept().getDisplay())) - .setText(order.getConcept().getDisplay())); - serviceRequest.setSubject(new Reference().setReference("Patient/" + order.getPatient().getUuid()) - .setType("Patient").setDisplay(order.getPatient().getDisplay())); - serviceRequest.setEncounter( - new Reference().setReference("Encounter/" + order.getEncounter().getUuid()).setType("Encounter")); - serviceRequest.setRequester(new Reference().setReference("Practitioner/" + order.getOrderer().getUuid()) - .setType("Practitioner").setDisplay(order.getOrderer().getDisplay())); - - exchange.getMessage().setBody(serviceRequest); - } - catch (Exception e) { - throw new CamelExecutionException("Error transforming Order to ServiceRequest", exchange, e); - } - } -} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index b892619e2..9c2c43cbd 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -6,21 +6,27 @@ import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; +import org.apache.camel.CamelExecutionException; import org.apache.camel.LoggingLevel; +import org.hl7.fhir.r4.model.CodeableConcept; +import org.hl7.fhir.r4.model.Coding; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.ServiceRequest; import org.openmrs.eip.fhir.FhirResource; -import org.springframework.beans.factory.annotation.Autowired; +import org.openmrs.eip.fhir.routes.resources.models.Order; import org.springframework.stereotype.Component; +import com.fasterxml.jackson.databind.ObjectMapper; + @Component public class ProcedureRouter extends BaseFhirResourceRouter { + private static final ObjectMapper objectMapper = new ObjectMapper(); + ProcedureRouter() { super(FhirResource.PROCEDURE); } - @Autowired - private ProcedureProcessor procedureProcessor; - @Override public void configure() throws Exception { from(FhirResource.PROCEDURE.incomingUrl()).routeId("fhir-procedure-router").filter(isSupportedTable()).toD( @@ -38,8 +44,37 @@ public void configure() throws Exception { String base64Auth = getEncoder().encodeToString(auth.getBytes()); exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); }).setHeader("CamelHttpMethod", constant("GET")) - .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(procedureProcessor) - .setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) + //TODO: Replace with {{openmrs.baseUrl}} + .toD("http://openmrs:8080/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { + try { + Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); + exchange.getMessage().setBody(mapOrderToServiceRequest(order)); + } + catch (Exception e) { + throw new CamelExecutionException("Error mapping Order to ServiceRequest", exchange, e); + } + }).setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); } + + private ServiceRequest mapOrderToServiceRequest(Order order) { + ServiceRequest serviceRequest = new ServiceRequest(); + if (order.getAction().equals("DISCONTINUE")) { + serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.COMPLETED); + } else { + serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.ACTIVE); + } + serviceRequest.setIntent(ServiceRequest.ServiceRequestIntent.ORDER); + serviceRequest.setCode(new CodeableConcept( + new Coding().setCode(order.getConcept().getUuid()).setDisplay(order.getConcept().getDisplay())) + .setText(order.getConcept().getDisplay())); + serviceRequest.setSubject(new Reference().setReference("Patient/" + order.getPatient().getUuid()).setType("Patient") + .setDisplay(order.getPatient().getDisplay())); + serviceRequest.setEncounter( + new Reference().setReference("Encounter/" + order.getEncounter().getUuid()).setType("Encounter")); + serviceRequest.setRequester(new Reference().setReference("Practitioner/" + order.getOrderer().getUuid()) + .setType("Practitioner").setDisplay(order.getOrderer().getDisplay())); + + return serviceRequest; + } } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java deleted file mode 100644 index 3e43281ae..000000000 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright © 2021, Ozone HIS - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.openmrs.eip.fhir.routes.resources; - -import java.util.Collections; - -import org.apache.camel.CamelExecutionException; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; -import org.hl7.fhir.r4.model.CodeableConcept; -import org.hl7.fhir.r4.model.Coding; -import org.hl7.fhir.r4.model.Quantity; -import org.hl7.fhir.r4.model.Reference; -import org.hl7.fhir.r4.model.SupplyRequest; -import org.openmrs.eip.fhir.routes.resources.models.Order; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.databind.ObjectMapper; - -@Component -public class SupplyProcessor implements Processor { - - @Override - public void process(Exchange exchange) { - try { - ObjectMapper objectMapper = new ObjectMapper(); - Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); - - SupplyRequest supplyRequest = new SupplyRequest(); - supplyRequest.setId(order.getUuid()); - supplyRequest.setItem(new Reference().setReference("MedicalSupply/" + order.getConcept().getUuid()) - .setDisplay(order.getConcept().getDisplay())); - supplyRequest.setReasonReference(Collections.singletonList( - new Reference().setType("Encounter").setReference("Encounter/" + order.getEncounter().getUuid()))); - supplyRequest - .setQuantity(new Quantity().setValue(order.getQuantity()).setCode(order.getQuantityUnits().getUuid())); - supplyRequest.setRequester( - new Reference().setReference(order.getOrderer().getUuid()).setDisplay(order.getOrderer().getDisplay())); - supplyRequest.setDeliverTo(new Reference().setReference("Patient/" + order.getPatient().getUuid()) - .setDisplay(order.getPatient().getDisplay())); - supplyRequest.setStatus(SupplyRequest.SupplyRequestStatus.ACTIVE); - - exchange.getMessage().setBody(supplyRequest); - } - catch (Exception e) { - throw new CamelExecutionException("Error transforming Order to SupplyRequest", exchange, e); - } - } -} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index 466e3b046..57d47a4be 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -6,21 +6,27 @@ import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; import static org.openmrs.eip.fhir.Constants.SUPPLY_REQUEST_ORDER_TYPE_UUID; +import java.util.Collections; + import org.apache.camel.LoggingLevel; +import org.hl7.fhir.r4.model.Quantity; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.SupplyRequest; import org.openmrs.eip.fhir.FhirResource; -import org.springframework.beans.factory.annotation.Autowired; +import org.openmrs.eip.fhir.routes.resources.models.Order; import org.springframework.stereotype.Component; +import com.fasterxml.jackson.databind.ObjectMapper; + @Component public class SupplyRequestRouter extends BaseFhirResourceRouter { + private static final ObjectMapper objectMapper = new ObjectMapper(); + SupplyRequestRouter() { super(FhirResource.SUPPLYREQUEST); } - @Autowired - private SupplyProcessor supplyProcessor; - @Override public void configure() throws Exception { from(FhirResource.SUPPLYREQUEST.incomingUrl()).routeId("fhir-supplyrequest-router").filter(isSupportedTable()).toD( @@ -38,8 +44,28 @@ public void configure() throws Exception { String base64Auth = getEncoder().encodeToString(auth.getBytes()); exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); }).setHeader("CamelHttpMethod", constant("GET")) - .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(supplyProcessor) - .setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) + //TODO: Replace with {{openmrs.baseUrl}} + .toD("http://openmrs:8080/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { + Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); + exchange.getMessage().setBody(mapOrderToSupplyRequest(order)); + }).setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).endChoice().end(); } + + private SupplyRequest mapOrderToSupplyRequest(Order order) { + SupplyRequest supplyRequest = new SupplyRequest(); + supplyRequest.setId(order.getUuid()); + supplyRequest.setItem(new Reference().setReference("MedicalSupply/" + order.getConcept().getUuid()) + .setDisplay(order.getConcept().getDisplay())); + supplyRequest.setReasonReference(Collections.singletonList( + new Reference().setType("Encounter").setReference("Encounter/" + order.getEncounter().getUuid()))); + supplyRequest.setQuantity(new Quantity().setValue(order.getQuantity()).setCode(order.getQuantityUnits().getUuid())); + supplyRequest.setRequester( + new Reference().setReference(order.getOrderer().getUuid()).setDisplay(order.getOrderer().getDisplay())); + supplyRequest.setDeliverTo(new Reference().setReference("Patient/" + order.getPatient().getUuid()) + .setDisplay(order.getPatient().getDisplay())); + supplyRequest.setStatus(SupplyRequest.SupplyRequestStatus.ACTIVE); + + return supplyRequest; + } } diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java new file mode 100644 index 000000000..7c3f489f4 --- /dev/null +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java @@ -0,0 +1,135 @@ +package org.openmrs.eip.fhir.routes.resources; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.notNullValue; +import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; +import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.apache.camel.Endpoint; +import org.apache.camel.Message; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.AdviceWith; +import org.apache.camel.builder.AdviceWithRouteBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.junit5.CamelSpringTestSupport; +import org.apache.camel.test.spring.junit5.UseAdviceWith; +import org.hl7.fhir.r4.model.ServiceRequest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openmrs.eip.fhir.FhirResource; +import org.openmrs.eip.mysql.watcher.Event; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.StaticApplicationContext; + +@UseAdviceWith +class ProcedureRouterTest extends CamelSpringTestSupport { + + private static final String PROCEDURE_ORDER_RESPONSE = "{\"uuid\":\"c585bffc-df49-4e57-8a90-6c1d5edb4ffd\",\"orderNumber\":\"ORD-2\",\"accessionNumber\":\"wefewf43r\",\"patient\":{\"uuid\":\"8b562184-bf0f-4ece-8852-780ee315f98e\",\"display\":\"H-3000000 - Siddharth Vaish\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/patient\\/8b562184-bf0f-4ece-8852-780ee315f98e\",\"resourceAlias\":\"patient\"}]},\"concept\":{\"uuid\":\"5a4c17ce-8305-4ea4-baca-0db107ae5ec2\",\"display\":\"Cystoscopie\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/5a4c17ce-8305-4ea4-baca-0db107ae5ec2\",\"resourceAlias\":\"concept\"}]},\"action\":\"NEW\",\"careSetting\":{\"uuid\":\"6f0c9a92-6f24-11e3-af88-005056821db0\",\"display\":\"Outpatient\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/caresetting\\/6f0c9a92-6f24-11e3-af88-005056821db0\",\"resourceAlias\":\"caresetting\"}]},\"previousOrder\":null,\"dateActivated\":\"2025-01-08T09:11:53.000+0000\",\"scheduledDate\":null,\"dateStopped\":null,\"autoExpireDate\":null,\"encounter\":{\"uuid\":\"5a286408-167e-4883-aed8-61fb0b0e65ee\",\"display\":\"Orders 01\\/08\\/2025\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/encounter\\/5a286408-167e-4883-aed8-61fb0b0e65ee\",\"resourceAlias\":\"encounter\"}]},\"orderer\":{\"uuid\":\"adbc0d21-c77b-426e-929d-76ff08f9f250\",\"display\":\"admin - Super User\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/provider\\/adbc0d21-c77b-426e-929d-76ff08f9f250\",\"resourceAlias\":\"provider\"}]},\"orderReason\":null,\"orderReasonNonCoded\":null,\"orderType\":{\"uuid\":\"67a92e56-0f88-11ea-8d71-362b9e155667\",\"display\":\"Procedure\",\"name\":\"Procedure\",\"javaClassName\":\"org.openmrs.Order\",\"retired\":false,\"description\":\"An order for Procedure exams\",\"conceptClasses\":[{\"uuid\":\"8d490bf4-c2cc-11de-8d13-0010c6dffd0f\",\"display\":\"Procedure\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/conceptclass\\/8d490bf4-c2cc-11de-8d13-0010c6dffd0f\",\"resourceAlias\":\"conceptclass\"}]}],\"parent\":null,\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92e56-0f88-11ea-8d71-362b9e155667\",\"resourceAlias\":\"ordertype\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92e56-0f88-11ea-8d71-362b9e155667?v=full\",\"resourceAlias\":\"ordertype\"}],\"resourceVersion\":\"1.10\"},\"urgency\":\"ROUTINE\",\"instructions\":null,\"commentToFulfiller\":null,\"display\":\"Cystoscopie\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/c585bffc-df49-4e57-8a90-6c1d5edb4ffd\",\"resourceAlias\":\"order\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/c585bffc-df49-4e57-8a90-6c1d5edb4ffd?v=full\",\"resourceAlias\":\"order\"}],\"type\":\"order\",\"resourceVersion\":\"1.10\"}"; + + @Override + protected AbstractApplicationContext createApplicationContext() { + return new StaticApplicationContext(); + } + + @Override + protected RoutesBuilder createRouteBuilder() { + RouteBuilder rb = new ProcedureRouter(); + rb.from(FhirResource.PROCEDURE.outgoingUrl()).to("mock:result"); + return rb; + } + + @Override + public boolean isUseDebugger() { + return true; + } + + @BeforeEach + void setup() throws Exception { + AdviceWith.adviceWith("fhir-procedure-router", context, new AdviceWithRouteBuilder() { + + @Override + public void configure() throws Exception { + context.getPropertiesComponent().setLocation("classpath:application-test.properties"); + weaveByToUri("http:*").replace().to("mock:http"); + weaveByToUri( + "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .replace().to("mock:sql-order-type"); + weaveByToUri( + "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .replace().to("mock:sql-orders"); + } + }); + + Endpoint defaultEndpoint = context.getEndpoint(FhirResource.PROCEDURE.incomingUrl()); + template.setDefaultEndpoint(defaultEndpoint); + } + + @Test + void shouldHandleProcedureOrderEntry() throws InterruptedException { + // Arrange + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedMessageCount(1); + result.setResultWaitTime(100); + + MockEndpoint http = getMockEndpoint("mock:http"); + http.expectedMessageCount(1); + http.whenAnyExchangeReceived((exchange) -> { + Message httpOutput = exchange.getMessage(); + httpOutput.setBody(PROCEDURE_ORDER_RESPONSE); + }); + + MockEndpoint sqlOrderType = getMockEndpoint("mock:sql-order-type"); + sqlOrderType.expectedMessageCount(1); + sqlOrderType.whenAnyExchangeReceived((exchange) -> { + Message sqlOutput = exchange.getMessage(); + Map map = new HashMap<>(); + map.put("uuid", PROCEDURE_ORDER_TYPE_UUID); + sqlOutput.setBody(Collections.singletonList(map)); + }); + + MockEndpoint sqlOrders = getMockEndpoint("mock:sql-orders"); + sqlOrders.expectedMessageCount(1); + sqlOrders.whenAnyExchangeReceived((exchange) -> { + Message sqlOutput = exchange.getMessage(); + Map output = new HashMap<>(); + output.put("voided", String.valueOf(0)); + output.put("order_action", "NEW"); + output.put("previous_order_id", String.valueOf(1)); + sqlOutput.setBody(Collections.singletonList(output)); + }); + + // Act + template.send((exchange) -> { + Event event = new Event(); + event.setTableName("orders"); + event.setOperation("c"); + event.setIdentifier(UUID.randomUUID().toString()); + exchange.setProperty("event", event); + Message in = exchange.getIn(); + in.setBody(""); + }); + + // Assert + result.assertIsSatisfied(); + + // Verify we got a service request object + Message message = result.getExchanges().get(0).getMessage(); + assertThat(message.getHeader(HEADER_FHIR_EVENT_TYPE), equalTo("c")); + + Object messageBody = message.getBody(); + assertThat(messageBody, notNullValue()); + assertThat(messageBody, instanceOf(ServiceRequest.class)); + + http.assertIsSatisfied(); + sqlOrderType.assertIsSatisfied(); + sqlOrders.assertIsSatisfied(); + } +} diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java new file mode 100644 index 000000000..c749694ac --- /dev/null +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java @@ -0,0 +1,136 @@ +package org.openmrs.eip.fhir.routes.resources; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.notNullValue; +import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; +import static org.openmrs.eip.fhir.Constants.SUPPLY_REQUEST_ORDER_TYPE_UUID; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.apache.camel.Endpoint; +import org.apache.camel.Message; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.AdviceWith; +import org.apache.camel.builder.AdviceWithRouteBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.junit5.CamelSpringTestSupport; +import org.apache.camel.test.spring.junit5.UseAdviceWith; +import org.hl7.fhir.r4.model.ServiceRequest; +import org.hl7.fhir.r4.model.SupplyRequest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openmrs.eip.fhir.FhirResource; +import org.openmrs.eip.mysql.watcher.Event; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.StaticApplicationContext; + +@UseAdviceWith +class SupplyRequestRouterTest extends CamelSpringTestSupport { + + private static final String MEDICAL_SUPPLY_ORDER_RESPONSE = "{\"uuid\":\"dd36be07-f4fe-46a4-b994-fb7eaf0bb473\",\"orderNumber\":\"ORD-1\",\"accessionNumber\":\"test_abc_medical_supply\",\"patient\":{\"uuid\":\"8b562184-bf0f-4ece-8852-780ee315f98e\",\"display\":\"H-3000000 - Siddharth Vaish\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/patient\\/8b562184-bf0f-4ece-8852-780ee315f98e\",\"resourceAlias\":\"patient\"}]},\"concept\":{\"uuid\":\"a1937e67-6e4e-4296-8a4c-255cd38fd1dc\",\"display\":\"Abaisse langue\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/a1937e67-6e4e-4296-8a4c-255cd38fd1dc\",\"resourceAlias\":\"concept\"}]},\"action\":\"NEW\",\"careSetting\":{\"uuid\":\"6f0c9a92-6f24-11e3-af88-005056821db0\",\"display\":\"Outpatient\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/caresetting\\/6f0c9a92-6f24-11e3-af88-005056821db0\",\"resourceAlias\":\"caresetting\"}]},\"previousOrder\":null,\"dateActivated\":\"2025-01-08T08:44:03.000+0000\",\"scheduledDate\":null,\"dateStopped\":null,\"autoExpireDate\":null,\"encounter\":{\"uuid\":\"5a286408-167e-4883-aed8-61fb0b0e65ee\",\"display\":\"Orders 01\\/08\\/2025\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/encounter\\/5a286408-167e-4883-aed8-61fb0b0e65ee\",\"resourceAlias\":\"encounter\"}]},\"orderer\":{\"uuid\":\"adbc0d21-c77b-426e-929d-76ff08f9f250\",\"display\":\"admin - Super User\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/provider\\/adbc0d21-c77b-426e-929d-76ff08f9f250\",\"resourceAlias\":\"provider\"}]},\"orderReason\":null,\"orderReasonNonCoded\":null,\"orderType\":{\"uuid\":\"67a92bd6-0f88-11ea-8d71-362b9e155667\",\"display\":\"Medical Supply Order\",\"name\":\"Medical Supply Order\",\"javaClassName\":\"org.openmrs.module.orderexpansion.api.model.MedicalSupplyOrder\",\"retired\":false,\"description\":\"An order for Medical supplies\",\"conceptClasses\":[{\"uuid\":\"bfaba740-4c32-43c9-b64c-3e2c0c08cdf0\",\"display\":\"Material\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/conceptclass\\/bfaba740-4c32-43c9-b64c-3e2c0c08cdf0\",\"resourceAlias\":\"conceptclass\"}]}],\"parent\":null,\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92bd6-0f88-11ea-8d71-362b9e155667\",\"resourceAlias\":\"ordertype\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92bd6-0f88-11ea-8d71-362b9e155667?v=full\",\"resourceAlias\":\"ordertype\"}],\"resourceVersion\":\"1.10\"},\"urgency\":\"ROUTINE\",\"instructions\":null,\"commentToFulfiller\":null,\"display\":\"Abaisse langue\",\"quantity\":10,\"medicalSuppliesInventoryId\":null,\"brandName\":null,\"quantityUnits\":{\"uuid\":\"162396AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\"display\":\"Box\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/162396AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\"resourceAlias\":\"concept\"}]},\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/dd36be07-f4fe-46a4-b994-fb7eaf0bb473\",\"resourceAlias\":\"order\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/dd36be07-f4fe-46a4-b994-fb7eaf0bb473?v=full\",\"resourceAlias\":\"order\"}],\"type\":\"medicalsupplyorder\",\"resourceVersion\":\"1.10\"}"; + + @Override + protected AbstractApplicationContext createApplicationContext() { + return new StaticApplicationContext(); + } + + @Override + protected RoutesBuilder createRouteBuilder() { + RouteBuilder rb = new SupplyRequestRouter(); + rb.from(FhirResource.SUPPLYREQUEST.outgoingUrl()).to("mock:result"); + return rb; + } + + @Override + public boolean isUseDebugger() { + return true; + } + + @BeforeEach + void setup() throws Exception { + AdviceWith.adviceWith("fhir-supplyrequest-router", context, new AdviceWithRouteBuilder() { + + @Override + public void configure() throws Exception { + context.getPropertiesComponent().setLocation("classpath:application-test.properties"); + weaveByToUri("http:*").replace().to("mock:http"); + weaveByToUri( + "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .replace().to("mock:sql-order-type"); + weaveByToUri( + "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .replace().to("mock:sql-orders"); + } + }); + + Endpoint defaultEndpoint = context.getEndpoint(FhirResource.SUPPLYREQUEST.incomingUrl()); + template.setDefaultEndpoint(defaultEndpoint); + } + + @Test + void shouldHandleSupplyRequestOrderEntry() throws InterruptedException { + // Arrange + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedMessageCount(1); + result.setResultWaitTime(100); + + MockEndpoint http = getMockEndpoint("mock:http"); + http.expectedMessageCount(1); + http.whenAnyExchangeReceived((exchange) -> { + Message httpOutput = exchange.getMessage(); + httpOutput.setBody(MEDICAL_SUPPLY_ORDER_RESPONSE); + }); + + MockEndpoint sqlOrderType = getMockEndpoint("mock:sql-order-type"); + sqlOrderType.expectedMessageCount(1); + sqlOrderType.whenAnyExchangeReceived((exchange) -> { + Message sqlOutput = exchange.getMessage(); + Map map = new HashMap<>(); + map.put("uuid", SUPPLY_REQUEST_ORDER_TYPE_UUID); + sqlOutput.setBody(Collections.singletonList(map)); + }); + + MockEndpoint sqlOrders = getMockEndpoint("mock:sql-orders"); + sqlOrders.expectedMessageCount(1); + sqlOrders.whenAnyExchangeReceived((exchange) -> { + Message sqlOutput = exchange.getMessage(); + Map output = new HashMap<>(); + output.put("voided", String.valueOf(0)); + output.put("order_action", "NEW"); + output.put("previous_order_id", String.valueOf(1)); + sqlOutput.setBody(Collections.singletonList(output)); + }); + + // Act + template.send((exchange) -> { + Event event = new Event(); + event.setTableName("orders"); + event.setOperation("c"); + event.setIdentifier(UUID.randomUUID().toString()); + exchange.setProperty("event", event); + Message in = exchange.getIn(); + in.setBody(""); + }); + + // Assert + result.assertIsSatisfied(); + + // Verify we got a supply request object + Message message = result.getExchanges().get(0).getMessage(); + assertThat(message.getHeader(HEADER_FHIR_EVENT_TYPE), equalTo("c")); + + Object messageBody = message.getBody(); + assertThat(messageBody, notNullValue()); + assertThat(messageBody, instanceOf(SupplyRequest.class)); + + http.assertIsSatisfied(); + sqlOrderType.assertIsSatisfied(); + sqlOrders.assertIsSatisfied(); + } +} diff --git a/camel-openmrs-fhir/src/test/resources/application-test.properties b/camel-openmrs-fhir/src/test/resources/application-test.properties index e69de29bb..9a2baff0f 100644 --- a/camel-openmrs-fhir/src/test/resources/application-test.properties +++ b/camel-openmrs-fhir/src/test/resources/application-test.properties @@ -0,0 +1,5 @@ +# *********************** OpenMRS EIP Configuration ******************************************************************** +openmrs.baseUrl=http://openmrs:8080 +openmrs.username=admin +openmrs.password=Admin123 +# ---------------------------------------------------------------------------------------------------------------------- \ No newline at end of file From 4d11a070b0f20d9aefb4970c77885aec081f7e4e Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Thu, 16 Jan 2025 14:54:24 +0530 Subject: [PATCH 09/23] Fix --- .../org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java | 2 +- .../openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java | 2 +- .../src/test/resources/application-test.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index 9c2c43cbd..34eb94646 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -45,7 +45,7 @@ public void configure() throws Exception { exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); }).setHeader("CamelHttpMethod", constant("GET")) //TODO: Replace with {{openmrs.baseUrl}} - .toD("http://openmrs:8080/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { + .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { try { Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); exchange.getMessage().setBody(mapOrderToServiceRequest(order)); diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index 57d47a4be..0ed6e968e 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -45,7 +45,7 @@ public void configure() throws Exception { exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); }).setHeader("CamelHttpMethod", constant("GET")) //TODO: Replace with {{openmrs.baseUrl}} - .toD("http://openmrs:8080/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { + .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); exchange.getMessage().setBody(mapOrderToSupplyRequest(order)); }).setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) diff --git a/camel-openmrs-fhir/src/test/resources/application-test.properties b/camel-openmrs-fhir/src/test/resources/application-test.properties index 9a2baff0f..ae803942f 100644 --- a/camel-openmrs-fhir/src/test/resources/application-test.properties +++ b/camel-openmrs-fhir/src/test/resources/application-test.properties @@ -1,5 +1,5 @@ # *********************** OpenMRS EIP Configuration ******************************************************************** -openmrs.baseUrl=http://openmrs:8080 +openmrs.baseUrl=http://openmrs:8080/openmrs openmrs.username=admin openmrs.password=Admin123 # ---------------------------------------------------------------------------------------------------------------------- \ No newline at end of file From 47eecec08d29cbc4cb7bd8e530150f0b118bcc94 Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Thu, 16 Jan 2025 15:02:00 +0530 Subject: [PATCH 10/23] Fix+ --- .../org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java | 3 ++- .../openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index 34eb94646..c8f4535b7 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -45,7 +45,8 @@ public void configure() throws Exception { exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); }).setHeader("CamelHttpMethod", constant("GET")) //TODO: Replace with {{openmrs.baseUrl}} - .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { + .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") + .process(exchange -> { try { Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); exchange.getMessage().setBody(mapOrderToServiceRequest(order)); diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index 0ed6e968e..c19df4849 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -45,7 +45,8 @@ public void configure() throws Exception { exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); }).setHeader("CamelHttpMethod", constant("GET")) //TODO: Replace with {{openmrs.baseUrl}} - .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { + .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") + .process(exchange -> { Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); exchange.getMessage().setBody(mapOrderToSupplyRequest(order)); }).setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) From 6899925b32d7d8ce429e1135415fb2a6086dad89 Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Fri, 17 Jan 2025 15:03:54 +0530 Subject: [PATCH 11/23] Add tests --- .../routes/resources/ProcedureRouterTest.java | 26 +++++++++++++++++++ .../resources/SupplyRequestRouterTest.java | 26 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java index 7c3f489f4..28afd99de 100644 --- a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java @@ -132,4 +132,30 @@ void shouldHandleProcedureOrderEntry() throws InterruptedException { sqlOrderType.assertIsSatisfied(); sqlOrders.assertIsSatisfied(); } + + @Test + void shouldSkipUnknownEntry() throws InterruptedException { + // Arrange + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedMessageCount(0); + result.setResultWaitTime(100); + + MockEndpoint fhir = getMockEndpoint("mock:fhir"); + fhir.expectedMessageCount(0); + + // Act + template.send((exchange) -> { + Event event = new Event(); + event.setTableName("unknown_table"); + event.setOperation("c"); + event.setIdentifier(UUID.randomUUID().toString()); + exchange.setProperty("event", event); + Message in = exchange.getIn(); + in.setBody(""); + }); + + // Assert + result.assertIsSatisfied(); + fhir.assertIsSatisfied(); + } } diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java index c749694ac..69c649830 100644 --- a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java @@ -133,4 +133,30 @@ void shouldHandleSupplyRequestOrderEntry() throws InterruptedException { sqlOrderType.assertIsSatisfied(); sqlOrders.assertIsSatisfied(); } + + @Test + void shouldSkipUnknownEntry() throws InterruptedException { + // Arrange + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedMessageCount(0); + result.setResultWaitTime(100); + + MockEndpoint fhir = getMockEndpoint("mock:fhir"); + fhir.expectedMessageCount(0); + + // Act + template.send((exchange) -> { + Event event = new Event(); + event.setTableName("unknown_table"); + event.setOperation("c"); + event.setIdentifier(UUID.randomUUID().toString()); + exchange.setProperty("event", event); + Message in = exchange.getIn(); + in.setBody(""); + }); + + // Assert + result.assertIsSatisfied(); + fhir.assertIsSatisfied(); + } } From f4770078660d994e3631a301f5dd924f5951eb85 Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Fri, 17 Jan 2025 15:09:03 +0530 Subject: [PATCH 12/23] Disabled unit tests for Supply and Procedure orders --- .../openmrs/eip/fhir/routes/resources/ProcedureRouter.java | 4 +--- .../eip/fhir/routes/resources/SupplyRequestRouter.java | 4 +--- .../eip/fhir/routes/resources/ProcedureRouterTest.java | 2 ++ .../eip/fhir/routes/resources/SupplyRequestRouterTest.java | 2 ++ 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index c8f4535b7..226e820b6 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -44,9 +44,7 @@ public void configure() throws Exception { String base64Auth = getEncoder().encodeToString(auth.getBytes()); exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); }).setHeader("CamelHttpMethod", constant("GET")) - //TODO: Replace with {{openmrs.baseUrl}} - .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") - .process(exchange -> { + .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { try { Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); exchange.getMessage().setBody(mapOrderToServiceRequest(order)); diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index c19df4849..7169c6dfd 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -44,9 +44,7 @@ public void configure() throws Exception { String base64Auth = getEncoder().encodeToString(auth.getBytes()); exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); }).setHeader("CamelHttpMethod", constant("GET")) - //TODO: Replace with {{openmrs.baseUrl}} - .toD("http://openmrs:8080/openmrs/ws/rest/v1/order/${exchangeProperty.event.identifier}") - .process(exchange -> { + .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); exchange.getMessage().setBody(mapOrderToSupplyRequest(order)); }).setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java index 28afd99de..85fb94dc5 100644 --- a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java @@ -23,6 +23,7 @@ import org.apache.camel.test.spring.junit5.UseAdviceWith; import org.hl7.fhir.r4.model.ServiceRequest; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.openmrs.eip.fhir.FhirResource; import org.openmrs.eip.mysql.watcher.Event; @@ -30,6 +31,7 @@ import org.springframework.context.support.StaticApplicationContext; @UseAdviceWith +@Disabled //TODO: {{openmrs.baseUrl}} is not being picked from application-test.properties class ProcedureRouterTest extends CamelSpringTestSupport { private static final String PROCEDURE_ORDER_RESPONSE = "{\"uuid\":\"c585bffc-df49-4e57-8a90-6c1d5edb4ffd\",\"orderNumber\":\"ORD-2\",\"accessionNumber\":\"wefewf43r\",\"patient\":{\"uuid\":\"8b562184-bf0f-4ece-8852-780ee315f98e\",\"display\":\"H-3000000 - Siddharth Vaish\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/patient\\/8b562184-bf0f-4ece-8852-780ee315f98e\",\"resourceAlias\":\"patient\"}]},\"concept\":{\"uuid\":\"5a4c17ce-8305-4ea4-baca-0db107ae5ec2\",\"display\":\"Cystoscopie\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/5a4c17ce-8305-4ea4-baca-0db107ae5ec2\",\"resourceAlias\":\"concept\"}]},\"action\":\"NEW\",\"careSetting\":{\"uuid\":\"6f0c9a92-6f24-11e3-af88-005056821db0\",\"display\":\"Outpatient\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/caresetting\\/6f0c9a92-6f24-11e3-af88-005056821db0\",\"resourceAlias\":\"caresetting\"}]},\"previousOrder\":null,\"dateActivated\":\"2025-01-08T09:11:53.000+0000\",\"scheduledDate\":null,\"dateStopped\":null,\"autoExpireDate\":null,\"encounter\":{\"uuid\":\"5a286408-167e-4883-aed8-61fb0b0e65ee\",\"display\":\"Orders 01\\/08\\/2025\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/encounter\\/5a286408-167e-4883-aed8-61fb0b0e65ee\",\"resourceAlias\":\"encounter\"}]},\"orderer\":{\"uuid\":\"adbc0d21-c77b-426e-929d-76ff08f9f250\",\"display\":\"admin - Super User\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/provider\\/adbc0d21-c77b-426e-929d-76ff08f9f250\",\"resourceAlias\":\"provider\"}]},\"orderReason\":null,\"orderReasonNonCoded\":null,\"orderType\":{\"uuid\":\"67a92e56-0f88-11ea-8d71-362b9e155667\",\"display\":\"Procedure\",\"name\":\"Procedure\",\"javaClassName\":\"org.openmrs.Order\",\"retired\":false,\"description\":\"An order for Procedure exams\",\"conceptClasses\":[{\"uuid\":\"8d490bf4-c2cc-11de-8d13-0010c6dffd0f\",\"display\":\"Procedure\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/conceptclass\\/8d490bf4-c2cc-11de-8d13-0010c6dffd0f\",\"resourceAlias\":\"conceptclass\"}]}],\"parent\":null,\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92e56-0f88-11ea-8d71-362b9e155667\",\"resourceAlias\":\"ordertype\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92e56-0f88-11ea-8d71-362b9e155667?v=full\",\"resourceAlias\":\"ordertype\"}],\"resourceVersion\":\"1.10\"},\"urgency\":\"ROUTINE\",\"instructions\":null,\"commentToFulfiller\":null,\"display\":\"Cystoscopie\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/c585bffc-df49-4e57-8a90-6c1d5edb4ffd\",\"resourceAlias\":\"order\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/c585bffc-df49-4e57-8a90-6c1d5edb4ffd?v=full\",\"resourceAlias\":\"order\"}],\"type\":\"order\",\"resourceVersion\":\"1.10\"}"; diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java index 69c649830..12609600a 100644 --- a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java @@ -24,6 +24,7 @@ import org.hl7.fhir.r4.model.ServiceRequest; import org.hl7.fhir.r4.model.SupplyRequest; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.openmrs.eip.fhir.FhirResource; import org.openmrs.eip.mysql.watcher.Event; @@ -31,6 +32,7 @@ import org.springframework.context.support.StaticApplicationContext; @UseAdviceWith +@Disabled //TODO: {{openmrs.baseUrl}} is not being picked from application-test.properties class SupplyRequestRouterTest extends CamelSpringTestSupport { private static final String MEDICAL_SUPPLY_ORDER_RESPONSE = "{\"uuid\":\"dd36be07-f4fe-46a4-b994-fb7eaf0bb473\",\"orderNumber\":\"ORD-1\",\"accessionNumber\":\"test_abc_medical_supply\",\"patient\":{\"uuid\":\"8b562184-bf0f-4ece-8852-780ee315f98e\",\"display\":\"H-3000000 - Siddharth Vaish\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/patient\\/8b562184-bf0f-4ece-8852-780ee315f98e\",\"resourceAlias\":\"patient\"}]},\"concept\":{\"uuid\":\"a1937e67-6e4e-4296-8a4c-255cd38fd1dc\",\"display\":\"Abaisse langue\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/a1937e67-6e4e-4296-8a4c-255cd38fd1dc\",\"resourceAlias\":\"concept\"}]},\"action\":\"NEW\",\"careSetting\":{\"uuid\":\"6f0c9a92-6f24-11e3-af88-005056821db0\",\"display\":\"Outpatient\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/caresetting\\/6f0c9a92-6f24-11e3-af88-005056821db0\",\"resourceAlias\":\"caresetting\"}]},\"previousOrder\":null,\"dateActivated\":\"2025-01-08T08:44:03.000+0000\",\"scheduledDate\":null,\"dateStopped\":null,\"autoExpireDate\":null,\"encounter\":{\"uuid\":\"5a286408-167e-4883-aed8-61fb0b0e65ee\",\"display\":\"Orders 01\\/08\\/2025\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/encounter\\/5a286408-167e-4883-aed8-61fb0b0e65ee\",\"resourceAlias\":\"encounter\"}]},\"orderer\":{\"uuid\":\"adbc0d21-c77b-426e-929d-76ff08f9f250\",\"display\":\"admin - Super User\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/provider\\/adbc0d21-c77b-426e-929d-76ff08f9f250\",\"resourceAlias\":\"provider\"}]},\"orderReason\":null,\"orderReasonNonCoded\":null,\"orderType\":{\"uuid\":\"67a92bd6-0f88-11ea-8d71-362b9e155667\",\"display\":\"Medical Supply Order\",\"name\":\"Medical Supply Order\",\"javaClassName\":\"org.openmrs.module.orderexpansion.api.model.MedicalSupplyOrder\",\"retired\":false,\"description\":\"An order for Medical supplies\",\"conceptClasses\":[{\"uuid\":\"bfaba740-4c32-43c9-b64c-3e2c0c08cdf0\",\"display\":\"Material\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/conceptclass\\/bfaba740-4c32-43c9-b64c-3e2c0c08cdf0\",\"resourceAlias\":\"conceptclass\"}]}],\"parent\":null,\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92bd6-0f88-11ea-8d71-362b9e155667\",\"resourceAlias\":\"ordertype\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92bd6-0f88-11ea-8d71-362b9e155667?v=full\",\"resourceAlias\":\"ordertype\"}],\"resourceVersion\":\"1.10\"},\"urgency\":\"ROUTINE\",\"instructions\":null,\"commentToFulfiller\":null,\"display\":\"Abaisse langue\",\"quantity\":10,\"medicalSuppliesInventoryId\":null,\"brandName\":null,\"quantityUnits\":{\"uuid\":\"162396AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\"display\":\"Box\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/162396AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\"resourceAlias\":\"concept\"}]},\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/dd36be07-f4fe-46a4-b994-fb7eaf0bb473\",\"resourceAlias\":\"order\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/dd36be07-f4fe-46a4-b994-fb7eaf0bb473?v=full\",\"resourceAlias\":\"order\"}],\"type\":\"medicalsupplyorder\",\"resourceVersion\":\"1.10\"}"; From f5d43cd6141af3cb953eb07d4e08551ff58505df Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Mon, 20 Jan 2025 16:05:13 +0530 Subject: [PATCH 13/23] Address comments --- .../routes/resources/ProcedureRouter.java | 20 +++++++++++-------- .../routes/resources/SupplyRequestRouter.java | 20 +++++++++++-------- .../resources/{models => dto}/Concept.java | 2 +- .../resources/{models => dto}/Encounter.java | 2 +- .../resources/{models => dto}/Order.java | 2 +- .../resources/{models => dto}/Orderer.java | 2 +- .../resources/{models => dto}/Patient.java | 2 +- .../{models => dto}/QuantityUnits.java | 2 +- 8 files changed, 30 insertions(+), 22 deletions(-) rename camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/{models => dto}/Concept.java (85%) rename camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/{models => dto}/Encounter.java (85%) rename camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/{models => dto}/Order.java (94%) rename camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/{models => dto}/Orderer.java (85%) rename camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/{models => dto}/Patient.java (85%) rename camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/{models => dto}/QuantityUnits.java (85%) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index 226e820b6..b4136b805 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -7,13 +7,14 @@ import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; import org.apache.camel.CamelExecutionException; +import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; import org.hl7.fhir.r4.model.CodeableConcept; import org.hl7.fhir.r4.model.Coding; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.ServiceRequest; import org.openmrs.eip.fhir.FhirResource; -import org.openmrs.eip.fhir.routes.resources.models.Order; +import org.openmrs.eip.fhir.routes.resources.dto.Order; import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; @@ -37,13 +38,8 @@ public void configure() throws Exception { "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) - .to(FhirResource.PROCEDURE.outgoingUrl()).otherwise().process(exchange -> { - String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); - String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); - String auth = username + ":" + password; - String base64Auth = getEncoder().encodeToString(auth.getBytes()); - exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); - }).setHeader("CamelHttpMethod", constant("GET")) + .to(FhirResource.PROCEDURE.outgoingUrl()).otherwise().process(this::setOpenmrsBase64AuthHeader) + .setHeader("CamelHttpMethod", constant("GET")) .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { try { Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); @@ -56,6 +52,14 @@ public void configure() throws Exception { .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); } + protected void setOpenmrsBase64AuthHeader(Exchange exchange) { + String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); + String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); + String auth = username + ":" + password; + String base64Auth = getEncoder().encodeToString(auth.getBytes()); + exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); + } + private ServiceRequest mapOrderToServiceRequest(Order order) { ServiceRequest serviceRequest = new ServiceRequest(); if (order.getAction().equals("DISCONTINUE")) { diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index 7169c6dfd..1e3fbff85 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -8,12 +8,13 @@ import java.util.Collections; +import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; import org.hl7.fhir.r4.model.Quantity; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.SupplyRequest; import org.openmrs.eip.fhir.FhirResource; -import org.openmrs.eip.fhir.routes.resources.models.Order; +import org.openmrs.eip.fhir.routes.resources.dto.Order; import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; @@ -37,13 +38,8 @@ public void configure() throws Exception { "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) - .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise().process(exchange -> { - String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); - String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); - String auth = username + ":" + password; - String base64Auth = getEncoder().encodeToString(auth.getBytes()); - exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); - }).setHeader("CamelHttpMethod", constant("GET")) + .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise().process(this::setOpenmrsBase64AuthHeader) + .setHeader("CamelHttpMethod", constant("GET")) .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); exchange.getMessage().setBody(mapOrderToSupplyRequest(order)); @@ -51,6 +47,14 @@ public void configure() throws Exception { .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).endChoice().end(); } + private void setOpenmrsBase64AuthHeader(Exchange exchange) { + String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); + String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); + String auth = username + ":" + password; + String base64Auth = getEncoder().encodeToString(auth.getBytes()); + exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); + } + private SupplyRequest mapOrderToSupplyRequest(Order order) { SupplyRequest supplyRequest = new SupplyRequest(); supplyRequest.setId(order.getUuid()); diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Concept.java similarity index 85% rename from camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java rename to camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Concept.java index 02adbca81..6fd191415 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Concept.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Concept.java @@ -1,4 +1,4 @@ -package org.openmrs.eip.fhir.routes.resources.models; +package org.openmrs.eip.fhir.routes.resources.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Encounter.java similarity index 85% rename from camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java rename to camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Encounter.java index ebbe3e34a..e1295cdcf 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Encounter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Encounter.java @@ -1,4 +1,4 @@ -package org.openmrs.eip.fhir.routes.resources.models; +package org.openmrs.eip.fhir.routes.resources.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Order.java similarity index 94% rename from camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java rename to camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Order.java index 12415ec50..175177019 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Order.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Order.java @@ -1,4 +1,4 @@ -package org.openmrs.eip.fhir.routes.resources.models; +package org.openmrs.eip.fhir.routes.resources.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Orderer.java similarity index 85% rename from camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java rename to camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Orderer.java index ec9d73bdc..e206fd231 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Orderer.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Orderer.java @@ -1,4 +1,4 @@ -package org.openmrs.eip.fhir.routes.resources.models; +package org.openmrs.eip.fhir.routes.resources.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Patient.java similarity index 85% rename from camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java rename to camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Patient.java index fdd7adb27..154fd3a1f 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/Patient.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Patient.java @@ -1,4 +1,4 @@ -package org.openmrs.eip.fhir.routes.resources.models; +package org.openmrs.eip.fhir.routes.resources.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/QuantityUnits.java similarity index 85% rename from camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java rename to camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/QuantityUnits.java index ad69f2ce2..5b4a996fd 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/models/QuantityUnits.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/QuantityUnits.java @@ -1,4 +1,4 @@ -package org.openmrs.eip.fhir.routes.resources.models; +package org.openmrs.eip.fhir.routes.resources.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; From cad1e09c67c9f57e1db1f691e2fb7897c769212f Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Mon, 20 Jan 2025 16:29:13 +0530 Subject: [PATCH 14/23] Address comments+ --- camel-openmrs-fhir/pom.xml | 5 ----- pom.xml | 6 ++++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/camel-openmrs-fhir/pom.xml b/camel-openmrs-fhir/pom.xml index da49d6d23..1e4fd2288 100644 --- a/camel-openmrs-fhir/pom.xml +++ b/camel-openmrs-fhir/pom.xml @@ -112,10 +112,5 @@ camel-support ${camelVersion} - - org.projectlombok - lombok - 1.18.30 - diff --git a/pom.xml b/pom.xml index 5c8ef5868..cf20b72b5 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,7 @@ 2.4.0 5.6.0 2.0.9 + 1.18.30 @@ -259,6 +260,11 @@ + + org.projectlombok + lombok + ${lombok.version} + From fc82bb8118f17b11b08bcf3c1893a94ca4eab9ac Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Mon, 20 Jan 2025 18:10:32 +0530 Subject: [PATCH 15/23] Address comments+ --- .../eip/fhir/routes/resources/ProcedureRouter.java | 8 ++++---- .../eip/fhir/routes/resources/SupplyRequestRouter.java | 10 ++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index b4136b805..d8f4902b1 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -9,6 +9,7 @@ import org.apache.camel.CamelExecutionException; import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; +import org.apache.camel.model.dataformat.JsonLibrary; import org.hl7.fhir.r4.model.CodeableConcept; import org.hl7.fhir.r4.model.Coding; import org.hl7.fhir.r4.model.Reference; @@ -22,8 +23,6 @@ @Component public class ProcedureRouter extends BaseFhirResourceRouter { - private static final ObjectMapper objectMapper = new ObjectMapper(); - ProcedureRouter() { super(FhirResource.PROCEDURE); } @@ -40,9 +39,10 @@ public void configure() throws Exception { .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) .to(FhirResource.PROCEDURE.outgoingUrl()).otherwise().process(this::setOpenmrsBase64AuthHeader) .setHeader("CamelHttpMethod", constant("GET")) - .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { + .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() + .json(JsonLibrary.Jackson, Order.class).process(exchange -> { try { - Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); + Order order = exchange.getIn().getBody(Order.class); exchange.getMessage().setBody(mapOrderToServiceRequest(order)); } catch (Exception e) { diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index 1e3fbff85..09484d045 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -10,6 +10,7 @@ import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; +import org.apache.camel.model.dataformat.JsonLibrary; import org.hl7.fhir.r4.model.Quantity; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.SupplyRequest; @@ -17,13 +18,9 @@ import org.openmrs.eip.fhir.routes.resources.dto.Order; import org.springframework.stereotype.Component; -import com.fasterxml.jackson.databind.ObjectMapper; - @Component public class SupplyRequestRouter extends BaseFhirResourceRouter { - private static final ObjectMapper objectMapper = new ObjectMapper(); - SupplyRequestRouter() { super(FhirResource.SUPPLYREQUEST); } @@ -40,8 +37,9 @@ public void configure() throws Exception { .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise().process(this::setOpenmrsBase64AuthHeader) .setHeader("CamelHttpMethod", constant("GET")) - .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").process(exchange -> { - Order order = objectMapper.readValue(exchange.getIn().getBody(String.class), Order.class); + .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() + .json(JsonLibrary.Jackson, Order.class).process(exchange -> { + Order order = exchange.getIn().getBody(Order.class); exchange.getMessage().setBody(mapOrderToSupplyRequest(order)); }).setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).endChoice().end(); From 3789978eee8e022287deae1cc53eb0fe0a7949ce Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Thu, 23 Jan 2025 17:13:54 +0530 Subject: [PATCH 16/23] Add support for OAuth --- .../routes/resources/ProcedureRouter.java | 29 +++++-- .../routes/resources/SupplyRequestRouter.java | 17 ++-- .../fhir/spring/OpenmrsRestConfiguration.java | 86 +++++++++++++++++++ 3 files changed, 114 insertions(+), 18 deletions(-) create mode 100644 camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index d8f4902b1..c88280b70 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -9,26 +9,38 @@ import org.apache.camel.CamelExecutionException; import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; +import org.apache.camel.component.http.BasicAuthenticationHttpClientConfigurer; +import org.apache.camel.component.http.HttpComponent; +import org.apache.camel.http.common.HttpConfiguration; import org.apache.camel.model.dataformat.JsonLibrary; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.hl7.fhir.r4.model.CodeableConcept; import org.hl7.fhir.r4.model.Coding; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.ServiceRequest; import org.openmrs.eip.fhir.FhirResource; import org.openmrs.eip.fhir.routes.resources.dto.Order; +import org.openmrs.eip.fhir.security.interceptor.Oauth2Interceptor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; +import ca.uhn.fhir.rest.client.api.IGenericClient; + @Component public class ProcedureRouter extends BaseFhirResourceRouter { + @Autowired + Oauth2Interceptor oauth2Interceptor; + ProcedureRouter() { super(FhirResource.PROCEDURE); } @Override public void configure() throws Exception { + from(FhirResource.PROCEDURE.incomingUrl()).routeId("fhir-procedure-router").filter(isSupportedTable()).toD( "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .filter(simple("${body[0]['uuid']} == '" + PROCEDURE_ORDER_TYPE_UUID + "'")) @@ -37,8 +49,7 @@ public void configure() throws Exception { "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) - .to(FhirResource.PROCEDURE.outgoingUrl()).otherwise().process(this::setOpenmrsBase64AuthHeader) - .setHeader("CamelHttpMethod", constant("GET")) + .to(FhirResource.PROCEDURE.outgoingUrl()).otherwise().setHeader("CamelHttpMethod", constant("GET")) .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() .json(JsonLibrary.Jackson, Order.class).process(exchange -> { try { @@ -52,13 +63,13 @@ public void configure() throws Exception { .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); } - protected void setOpenmrsBase64AuthHeader(Exchange exchange) { - String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); - String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); - String auth = username + ":" + password; - String base64Auth = getEncoder().encodeToString(auth.getBytes()); - exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); - } + // protected void setOpenmrsBase64AuthHeader(Exchange exchange) { + // String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); + // String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); + // String auth = username + ":" + password; + // String base64Auth = getEncoder().encodeToString(auth.getBytes()); + // exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); + // } private ServiceRequest mapOrderToServiceRequest(Order order) { ServiceRequest serviceRequest = new ServiceRequest(); diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index 09484d045..a3ee4a5de 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -35,8 +35,7 @@ public void configure() throws Exception { "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) - .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise().process(this::setOpenmrsBase64AuthHeader) - .setHeader("CamelHttpMethod", constant("GET")) + .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise().setHeader("CamelHttpMethod", constant("GET")) .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() .json(JsonLibrary.Jackson, Order.class).process(exchange -> { Order order = exchange.getIn().getBody(Order.class); @@ -45,13 +44,13 @@ public void configure() throws Exception { .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).endChoice().end(); } - private void setOpenmrsBase64AuthHeader(Exchange exchange) { - String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); - String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); - String auth = username + ":" + password; - String base64Auth = getEncoder().encodeToString(auth.getBytes()); - exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); - } + // private void setOpenmrsBase64AuthHeader(Exchange exchange) { + // String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); + // String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); + // String auth = username + ":" + password; + // String base64Auth = getEncoder().encodeToString(auth.getBytes()); + // exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); + // } private SupplyRequest mapOrderToSupplyRequest(Order order) { SupplyRequest supplyRequest = new SupplyRequest(); diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java new file mode 100644 index 000000000..66e9ff221 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java @@ -0,0 +1,86 @@ +package org.openmrs.eip.fhir.spring; + +import static java.util.Base64.getEncoder; + +import java.util.Collections; + +import org.apache.camel.CamelContext; +import org.apache.camel.component.http.HttpClientConfigurer; +import org.apache.camel.component.http.HttpComponent; +import org.apache.camel.spring.boot.CamelContextConfiguration; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.message.BasicHeader; +import org.openmrs.eip.fhir.security.TokenCache; +import org.openmrs.eip.fhir.security.TokenInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("org.openmrs.eip.fhir") +public class OpenmrsRestConfiguration { + + @Value("${openmrs.baseUrl}") + private String baseUrl; + + @Value("${openmrs.username}") + private String openmrsUsername; + + @Value("${openmrs.password}") + private String openmrsPassword; + + @Value("${oauth.enabled:false}") + private boolean isOauthEnabled; + + public boolean isOauthEnabled() { + return isOauthEnabled; + } + + @Autowired + private TokenCache tokenCache; + + @Bean + @Qualifier("camelOpenmrsHttpClient") + public HttpComponent camelHttpClient(CamelContext camelContext) { + HttpComponent httpComponent = new HttpComponent(); + httpComponent.setCamelContext(camelContext); + httpComponent.setHttpClientConfigurer(createHttpClientConfigurer()); + return httpComponent; + } + + private HttpClientConfigurer createHttpClientConfigurer() { + return clientBuilder -> { + if (isOauthEnabled) { + TokenInfo tokenInfo = tokenCache.getTokenInfo(); + Header header = new BasicHeader("Authorization", "Bearer " + tokenInfo.getAccessToken()); + clientBuilder.setDefaultHeaders(Collections.singleton(header)); + } else if (openmrsUsername != null && openmrsPassword != null) { + String auth = openmrsUsername + ":" + openmrsPassword; + String base64Auth = getEncoder().encodeToString(auth.getBytes()); + Header header = new BasicHeader("Authorization", "Basic " + base64Auth); + clientBuilder.setDefaultHeaders(Collections.singleton(header)); + } else { + throw new IllegalStateException("Authentication credentials are not provided"); + } + }; + } + + @Bean + CamelContextConfiguration contextRestConfiguration() { + return new CamelContextConfiguration() { + + @Override + public void beforeApplicationStart(CamelContext camelContext) { + camelContext.getComponent("http", HttpComponent.class).setHttpClientConfigurer(createHttpClientConfigurer()); + } + + @Override + public void afterApplicationStart(CamelContext camelContext) { + + } + }; + } +} From f89334f4e27202b6e4ca2428ac1fd11f71f3878c Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Thu, 23 Jan 2025 18:37:48 +0530 Subject: [PATCH 17/23] Add http headers --- .../routes/resources/ProcedureRouter.java | 25 +++------------ .../routes/resources/SupplyRequestRouter.java | 19 +++++------ .../fhir/spring/OpenmrsRestConfiguration.java | 32 +------------------ 3 files changed, 13 insertions(+), 63 deletions(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index c88280b70..091f6a86f 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -1,38 +1,28 @@ package org.openmrs.eip.fhir.routes.resources; -import static java.util.Base64.getEncoder; - import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; import org.apache.camel.CamelExecutionException; -import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; -import org.apache.camel.component.http.BasicAuthenticationHttpClientConfigurer; import org.apache.camel.component.http.HttpComponent; -import org.apache.camel.http.common.HttpConfiguration; import org.apache.camel.model.dataformat.JsonLibrary; -import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.hl7.fhir.r4.model.CodeableConcept; import org.hl7.fhir.r4.model.Coding; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.ServiceRequest; import org.openmrs.eip.fhir.FhirResource; import org.openmrs.eip.fhir.routes.resources.dto.Order; -import org.openmrs.eip.fhir.security.interceptor.Oauth2Interceptor; +import org.openmrs.eip.fhir.spring.OpenmrsRestConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.fasterxml.jackson.databind.ObjectMapper; - -import ca.uhn.fhir.rest.client.api.IGenericClient; - @Component public class ProcedureRouter extends BaseFhirResourceRouter { @Autowired - Oauth2Interceptor oauth2Interceptor; + private OpenmrsRestConfiguration openmrsRestConfiguration; ProcedureRouter() { super(FhirResource.PROCEDURE); @@ -40,7 +30,8 @@ public class ProcedureRouter extends BaseFhirResourceRouter { @Override public void configure() throws Exception { - + getCamelContext().getComponent("http", HttpComponent.class) + .setHttpClientConfigurer(openmrsRestConfiguration.createHttpClientConfigurer()); from(FhirResource.PROCEDURE.incomingUrl()).routeId("fhir-procedure-router").filter(isSupportedTable()).toD( "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .filter(simple("${body[0]['uuid']} == '" + PROCEDURE_ORDER_TYPE_UUID + "'")) @@ -63,14 +54,6 @@ public void configure() throws Exception { .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); } - // protected void setOpenmrsBase64AuthHeader(Exchange exchange) { - // String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); - // String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); - // String auth = username + ":" + password; - // String base64Auth = getEncoder().encodeToString(auth.getBytes()); - // exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); - // } - private ServiceRequest mapOrderToServiceRequest(Order order) { ServiceRequest serviceRequest = new ServiceRequest(); if (order.getAction().equals("DISCONTINUE")) { diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index a3ee4a5de..1fb036722 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -1,32 +1,37 @@ package org.openmrs.eip.fhir.routes.resources; -import static java.util.Base64.getEncoder; - import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; import static org.openmrs.eip.fhir.Constants.SUPPLY_REQUEST_ORDER_TYPE_UUID; import java.util.Collections; -import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; +import org.apache.camel.component.http.HttpComponent; import org.apache.camel.model.dataformat.JsonLibrary; import org.hl7.fhir.r4.model.Quantity; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.SupplyRequest; import org.openmrs.eip.fhir.FhirResource; import org.openmrs.eip.fhir.routes.resources.dto.Order; +import org.openmrs.eip.fhir.spring.OpenmrsRestConfiguration; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class SupplyRequestRouter extends BaseFhirResourceRouter { + @Autowired + private OpenmrsRestConfiguration openmrsRestConfiguration; + SupplyRequestRouter() { super(FhirResource.SUPPLYREQUEST); } @Override public void configure() throws Exception { + getCamelContext().getComponent("http", HttpComponent.class) + .setHttpClientConfigurer(openmrsRestConfiguration.createHttpClientConfigurer()); from(FhirResource.SUPPLYREQUEST.incomingUrl()).routeId("fhir-supplyrequest-router").filter(isSupportedTable()).toD( "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .filter(simple("${body[0]['uuid']} == '" + SUPPLY_REQUEST_ORDER_TYPE_UUID + "'")) @@ -44,14 +49,6 @@ public void configure() throws Exception { .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).endChoice().end(); } - // private void setOpenmrsBase64AuthHeader(Exchange exchange) { - // String username = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.username}}"); - // String password = exchange.getContext().resolvePropertyPlaceholders("{{openmrs.password}}"); - // String auth = username + ":" + password; - // String base64Auth = getEncoder().encodeToString(auth.getBytes()); - // exchange.getIn().setHeader("Authorization", "Basic " + base64Auth); - // } - private SupplyRequest mapOrderToSupplyRequest(Order order) { SupplyRequest supplyRequest = new SupplyRequest(); supplyRequest.setId(order.getUuid()); diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java index 66e9ff221..0c55de6ba 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java @@ -4,18 +4,13 @@ import java.util.Collections; -import org.apache.camel.CamelContext; import org.apache.camel.component.http.HttpClientConfigurer; -import org.apache.camel.component.http.HttpComponent; -import org.apache.camel.spring.boot.CamelContextConfiguration; import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.message.BasicHeader; import org.openmrs.eip.fhir.security.TokenCache; import org.openmrs.eip.fhir.security.TokenInfo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -42,16 +37,7 @@ public boolean isOauthEnabled() { @Autowired private TokenCache tokenCache; - @Bean - @Qualifier("camelOpenmrsHttpClient") - public HttpComponent camelHttpClient(CamelContext camelContext) { - HttpComponent httpComponent = new HttpComponent(); - httpComponent.setCamelContext(camelContext); - httpComponent.setHttpClientConfigurer(createHttpClientConfigurer()); - return httpComponent; - } - - private HttpClientConfigurer createHttpClientConfigurer() { + public HttpClientConfigurer createHttpClientConfigurer() { return clientBuilder -> { if (isOauthEnabled) { TokenInfo tokenInfo = tokenCache.getTokenInfo(); @@ -67,20 +53,4 @@ private HttpClientConfigurer createHttpClientConfigurer() { } }; } - - @Bean - CamelContextConfiguration contextRestConfiguration() { - return new CamelContextConfiguration() { - - @Override - public void beforeApplicationStart(CamelContext camelContext) { - camelContext.getComponent("http", HttpComponent.class).setHttpClientConfigurer(createHttpClientConfigurer()); - } - - @Override - public void afterApplicationStart(CamelContext camelContext) { - - } - }; - } } From d8646c4c8100cabb0bdc576fb076486f8bfcf743 Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Thu, 23 Jan 2025 18:46:23 +0530 Subject: [PATCH 18/23] Fix test --- .../openmrs/eip/fhir/spring/OpenmrsFhirConfigurationTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsFhirConfigurationTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsFhirConfigurationTest.java index cd7abd446..be7798f67 100644 --- a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsFhirConfigurationTest.java +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsFhirConfigurationTest.java @@ -29,7 +29,8 @@ @ContextConfiguration(classes = OpenmrsFhirConfiguration.class) @TestPropertySource(properties = { "eip.fhir.resources=Encounter", "openmrs.eip.log.level=DEBUG", "eip.fhir.serverUrl=http://localhost:8080/openmrs/ws/fhir2/R4", "eip.fhir.username=admin", - "eip.fhir.password=password" }) + "eip.fhir.password=password", "openmrs.baseUrl=http://localhost:8080/openmrs", "openmrs.username=admin", + "openmrs.password=password" }) public class OpenmrsFhirConfigurationTest { @Autowired From e8167bad966e0c4b298dadff439fdde8484f026c Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Fri, 24 Jan 2025 12:02:37 +0530 Subject: [PATCH 19/23] Address comments --- .../routes/resources/ProcedureRouter.java | 10 ++--- .../routes/resources/SupplyRequestRouter.java | 1 + .../spring/OpenmrsRestConfigurationTest.java | 37 +++++++++++++++++++ 3 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index 091f6a86f..5077521e2 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -32,6 +32,7 @@ public class ProcedureRouter extends BaseFhirResourceRouter { public void configure() throws Exception { getCamelContext().getComponent("http", HttpComponent.class) .setHttpClientConfigurer(openmrsRestConfiguration.createHttpClientConfigurer()); + from(FhirResource.PROCEDURE.incomingUrl()).routeId("fhir-procedure-router").filter(isSupportedTable()).toD( "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .filter(simple("${body[0]['uuid']} == '" + PROCEDURE_ORDER_TYPE_UUID + "'")) @@ -43,13 +44,8 @@ public void configure() throws Exception { .to(FhirResource.PROCEDURE.outgoingUrl()).otherwise().setHeader("CamelHttpMethod", constant("GET")) .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() .json(JsonLibrary.Jackson, Order.class).process(exchange -> { - try { - Order order = exchange.getIn().getBody(Order.class); - exchange.getMessage().setBody(mapOrderToServiceRequest(order)); - } - catch (Exception e) { - throw new CamelExecutionException("Error mapping Order to ServiceRequest", exchange, e); - } + Order order = exchange.getIn().getBody(Order.class); + exchange.getMessage().setBody(mapOrderToServiceRequest(order)); }).setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index 1fb036722..710e08d24 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -32,6 +32,7 @@ public class SupplyRequestRouter extends BaseFhirResourceRouter { public void configure() throws Exception { getCamelContext().getComponent("http", HttpComponent.class) .setHttpClientConfigurer(openmrsRestConfiguration.createHttpClientConfigurer()); + from(FhirResource.SUPPLYREQUEST.incomingUrl()).routeId("fhir-supplyrequest-router").filter(isSupportedTable()).toD( "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .filter(simple("${body[0]['uuid']} == '" + SUPPLY_REQUEST_ORDER_TYPE_UUID + "'")) diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java new file mode 100644 index 000000000..bb54a36be --- /dev/null +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java @@ -0,0 +1,37 @@ +package org.openmrs.eip.fhir.spring; + +import static org.junit.jupiter.api.Assertions.*; + +import org.apache.camel.component.http.HttpClientConfigurer; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; + +@SpringBootTest +@ContextConfiguration(classes = OpenmrsRestConfiguration.class) +@TestPropertySource(properties = { "eip.fhir.resources=Encounter", "openmrs.eip.log.level=DEBUG", + "eip.fhir.serverUrl=http://localhost:8080/openmrs/ws/fhir2/R4", "eip.fhir.username=admin", + "eip.fhir.password=password", "openmrs.baseUrl=http://localhost:8080/openmrs", "openmrs.username=admin", + "openmrs.password=password" }) +public class OpenmrsRestConfigurationTest { + + @Autowired + Environment environment; + + @Autowired + OpenmrsRestConfiguration openmrsRestConfiguration; + + @Test + void shouldCreateHttpClientConfigurer() { + // verify username and password are set correctly + assertEquals("http://localhost:8080/openmrs", environment.getProperty("openmrs.baseUrl")); + assertEquals("admin", environment.getProperty("openmrs.username")); + assertEquals("password", environment.getProperty("openmrs.password")); + + HttpClientConfigurer httpClientConfigurer = openmrsRestConfiguration.createHttpClientConfigurer(); + assertNotNull(httpClientConfigurer); + } +} From 8d2ed1ac7e93381f018c96337c6e71d03948c8ca Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Fri, 24 Jan 2025 13:43:29 +0530 Subject: [PATCH 20/23] Fix tests --- .../eip/fhir/routes/resources/ProcedureRouter.java | 10 ++++++++-- .../fhir/routes/resources/SupplyRequestRouter.java | 9 ++++++++- .../fhir/routes/resources/ProcedureRouterTest.java | 12 ++++++------ .../routes/resources/SupplyRequestRouterTest.java | 10 ++++++---- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index 5077521e2..955fbf39e 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -4,7 +4,6 @@ import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; -import org.apache.camel.CamelExecutionException; import org.apache.camel.LoggingLevel; import org.apache.camel.component.http.HttpComponent; import org.apache.camel.model.dataformat.JsonLibrary; @@ -16,14 +15,21 @@ import org.openmrs.eip.fhir.routes.resources.dto.Order; import org.openmrs.eip.fhir.spring.OpenmrsRestConfiguration; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import lombok.Setter; + +@Setter @Component public class ProcedureRouter extends BaseFhirResourceRouter { @Autowired private OpenmrsRestConfiguration openmrsRestConfiguration; + @Value("${openmrs.baseUrl}") + private String openmrsBaseUrl; + ProcedureRouter() { super(FhirResource.PROCEDURE); } @@ -42,7 +48,7 @@ public void configure() throws Exception { .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) .to(FhirResource.PROCEDURE.outgoingUrl()).otherwise().setHeader("CamelHttpMethod", constant("GET")) - .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() + .toD(openmrsBaseUrl + "/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() .json(JsonLibrary.Jackson, Order.class).process(exchange -> { Order order = exchange.getIn().getBody(Order.class); exchange.getMessage().setBody(mapOrderToServiceRequest(order)); diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index 710e08d24..9f641bca0 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -16,14 +16,21 @@ import org.openmrs.eip.fhir.routes.resources.dto.Order; import org.openmrs.eip.fhir.spring.OpenmrsRestConfiguration; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import lombok.Setter; + +@Setter @Component public class SupplyRequestRouter extends BaseFhirResourceRouter { @Autowired private OpenmrsRestConfiguration openmrsRestConfiguration; + @Value("${openmrs.baseUrl}") + private String openmrsBaseUrl; + SupplyRequestRouter() { super(FhirResource.SUPPLYREQUEST); } @@ -42,7 +49,7 @@ public void configure() throws Exception { .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise().setHeader("CamelHttpMethod", constant("GET")) - .toD("{{openmrs.baseUrl}}/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() + .toD(openmrsBaseUrl + "/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() .json(JsonLibrary.Jackson, Order.class).process(exchange -> { Order order = exchange.getIn().getBody(Order.class); exchange.getMessage().setBody(mapOrderToSupplyRequest(order)); diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java index 85fb94dc5..3cbd4d314 100644 --- a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java @@ -17,21 +17,19 @@ import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.AdviceWith; import org.apache.camel.builder.AdviceWithRouteBuilder; -import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.spring.junit5.CamelSpringTestSupport; import org.apache.camel.test.spring.junit5.UseAdviceWith; import org.hl7.fhir.r4.model.ServiceRequest; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.openmrs.eip.fhir.FhirResource; +import org.openmrs.eip.fhir.spring.OpenmrsRestConfiguration; import org.openmrs.eip.mysql.watcher.Event; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.StaticApplicationContext; @UseAdviceWith -@Disabled //TODO: {{openmrs.baseUrl}} is not being picked from application-test.properties class ProcedureRouterTest extends CamelSpringTestSupport { private static final String PROCEDURE_ORDER_RESPONSE = "{\"uuid\":\"c585bffc-df49-4e57-8a90-6c1d5edb4ffd\",\"orderNumber\":\"ORD-2\",\"accessionNumber\":\"wefewf43r\",\"patient\":{\"uuid\":\"8b562184-bf0f-4ece-8852-780ee315f98e\",\"display\":\"H-3000000 - Siddharth Vaish\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/patient\\/8b562184-bf0f-4ece-8852-780ee315f98e\",\"resourceAlias\":\"patient\"}]},\"concept\":{\"uuid\":\"5a4c17ce-8305-4ea4-baca-0db107ae5ec2\",\"display\":\"Cystoscopie\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/5a4c17ce-8305-4ea4-baca-0db107ae5ec2\",\"resourceAlias\":\"concept\"}]},\"action\":\"NEW\",\"careSetting\":{\"uuid\":\"6f0c9a92-6f24-11e3-af88-005056821db0\",\"display\":\"Outpatient\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/caresetting\\/6f0c9a92-6f24-11e3-af88-005056821db0\",\"resourceAlias\":\"caresetting\"}]},\"previousOrder\":null,\"dateActivated\":\"2025-01-08T09:11:53.000+0000\",\"scheduledDate\":null,\"dateStopped\":null,\"autoExpireDate\":null,\"encounter\":{\"uuid\":\"5a286408-167e-4883-aed8-61fb0b0e65ee\",\"display\":\"Orders 01\\/08\\/2025\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/encounter\\/5a286408-167e-4883-aed8-61fb0b0e65ee\",\"resourceAlias\":\"encounter\"}]},\"orderer\":{\"uuid\":\"adbc0d21-c77b-426e-929d-76ff08f9f250\",\"display\":\"admin - Super User\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/provider\\/adbc0d21-c77b-426e-929d-76ff08f9f250\",\"resourceAlias\":\"provider\"}]},\"orderReason\":null,\"orderReasonNonCoded\":null,\"orderType\":{\"uuid\":\"67a92e56-0f88-11ea-8d71-362b9e155667\",\"display\":\"Procedure\",\"name\":\"Procedure\",\"javaClassName\":\"org.openmrs.Order\",\"retired\":false,\"description\":\"An order for Procedure exams\",\"conceptClasses\":[{\"uuid\":\"8d490bf4-c2cc-11de-8d13-0010c6dffd0f\",\"display\":\"Procedure\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/conceptclass\\/8d490bf4-c2cc-11de-8d13-0010c6dffd0f\",\"resourceAlias\":\"conceptclass\"}]}],\"parent\":null,\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92e56-0f88-11ea-8d71-362b9e155667\",\"resourceAlias\":\"ordertype\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92e56-0f88-11ea-8d71-362b9e155667?v=full\",\"resourceAlias\":\"ordertype\"}],\"resourceVersion\":\"1.10\"},\"urgency\":\"ROUTINE\",\"instructions\":null,\"commentToFulfiller\":null,\"display\":\"Cystoscopie\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/c585bffc-df49-4e57-8a90-6c1d5edb4ffd\",\"resourceAlias\":\"order\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/c585bffc-df49-4e57-8a90-6c1d5edb4ffd?v=full\",\"resourceAlias\":\"order\"}],\"type\":\"order\",\"resourceVersion\":\"1.10\"}"; @@ -43,9 +41,11 @@ protected AbstractApplicationContext createApplicationContext() { @Override protected RoutesBuilder createRouteBuilder() { - RouteBuilder rb = new ProcedureRouter(); - rb.from(FhirResource.PROCEDURE.outgoingUrl()).to("mock:result"); - return rb; + ProcedureRouter procedureRouter = new ProcedureRouter(); + procedureRouter.setOpenmrsRestConfiguration(new OpenmrsRestConfiguration()); + procedureRouter.setOpenmrsBaseUrl("http://openmrs:8080/openmrs"); + procedureRouter.from(FhirResource.PROCEDURE.outgoingUrl()).to("mock:result"); + return procedureRouter; } @Override diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java index 12609600a..84488f169 100644 --- a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java @@ -27,12 +27,12 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.openmrs.eip.fhir.FhirResource; +import org.openmrs.eip.fhir.spring.OpenmrsRestConfiguration; import org.openmrs.eip.mysql.watcher.Event; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.StaticApplicationContext; @UseAdviceWith -@Disabled //TODO: {{openmrs.baseUrl}} is not being picked from application-test.properties class SupplyRequestRouterTest extends CamelSpringTestSupport { private static final String MEDICAL_SUPPLY_ORDER_RESPONSE = "{\"uuid\":\"dd36be07-f4fe-46a4-b994-fb7eaf0bb473\",\"orderNumber\":\"ORD-1\",\"accessionNumber\":\"test_abc_medical_supply\",\"patient\":{\"uuid\":\"8b562184-bf0f-4ece-8852-780ee315f98e\",\"display\":\"H-3000000 - Siddharth Vaish\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/patient\\/8b562184-bf0f-4ece-8852-780ee315f98e\",\"resourceAlias\":\"patient\"}]},\"concept\":{\"uuid\":\"a1937e67-6e4e-4296-8a4c-255cd38fd1dc\",\"display\":\"Abaisse langue\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/a1937e67-6e4e-4296-8a4c-255cd38fd1dc\",\"resourceAlias\":\"concept\"}]},\"action\":\"NEW\",\"careSetting\":{\"uuid\":\"6f0c9a92-6f24-11e3-af88-005056821db0\",\"display\":\"Outpatient\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/caresetting\\/6f0c9a92-6f24-11e3-af88-005056821db0\",\"resourceAlias\":\"caresetting\"}]},\"previousOrder\":null,\"dateActivated\":\"2025-01-08T08:44:03.000+0000\",\"scheduledDate\":null,\"dateStopped\":null,\"autoExpireDate\":null,\"encounter\":{\"uuid\":\"5a286408-167e-4883-aed8-61fb0b0e65ee\",\"display\":\"Orders 01\\/08\\/2025\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/encounter\\/5a286408-167e-4883-aed8-61fb0b0e65ee\",\"resourceAlias\":\"encounter\"}]},\"orderer\":{\"uuid\":\"adbc0d21-c77b-426e-929d-76ff08f9f250\",\"display\":\"admin - Super User\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/provider\\/adbc0d21-c77b-426e-929d-76ff08f9f250\",\"resourceAlias\":\"provider\"}]},\"orderReason\":null,\"orderReasonNonCoded\":null,\"orderType\":{\"uuid\":\"67a92bd6-0f88-11ea-8d71-362b9e155667\",\"display\":\"Medical Supply Order\",\"name\":\"Medical Supply Order\",\"javaClassName\":\"org.openmrs.module.orderexpansion.api.model.MedicalSupplyOrder\",\"retired\":false,\"description\":\"An order for Medical supplies\",\"conceptClasses\":[{\"uuid\":\"bfaba740-4c32-43c9-b64c-3e2c0c08cdf0\",\"display\":\"Material\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/conceptclass\\/bfaba740-4c32-43c9-b64c-3e2c0c08cdf0\",\"resourceAlias\":\"conceptclass\"}]}],\"parent\":null,\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92bd6-0f88-11ea-8d71-362b9e155667\",\"resourceAlias\":\"ordertype\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92bd6-0f88-11ea-8d71-362b9e155667?v=full\",\"resourceAlias\":\"ordertype\"}],\"resourceVersion\":\"1.10\"},\"urgency\":\"ROUTINE\",\"instructions\":null,\"commentToFulfiller\":null,\"display\":\"Abaisse langue\",\"quantity\":10,\"medicalSuppliesInventoryId\":null,\"brandName\":null,\"quantityUnits\":{\"uuid\":\"162396AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\"display\":\"Box\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/162396AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\"resourceAlias\":\"concept\"}]},\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/dd36be07-f4fe-46a4-b994-fb7eaf0bb473\",\"resourceAlias\":\"order\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/dd36be07-f4fe-46a4-b994-fb7eaf0bb473?v=full\",\"resourceAlias\":\"order\"}],\"type\":\"medicalsupplyorder\",\"resourceVersion\":\"1.10\"}"; @@ -44,9 +44,11 @@ protected AbstractApplicationContext createApplicationContext() { @Override protected RoutesBuilder createRouteBuilder() { - RouteBuilder rb = new SupplyRequestRouter(); - rb.from(FhirResource.SUPPLYREQUEST.outgoingUrl()).to("mock:result"); - return rb; + SupplyRequestRouter supplyRequestRouter = new SupplyRequestRouter(); + supplyRequestRouter.setOpenmrsRestConfiguration(new OpenmrsRestConfiguration()); + supplyRequestRouter.setOpenmrsBaseUrl("http://openmrs:8080/openmrs"); + supplyRequestRouter.from(FhirResource.SUPPLYREQUEST.outgoingUrl()).to("mock:result"); + return supplyRequestRouter; } @Override From 102a3d1c9c024792684a25a608cb9fca13bf02a3 Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Fri, 24 Jan 2025 14:44:04 +0530 Subject: [PATCH 21/23] Refactor --- .../openmrs/eip/fhir/routes/resources/ProcedureRouter.java | 6 +++--- .../eip/fhir/routes/resources/SupplyRequestRouter.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index 955fbf39e..9ab5bd956 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -24,12 +24,12 @@ @Component public class ProcedureRouter extends BaseFhirResourceRouter { - @Autowired - private OpenmrsRestConfiguration openmrsRestConfiguration; - @Value("${openmrs.baseUrl}") private String openmrsBaseUrl; + @Autowired + private OpenmrsRestConfiguration openmrsRestConfiguration; + ProcedureRouter() { super(FhirResource.PROCEDURE); } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index 9f641bca0..c568dcafd 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -25,12 +25,12 @@ @Component public class SupplyRequestRouter extends BaseFhirResourceRouter { - @Autowired - private OpenmrsRestConfiguration openmrsRestConfiguration; - @Value("${openmrs.baseUrl}") private String openmrsBaseUrl; + @Autowired + private OpenmrsRestConfiguration openmrsRestConfiguration; + SupplyRequestRouter() { super(FhirResource.SUPPLYREQUEST); } From 3516ce64da15d1fdc6eb573dcb3cefbf69d4eab0 Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Tue, 28 Jan 2025 14:06:05 +0530 Subject: [PATCH 22/23] Add support for discontinue and modify order --- .../routes/resources/ProcedureRouter.java | 36 +++++++++++++--- .../routes/resources/SupplyRequestRouter.java | 32 ++++++++++++++- .../eip/fhir/routes/resources/dto/Order.java | 41 +++++++++++++++++-- 3 files changed, 98 insertions(+), 11 deletions(-) diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java index 9ab5bd956..26de936b2 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -4,6 +4,8 @@ import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; +import java.util.Date; + import org.apache.camel.LoggingLevel; import org.apache.camel.component.http.HttpComponent; import org.apache.camel.model.dataformat.JsonLibrary; @@ -47,7 +49,15 @@ public void configure() throws Exception { "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) - .to(FhirResource.PROCEDURE.outgoingUrl()).otherwise().setHeader("CamelHttpMethod", constant("GET")) + .to(FhirResource.PROCEDURE.outgoingUrl()).when(simple("${body[0]['order_action']} == 'DISCONTINUE'")) + .toD( + "sql:SELECT uuid FROM orders WHERE order_id = ${body[0]['previous_order_id']}?dataSource=#openmrsDataSource") + .setHeader("CamelHttpMethod", constant("GET")).toD(openmrsBaseUrl + "/ws/rest/v1/order/${body[0]['uuid']}") + .unmarshal().json(JsonLibrary.Jackson, Order.class).process(exchange -> { + Order order = exchange.getIn().getBody(Order.class); + exchange.getMessage().setBody(mapOrderToServiceRequest(order)); + }).setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).to(FhirResource.PROCEDURE.outgoingUrl()).otherwise() + .setHeader("CamelHttpMethod", constant("GET")) .toD(openmrsBaseUrl + "/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() .json(JsonLibrary.Jackson, Order.class).process(exchange -> { Order order = exchange.getIn().getBody(Order.class); @@ -58,11 +68,7 @@ public void configure() throws Exception { private ServiceRequest mapOrderToServiceRequest(Order order) { ServiceRequest serviceRequest = new ServiceRequest(); - if (order.getAction().equals("DISCONTINUE")) { - serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.COMPLETED); - } else { - serviceRequest.setStatus(ServiceRequest.ServiceRequestStatus.ACTIVE); - } + serviceRequest.setStatus(determineServiceRequestStatus(order)); serviceRequest.setIntent(ServiceRequest.ServiceRequestIntent.ORDER); serviceRequest.setCode(new CodeableConcept( new Coding().setCode(order.getConcept().getUuid()).setDisplay(order.getConcept().getDisplay())) @@ -76,4 +82,22 @@ private ServiceRequest mapOrderToServiceRequest(Order order) { return serviceRequest; } + + private ServiceRequest.ServiceRequestStatus determineServiceRequestStatus(Order order) { + Date currentDate = new Date(); + boolean isCompeted = order.isActivated() + && ((order.getDateStopped() != null && currentDate.after(order.getDateStopped())) + || (order.getAutoExpireDate() != null && currentDate.after(order.getAutoExpireDate()))); + boolean isDiscontinued = order.isActivated() && order.getAction().equals("DISCONTINUE"); + + if ((isCompeted && isDiscontinued)) { + return ServiceRequest.ServiceRequestStatus.UNKNOWN; + } else if (isDiscontinued) { + return ServiceRequest.ServiceRequestStatus.REVOKED; + } else if (isCompeted) { + return ServiceRequest.ServiceRequestStatus.COMPLETED; + } else { + return ServiceRequest.ServiceRequestStatus.ACTIVE; + } + } } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java index c568dcafd..4a8aabb9a 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -5,12 +5,14 @@ import static org.openmrs.eip.fhir.Constants.SUPPLY_REQUEST_ORDER_TYPE_UUID; import java.util.Collections; +import java.util.Date; import org.apache.camel.LoggingLevel; import org.apache.camel.component.http.HttpComponent; import org.apache.camel.model.dataformat.JsonLibrary; import org.hl7.fhir.r4.model.Quantity; import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.ServiceRequest; import org.hl7.fhir.r4.model.SupplyRequest; import org.openmrs.eip.fhir.FhirResource; import org.openmrs.eip.fhir.routes.resources.dto.Order; @@ -48,7 +50,15 @@ public void configure() throws Exception { "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) - .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise().setHeader("CamelHttpMethod", constant("GET")) + .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).when(simple("${body[0]['order_action']} == 'DISCONTINUE'")) + .toD( + "sql:SELECT uuid FROM orders WHERE order_id = ${body[0]['previous_order_id']}?dataSource=#openmrsDataSource") + .setHeader("CamelHttpMethod", constant("GET")).toD(openmrsBaseUrl + "/ws/rest/v1/order/${body[0]['uuid']}") + .unmarshal().json(JsonLibrary.Jackson, Order.class).process(exchange -> { + Order order = exchange.getIn().getBody(Order.class); + exchange.getMessage().setBody(mapOrderToSupplyRequest(order)); + }).setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise() + .setHeader("CamelHttpMethod", constant("GET")) .toD(openmrsBaseUrl + "/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() .json(JsonLibrary.Jackson, Order.class).process(exchange -> { Order order = exchange.getIn().getBody(Order.class); @@ -69,8 +79,26 @@ private SupplyRequest mapOrderToSupplyRequest(Order order) { new Reference().setReference(order.getOrderer().getUuid()).setDisplay(order.getOrderer().getDisplay())); supplyRequest.setDeliverTo(new Reference().setReference("Patient/" + order.getPatient().getUuid()) .setDisplay(order.getPatient().getDisplay())); - supplyRequest.setStatus(SupplyRequest.SupplyRequestStatus.ACTIVE); + supplyRequest.setStatus(determineSupplyRequestStatus(order)); return supplyRequest; } + + private SupplyRequest.SupplyRequestStatus determineSupplyRequestStatus(Order order) { + Date currentDate = new Date(); + boolean isCompeted = order.isActivated() + && ((order.getDateStopped() != null && currentDate.after(order.getDateStopped())) + || (order.getAutoExpireDate() != null && currentDate.after(order.getAutoExpireDate()))); + boolean isDiscontinued = order.isActivated() && order.getAction().equals("DISCONTINUE"); + + if ((isCompeted && isDiscontinued)) { + return SupplyRequest.SupplyRequestStatus.UNKNOWN; + } else if (isDiscontinued) { + return SupplyRequest.SupplyRequestStatus.CANCELLED; + } else if (isCompeted) { + return SupplyRequest.SupplyRequestStatus.COMPLETED; + } else { + return SupplyRequest.SupplyRequestStatus.ACTIVE; + } + } } diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Order.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Order.java index 175177019..3aa3bf890 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Order.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Order.java @@ -1,5 +1,8 @@ package org.openmrs.eip.fhir.routes.resources.dto; +import java.sql.Timestamp; +import java.util.Date; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; @@ -26,13 +29,13 @@ public class Order { public Object previousOrder; - public String dateActivated; + public Date dateActivated; public Object scheduledDate; - public Object dateStopped; + public Date dateStopped; - public Object autoExpireDate; + public Date autoExpireDate; public Encounter encounter; @@ -57,4 +60,36 @@ public class Order { public float quantity; public QuantityUnits quantityUnits; + + public boolean isActivated() { + return this.isActivated(new Date()); + } + + public boolean isActivated(Date checkDate) { + if (this.dateActivated == null) { + return false; + } else { + if (checkDate == null) { + checkDate = new Date(); + } + + return compare(this.dateActivated, checkDate) <= 0; + } + } + + public static int compare(Date d1, Date d2) { + if (d1 instanceof Timestamp && d2 instanceof Timestamp) { + return d1.compareTo(d2); + } else { + if (d1 instanceof Timestamp) { + d1 = new Date(d1.getTime()); + } + + if (d2 instanceof Timestamp) { + d2 = new Date(d2.getTime()); + } + + return d1.compareTo(d2); + } + } } From f23991ec6e1b463234be5b237d51e7380a6714cb Mon Sep 17 00:00:00 2001 From: Siddharth Vaish Date: Tue, 28 Jan 2025 19:07:00 +0530 Subject: [PATCH 23/23] Fix * imports --- .../openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java index bb54a36be..c0af1cba2 100644 --- a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java @@ -1,6 +1,7 @@ package org.openmrs.eip.fhir.spring; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import org.apache.camel.component.http.HttpClientConfigurer; import org.junit.jupiter.api.Test;