diff --git a/config/default.js b/config/default.js index 503eedf..fade308 100644 --- a/config/default.js +++ b/config/default.js @@ -7,6 +7,7 @@ module.exports = { PORT: process.env.PORT || 3000, API_VERSION: process.env.API_VERSION || 'v5', DEFAULT_PAGE_SIZE: process.env.DEFAULT_PAGE_SIZE || 1000, + MAX_ELASTIC_SEARCH_RECORDS_SIZE: process.env.MAX_ELASTIC_SEARCH_RECORDS_SIZE || 10000, // used to properly set the header response to api calls for services behind a load balancer API_BASE_URL: process.env.API_BASE_URL || `http://localhost:3000`, diff --git a/src/services/ResourceService.js b/src/services/ResourceService.js index 4016d99..199fde7 100644 --- a/src/services/ResourceService.js +++ b/src/services/ResourceService.js @@ -446,7 +446,23 @@ async function listChallengesByMember (memberId, criteria) { } }) - const docs = await searchES(mustQuery, perPage, page) + let docs = { + hits: { + total: 0, + hits: [] + } + } + + if (perPage * page <= config.MAX_ELASTIC_SEARCH_RECORDS_SIZE) { + docs = await searchES(mustQuery, perPage, page) + } else { + throw new errors.BadRequestError(` + ES pagination params: + page ${page}, + perPage: ${perPage} + exceeds the max search window:${config.MAX_ELASTIC_SEARCH_RECORDS_SIZE}` + ) + } // Extract data from hits let result = _.map(docs.hits.hits, item => item._source)