import type { H3Event } from 'h3' type Table = 'reviews' | 'notes' type Fields = Record interface RowPage { count: number results: Row[] } const PAGE_SIZE = 200 const TIMEOUT_MS = 15_000 function tableId(event: H3Event, table: Table): string { const config = useRuntimeConfig(event) const id = { reviews: config.baserowReviewsTableId, notes: config.baserowNotesTableId }[table] if (!id) { throw createError({ statusCode: 500, statusMessage: `NUXT_BASEROW_${table.toUpperCase()}_TABLE_ID is not set` }) } return id } async function request( event: H3Event, path: string, options: { method?: 'GET' | 'POST', 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' }) } } export async function listRows(event: H3Event, table: Table): Promise { const path = `rows/table/${tableId(event, table)}/` const rows: Row[] = [] for (let page = 1; ; page++) { const { count, results } = await request>(event, path, { 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, table: Table, fields: Fields): Promise { return request(event, `rows/table/${tableId(event, table)}/`, { method: 'POST', query: { user_field_names: true }, body: fields }) } export function listFields(event: H3Event, table: Table): Promise { return request(event, `fields/table/${tableId(event, table)}/`) }