import { pickAuthInput } from './auth.ts' import { airtableRequest } from './client.ts' import { mapRecord } from './models.ts' import { recordsPath } from './setup.ts' import type { AirtableAuthInput, AirtableRecordSummary, DryRunResult, JsonRecord, } from './types.ts' import { optionalBoolean, requireConfirmOrDryRun, requireRecord, requireString, } from './types.ts' export type CreateRecordInput = AirtableAuthInput & { baseId: string tableIdOrName: string fields: JsonRecord typecast?: boolean confirm?: boolean dryRun?: boolean } function createPayload(input: CreateRecordInput): { path: string body: JsonRecord } { const fields = requireRecord(input.fields, 'fields') const body: JsonRecord = { records: [{ fields }], } const typecast = optionalBoolean(input.typecast, 'typecast') if (typecast !== undefined) body.typecast = typecast return { path: recordsPath( requireString(input.baseId, 'baseId'), requireString(input.tableIdOrName, 'tableIdOrName'), ), body, } } /** * Create an Airtable record. Requires `confirm: true`, or use `dryRun: true`. * Needs `data.records:write`. * @example * import createRecord from 'kody:@kody/airtable/create-record' * const preview = await createRecord({ * baseId: 'appXXXXXXXXXXXXXX', * tableIdOrName: 'tblXXXXXXXXXXXXXX', * fields: { Name: 'Follow up on onboarding' }, * dryRun: true, * }) */ export async function createRecord( input: CreateRecordInput, ): Promise< AirtableRecordSummary | DryRunResult<{ method: string; path: string; body: JsonRecord }> > { const payload = createPayload(input) if (requireConfirmOrDryRun(input, 'Creating an Airtable record') === 'dryRun') { return { dryRun: true, wouldCall: { method: 'POST', ...payload } } } const result = await airtableRequest<{ records?: Array }>({ ...input, operation: 'records.write', method: 'POST', path: payload.path, body: payload.body, }) const body = result.data && typeof result.data === 'object' ? result.data : {} const created = Array.isArray(body.records) ? body.records[0] : null if (!created) throw new Error('Airtable create record did not return a record.') return mapRecord(created) } /** * Create an Airtable record. Requires `confirm: true`, or use `dryRun: true`. * @example * import createRecord from 'kody:@kody/airtable/create-record' * const preview = await createRecord({ * baseId: 'appXXXXXXXXXXXXXX', * tableIdOrName: 'Tasks', * fields: { Name: 'Bug' }, * dryRun: true, * }) */ export default async function createRecordEntrypoint( params: Partial & Record = {}, ) { const input = requireRecord(params, 'create-record') return createRecord({ baseId: requireString(input.baseId, 'baseId'), tableIdOrName: requireString(input.tableIdOrName, 'tableIdOrName'), fields: requireRecord(input.fields, 'fields'), typecast: optionalBoolean(input.typecast, 'typecast'), ...pickAuthInput(input), confirm: optionalBoolean(input.confirm, 'confirm'), dryRun: optionalBoolean(input.dryRun, 'dryRun'), }) }