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