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<AirtableCommentSummary>
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<ListCommentsResult> {
const result = await airtableRequest<{ comments?: Array<unknown> }>({
...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<ListCommentsInput> & Record<string, unknown> = {},
) {
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),
})
}