-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[HIE-2] client registry Patient search flow implementation
[HIE-2] define ihe-pix operation and start implementation of getCRPatient [HIE-2] adding config options for default system and get patient endpoint [HIE-2] drop format param and change targetSystems to OR [HIE-2] move targetSystem param logic to controller [HIE-2] change to OperationParam in getCRPatient provider method cleanup, adding comments, refactoring Patient parsing
- Loading branch information
Showing
10 changed files
with
305 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 6 additions & 0 deletions
6
api/src/main/java/org/openmrs/module/clientregistry/ClientRegistryTransactionType.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package org.openmrs.module.clientregistry; | ||
|
||
public enum ClientRegistryTransactionType { | ||
FHIR, | ||
HL7 | ||
} |
14 changes: 14 additions & 0 deletions
14
api/src/main/java/org/openmrs/module/clientregistry/api/CRPatientService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package org.openmrs.module.clientregistry.api; | ||
|
||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; | ||
import org.hl7.fhir.r4.model.Patient; | ||
import org.openmrs.module.fhir2.api.search.param.PatientSearchParams; | ||
|
||
import java.util.List; | ||
|
||
public interface CRPatientService { | ||
|
||
List<Patient> getCRPatient(String sourceIdentifier, String sourceIdentifierSystem, List<String> extraTargetSystems); | ||
|
||
List<Patient> searchCRForPatients(PatientSearchParams patientSearchParams); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
67 changes: 67 additions & 0 deletions
67
api/src/main/java/org/openmrs/module/clientregistry/api/impl/FhirCRPatientServiceImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
package org.openmrs.module.clientregistry.api.impl; | ||
|
||
import ca.uhn.fhir.rest.client.api.IGenericClient; | ||
import ca.uhn.fhir.rest.gclient.IQuery; | ||
import org.hl7.fhir.instance.model.api.IBaseBundle; | ||
import org.hl7.fhir.r4.model.Bundle; | ||
import org.hl7.fhir.r4.model.Patient; | ||
import org.openmrs.module.clientregistry.ClientRegistryConfig; | ||
import org.openmrs.module.clientregistry.api.CRPatientService; | ||
import org.openmrs.module.clientregistry.providers.FhirCRConstants; | ||
import org.openmrs.module.fhir2.FhirConstants; | ||
import org.openmrs.module.fhir2.api.search.param.PatientSearchParams; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.stereotype.Component; | ||
|
||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
@Component | ||
public class FhirCRPatientServiceImpl implements CRPatientService { | ||
|
||
@Autowired | ||
private IGenericClient fhirClient; | ||
|
||
@Autowired | ||
private ClientRegistryConfig config; | ||
|
||
/** | ||
* Constructs a $ihe-pix fhir client call to an external Client Registry returning any patients that match the given | ||
* identifier and target systems. | ||
*/ | ||
@Override | ||
public List<Patient> getCRPatient(String sourceIdentifier, String sourceIdentifierSystem, List<String> extraTargetSystems) { | ||
// construct and send request to external client registry | ||
IQuery<IBaseBundle> crRequest = fhirClient | ||
.search() | ||
.byUrl( | ||
String.format("%s/%s", config.getClientRegistryServerUrl(), config.getClientRegistryGetPatientEndpoint())) | ||
.where( | ||
FhirCRConstants.SOURCE_IDENTIFIER_PARAM.exactly().systemAndIdentifier(sourceIdentifierSystem, | ||
sourceIdentifier)); | ||
|
||
if (!extraTargetSystems.isEmpty()) { | ||
crRequest.and(FhirCRConstants.TARGET_SYSTEM_PARAM.matches().values(extraTargetSystems)); | ||
} | ||
|
||
Bundle patientBundle = crRequest.returnBundle(Bundle.class).execute(); | ||
return parseCRPatientSearchResults(patientBundle); | ||
} | ||
|
||
@Override | ||
public List<Patient> searchCRForPatients(PatientSearchParams patientSearchParams) { | ||
return null; | ||
} | ||
|
||
/** | ||
* Filter and parse out fhir patients from Client Registry Patient Search results | ||
*/ | ||
private List<Patient> parseCRPatientSearchResults(Bundle patientBundle) { | ||
return patientBundle | ||
.getEntry() | ||
.stream() | ||
.filter(entry -> entry.hasType(FhirConstants.PATIENT)) | ||
.map(entry -> (Patient) entry.getResource()) | ||
.collect(Collectors.toList()); | ||
} | ||
} |
26 changes: 26 additions & 0 deletions
26
api/src/main/java/org/openmrs/module/clientregistry/providers/FhirCRConstants.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package org.openmrs.module.clientregistry.providers; | ||
|
||
import ca.uhn.fhir.model.api.annotation.SearchParamDefinition; | ||
import ca.uhn.fhir.rest.gclient.StringClientParam; | ||
import ca.uhn.fhir.rest.gclient.TokenClientParam; | ||
import ca.uhn.fhir.rest.gclient.UriClientParam; | ||
|
||
public class FhirCRConstants { | ||
|
||
public static final String IHE_PIX_OPERATION = "$ihe-pix"; | ||
|
||
@SearchParamDefinition(name = "sourceIdentifier", path = "Patient.sourceIdentifier", description = "A patient identifier used to find cross-matching identifiers in client registry", type = "token") | ||
public static final String SOURCE_IDENTIFIER = "sourceIdentifier"; | ||
|
||
public static final TokenClientParam SOURCE_IDENTIFIER_PARAM = new TokenClientParam("sourceIdentifier"); | ||
|
||
@SearchParamDefinition(name = "targetSystem", path = "Patient.targetSystem", description = "Assigning Authorities for the Patient Identifier Domains from which the returned identifiers shall be selected", type = "token") | ||
public static final String TARGET_SYSTEM = "targetSystem"; | ||
|
||
public static final UriClientParam TARGET_SYSTEM_PARAM = new UriClientParam("targetSystem"); | ||
|
||
@SearchParamDefinition(name = "_format", path = "Patient.targetSystem", description = "Assigning Authorities for the Patient Identifier Domains from which the returned identifiers shall be selected", type = "token") | ||
public static final String _FORMAT = "_FORMAT"; | ||
|
||
public static final StringClientParam _FORMAT_PARAM = new StringClientParam("_format"); | ||
} |
102 changes: 102 additions & 0 deletions
102
...in/java/org/openmrs/module/clientregistry/providers/r4/FhirCRPatientResourceProvider.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
package org.openmrs.module.clientregistry.providers.r4; | ||
|
||
import ca.uhn.fhir.model.valueset.BundleTypeEnum; | ||
import ca.uhn.fhir.rest.annotation.Search; | ||
import ca.uhn.fhir.rest.param.StringParam; | ||
import ca.uhn.fhir.rest.param.StringOrListParam; | ||
import ca.uhn.fhir.rest.server.IResourceProvider; | ||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; | ||
import ca.uhn.fhir.rest.server.exceptions.NotImplementedOperationException; | ||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; | ||
import lombok.Setter; | ||
import org.hl7.fhir.instance.model.api.IBaseResource; | ||
import org.hl7.fhir.r4.model.Patient; | ||
import ca.uhn.fhir.rest.annotation.Operation; | ||
import ca.uhn.fhir.rest.annotation.OperationParam; | ||
import org.openmrs.module.clientregistry.ClientRegistryConfig; | ||
import org.openmrs.module.clientregistry.api.ClientRegistryManager; | ||
import org.openmrs.module.clientregistry.providers.FhirCRConstants; | ||
import org.openmrs.module.fhir2.api.annotations.R4Provider; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.stereotype.Component; | ||
|
||
import java.util.Collections; | ||
import java.util.List; | ||
import java.util.Objects; | ||
import java.util.stream.Collectors; | ||
|
||
import static lombok.AccessLevel.PACKAGE; | ||
|
||
@Component("crPatientFhirR4ResourceProvider") | ||
@R4Provider | ||
@Setter(PACKAGE) | ||
public class FhirCRPatientResourceProvider implements IResourceProvider { | ||
|
||
@Autowired | ||
private ClientRegistryManager clientRegistryManager; | ||
|
||
@Autowired | ||
private ClientRegistryConfig config; | ||
|
||
@Override | ||
public Class<? extends IBaseResource> getResourceType() { | ||
return Patient.class; | ||
} | ||
|
||
/** | ||
* FHIR endpoint to get Patient references from external client registry Example request: GET | ||
* [fhirbase]/Patient/$ihe-pix?sourceIdentifier=1234[&targetSystem=system1,system2] | ||
* | ||
* @param sourceIdentifierParam patient identifier | ||
* @param targetSystemsParam (optional) Patient assigning authorities (ie systems) from which | ||
* the returned identifiers shall be selected. Use module defined default if not | ||
* provided. | ||
* @return OpenMRS Patient corresponding to identifier (TODO this might change to a list of | ||
* identifier references returned by CR) | ||
*/ | ||
@Operation(name = FhirCRConstants.IHE_PIX_OPERATION, idempotent=true, type = Patient.class, bundleType = BundleTypeEnum.SEARCHSET) | ||
public List<Patient> getCRPatientById( | ||
@OperationParam(name = FhirCRConstants.SOURCE_IDENTIFIER) StringParam sourceIdentifierParam, | ||
@OperationParam(name = FhirCRConstants.TARGET_SYSTEM) StringOrListParam targetSystemsParam | ||
) { | ||
|
||
if (sourceIdentifierParam == null || sourceIdentifierParam.getValue() == null) { | ||
throw new InvalidRequestException("sourceIdentifier must be specified"); | ||
} | ||
|
||
List<String> targetSystems = targetSystemsParam == null | ||
? Collections.emptyList() | ||
: targetSystemsParam.getValuesAsQueryTokens().stream().filter(Objects::nonNull).map(StringParam::getValue).collect(Collectors.toList()); | ||
|
||
// If no targetSystem provided, use config defined default. Otherwise, take first targetSystem provided and | ||
// include in sourceIdentifier token. Remaining targetSystems included in targetSystem param passed to CR | ||
String sourceIdentifierSystem; | ||
if (targetSystems.isEmpty()) { | ||
sourceIdentifierSystem = config.getClientRegistryDefaultPatientIdentifierSystem(); | ||
} else { | ||
sourceIdentifierSystem = targetSystems.get(0); | ||
targetSystems.remove(0); | ||
} | ||
|
||
if (sourceIdentifierSystem == null || sourceIdentifierSystem.isEmpty()) { | ||
throw new InvalidRequestException("ClientRegistry module does not have a default target system assigned " + | ||
"via the defaultPatientIdentifierSystem property. At least one targetSystem must be provided in " + | ||
"the request"); | ||
} | ||
|
||
List<Patient> patients = clientRegistryManager.getPatientService().getCRPatient( | ||
sourceIdentifierParam.getValue(), sourceIdentifierSystem, targetSystems | ||
); | ||
|
||
if (patients.isEmpty()) { | ||
throw new ResourceNotFoundException("No Client Registry patients found."); | ||
} | ||
|
||
return patients; | ||
} | ||
|
||
@Search | ||
public List<Patient> searchClientRegistryPatients() { | ||
throw new NotImplementedOperationException("search client registry is not yet implemented"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -35,13 +35,37 @@ | |
|
||
<!-- Required Global Properties --> | ||
<globalProperty> | ||
<property>@MODULE_ID@.serverUrl</property> | ||
<defaultValue>http://localhost:5001/CR/fhir/</defaultValue> | ||
<property>@MODULE_ID@.clientRegistryServerUrl</property> | ||
<defaultValue>http://localhost:5001/CR/fhir</defaultValue> | ||
<description> | ||
Base URL for the Client Registry Server | ||
</description> | ||
</globalProperty> | ||
|
||
<globalProperty> | ||
<property>@[email protected]</property> | ||
<defaultValue>Patient/$ihe-pix</defaultValue> | ||
<description> | ||
Client registry endpoint implementing the Patient identifier cross-reference transaction (ITI-83) | ||
</description> | ||
</globalProperty> | ||
|
||
<globalProperty> | ||
<property>@[email protected]</property> | ||
<defaultValue></defaultValue> | ||
<description> | ||
Default system from which the Patient identifiers will be returned, if no system provided in requests | ||
</description> | ||
</globalProperty> | ||
|
||
<globalProperty> | ||
<property>@[email protected]</property> | ||
<defaultValue>fhir</defaultValue> | ||
<description> | ||
Transaction method supported by the Client Registry. Currently supporting fhir or hl7. | ||
</description> | ||
</globalProperty> | ||
|
||
<globalProperty> | ||
<property>@[email protected]</property> | ||
<defaultValue>openmrs</defaultValue> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters