import { pickAuthInput } from './auth.ts' import { airtableRequest } from './client.ts' import { mapRecord } from './models.ts' import { recordsPath } from './setup.ts' import type { AirtableAuthInput, AirtablePageInfo, AirtableRecordSummary, JsonRecord, } from './types.ts' import { clampInt, compactRecord, optionalBoolean, optionalString, optionalStringArray, requireRecord, requireString, } from './types.ts' export type ListRecordsInput = AirtableAuthInput & { baseId: string /** Table id (`tbl…`) or table name. */ tableIdOrName: string fields?: Array filterByFormula?: string view?: string maxRecords?: number pageSize?: number offset?: string returnFieldsByFieldId?: boolean } export type ListRecordsResult = { items: Array pageInfo: AirtablePageInfo } /** * List records in an Airtable table. Needs `data.records:read`. * @example * import listRecords from 'kody:@kody/airtable/list-records' * const { items } = await listRecords({ * baseId: 'appXXXXXXXXXXXXXX', * tableIdOrName: 'tblXXXXXXXXXXXXXX', * pageSize: 25, * }) */ export async function listRecords(input: ListRecordsInput): Promise { const baseId = requireString(input.baseId, 'baseId') const tableIdOrName = requireString(input.tableIdOrName, 'tableIdOrName') const pageSize = clampInt(input.pageSize, 1, 100, 25, 'pageSize') const maxRecords = input.maxRecords === undefined ? undefined : clampInt(input.maxRecords, 1, 1000, 100, 'maxRecords') const query = compactRecord({ pageSize, maxRecords, offset: optionalString(input.offset, 'offset'), view: optionalString(input.view, 'view'), filterByFormula: optionalString(input.filterByFormula, 'filterByFormula'), returnFieldsByFieldId: optionalBoolean( input.returnFieldsByFieldId, 'returnFieldsByFieldId', ), 'fields[]': optionalStringArray(input.fields, 'fields'), }) as JsonRecord const result = await airtableRequest<{ records?: Array }>({ ...input, operation: 'records.read', path: recordsPath(baseId, tableIdOrName), query, }) const body = result.data && typeof result.data === 'object' ? result.data : {} return { items: (Array.isArray(body.records) ? body.records : []).map(mapRecord), pageInfo: result.pageInfo, } } /** * List records in an Airtable table. * @example * import listRecords from 'kody:@kody/airtable/list-records' * const result = await listRecords({ * baseId: 'appXXXXXXXXXXXXXX', * tableIdOrName: 'Tasks', * }) */ export default async function listRecordsEntrypoint( params: Partial & Record = {}, ) { const input = requireRecord(params, 'list-records') return listRecords({ baseId: requireString(input.baseId, 'baseId'), tableIdOrName: requireString(input.tableIdOrName, 'tableIdOrName'), fields: optionalStringArray(input.fields, 'fields'), filterByFormula: optionalString(input.filterByFormula, 'filterByFormula'), view: optionalString(input.view, 'view'), maxRecords: input.maxRecords as number | undefined, pageSize: input.pageSize as number | undefined, offset: optionalString(input.offset, 'offset'), returnFieldsByFieldId: optionalBoolean( input.returnFieldsByFieldId, 'returnFieldsByFieldId', ), ...pickAuthInput(input), }) }