UNPKG

1.48 kBJavaScriptView Raw
1'use strict';
2
3const fetchres = require('fetchres');
4const logger = require('@financial-times/n-logger').default;
5const signedFetch = require('signed-aws-es-fetch');
6const elasticAgent = require('./utils/elastic-agent');
7
8module.exports = function search(opts) {
9 let filterObject;
10
11 if (Array.isArray(opts.filter)) {
12 let term = Object.defineProperty({}, opts.filter[0], {
13 value: opts.filter[1],
14 enumerable: true
15 });
16
17 filterObject = {
18 bool: {
19 must: {
20 term: term
21 }
22 }
23 };
24 } else {
25 filterObject = opts.filter;
26 }
27
28 let body = {
29 // source filtering maintains consistent behaviour, loading stored
30 // fields would require an additional normalisation step.
31 _source: 'fields' in opts ? opts.fields : true,
32 from: 'offset' in opts ? opts.offset : 0,
33 size: 'count' in opts ? opts.count : 10,
34 filter: filterObject,
35 sort: {
36 publishedDate: { order: 'desc' }
37 }
38 };
39
40 return signedFetch('https://next-elastic.ft.com/v3_api_v2/item/_search', {
41 body: JSON.stringify(body),
42 agent: elasticAgent,
43 method: 'POST',
44 timeout: 3000
45 })
46 .then(response => {
47 if (!response.ok) {
48 logger.warn('Failed getting content from Elastic Search', {
49 query: JSON.stringify(opts.filter),
50 status: response.status
51 });
52 }
53
54 return fetchres.json(response);
55 })
56 .then(results => {
57 let total = results.hits.total;
58
59 results = results.hits.hits.map(hit => hit._source);
60 results.total = total;
61
62 return results;
63 });
64};