UNPKG

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