pixm-iti104 component
The pixm-iti104 component provides interfaces for actors of the Patient Identity Feed FHIR IHE transaction (ITI-104), which is described in the IHE IT Infrastructure Technical Framework Supplement, Patient Identifier Cross-reference for Mobile (PIXm), Section 2:3.104.
Actors
The transaction defines the following actors:
Producer side corresponds to the Patient Identity Source actor. Consumer side corresponds to the Patient Identifier Cross-Reference Manager actor.
Dependencies
In a Maven-based environment, the following dependency must be registered in pom.xml:
<dependency>
<groupId>org.openehealth.ipf.platform-camel</groupId>
<artifactId>ipf-platform-camel-ihe-fhir-r4-pixpdq</artifactId>
<version>${ipf-version}</version>
</dependency>
Endpoint URI Format
Producer
The endpoint URI format of pixm-iti104 component producers is:
pixm-iti104://hostname:port/path/to/service[?parameters]
where hostname is either an IP address or a domain name, port is a number, and path/to/service represents additional path elements of the remote service.
Consumer
The endpoint URI format of pixm-iti104 component consumers is:
pixm-iti104://serviceName[?parameters]
The resulting URL of the exposed FHIR REST Service endpoint depends on the configuration of the deployment container.
Consider a Tomcat container on host eHealth.server.org is configured in the following way:
port = 8888
contextPath = /IHE
servletPath = /fhir/*
Then the pixm-iti104 consumer will be available for external clients under the URL
http://eHealth.server.org:8888/IHE/fhir.
URI parameters controlling the transaction features are described below.
Messages
ITI-104 consists of conditional updates and deletes of Patient resources, conditional on the patient identifier in the domain of the Patient Identity Source:
| Message | HTTP request | Remark |
|---|---|---|
| Add/Revise Patient | PUT Patient?identifier=system\|value |
Creates the patient if it does not exist yet |
| Resolve Duplicate Patient | PUT Patient?identifier=system\|value |
The subsumed patient carries a replaced-by link to the surviving patient |
| Remove Patient | DELETE Patient?identifier=system\|value |
Only with the Remove Patient Option |
The consumer rejects requests that are not conditional on exactly one identifier parameter with both
system and value (e.g. PUT Patient/123) with 400 Bad Request, before the route is called.
For Resolve Duplicate Patient, PixmPatient.addReplacedByLink(Identifier) adds the replaced-by link
and marks the subsumed patient inactive, as the PDQm Patient profile requires active along with a link.
Consumer
The route receives
- the Patient as body for Add/Revise Patient and Resolve Duplicate Patient, and the
Identifierof the patient to be removed for Remove Patient - the identifier of the condition as
Iti104Parametersin theConstants.FHIR_REQUEST_PARAMETERSheader
and must return a MethodOutcome. If a conditional update has created the patient, MethodOutcome.setCreated(true)
must be called, so that the consumer responds with 201 Created and audits a create.
ITI-104 relies on the FHIR conditional update and conditional delete semantics, which the route
has to implement, as only it knows the patients. In particular, if the condition matches more than one
patient, the route shall reject the request by throwing a PreconditionFailedException (412 Precondition Failed).
A conditional delete that matches no patient is not an error.
Remove Patient Option
By default, the consumer supports the Remove Patient Option and advertises conditional delete in its
CapabilityStatement. A Patient Identifier Cross-reference Manager that does not support this option,
e.g. because it proxies ITI-104 to a PIX Feed, can use the Iti104UpdateResourceProvider instead,
which only accepts conditional updates. It is configured with the resourceProvider
endpoint parameter:
<bean id="iti104UpdateProvider"
class="org.openehealth.ipf.commons.ihe.fhir.iti104.Iti104UpdateResourceProvider"/>
from("pixm-iti104://service?resourceProvider=#iti104UpdateProvider")
Producer
The producer sends a Patient in the message body as conditional update, and an Identifier or a
system|value string as conditional delete. The identifier of the condition is taken from
- the
Iti104Parametersin theConstants.FHIR_REQUEST_PARAMETERSheader, e.g. when forwarding a request received by a pixm-iti104 consumer - the
Iti104Constants.ITI104_PATIENT_IDENTIFIER_HEADERheader, asIdentifierorsystem|valuestring - the message body: the identifier to be removed, or the only identifier of the Patient
A Patient with more than one identifier therefore requires one of the headers.
Example
This is an example on how to use the component on the consumer side:
from("pixm-iti104://service?audit=true")
.process(itiRequestValidator())
.process(myProcessor)
// add, revise, merge or remove the patient and create a MethodOutcome
and on the producer side:
from("direct:feed")
.setHeader(Iti104Constants.ITI104_PATIENT_IDENTIFIER_HEADER, constant("urn:oid:1.2.3.4|0815"))
.to("pixm-iti104://pixm.example.org/fhir")
Validation
With resource validation, a Patient that claims to conform to the PIXm Patient
profile (https://profiles.ihe.net/ITI/PIXm/StructureDefinition/IHE.PIXm.Patient) or the PDQm Patient profile
(https://profiles.ihe.net/ITI/PDQm/StructureDefinition/IHE.PDQm.Patient) in meta.profile is validated
against this profile, using the official PIXm and PDQm implementation guide packages. Any other Patient
is validated against the base FHIR Patient.
Auditing
ITI-104 is audited as DICOM Patient Record event with the action Create, Update or Delete. With the FHIR serialization strategies, the audit records conform to the PIXm AuditEvent profiles:
| Actor | Add/Revise, Resolve Duplicate | Remove Patient |
|---|---|---|
| Patient Identity Source | IHE.PIXm.Feed.Update.Audit.Source |
IHE.PIXm.Feed.Delete.Audit.Source |
| Patient Identifier Cross-reference Manager | IHE.PIXm.Feed.Create.Audit.Manager if the patient has been created, IHE.PIXm.Feed.Update.Audit.Manager otherwise |
IHE.PIXm.Feed.Delete.Audit.Manager |
The Patient Identity Source cannot tell whether its conditional update has created a patient, so it always records an update, as PIXm defines no Create profile for it.
Translation into PIX Feed
IPF comes with translators to translate ITI-104 requests into PIX Feed (ITI-8) messages and the acknowledgements back into responses, so that a Patient Identifier Cross-reference Manager can proxy ITI-104 to an HL7v2-based PIX Manager. PIX Feed has no equivalent of Remove Patient.