diff options
| author | Fuwn <[email protected]> | 2026-01-24 13:09:50 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-01-24 13:09:50 +0000 |
| commit | 396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b (patch) | |
| tree | b9df4ca6a70db45cfffbae6fdd7252e20fb8e93c /src/lib/params.ts | |
| download | umami-396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b.tar.xz umami-396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b.zip | |
Created from https://vercel.com/new
Diffstat (limited to 'src/lib/params.ts')
| -rw-r--r-- | src/lib/params.ts | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/lib/params.ts b/src/lib/params.ts new file mode 100644 index 0000000..ab2d586 --- /dev/null +++ b/src/lib/params.ts @@ -0,0 +1,62 @@ +import { FILTER_COLUMNS, OPERATORS } from '@/lib/constants'; +import type { Filter, QueryFilters, QueryOptions } from '@/lib/types'; + +export function parseFilterValue(param: any) { + if (typeof param === 'string') { + const operatorValues = Object.values(OPERATORS).join('|'); + + const regex = new RegExp(`^(${operatorValues})\\.(.*)$`); + + const [, operator, value] = param.match(regex) || []; + + return { operator: operator || OPERATORS.equals, value: value || param }; + } + + return { operator: OPERATORS.equals, value: param }; +} + +export function isEqualsOperator(operator: any) { + return [OPERATORS.equals, OPERATORS.notEquals].includes(operator); +} + +export function isSearchOperator(operator: any) { + return [OPERATORS.contains, OPERATORS.doesNotContain].includes(operator); +} + +export function filtersObjectToArray(filters: QueryFilters, options: QueryOptions = {}): Filter[] { + if (!filters) { + return []; + } + + return Object.keys(filters).reduce((arr, key) => { + const filter = filters[key]; + + if (filter === undefined || filter === null) { + return arr; + } + + if (filter?.name && filter?.value !== undefined) { + return arr.concat({ ...filter, column: options?.columns?.[key] ?? FILTER_COLUMNS[key] }); + } + + const { operator, value } = parseFilterValue(filter); + + return arr.concat({ + name: key, + column: options?.columns?.[key] ?? FILTER_COLUMNS[key], + operator, + value, + prefix: options?.prefix, + }); + }, []); +} + +export function filtersArrayToObject(filters: Filter[]) { + return filters.reduce((obj, filter: Filter) => { + const { name, operator, value } = filter; + + obj[name] = `${operator}.${value}`; + + return obj; + }, {}); +} |