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<string>
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<AirtableRecordSummary> {
const baseId = requireString(input.baseId, 'baseId')
const tableIdOrName = requireString(input.tableIdOrName, 'tableIdOrName')
const recordId = requireString(input.recordId, 'recordId')
const result = await airtableRequest<unknown>({
...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<GetRecordInput> & Record<string, unknown> = {},
) {
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),
})
}