From aef9f8355f4c0edccc980f1e2edee528061d0bef Mon Sep 17 00:00:00 2001 From: Stamsy Date: Wed, 11 Dec 2024 15:44:08 +0200 Subject: [PATCH] update the pagination logic and eliminate any unused functions --- .../nodes/Aws/IAM/GenericFunctions.ts | 52 +++++++------------ .../Aws/IAM/descriptions/GroupDescription.ts | 38 +++++++------- .../Aws/IAM/descriptions/UserDescription.ts | 44 +++++----------- 3 files changed, 52 insertions(+), 82 deletions(-) diff --git a/packages/nodes-base/nodes/Aws/IAM/GenericFunctions.ts b/packages/nodes-base/nodes/Aws/IAM/GenericFunctions.ts index 5ed023b869416..4a68972aa0b50 100644 --- a/packages/nodes-base/nodes/Aws/IAM/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Aws/IAM/GenericFunctions.ts @@ -15,14 +15,6 @@ import type { import { ApplicationError, NodeApiError, NodeOperationError } from 'n8n-workflow'; /* Function which helps while developing the node */ -// ToDo: Remove before completing the pull request -export async function presendTest( - this: IExecuteSingleFunctions, - requestOptions: IHttpRequestOptions, -): Promise { - console.log('requestOptions', requestOptions); - return requestOptions; -} /* * Helper function which stringifies the body before sending the request. @@ -145,13 +137,16 @@ export async function processGroupsResponse( items: INodeExecutionData[], response: IN8nHttpFullResponse, ): Promise { - const responseBody = response.body as { Groups: IDataObject[] }; + const responseBody = response.body as { + ListGroupsResponse: { ListGroupsResult: { Groups: IDataObject[] } }; + }; + const data = responseBody.ListGroupsResponse.ListGroupsResult.Groups; - if (!responseBody || !Array.isArray(responseBody.Groups)) { + if (!responseBody || !Array.isArray(data)) { throw new ApplicationError('Unexpected response format: No groups found.'); } - const executionData: INodeExecutionData[] = responseBody.Groups.map((group) => ({ + const executionData: INodeExecutionData[] = data.map((group) => ({ json: group, })); @@ -179,8 +174,6 @@ export async function processUsersResponse( return executionData; } -const possibleRootProperties = ['Users', 'Groups']; -// ToDo: Test if pagination works export async function handlePagination( this: IExecutePaginationFunctions, resultOptions: DeclarativeRestApiSettings.ResultOptions, @@ -189,7 +182,6 @@ export async function handlePagination( let nextPageToken: string | undefined; const returnAll = this.getNodeParameter('returnAll') as boolean; let limit = 60; - console.log('Entered pagination!!!!'); // Update limit if 'returnAll' is not selected if (!returnAll) { limit = this.getNodeParameter('limit') as number; @@ -208,39 +200,35 @@ export async function handlePagination( ...body, PaginationToken: nextPageToken, } as IDataObject; - console.log('Updated request body with PaginationToken:', resultOptions.options.body); } - // Make the request - console.log('Sending request with options:', resultOptions); const responseData = await this.makeRoutingRequest(resultOptions); // Process response data - for (const page of responseData) { - console.log('Processing page:', page.json); - - // Iterate over possible root properties (e.g., "Users") - for (const prop of possibleRootProperties) { - if (page.json[prop]) { - const currentData = page.json[prop] as IDataObject[]; - console.log(`Extracted data from property "${prop}":`, currentData); - aggregatedResult.push(...currentData); + if (responseData && Array.isArray(responseData)) { + for (const page of responseData) { + aggregatedResult.push(page.json); + + // Check if the limit has been reached + if (!returnAll && aggregatedResult.length >= limit) { + return aggregatedResult.slice(0, limit).map((item) => ({ json: item })); } + + // Update the nextPageToken for the next request + nextPageToken = page.json.PaginationToken as string | undefined; } + } else if (responseData && typeof responseData === 'object') { + aggregatedResult.push(responseData as IDataObject); + + nextPageToken = (responseData as IDataObject).PaginationToken as string | undefined; // Check if the limit has been reached if (!returnAll && aggregatedResult.length >= limit) { - console.log('Limit reached. Returning results.'); return aggregatedResult.slice(0, limit).map((item) => ({ json: item })); } - - // Update the nextPageToken for the next request - nextPageToken = page.json.PaginationToken as string | undefined; - console.log('Next Page Token:', nextPageToken); } } while (nextPageToken); - console.log('Final Aggregated Results:', aggregatedResult); return aggregatedResult.map((item) => ({ json: item })); } diff --git a/packages/nodes-base/nodes/Aws/IAM/descriptions/GroupDescription.ts b/packages/nodes-base/nodes/Aws/IAM/descriptions/GroupDescription.ts index 7dc8953963109..eb6891c16c3f7 100644 --- a/packages/nodes-base/nodes/Aws/IAM/descriptions/GroupDescription.ts +++ b/packages/nodes-base/nodes/Aws/IAM/descriptions/GroupDescription.ts @@ -1,7 +1,11 @@ -import type { IExecuteSingleFunctions, IHttpRequestOptions, INodeProperties } from 'n8n-workflow'; -import { NodeOperationError } from 'n8n-workflow'; +import type { INodeProperties } from 'n8n-workflow'; -import { handleErrorPostReceive, presendTest, validatePath } from '../GenericFunctions'; +import { + handleErrorPostReceive, + handlePagination, + processGroupsResponse, + validatePath, +} from '../GenericFunctions'; export const groupOperations: INodeProperties[] = [ { @@ -37,9 +41,6 @@ export const groupOperations: INodeProperties[] = [ value: 'delete', description: 'Delete an existing group', routing: { - send: { - preSend: [presendTest], // ToDo: Remove this line before completing the pull request - }, request: { method: 'POST', url: '=?Action=DeleteGroup&Version=2010-05-08&GroupName={{$parameter["GroupName"]}}', @@ -64,9 +65,6 @@ export const groupOperations: INodeProperties[] = [ value: 'get', description: 'Retrieve details of an existing group', routing: { - // send: { - // preSend: [presendTest], // ToDo: Remove this line before completing the pull request - // }, request: { method: 'POST', url: '=?Action=GetGroup&Version=2010-05-08&GroupName={{$parameter["GroupName"]}}', @@ -83,13 +81,23 @@ export const groupOperations: INodeProperties[] = [ value: 'getAll', description: 'Retrieve a list of groups', routing: { + send: { + paginate: true, + }, + operations: { + pagination: handlePagination, + }, request: { method: 'POST', url: '=/?Action=ListGroups&Version=2010-05-08', + qs: { + pageSize: + '={{ $parameter["limit"] ? ($parameter["limit"] < 60 ? $parameter["limit"] : 60) : 60 }}', + }, ignoreHttpStatusErrors: true, }, output: { - postReceive: [handleErrorPostReceive], + postReceive: [handleErrorPostReceive, processGroupsResponse], }, }, action: 'Get many groups', @@ -105,15 +113,7 @@ export const groupOperations: INodeProperties[] = [ ignoreHttpStatusErrors: true, }, output: { - postReceive: [ - handleErrorPostReceive, - // { - // type: 'set', - // properties: { - // value: '={{ { "updated": true } }}', - // }, - // }, - ], + postReceive: [handleErrorPostReceive], }, }, action: 'Update group', diff --git a/packages/nodes-base/nodes/Aws/IAM/descriptions/UserDescription.ts b/packages/nodes-base/nodes/Aws/IAM/descriptions/UserDescription.ts index 9c9c2cf81384b..b72ee5d0c3077 100644 --- a/packages/nodes-base/nodes/Aws/IAM/descriptions/UserDescription.ts +++ b/packages/nodes-base/nodes/Aws/IAM/descriptions/UserDescription.ts @@ -2,8 +2,8 @@ import type { INodeProperties } from 'n8n-workflow'; import { handleErrorPostReceive, + handlePagination, presendFields, - presendTest, processUsersResponse, validatePath, } from '../GenericFunctions'; @@ -28,10 +28,7 @@ export const userOperations: INodeProperties[] = [ action: 'Add user to group', routing: { send: { - preSend: [ - presendTest, // ToDo: Remove this line before completing the pull request - presendFields, - ], + preSend: [presendFields], }, request: { method: 'POST', @@ -50,10 +47,7 @@ export const userOperations: INodeProperties[] = [ action: 'Create user', routing: { send: { - preSend: [ - presendTest, // ToDo: Remove this line before completing the pull request - presendFields, - ], + preSend: [presendFields], }, request: { method: 'POST', @@ -72,10 +66,7 @@ export const userOperations: INodeProperties[] = [ action: 'Delete user', routing: { send: { - preSend: [ - presendTest, // ToDo: Remove this line before completing the pull request - presendFields, - ], + preSend: [presendFields], }, request: { method: 'POST', @@ -94,10 +85,7 @@ export const userOperations: INodeProperties[] = [ action: 'Get user', routing: { send: { - preSend: [ - presendTest, // ToDo: Remove this line before completing the pull request - presendFields, - ], + preSend: [presendFields], }, request: { method: 'POST', @@ -114,16 +102,17 @@ export const userOperations: INodeProperties[] = [ value: 'getAll', description: 'Retrieve a list of users', routing: { - // send: { - // paginate: true, - // preSend: [presendFields] - // }, send: { - preSend: [presendTest], // ToDo: Remove this line before completing the pull request + paginate: true, }, + operations: { pagination: handlePagination }, request: { method: 'POST', url: '/?Action=ListUsers&Version=2010-05-08', + qs: { + pageSize: + '={{ $parameter["limit"] ? ($parameter["limit"] < 60 ? $parameter["limit"] : 60) : 60 }}', + }, ignoreHttpStatusErrors: true, }, output: { @@ -139,10 +128,7 @@ export const userOperations: INodeProperties[] = [ action: 'Remove user from group', routing: { send: { - preSend: [ - presendTest, // ToDo: Remove this line before completing the pull request - presendFields, - ], + preSend: [presendFields], }, request: { method: 'POST', @@ -161,10 +147,7 @@ export const userOperations: INodeProperties[] = [ action: 'Update user', routing: { send: { - preSend: [ - presendTest, // ToDo: Remove this line before completing the pull request - presendFields, - ], + preSend: [presendFields], }, request: { method: 'POST', @@ -353,7 +336,6 @@ const getAllFields: INodeProperties[] = [ property: 'Limit', type: 'query', value: '={{ $value }}', - preSend: [presendTest], }, }, type: 'number',