import type { H3Event } from 'h3' type Fields = Record interface RowPage { count: number results: Row[] } const PAGE_SIZE = 200 const TIMEOUT_MS = 15_000 async function request( event: H3Event, path: string, options: { method?: 'GET' | 'POST' | 'PATCH' | 'DELETE', query?: Fields, body?: Fields } = {} ): Promise { 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(event: H3Event, tableId: string, query: Fields = {}): Promise { const path = `rows/table/${tableId}/` const rows: Row[] = [] for (let page = 1; ; page++) { const { count, results } = await request>(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(event: H3Event, tableId: string, fields: Fields): Promise { return request(event, `rows/table/${tableId}/`, { method: 'POST', query: { user_field_names: true }, body: fields }) } export function getRow(event: H3Event, tableId: string, rowId: number): Promise { return request(event, `rows/table/${tableId}/${rowId}/`, { query: { user_field_names: true } }) } export async function deleteRow(event: H3Event, tableId: string, rowId: number): Promise { await request(event, `rows/table/${tableId}/${rowId}/`, { method: 'DELETE' }) } export function updateRow(event: H3Event, tableId: string, rowId: number, fields: Fields): Promise { return request(event, `rows/table/${tableId}/${rowId}/`, { method: 'PATCH', query: { user_field_names: true }, body: fields }) } export function listFields(event: H3Event, tableId: string): Promise { return request(event, `fields/table/${tableId}/`) }