brf/server/lib/knex_helpers.ts
2025-12-18 07:31:37 +01:00

54 lines
1.4 KiB
TypeScript

import type { QueryBuilder } from 'knex'
import _ from 'lodash'
export function convertToReturning(obj: Record<string, string>) {
return _.map(obj, (value, key) => _.isString(value) && `${value} as ${key}`).filter(_.identity)
}
export function columnAs(name: string, table: string, transformer = _.snakeCase) {
const transformed = transformer(name)
if (transformed !== name) {
// knex automagically wraps everything in ", so they are not needed around ${name}
return `${table ? table + '.' : ''}${transformed} as ${name}`
}
return table ? `${table}.${name}` : name
}
export function columnBuilder(builder: QueryBuilder, columns: Record<string, string>, columnNames: string[]) {
for (const columnName of columnNames) {
const column = columns[columnName]
if (column) {
// @ts-ignore
builder.column(column)
}
}
return builder
}
export function where(builder: QueryBuilder, json: Record<string, ANY>) {
return _.reduce(
json,
(builder, value, key) => {
if (value === null) {
// @ts-ignore
return builder.whereNull(key)
} else if (Array.isArray(value)) {
// @ts-ignore
return builder.whereIn(key, value)
}
// @ts-ignore
return builder.where(key, value)
},
builder,
)
}
export const one = (result: ANY) => (result.rows ? result.rows[0] : undefined)
export const many = (result: ANY) => (result.rows ? result.rows : [])