import { pickAuthInput } from './auth.ts' import { airtableRequest } from './client.ts' import { recordsPath } from './setup.ts' import type { AirtableAuthInput, DryRunResult, JsonRecord } from './types.ts' import { optionalBoolean, requireConfirmOrDryRun, requireRecord, requireString } from './types.ts' export type DeleteRecordInput = AirtableAuthInput & { baseId: string tableIdOrName: string recordId: string confirm?: boolean dryRun?: boolean } export type DeleteRecordResult = { id: string deleted: boolean } function deleteCall(input: DeleteRecordInput): { path: string query: JsonRecord } { return { path: recordsPath( requireString(input.baseId, 'baseId'), requireString(input.tableIdOrName, 'tableIdOrName'), ), query: { 'records[]': requireString(input.recordId, 'recordId') }, } } /** * Delete an Airtable record. Requires `confirm: true`, or use `dryRun: true`. * Needs `data.records:write`. * @example * import deleteRecord from 'kody:@kody/airtable/delete-record' * const preview = await deleteRecord({ * baseId: 'appXXXXXXXXXXXXXX', * tableIdOrName: 'tblXXXXXXXXXXXXXX', * recordId: 'recXXXXXXXXXXXXXX', * dryRun: true, * }) */ export async function deleteRecord( input: DeleteRecordInput, ): Promise< DeleteRecordResult | DryRunResult<{ method: string; path: string; query: JsonRecord }> > { const payload = deleteCall(input) if (requireConfirmOrDryRun(input, 'Deleting an Airtable record') === 'dryRun') { return { dryRun: true, wouldCall: { method: 'DELETE', ...payload } } } const result = await airtableRequest<{ records?: Array<{ id?: string; deleted?: boolean }> }>( { ...input, operation: 'records.write', method: 'DELETE', path: payload.path, query: payload.query, }, ) const body = result.data && typeof result.data === 'object' ? result.data : {} const deleted = Array.isArray(body.records) ? body.records[0] : null return { id: deleted?.id || requireString(input.recordId, 'recordId'), deleted: deleted?.deleted === true, } } /** * Delete an Airtable record. Requires `confirm: true`, or use `dryRun: true`. * @example * import deleteRecord from 'kody:@kody/airtable/delete-record' * const preview = await deleteRecord({ * baseId: 'appXXXXXXXXXXXXXX', * tableIdOrName: 'Tasks', * recordId: 'recXXXXXXXXXXXXXX', * dryRun: true, * }) */ export default async function deleteRecordEntrypoint( params: Partial & Record = {}, ) { const input = requireRecord(params, 'delete-record') return deleteRecord({ baseId: requireString(input.baseId, 'baseId'), tableIdOrName: requireString(input.tableIdOrName, 'tableIdOrName'), recordId: requireString(input.recordId, 'recordId'), ...pickAuthInput(input), confirm: optionalBoolean(input.confirm, 'confirm'), dryRun: optionalBoolean(input.dryRun, 'dryRun'), }) }