@windingtree/wt-search-api
Version:
NodeJS app that enables quick search over data from Winding Tree platform
74 lines (67 loc) • 1.72 kB
JavaScript
const byCategory = require('./indices/by-category');
const byDefaultLocale = require('./indices/by-default-locale');
const byLocation = require('./indices/by-location');
const { QueryParseError } = require('./errors');
const FILTERS = {
// { <query_param> : <filter_fn> }
category: byCategory.getFilter,
location: byLocation.getFilter,
defaultLocale: byDefaultLocale.getFilter,
};
const SORTS = {
// { <query_param> : <sort_fn> }
sortByDistance: byLocation.getSort,
};
/**
* Extract filtering information from the GET query and
* transform it to the internal representation.
*
* @param {Object} query request GET params
* @return {Array}
* @throw QueryParseError
*
*/
function getFilters (query) {
const filters = Object.keys(FILTERS)
.map((filterParam) => {
if (!query[filterParam]) {
return;
}
return FILTERS[filterParam](query[filterParam]);
})
.filter(Boolean)
.reduce((prev, curr) => prev.concat(curr), []);
return (filters.length > 0) ? filters : undefined;
}
/**
* Extract sorting representation from the GET query, if
* applicable.
*
* @param {Object} query request GET params
* @return {Object}
* @throw QueryParseError
*
*/
function getSort (query) {
return Object.keys(SORTS)
.map((sortParam) => {
if (!query[sortParam]) {
return;
}
return SORTS[sortParam](query[sortParam]);
})
.filter(Boolean)
.reduce((prev, curr) => {
if (prev && curr) {
throw new QueryParseError('Cannot specify more than a single criteria for sorting.');
}
return prev || curr;
}, undefined);
}
module.exports = {
FILTERS,
SORTS,
QueryParseError,
getFilters,
getSort,
};