aboutsummaryrefslogtreecommitdiff
path: root/src/lib/params.ts
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-01-24 13:09:50 +0000
committerFuwn <[email protected]>2026-01-24 13:09:50 +0000
commit396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b (patch)
treeb9df4ca6a70db45cfffbae6fdd7252e20fb8e93c /src/lib/params.ts
downloadumami-396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b.tar.xz
umami-396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b.zip
Initial commitHEADmain
Created from https://vercel.com/new
Diffstat (limited to 'src/lib/params.ts')
-rw-r--r--src/lib/params.ts62
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;
+ }, {});
+}