One of the new and exciting standards emerging from HL7 is Fast Healthcare Interoperable Resource (FHIR). Its main purpose is to simplify the exchange of health information with a lightweight implementation framework that will bring smiles to implementers. It certainly put a smile on my face when I put this example together using Iguana!
Note: I’d like to give a shout out to Grahame Grieve for kindly providing the publicly-available FHIR test server that I used in this example.
It appears this server is down (or moved), but here is a list of publicly available FHIR test servers.
My example is demonstrates the following actions: get a Patient resource, search all Patient resources, and add a Patient resource.
Note: I use XML as the payload for this example, but JSON is also supported.
To get a patient resource, I defined a variable (‘Patient149XMLURL’) that points to a known fictitious patient named Henry Glover (ID: 149). By using the net.http.get function, I was able to pull Henry Glover’s patient info:
-- The main function is the first function called from Iguana.
-- The Data argument will contain the message to be processed.
require 'patientFHIR'
Patient149XMLURL = 'http://hl7connect.healthintersections.com.au/svc/fhir/patient/@149?_format=xml'
AllPatientsXMLURL = 'http://hl7connect.healthintersections.com.au/svc/fhir/patient/search?_format=xml'
CreatePatientXMLURL = 'http://hl7connect.healthintersections.com.au/svc/fhir/patient?_format=xml'
function main(Data)
print(patientFHIR,_G)
local msg, name = hl7.parse({vmd = 'demo.vmd', data = Data})
-- read an individual patient in XML format from FHIR server
-- reference http://www.hl7.org/implement/standards/fhir/patient.htm
local R,C,H = net.http.get{url=Patient149XMLURL, live=true}
print (C,R,H)
To search through Patient resources, I added a search keyword after the resource URL. FHIR defines a resource bundle as the return type:
-- read all patient records in XML format from FHIR server
-- reference http://www.hl7.org/implement/standards/fhir/http.htm#search
R,C,H = net.http.get{url=AllPatientsXMLURL, live=true}
print (C,R,H)
Finally, I added a patient resource by using net.http.post and passing in patient XML data created in a separate module, patientFHIR:
-- create a new patient in FHIR server
-- reference http://www.hl7.org/implement/standards/fhir/http.htm#create
local P = patientFHIR.InsertTemplate()
P = mapPatientData(P,msg,name)
R,C,H = net.http.post{url=CreatePatientXMLURL, live=true,
headers={['Content-Type']='application/xml'},
body=P:S()
}
print (C,R,H) -- code 201 (c=201) is a successful insert
end
function mapPatientData(Xml,Msg,Name)
if Name=='ADT' then
Xml.Patient.active[1]='true'
Xml.Patient.identifier.use[1]='official'
Xml.Patient.identifier.label[1]='SSN'
Xml.Patient.identifier.id[1]=Msg.PID[2][1]
Xml.Patient.details.name.use.value='official'
Xml.Patient.details.name.family.value=Msg.PID[5][1][1][1]
Xml.Patient.details.name.given.value=Msg.PID[5][1][2]
Xml.Patient.details.birthDate.value=Msg.PID[7][1]
print(Msg.PID[8])
Xml.Patient.details.gender.code[1]=Msg.PID[8]
end
return Xml
end
Here is the module for creating XML containing patient info:
patientFHIR={}
function patientFHIR.InsertTemplate()
return xml.parse
{data = [[
<Patient xmlns="http://hl7.org/fhir">
<active>#</active>
<identifier>
<use>#</use>
<label>#</label>
<id>#</id>
</identifier>
<details>
<name>
<use value="official"/>
<family value="family name"/>
<given value="given name"/>
</name>
<gender>
<system value="http://hl7.org/fhir/sid/v2-0001"/>
<code value=""/>
<display value=""/>
</gender>
<birthDate value="Date"/>
</details>
</Patient>
]]
}
end
function node.S(ANode)
return tostring(ANode)
end
If you want to try all this out, simply import this zip file (with the complete code) into your project: FHIR_Patient_Example_Filter.zip
Well, that’s it for today! Stay tuned as I’ll be posting a JSON example shortly…
Cheers!
Rolly