-
Notifications
You must be signed in to change notification settings - Fork 0
/
fhirsearch.js
110 lines (97 loc) · 3.56 KB
/
fhirsearch.js
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
'use strict';
//Copyright 2018 Tim Coates
//
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
var AWS = require("aws-sdk");
var docClient = null;
var utility = require("./utility.js");
var mime = "application/json";
module.exports = {
entrypoint: entrypoint
};
/**
Function to do a SEARCH, called by a GET to /fhir/Patient
NB: See fhirget for handling calls to GET to /fhir/Patient/{patID}
*/
function entrypoint(event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false;
console.log("Event: ", JSON.stringify(event));
var baseURL = event.headers["X-Forwarded-Proto"] + "://" + event.headers.Host + event.requestContext.path;
mime = utility.getMimeType(event);
var response = JSON.stringify(event);
var reply = {
statusCode: 404,
headers: { "Content-Type": "text/plain" },
body: response
};
var dob = null;
if('queryStringParameters' in event) {
console.log("queryStringParameters exists");
} else {
console.log("queryStringParameters not here??");
}
if('birthdate' in event.queryStringParameters) {
dob = event.queryStringParameters["birthdate"].slice(0, 4) + event.queryStringParameters["birthdate"].slice(5, 7) + event.queryStringParameters["birthdate"].slice(8);
console.log("Searching on DOB: " + dob);
}
var family_name = null;
if('family' in event.queryStringParameters) {
family_name = event.queryStringParameters["family"];
console.log("Searching on family_name: " + family_name);
}
var postcode = null;
if('address-postalcode' in event.queryStringParameters) {
postcode = event.queryStringParameters["address-postalcode"].replace(" ","");
console.log("Searching on postcode: " + postcode);
}
if(dob != null && family_name != null && postcode != null) {
console.log("We have query params");
var indexval = family_name + postcode + dob;
var params = {
TableName: "prod-pds-data",
IndexName: "traceindex",
KeyConditionExpression: "traceindex = :term",
ExpressionAttributeValues: {
":term": indexval
}
};
console.log("params: " + JSON.stringify(params));
if(docClient == null) {
docClient = new AWS.DynamoDB.DocumentClient();
}
docClient.query(params, function(err, data) {
if(err) {
console.log("err: " + JSON.stringify(err));
reply.body = utility.makeBundle(null, baseURL, mime);
} else {
console.log("Got some data: " + JSON.stringify(data));
if(data.Count == 1) {
console.log("Got exactly one match.");
reply.body = utility.makeBundle(data.Items[0], baseURL, mime);
reply.statusCode = 200;
reply.headers = { "Content-Type": "application/json" };
} else {
console.log("Got multiple matches.");
reply.body = utility.makeBundle(null, baseURL, mime);
}
console.log("Response will be: " + reply.body);
}
callback(null, reply);
});
} else {
console.log("We didn't get all 3 query parameteres required.");
// Here we'll just send a default (TBC) empty bundle.
reply.body = utility.makeBundle(null, baseURL, mime);
callback(null, reply);
}
}