import { pickAuthInput } from './auth.ts' import { airtableRequest } from './client.ts' import { mapComment } from './models.ts' import { recordsPath } from './setup.ts' import type { AirtableAuthInput, AirtableCommentSummary, AirtablePageInfo, } from './types.ts' import { clampInt, compactRecord, optionalString, requireRecord, requireString } from './types.ts' export type ListCommentsInput = AirtableAuthInput & { baseId: string tableIdOrName: string recordId: string pageSize?: number offset?: string } export type ListCommentsResult = { items: Array pageInfo: AirtablePageInfo } /** * List comments on an Airtable record. Needs `data.recordComments:read`. * @example * import listComments from 'kody:@kody/airtable/list-comments' * const { items } = await listComments({ * baseId: 'appXXXXXXXXXXXXXX', * tableIdOrName: 'tblXXXXXXXXXXXXXX', * recordId: 'recXXXXXXXXXXXXXX', * }) */ export async function listComments(input: ListCommentsInput): Promise { const result = await airtableRequest<{ comments?: Array }>({ ...input, operation: 'comments.read', path: recordsPath( requireString(input.baseId, 'baseId'), requireString(input.tableIdOrName, 'tableIdOrName'), requireString(input.recordId, 'recordId'), 'comments', ), query: compactRecord({ pageSize: clampInt(input.pageSize, 1, 100, 25, 'pageSize'), offset: optionalString(input.offset, 'offset'), }), }) const body = result.data && typeof result.data === 'object' ? result.data : {} return { items: (Array.isArray(body.comments) ? body.comments : []).map(mapComment), pageInfo: result.pageInfo, } } /** * List comments on an Airtable record. * @example * import listComments from 'kody:@kody/airtable/list-comments' * const result = await listComments({ * baseId: 'appXXXXXXXXXXXXXX', * tableIdOrName: 'Tasks', * recordId: 'recXXXXXXXXXXXXXX', * }) */ export default async function listCommentsEntrypoint( params: Partial & Record = {}, ) { const input = requireRecord(params, 'list-comments') return listComments({ baseId: requireString(input.baseId, 'baseId'), tableIdOrName: requireString(input.tableIdOrName, 'tableIdOrName'), recordId: requireString(input.recordId, 'recordId'), pageSize: input.pageSize as number | undefined, offset: optionalString(input.offset, 'offset'), ...pickAuthInput(input), }) }