35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
import type { ParsedQuery } from '../data-sources/types'
|
|
|
|
type PostgrestOperator = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'like' | 'ilike'
|
|
|
|
export function applyParsedQuery(builder: any, parsed: ParsedQuery | null) {
|
|
if (!parsed) {
|
|
return builder
|
|
}
|
|
|
|
for (const filter of parsed.filters) {
|
|
const operator: PostgrestOperator = (filter.operator ?? 'eq') as PostgrestOperator
|
|
|
|
if (typeof builder[operator] === 'function') {
|
|
const value = operator === 'like' || operator === 'ilike' ? String(filter.value) : filter.value
|
|
builder = builder[operator](filter.field, value)
|
|
}
|
|
}
|
|
|
|
if (parsed.orderBy && typeof builder.order === 'function') {
|
|
builder = builder.order(parsed.orderBy.field, {
|
|
ascending: parsed.orderBy.ascending !== false
|
|
})
|
|
}
|
|
|
|
if (parsed.limit && parsed.offset !== undefined && typeof builder.range === 'function') {
|
|
const from = parsed.offset
|
|
const to = parsed.offset + parsed.limit - 1
|
|
builder = builder.range(from, to)
|
|
} else if (parsed.limit && typeof builder.limit === 'function') {
|
|
builder = builder.limit(parsed.limit)
|
|
}
|
|
|
|
return builder
|
|
}
|