Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/airtable

src/get-record.ts

78 lines · 2.3 KB · TypeScript
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),
	})
}