initial commit
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
import type { H3Event } from 'h3'
|
||||
|
||||
type Table = 'reviews' | 'notes'
|
||||
type Fields = Record<string, unknown>
|
||||
|
||||
interface RowPage<Row> {
|
||||
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<T>(
|
||||
event: H3Event,
|
||||
path: string,
|
||||
options: { method?: 'GET' | 'POST', 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'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export async function listRows<Row>(event: H3Event, table: Table): Promise<Row[]> {
|
||||
const path = `rows/table/${tableId(event, table)}/`
|
||||
const rows: Row[] = []
|
||||
for (let page = 1; ; page++) {
|
||||
const { count, results } = await request<RowPage<Row>>(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<Row>(event: H3Event, table: Table, fields: Fields): Promise<Row> {
|
||||
return request<Row>(event, `rows/table/${tableId(event, table)}/`, {
|
||||
method: 'POST',
|
||||
query: { user_field_names: true },
|
||||
body: fields
|
||||
})
|
||||
}
|
||||
|
||||
export function listFields<Field>(event: H3Event, table: Table): Promise<Field[]> {
|
||||
return request<Field[]>(event, `fields/table/${tableId(event, table)}/`)
|
||||
}
|
||||
Reference in New Issue
Block a user