-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
112 lines (93 loc) · 2.2 KB
/
index.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
111
112
const gateless = (handler, options) => {
return async (event, context, callback) => {
let result = {};
let statusCode = 200;
let response = eventToResponse(event);
let request = eventToRequest(event);
try {
result = await handler(request, response, event);
} catch (error) {
statusCode = error.statusCode || 500;
result = { message: error.message };
}
callback(null, makeResponse(statusCode, result));
return;
};
};
const eventToRequest = event => {
let method = event.method;
let params = event.queryStringParameters;
let headers = event.headers;
let body = event.body;
try {
body = JSON.parse(event.body);
} catch (e) {}
return {
method,
params,
parameters: params,
headers,
body,
checkParameters: checkParameters
};
};
const eventToResponse = event => {
return event;
};
const makeResponse = (statusCode, body) => {
return {
statusCode: statusCode,
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify(body)
};
};
const checkParameters = (object = {}, parameters) => {
let keys = Object.keys(object) || [];
keys = keys.map(k => k.toLowerCase());
for (const param of parameters) {
if (!keys.includes(param.toLowerCase())) {
throw new MissingParameterError(param);
}
}
};
class ClientError extends Error {
constructor(message, statusCode = 400) {
super(message);
this.name = "ClientError";
this.statusCode = statusCode;
}
}
class ServerError extends Error {
constructor(message, statusCode = 500) {
super(message);
this.name = "ServerError";
this.statusCode = statusCode;
}
}
class MissingParameterError extends ClientError {
constructor(parameterName) {
super(`Missing parameter '${parameterName}'`);
}
}
class UnauthorizedError extends ClientError {
constructor() {
super("Unauthorized", 403);
}
}
class NotFoundError extends ClientError {
constructor(resource = "Resource") {
super(`${resource} not found`, 404);
}
}
module.exports = {
gateless,
checkParameters,
ClientError,
MissingParameterError,
UnauthorizedError,
NotFoundError,
ServerError
};