generated from PackagrIO/goweb-template
/
fhir_questionnaire.go
308 lines (303 loc) · 13.8 KB
/
fhir_questionnaire.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
// THIS FILE IS GENERATED BY https://github.com/fastenhealth/fasten-onprem/blob/main/backend/pkg/models/database/generate.go
// PLEASE DO NOT EDIT BY HAND
package database
import (
"encoding/json"
"fmt"
goja "github.com/dop251/goja"
models "github.com/fastenhealth/fasten-onprem/backend/pkg/models"
datatypes "gorm.io/datatypes"
"time"
)
type FhirQuestionnaire struct {
models.ResourceBase
// A code that corresponds to one of its items in the questionnaire
// https://hl7.org/fhir/r4/search.html#token
Code datatypes.JSON `gorm:"column:code;type:text;serializer:json" json:"code,omitempty"`
// A use context assigned to the questionnaire
// https://hl7.org/fhir/r4/search.html#token
Context datatypes.JSON `gorm:"column:context;type:text;serializer:json" json:"context,omitempty"`
// A quantity- or range-valued use context assigned to the questionnaire
// https://hl7.org/fhir/r4/search.html#quantity
ContextQuantity datatypes.JSON `gorm:"column:contextQuantity;type:text;serializer:json" json:"contextQuantity,omitempty"`
// A type of use context assigned to the questionnaire
// https://hl7.org/fhir/r4/search.html#token
ContextType datatypes.JSON `gorm:"column:contextType;type:text;serializer:json" json:"contextType,omitempty"`
// The questionnaire publication date
// https://hl7.org/fhir/r4/search.html#date
Date *time.Time `gorm:"column:date;type:datetime" json:"date,omitempty"`
// ElementDefinition - details for the item
// https://hl7.org/fhir/r4/search.html#uri
Definition string `gorm:"column:definition;type:text" json:"definition,omitempty"`
// The description of the questionnaire
// https://hl7.org/fhir/r4/search.html#string
Description datatypes.JSON `gorm:"column:description;type:text;serializer:json" json:"description,omitempty"`
// The time during which the questionnaire is intended to be in use
// https://hl7.org/fhir/r4/search.html#date
Effective *time.Time `gorm:"column:effective;type:datetime" json:"effective,omitempty"`
// External identifier for the questionnaire
// https://hl7.org/fhir/r4/search.html#token
Identifier datatypes.JSON `gorm:"column:identifier;type:text;serializer:json" json:"identifier,omitempty"`
// Intended jurisdiction for the questionnaire
// https://hl7.org/fhir/r4/search.html#token
Jurisdiction datatypes.JSON `gorm:"column:jurisdiction;type:text;serializer:json" json:"jurisdiction,omitempty"`
// Language of the resource content
// https://hl7.org/fhir/r4/search.html#token
Language datatypes.JSON `gorm:"column:language;type:text;serializer:json" json:"language,omitempty"`
// When the resource version last changed
// https://hl7.org/fhir/r4/search.html#date
MetaLastUpdated *time.Time `gorm:"column:metaLastUpdated;type:datetime" json:"metaLastUpdated,omitempty"`
// Profiles this resource claims to conform to
// https://hl7.org/fhir/r4/search.html#reference
MetaProfile datatypes.JSON `gorm:"column:metaProfile;type:text;serializer:json" json:"metaProfile,omitempty"`
// Tags applied to this resource
// https://hl7.org/fhir/r4/search.html#token
MetaTag datatypes.JSON `gorm:"column:metaTag;type:text;serializer:json" json:"metaTag,omitempty"`
// Tags applied to this resource
// This is a primitive string literal (`keyword` type). It is not a recognized SearchParameter type from https://hl7.org/fhir/r4/search.html, it's Fasten Health-specific
MetaVersionId string `gorm:"column:metaVersionId;type:text" json:"metaVersionId,omitempty"`
// Computationally friendly name of the questionnaire
// https://hl7.org/fhir/r4/search.html#string
Name datatypes.JSON `gorm:"column:name;type:text;serializer:json" json:"name,omitempty"`
// Name of the publisher of the questionnaire
// https://hl7.org/fhir/r4/search.html#string
Publisher datatypes.JSON `gorm:"column:publisher;type:text;serializer:json" json:"publisher,omitempty"`
// The current status of the questionnaire
// https://hl7.org/fhir/r4/search.html#token
Status datatypes.JSON `gorm:"column:status;type:text;serializer:json" json:"status,omitempty"`
// Resource that can be subject of QuestionnaireResponse
// https://hl7.org/fhir/r4/search.html#token
SubjectType datatypes.JSON `gorm:"column:subjectType;type:text;serializer:json" json:"subjectType,omitempty"`
// Text search against the narrative
// This is a primitive string literal (`keyword` type). It is not a recognized SearchParameter type from https://hl7.org/fhir/r4/search.html, it's Fasten Health-specific
Text string `gorm:"column:text;type:text" json:"text,omitempty"`
// The human-friendly name of the questionnaire
// https://hl7.org/fhir/r4/search.html#string
Title datatypes.JSON `gorm:"column:title;type:text;serializer:json" json:"title,omitempty"`
// A resource type filter
// https://hl7.org/fhir/r4/search.html#special
Type datatypes.JSON `gorm:"column:type;type:text;serializer:json" json:"type,omitempty"`
// The uri that identifies the questionnaire
// https://hl7.org/fhir/r4/search.html#uri
Url string `gorm:"column:url;type:text" json:"url,omitempty"`
// The business version of the questionnaire
// https://hl7.org/fhir/r4/search.html#token
Version datatypes.JSON `gorm:"column:version;type:text;serializer:json" json:"version,omitempty"`
}
func (s *FhirQuestionnaire) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"code": "token",
"context": "token",
"contextQuantity": "quantity",
"contextType": "token",
"date": "date",
"definition": "uri",
"description": "string",
"effective": "date",
"id": "keyword",
"identifier": "token",
"jurisdiction": "token",
"language": "token",
"metaLastUpdated": "date",
"metaProfile": "reference",
"metaTag": "token",
"metaVersionId": "keyword",
"name": "string",
"publisher": "string",
"sort_date": "date",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subjectType": "token",
"text": "keyword",
"title": "string",
"type": "special",
"url": "uri",
"version": "token",
}
return searchParameters
}
func (s *FhirQuestionnaire) PopulateAndExtractSearchParameters(resourceRaw json.RawMessage) error {
s.ResourceRaw = datatypes.JSON(resourceRaw)
// unmarshal the raw resource (bytes) into a map
var resourceRawMap map[string]interface{}
err := json.Unmarshal(resourceRaw, &resourceRawMap)
if err != nil {
return err
}
if len(fhirPathJs) == 0 {
return fmt.Errorf("fhirPathJs script is empty")
}
vm := goja.New()
// setup the global window object
vm.Set("window", vm.NewObject())
// set the global FHIR Resource object
vm.Set("fhirResource", resourceRawMap)
// compile the fhirpath library
fhirPathJsProgram, err := goja.Compile("fhirpath.min.js", fhirPathJs, true)
if err != nil {
return err
}
// compile the searchParametersExtractor library
searchParametersExtractorJsProgram, err := goja.Compile("searchParameterExtractor.js", searchParameterExtractorJs, true)
if err != nil {
return err
}
// add the fhirpath library in the goja vm
_, err = vm.RunProgram(fhirPathJsProgram)
if err != nil {
return err
}
// add the searchParametersExtractor library in the goja vm
_, err = vm.RunProgram(searchParametersExtractorJsProgram)
if err != nil {
return err
}
// execute the fhirpath expression for each search parameter
// extracting Code
codeResult, err := vm.RunString("extractTokenSearchParameters(fhirResource, 'Questionnaire.item.code')")
if err == nil && codeResult.String() != "undefined" {
s.Code = []byte(codeResult.String())
}
// extracting Context
contextResult, err := vm.RunString("extractTokenSearchParameters(fhirResource, '(Questionnaire.useContext.valueCodeableConcept)')")
if err == nil && contextResult.String() != "undefined" {
s.Context = []byte(contextResult.String())
}
// extracting ContextQuantity
contextQuantityResult, err := vm.RunString("extractCatchallSearchParameters(fhirResource, '(Questionnaire.useContext.valueQuantity) | (Questionnaire.useContext.valueRange)')")
if err == nil && contextQuantityResult.String() != "undefined" {
s.ContextQuantity = []byte(contextQuantityResult.String())
}
// extracting ContextType
contextTypeResult, err := vm.RunString("extractTokenSearchParameters(fhirResource, 'Questionnaire.useContext.code')")
if err == nil && contextTypeResult.String() != "undefined" {
s.ContextType = []byte(contextTypeResult.String())
}
// extracting Date
dateResult, err := vm.RunString("extractDateSearchParameters(fhirResource, 'Questionnaire.date')")
if err == nil && dateResult.String() != "undefined" {
t, err := time.Parse(time.RFC3339, dateResult.String())
if err == nil {
s.Date = &t
} else if err != nil {
d, err := time.Parse("2006-01-02", dateResult.String())
if err == nil {
s.Date = &d
}
}
}
// extracting Definition
definitionResult, err := vm.RunString("extractSimpleSearchParameters(fhirResource, 'Questionnaire.item.definition')")
if err == nil && definitionResult.String() != "undefined" {
s.Definition = definitionResult.String()
}
// extracting Description
descriptionResult, err := vm.RunString("extractStringSearchParameters(fhirResource, 'Questionnaire.description')")
if err == nil && descriptionResult.String() != "undefined" {
s.Description = []byte(descriptionResult.String())
}
// extracting Effective
effectiveResult, err := vm.RunString("extractDateSearchParameters(fhirResource, 'Questionnaire.effectivePeriod')")
if err == nil && effectiveResult.String() != "undefined" {
t, err := time.Parse(time.RFC3339, effectiveResult.String())
if err == nil {
s.Effective = &t
} else if err != nil {
d, err := time.Parse("2006-01-02", effectiveResult.String())
if err == nil {
s.Effective = &d
}
}
}
// extracting Identifier
identifierResult, err := vm.RunString("extractTokenSearchParameters(fhirResource, 'Questionnaire.identifier')")
if err == nil && identifierResult.String() != "undefined" {
s.Identifier = []byte(identifierResult.String())
}
// extracting Jurisdiction
jurisdictionResult, err := vm.RunString("extractTokenSearchParameters(fhirResource, 'Questionnaire.jurisdiction')")
if err == nil && jurisdictionResult.String() != "undefined" {
s.Jurisdiction = []byte(jurisdictionResult.String())
}
// extracting Language
languageResult, err := vm.RunString("extractTokenSearchParameters(fhirResource, 'language')")
if err == nil && languageResult.String() != "undefined" {
s.Language = []byte(languageResult.String())
}
// extracting MetaLastUpdated
metaLastUpdatedResult, err := vm.RunString("extractDateSearchParameters(fhirResource, 'meta.lastUpdated')")
if err == nil && metaLastUpdatedResult.String() != "undefined" {
t, err := time.Parse(time.RFC3339, metaLastUpdatedResult.String())
if err == nil {
s.MetaLastUpdated = &t
} else if err != nil {
d, err := time.Parse("2006-01-02", metaLastUpdatedResult.String())
if err == nil {
s.MetaLastUpdated = &d
}
}
}
// extracting MetaProfile
metaProfileResult, err := vm.RunString("extractReferenceSearchParameters(fhirResource, 'meta.profile')")
if err == nil && metaProfileResult.String() != "undefined" {
s.MetaProfile = []byte(metaProfileResult.String())
}
// extracting MetaTag
metaTagResult, err := vm.RunString("extractTokenSearchParameters(fhirResource, 'meta.tag')")
if err == nil && metaTagResult.String() != "undefined" {
s.MetaTag = []byte(metaTagResult.String())
}
// extracting MetaVersionId
metaVersionIdResult, err := vm.RunString("extractSimpleSearchParameters(fhirResource, 'meta.versionId')")
if err == nil && metaVersionIdResult.String() != "undefined" {
s.MetaVersionId = metaVersionIdResult.String()
}
// extracting Name
nameResult, err := vm.RunString("extractStringSearchParameters(fhirResource, 'Questionnaire.name')")
if err == nil && nameResult.String() != "undefined" {
s.Name = []byte(nameResult.String())
}
// extracting Publisher
publisherResult, err := vm.RunString("extractStringSearchParameters(fhirResource, 'Questionnaire.publisher')")
if err == nil && publisherResult.String() != "undefined" {
s.Publisher = []byte(publisherResult.String())
}
// extracting Status
statusResult, err := vm.RunString("extractTokenSearchParameters(fhirResource, 'Questionnaire.status')")
if err == nil && statusResult.String() != "undefined" {
s.Status = []byte(statusResult.String())
}
// extracting SubjectType
subjectTypeResult, err := vm.RunString("extractTokenSearchParameters(fhirResource, 'Questionnaire.subjectType')")
if err == nil && subjectTypeResult.String() != "undefined" {
s.SubjectType = []byte(subjectTypeResult.String())
}
// extracting Text
textResult, err := vm.RunString("extractSimpleSearchParameters(fhirResource, 'text')")
if err == nil && textResult.String() != "undefined" {
s.Text = textResult.String()
}
// extracting Title
titleResult, err := vm.RunString("extractStringSearchParameters(fhirResource, 'Questionnaire.title')")
if err == nil && titleResult.String() != "undefined" {
s.Title = []byte(titleResult.String())
}
// extracting Url
urlResult, err := vm.RunString("extractSimpleSearchParameters(fhirResource, 'Questionnaire.url')")
if err == nil && urlResult.String() != "undefined" {
s.Url = urlResult.String()
}
// extracting Version
versionResult, err := vm.RunString("extractTokenSearchParameters(fhirResource, 'Questionnaire.version')")
if err == nil && versionResult.String() != "undefined" {
s.Version = []byte(versionResult.String())
}
return nil
}
// TableName overrides the table name from fhir_observations (pluralized) to `fhir_observation`. https://gorm.io/docs/conventions.html#TableName
func (s *FhirQuestionnaire) TableName() string {
return "fhir_questionnaire"
}