diff --git a/packages/nodes-base/nodes/Notion/BlockDescription.ts b/packages/nodes-base/nodes/Notion/BlockDescription.ts index 38174dd9ee..00e0241921 100644 --- a/packages/nodes-base/nodes/Notion/BlockDescription.ts +++ b/packages/nodes-base/nodes/Notion/BlockDescription.ts @@ -187,4 +187,16 @@ export const blockFields: INodeProperties[] = [ default: 50, description: 'Max number of results to return', }, + { + displayName: 'Also Fetch Nested Blocks', + name: 'fetchNestedBlocks', + type: 'boolean', + displayOptions: { + show: { + resource: ['block'], + operation: ['getAll'], + }, + }, + default: false, + }, ]; diff --git a/packages/nodes-base/nodes/Notion/GenericFunctions.ts b/packages/nodes-base/nodes/Notion/GenericFunctions.ts index b459c8bc13..9de7d1842d 100644 --- a/packages/nodes-base/nodes/Notion/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Notion/GenericFunctions.ts @@ -81,7 +81,6 @@ export async function notionApiRequestAllItems( propertyName: string, method: string, endpoint: string, - body: any = {}, query: IDataObject = {}, ): Promise { @@ -109,6 +108,48 @@ export async function notionApiRequestAllItems( return returnData; } +export async function notionApiRequestGetBlockChildrens( + this: IExecuteFunctions | ILoadOptionsFunctions | IPollFunctions, + blocks: IDataObject[], + responseData: IDataObject[] = [], + limit?: number, +) { + if (blocks.length === 0) return responseData; + + for (const block of blocks) { + responseData.push(block); + + if (block.type === 'child_page') continue; + + if (block.has_children) { + let childrens = await notionApiRequestAllItems.call( + this, + 'results', + 'GET', + `/blocks/${block.id}/children`, + ); + + childrens = (childrens || []).map((entry: IDataObject) => ({ + object: entry.object, + parent_id: block.id, + ...entry, + })); + + await notionApiRequestGetBlockChildrens.call(this, childrens, responseData); + } + + if (limit && responseData.length === limit) { + return responseData; + } + + if (limit && responseData.length > limit) { + return responseData.slice(0, limit); + } + } + + return responseData; +} + export function getBlockTypes() { return [ { diff --git a/packages/nodes-base/nodes/Notion/v2/NotionV2.node.ts b/packages/nodes-base/nodes/Notion/v2/NotionV2.node.ts index 00987c7f86..9b5067c6a1 100644 --- a/packages/nodes-base/nodes/Notion/v2/NotionV2.node.ts +++ b/packages/nodes-base/nodes/Notion/v2/NotionV2.node.ts @@ -24,6 +24,7 @@ import { mapSorting, notionApiRequest, notionApiRequestAllItems, + notionApiRequestGetBlockChildrens, simplifyObjects, validateJSON, } from '../GenericFunctions'; @@ -273,6 +274,7 @@ export class NotionV2 implements INodeType { this.getNodeParameter('blockId', i, '', { extractValue: true }) as string, ); const returnAll = this.getNodeParameter('returnAll', i); + const fetchNestedBlocks = this.getNodeParameter('fetchNestedBlocks', i) as boolean; if (returnAll) { responseData = await notionApiRequestAllItems.call( @@ -282,8 +284,13 @@ export class NotionV2 implements INodeType { `/blocks/${blockId}/children`, {}, ); + + if (fetchNestedBlocks) { + responseData = await notionApiRequestGetBlockChildrens.call(this, responseData); + } } else { - qs.page_size = this.getNodeParameter('limit', i); + const limit = this.getNodeParameter('limit', i); + qs.page_size = limit; responseData = await notionApiRequest.call( this, 'GET', @@ -291,7 +298,13 @@ export class NotionV2 implements INodeType { {}, qs, ); - responseData = responseData.results; + const results = responseData.results; + + if (fetchNestedBlocks) { + responseData = await notionApiRequestGetBlockChildrens.call(this, results, [], limit); + } else { + responseData = results; + } } responseData = responseData.map((_data: IDataObject) => ({