import { nextCursor, notionRequest, resolveDataSourceId, type JsonRecord } from './request.ts' import { boundedPageSize, inputRecord, optionalArray, optionalRecord, optionalString } from './validation.ts' type QueryResponse = { results?: unknown[] has_more?: boolean next_cursor?: string | null [key: string]: unknown } /** * Query a Notion database's rows with optional filter and sorts. * * Pass `dataSourceId` directly, or `databaseId` to auto-resolve the database's * single data source (errors if the database has multiple data sources). */ export default async function queryDatabase(params: Record) { const input = inputRecord(params) const account = optionalString(input, 'account') const integration = optionalString(input, 'integration') const explicitDataSourceId = optionalString(input, 'dataSourceId') const databaseId = optionalString(input, 'databaseId') if (!explicitDataSourceId && !databaseId) { throw new Error('dataSourceId or databaseId is required.') } const dataSourceId = explicitDataSourceId ?? (await resolveDataSourceId(databaseId as string, { account, integration })) const body: JsonRecord = { filter: optionalRecord(input, 'filter'), sorts: optionalArray(input, 'sorts'), page_size: boundedPageSize(input.pageSize), start_cursor: optionalString(input, 'startCursor'), } const result = await notionRequest( '/data_sources/' + encodeURIComponent(dataSourceId) + '/query', { method: 'POST', body, account, integration }, ) return { dataSourceId, results: result.results ?? [], hasMore: result.has_more === true, nextCursor: nextCursor(result), } }