| |
| |
| |
| |
| |
| import languages from '@/languages/lib/languages-server' |
| import { allIndexVersionKeys, versionToIndexVersionMap } from '@/search/lib/elasticsearch-versions' |
| import { SearchTypes } from '@/search/types' |
|
|
| import type { SearchRequestQueryParams } from '@/search/lib/search-request-params/types' |
|
|
| |
| export function getSearchRequestParamsObject(type: SearchTypes): SearchRequestQueryParams[] { |
| if (type === 'aiSearchAutocomplete') { |
| return AI_SEARCH_AUTOCOMPLETE_PARAMS_OBJ |
| } |
| return GENERAL_SEARCH_PARAMS_OBJ |
| } |
|
|
| |
|
|
| |
| const DEFAULT_AUTOCOMPLETE_SIZE = 5 |
| const MAX_AUTOCOMPLETE_SIZE = 10 |
| const DEFAULT_SIZE = 10 |
| const MAX_SIZE = 50 |
| const DEFAULT_PAGE = 1 |
| const POSSIBLE_SORTS = ['best', 'relevance'] as const |
| const DEFAULT_SORT = POSSIBLE_SORTS[0] |
| const MAX_PAGE = 10 |
| const V1_AGGREGATES = ['toplevel'] as const |
| export const POSSIBLE_HIGHLIGHT_FIELDS = ['title', 'content'] as const |
| |
| |
| |
| export const DEFAULT_HIGHLIGHT_FIELDS: readonly string[] = ['title', 'content'] |
|
|
| export const V1_ADDITIONAL_INCLUDES = ['intro', 'headings', 'toplevel'] as const |
|
|
| export class ValidationError extends Error {} |
|
|
| const SHARED_PARAMS_OBJ: SearchRequestQueryParams[] = [ |
| { key: 'query' }, |
| { |
| key: 'version', |
| default_: 'free-pro-team', |
| validate: (version: string) => { |
| if (!versionToIndexVersionMap[version]) { |
| throw new ValidationError(`'${version}' not in ${allIndexVersionKeys.join(', ')}`) |
| } |
| return true |
| }, |
| }, |
| ] |
|
|
| const GENERAL_SEARCH_PARAMS_OBJ: SearchRequestQueryParams[] = [ |
| ...SHARED_PARAMS_OBJ, |
| { key: 'query' }, |
| { key: 'language', default_: 'en', validate: (v) => v in languages }, |
| { |
| key: 'size', |
| default_: DEFAULT_SIZE, |
| cast: (v) => parseInt(v, 10), |
| validate: (v) => v >= 0 && v <= MAX_SIZE, |
| }, |
| { |
| key: 'page', |
| default_: DEFAULT_PAGE, |
| cast: (v) => parseInt(v, 10), |
| validate: (v) => v >= 1 && v <= MAX_PAGE, |
| }, |
| { key: 'sort', default_: DEFAULT_SORT, validate: (v) => POSSIBLE_SORTS.includes(v as any) }, |
| { |
| key: 'highlights', |
| default_: DEFAULT_HIGHLIGHT_FIELDS, |
| cast: (v) => (Array.isArray(v) ? v : [v]), |
| multiple: true, |
| validate: (v) => { |
| for (const highlight of v) { |
| if (!POSSIBLE_HIGHLIGHT_FIELDS.includes(highlight)) { |
| throw new ValidationError(`highlight value '${highlight}' is not valid`) |
| } |
| } |
| return true |
| }, |
| }, |
| { key: 'autocomplete', default_: false, cast: toBoolean }, |
| { key: 'debug', default_: process.env.NODE_ENV === 'development', cast: toBoolean }, |
| { |
| key: 'include', |
| default_: [], |
| cast: toArray, |
| multiple: true, |
| validate: (values) => |
| values.every((value: string) => V1_ADDITIONAL_INCLUDES.includes(value as any)), |
| }, |
| { |
| key: 'toplevel', |
| default_: [], |
| cast: toArray, |
| multiple: true, |
| }, |
| { |
| key: 'aggregate', |
| default_: [], |
| cast: toArray, |
| multiple: true, |
| validate: (values) => values.every((value: string) => V1_AGGREGATES.includes(value as any)), |
| }, |
| ] |
|
|
| const SHARED_AUTOCOMPLETE_PARAMS_OBJ: SearchRequestQueryParams[] = [ |
| { key: 'query' }, |
| { |
| key: 'size', |
| default_: DEFAULT_AUTOCOMPLETE_SIZE, |
| cast: (size: string) => parseInt(size, 10), |
| validate: (size: number) => size >= 0 && size <= MAX_AUTOCOMPLETE_SIZE, |
| }, |
| { |
| key: 'version', |
| default_: 'free-pro-team', |
| validate: (version: string) => { |
| if (!versionToIndexVersionMap[version]) { |
| throw new ValidationError(`'${version}' not in ${allIndexVersionKeys.join(', ')}`) |
| } |
| return true |
| }, |
| }, |
| ] |
|
|
| const AI_SEARCH_AUTOCOMPLETE_PARAMS_OBJ: SearchRequestQueryParams[] = [ |
| ...SHARED_AUTOCOMPLETE_PARAMS_OBJ, |
| { key: 'language', default_: 'en', validate: (language: string) => language === 'en' }, |
| ] |
|
|
| function toBoolean(value: any): boolean { |
| return value === 'true' || value === '1' |
| } |
|
|
| function toArray(value: any): any[] { |
| return Array.isArray(value) ? value : [value] |
| } |
|
|