Skip to content

Commit e4f1a9f

Browse files
committed
Fix for unmarshalling of contained resources (#116)
1 parent 4fd04f4 commit e4f1a9f

File tree

4 files changed

+42
-10
lines changed

4 files changed

+42
-10
lines changed

fixtures/condition_with_contained_patient.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
}],
1616
"gender": "male",
1717
"birthDate": "1950-09-02",
18+
"managingOrganization": {
19+
"reference": "Organization/1"
20+
},
1821
"extension":[
1922
{
2023
"url":"http://hl7.org/fhir/StructureDefinition/us-core-race",

models/domainresource.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,34 @@
2626

2727
package models
2828

29+
import (
30+
"gopkg.in/mgo.v2/bson"
31+
)
32+
33+
type ContainedResources []interface{}
34+
2935
type DomainResource struct {
3036
Resource `bson:",inline"`
31-
Text *Narrative `bson:"text,omitempty" json:"text,omitempty"`
32-
Contained []interface{} `bson:"contained,omitempty" json:"contained,omitempty"`
33-
Extension []Extension `bson:"extension,omitempty" json:"extension,omitempty"`
34-
ModifierExtension []Extension `bson:"modifierExtension,omitempty" json:"modifierExtension,omitempty"`
37+
Text *Narrative `bson:"text,omitempty" json:"text,omitempty"`
38+
Contained ContainedResources `bson:"contained,omitempty" json:"contained,omitempty"`
39+
Extension []Extension `bson:"extension,omitempty" json:"extension,omitempty"`
40+
ModifierExtension []Extension `bson:"modifierExtension,omitempty" json:"modifierExtension,omitempty"`
41+
}
42+
43+
// Convert contained resources from map[string]interfac{} to specific types.
44+
// Custom marshalling methods on those types will then hide internal fields
45+
// like @context and referenceid.
46+
func (x *ContainedResources) SetBSON(raw bson.Raw) (err error) {
47+
48+
// alias type to avoid infinite loop when calling Unmarshal
49+
type containedResources ContainedResources
50+
x2 := (*containedResources)(x)
51+
if err = raw.Unmarshal(x2); err == nil {
52+
if x != nil {
53+
for i := range *x {
54+
(*x)[i] = BSONMapToResource((*x)[i].(bson.M), true)
55+
}
56+
}
57+
}
58+
return
3559
}

server/resource_controller.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,9 +291,6 @@ func (u CustomJSONRenderer) Render(w http.ResponseWriter) (err error) {
291291
data = bytes.Replace(data, []byte("\\u003e"), []byte(">"), -1)
292292
data = bytes.Replace(data, []byte("\\u0026"), []byte("&"), -1)
293293

294-
// Convert "_id" to "id"
295-
data = bytes.Replace(data, []byte("\"_id\":"), []byte("\"id\":"), -1)
296-
297294
writeContentType(w, fhirJSONContentType)
298295
_, err = w.Write(data)
299296
return

server/server_test.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ func (s *ServerSuite) TestEmbbeddedResourceIDsGetRetrievedCorrectly(c *C) {
632632
c.Assert(resource["_id"], IsNil)
633633
}
634634

635-
func (s *ServerSuite) TestContainedResourcesIDsAreCorrectButExtensionIsNot(c *C) {
635+
func (s *ServerSuite) TestContainedResources(c *C) {
636636
res, err := postFixture(s.Server.URL, "Condition", "../fixtures/condition_with_contained_patient.json")
637637
util.CheckErr(err)
638638

@@ -659,10 +659,18 @@ func (s *ServerSuite) TestContainedResourcesIDsAreCorrectButExtensionIsNot(c *C)
659659
c.Assert(len(containedMap["id"].(string)), Equals, 19)
660660
c.Assert(containedMap["_id"], IsNil)
661661

662-
// But sadly, the extension in the patient is not
662+
// the extension should be without internal fields like @context
663663
extension := containedMap["extension"].([]interface{})[0]
664664
extensionMap := extension.(map[string]interface{})
665-
c.Assert(extensionMap["@context"], Not(IsNil))
665+
c.Assert(extensionMap["@context"], IsNil)
666+
c.Assert(extensionMap["url"], Equals, "http://hl7.org/fhir/StructureDefinition/us-core-race")
667+
668+
// the managingOrganization reference should be without internal fields like referenceid
669+
managingOrganizationMap := containedMap["managingOrganization"].(map[string]interface{})
670+
c.Assert(managingOrganizationMap["reference"], Equals, "Organization/1")
671+
c.Assert(managingOrganizationMap["referenceid"], IsNil)
672+
c.Assert(managingOrganizationMap["type"], IsNil)
673+
c.Assert(managingOrganizationMap["external"], IsNil)
666674

667675
// Delete this entry
668676
worker := s.MasterSession.GetWorkerSession()

0 commit comments

Comments
 (0)