-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathendpoints.ts
62 lines (56 loc) · 1.79 KB
/
endpoints.ts
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
import { IResponse } from "./util.ts";
import { ServerRequest } from "https://deno.land/[email protected]/http/server.ts";
import { nameMatchesPhoneNumber, numberIsLeaked, doneLoading } from "./datasets/index.ts";
const endpoints: Array<{
method: string | string[],
urlMatcher: (url: URL) => boolean,
handler(respond: (res: IResponse) => void, url: URL, body: object | undefined, request: ServerRequest): Promise<void>,
}> = [
{
method: 'POST',
urlMatcher: url => url.pathname == '/check',
handler: async (respond, url, body: { phoneNumber: string, name?: string } | undefined) => {
if (!body?.phoneNumber) {
respond({
status: 400,
body: 'missing \'phoneNumber\' in body',
});
return;
}
const name = body.name?.trim();
let phoneNumber = body.phoneNumber.replace(/\s/g, '');
if (!/^((\+|00)?31|0)\d{9}$/.test(phoneNumber)) {
respond({
status: 400,
body: 'invalid phone number',
});
return;
}
if (!doneLoading()) {
respond({
status: 503,
body: 'aan het opstarten, probeer het over een halve minuut nog eens',
});
return;
}
if (phoneNumber.substr(0, 4) == '+316') {
phoneNumber = phoneNumber.slice(1);
}
else if (phoneNumber.substr(0,2) == '06') {
phoneNumber = '31' + phoneNumber.slice(1);
}
const numberIsPwned = numberIsLeaked(phoneNumber);
const nameMatches = name && numberIsPwned ? nameMatchesPhoneNumber(phoneNumber, name) : null;
respond({
body: JSON.stringify({
numberIsPwned,
nameMatches
}),
headers: new Headers({
'Content-Type': 'application/json'
}),
});
}
},
];
export default endpoints;