-
Notifications
You must be signed in to change notification settings - Fork 0
/
createIndex.js
87 lines (75 loc) · 2.19 KB
/
createIndex.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
const AWS = require('aws-sdk');
const region = process.env.AWS_DEFAULT_REGION;
const domain = process.env.ES_API_URL.substring(8);
const endpoint = new AWS.Endpoint(domain);
const index = 'digests';
const type = 'digest';
const createIndex = async () => {
if (await indexExists()) return;
const request = createRequest('PUT', createBody());
makeRequest(request);
};
const indexExists = async () => {
const request = createRequest('HEAD');
const response = await makeRequest(request);
return response === 200;
};
const createRequest = (requestMethod, body = null) => {
const request = new AWS.HttpRequest(endpoint, region);
setParameters(request, requestMethod, body);
setHeaders(request);
signRequest(request);
return request;
};
const setParameters = (request, requestMethod, body = null) => {
request.method = requestMethod;
request.path += `${index}/`;
if (body) request.body = JSON.stringify(body);
};
const setHeaders = (request) => {
request.headers['host'] = domain;
request.headers['Content-Type'] = 'application/json';
request.headers['Content-Length'] = request.body.length;
};
const signRequest = (request) => {
const credentials = new AWS.EnvironmentCredentials('AWS');
const signer = new AWS.Signers.V4(request, 'es');
signer.addAuthorization(credentials, new Date());
};
const makeRequest = (request) => {
const client = new AWS.HttpClient();
return new Promise((resolve, reject) => {
client.handleRequest(request, null, (response) => {
response.on('data', () => {});
response.on('end', () => resolve(response.statusCode));
}, (error) => reject(error));
});
};
const createBody = () => ({
mappings: {
[type]: {
properties: {
search: {
properties: {
query: { type: 'percolator' },
userID: { type: 'keyword' },
searchTerm: {
type: 'text',
fields: {
keyword: {
type: 'keyword'
}
}
}
}
},
Content: { type: 'text' },
Tags: { type: 'text' }
}
}
}
});
createIndex().catch((error) => {
console.error(error);
process.exitCode = 1;
});