import { pickAuthInput } from './auth.ts' import { airtableRequest } from './client.ts' import { mapRecord } from './models.ts' import { recordsPath } from './setup.ts' import type { AirtableAuthInput, AirtableRecordSummary } from './types.ts' import { optionalBoolean, optionalStringArray, requireRecord, requireString, } from './types.ts' export type GetRecordInput = AirtableAuthInput & { baseId: string tableIdOrName: string recordId: string fields?: Array returnFieldsByFieldId?: boolean } /** * Get one Airtable record. Needs `data.records:read`. * @example * import getRecord from 'kody:@kody/airtable/get-record' * const record = await getRecord({ * baseId: 'appXXXXXXXXXXXXXX', * tableIdOrName: 'tblXXXXXXXXXXXXXX', * recordId: 'recXXXXXXXXXXXXXX', * }) */ export async function getRecord(input: GetRecordInput): Promise { const baseId = requireString(input.baseId, 'baseId') const tableIdOrName = requireString(input.tableIdOrName, 'tableIdOrName') const recordId = requireString(input.recordId, 'recordId') const result = await airtableRequest({ ...input, operation: 'records.read', path: recordsPath(baseId, tableIdOrName, recordId), query: { 'fields[]': optionalStringArray(input.fields, 'fields'), returnFieldsByFieldId: optionalBoolean( input.returnFieldsByFieldId, 'returnFieldsByFieldId', ), }, }) if (!result.data || typeof result.data !== 'object') { throw new Error(`Airtable record not found: ${recordId}`) } return mapRecord(result.data) } /** * Get one Airtable record. * @example * import getRecord from 'kody:@kody/airtable/get-record' * const record = await getRecord({ * baseId: 'appXXXXXXXXXXXXXX', * tableIdOrName: 'Tasks', * recordId: 'recXXXXXXXXXXXXXX', * }) */ export default async function getRecordEntrypoint( params: Partial & Record = {}, ) { const input = requireRecord(params, 'get-record') return getRecord({ baseId: requireString(input.baseId, 'baseId'), tableIdOrName: requireString(input.tableIdOrName, 'tableIdOrName'), recordId: requireString(input.recordId, 'recordId'), fields: optionalStringArray(input.fields, 'fields'), returnFieldsByFieldId: optionalBoolean( input.returnFieldsByFieldId, 'returnFieldsByFieldId', ), ...pickAuthInput(input), }) }