81 lines
2.6 KiB
TypeScript
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}/`)
|
|
}
|