UNPKG

@windingtree/wt-search-api

Version:

NodeJS app that enables quick search over data from Winding Tree platform

74 lines (67 loc) 1.72 kB
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, };