-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
121 lines (88 loc) · 3.99 KB
/
index.js
File metadata and controls
121 lines (88 loc) · 3.99 KB
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
var amazonApiGatewayQuerystring = require('amazon-api-gateway-querystring');
module.exports = function (configFactory) {
return function (event, context, callback) {
var output = {
statusCode: 200,
headers: {},
body: {}
},
requestPayload = {
headers: event.headers,
accessToken: event.headers && event.headers.Authorization,
identity: event && event.requestContext && event.requestContext.authorizer && event.requestContext.authorizer.claims || null,
sourceIP: event && event.requestContext && event.requestContext.identity && event.requestContext.identity.sourceIp || null,
stageVariables: event.stageVariables || {},
path: event.path || '',
resource: event.resource || '/',
httpMethod: event.httpMethod || 'DEFAULT',
origin: event.headers && [event.headers['X-Forwarded-Proto'], event.headers.Host].join('://') || '',
stage: (event.requestContext && event.requestContext.stage || ''),
pathParameters: Object.keys(event.pathParameters || {}).reduce(function (params, k) { params[k] = decodeURIComponent(event.pathParameters[k]); return params; }, {}),
queryStringParameters: event.queryStringParameters || {},
body: event.body || {}
};
var _config = Object.assign(
{
// base directory where start to map resource_path to files
methodsBaseDir: 'resources',
// parse querystring looking for nested params
// https://www.npmjs.com/package/amazon-api-gateway-querystring
parseQueryString: true,
// parse event.body looking for JSON structure
parseBody: true,
// Response Headers
headers: {},
// function called with response that returns the output object
response: function (response) {
return {
body: response
};
},
// function called with error that returns the output object
error: function (error) {
return {
statusCode: 500,
body: {
error: error
}
};
}
},
configFactory({requestPayload, event, context})
);
if (_config.parseQueryString && Object.keys(requestPayload.queryStringParameters).length)
requestPayload.queryStringParameters = amazonApiGatewayQuerystring(requestPayload.queryStringParameters);
if (_config.parseBody && event.body) {
try {
var parsed = JSON.parse(event.body);
if (parsed)
requestPayload.body = parsed;
} catch (e) {}
}
var moduleName = requestPayload.resource + '/' + requestPayload.httpMethod.toUpperCase();
try {
var middleware = require(require('path').dirname(module.parent.filename) + '/' + _config.methodsBaseDir + moduleName);
}
catch (error) {
output = _config.error(error);
output.headers = Object.assign(_config.headers, output.headers);
if (output.body)
output.body = JSON.stringify(output.body);
callback(null, output);
return;
}
middleware(requestPayload).then(function (response) {
output = _config.response(response);
output.headers = Object.assign(_config.headers, output.headers);
if (output.body)
output.body = JSON.stringify(output.body);
callback(null, output);
}).catch(function (error) {
output = _config.error(error);
output.headers = Object.assign(_config.headers, output.headers);
if (output.body)
output.body = JSON.stringify(output.body);
callback(null, output);
});
}
}