Files
website/server/utils/baserow.ts
T
2026-10-01 19:39:20 +02:00

81 lines
2.6 KiB
TypeScript

import type { H3Event } from 'h3'
type Fields = Record<string, unknown>
interface RowPage<Row> {
count: number
results: Row[]
}
const PAGE_SIZE = 200
const TIMEOUT_MS = 15_000
async function request<T>(
event: H3Event,
path: string,
options: { method?: 'GET' | 'POST' | 'PATCH' | 'DELETE', query?: Fields, body?: Fields } = {}
): Promise<T> {
const { baserowUrl, baserowToken } = useRuntimeConfig(event)
if (!baserowUrl || !baserowToken) {
throw createError({ statusCode: 500, statusMessage: 'NUXT_BASEROW_URL and NUXT_BASEROW_TOKEN must be set' })
}
try {
return await $fetch(`/api/database/${path}`, {
baseURL: baserowUrl,
method: options.method ?? 'GET',
headers: { Authorization: `Token ${baserowToken}` },
query: options.query,
body: options.body,
timeout: TIMEOUT_MS
}) as T
} catch (error: any) {
const detail = error?.data?.detail
throw createError({
statusCode: error?.statusCode ?? 502,
statusMessage: typeof detail === 'string' ? detail : 'Baserow request failed'
})
}
}
/** All rows of a table. `query` adds Baserow list parameters, e.g. `{ filter__read__boolean: true }` or `{ include: 'title' }`. */
export async function listRows<Row>(event: H3Event, tableId: string, query: Fields = {}): Promise<Row[]> {
const path = `rows/table/${tableId}/`
const rows: Row[] = []
for (let page = 1; ; page++) {
const { count, results } = await request<RowPage<Row>>(event, path, {
query: { ...query, user_field_names: true, size: PAGE_SIZE, page }
})
rows.push(...results)
if (rows.length >= count || results.length === 0) return rows
}
}
export function createRow<Row>(event: H3Event, tableId: string, fields: Fields): Promise<Row> {
return request<Row>(event, `rows/table/${tableId}/`, {
method: 'POST',
query: { user_field_names: true },
body: fields
})
}
export function getRow<Row>(event: H3Event, tableId: string, rowId: number): Promise<Row> {
return request<Row>(event, `rows/table/${tableId}/${rowId}/`, { query: { user_field_names: true } })
}
export async function deleteRow(event: H3Event, tableId: string, rowId: number): Promise<void> {
await request(event, `rows/table/${tableId}/${rowId}/`, { method: 'DELETE' })
}
export function updateRow<Row>(event: H3Event, tableId: string, rowId: number, fields: Fields): Promise<Row> {
return request<Row>(event, `rows/table/${tableId}/${rowId}/`, {
method: 'PATCH',
query: { user_field_names: true },
body: fields
})
}
export function listFields<Field>(event: H3Event, tableId: string): Promise<Field[]> {
return request<Field[]>(event, `fields/table/${tableId}/`)
}