Files
n8n-enterprise-unlocked/packages/nodes-base/nodes/Aws/IAM/methods/listSearch.ts
Stanimira Rikova ab1047ebde feat(AWS IAM Node): Add new AWS IAM Node (#11963)
Co-authored-by: Adina Totorean <adinatotorean99@gmail.com>
2025-05-15 11:59:19 +01:00

160 lines
4.3 KiB
TypeScript

import type {
IDataObject,
IExecuteSingleFunctions,
IHttpRequestOptions,
ILoadOptionsFunctions,
INodeListSearchItems,
INodeListSearchResult,
JsonObject,
} from 'n8n-workflow';
import { NodeApiError } from 'n8n-workflow';
import { CURRENT_VERSION } from '../helpers/constants';
import type {
GetAllGroupsResponseBody,
GetAllUsersResponseBody,
GetGroupResponseBody,
} from '../helpers/types';
import { awsApiRequest } from '../transport';
function formatSearchResults(
items: IDataObject[],
propertyName: string,
filter?: string,
): INodeListSearchItems[] {
return items
.map((item) => ({
name: String(item[propertyName] ?? ''),
value: String(item[propertyName] ?? ''),
}))
.filter(({ name }) => !filter || name.includes(filter))
.sort((a, b) => a.name.localeCompare(b.name));
}
export async function searchUsers(
this: ILoadOptionsFunctions,
filter?: string,
paginationToken?: string,
): Promise<INodeListSearchResult> {
const options: IHttpRequestOptions = {
method: 'POST',
url: '',
body: {
Action: 'ListUsers',
Version: CURRENT_VERSION,
...(paginationToken ? { Marker: paginationToken } : {}),
},
};
const responseData = (await awsApiRequest.call(this, options)) as GetAllUsersResponseBody;
const users = responseData.ListUsersResponse.ListUsersResult.Users || [];
const nextMarker = responseData.ListUsersResponse.ListUsersResult.IsTruncated
? responseData.ListUsersResponse.ListUsersResult.Marker
: undefined;
return {
results: formatSearchResults(users, 'UserName', filter),
paginationToken: nextMarker,
};
}
export async function searchGroups(
this: ILoadOptionsFunctions,
filter?: string,
paginationToken?: string,
): Promise<INodeListSearchResult> {
const options: IHttpRequestOptions = {
method: 'POST',
url: '',
body: {
Action: 'ListGroups',
Version: CURRENT_VERSION,
...(paginationToken ? { Marker: paginationToken } : {}),
},
};
const responseData = (await awsApiRequest.call(this, options)) as GetAllGroupsResponseBody;
const groups = responseData.ListGroupsResponse.ListGroupsResult.Groups || [];
const nextMarker = responseData.ListGroupsResponse.ListGroupsResult.IsTruncated
? responseData.ListGroupsResponse.ListGroupsResult.Marker
: undefined;
return {
results: formatSearchResults(groups, 'GroupName', filter),
paginationToken: nextMarker,
};
}
export async function searchGroupsForUser(
this: ILoadOptionsFunctions | IExecuteSingleFunctions,
filter?: string,
): Promise<INodeListSearchResult> {
const userName = this.getNodeParameter('user', undefined, { extractValue: true });
let allGroups: IDataObject[] = [];
let nextMarkerGroups: string | undefined;
do {
const options: IHttpRequestOptions = {
method: 'POST',
url: '',
body: {
Action: 'ListGroups',
Version: CURRENT_VERSION,
...(nextMarkerGroups ? { Marker: nextMarkerGroups } : {}),
},
};
const groupsData = (await awsApiRequest.call(this, options)) as GetAllGroupsResponseBody;
const groups = groupsData.ListGroupsResponse?.ListGroupsResult?.Groups || [];
nextMarkerGroups = groupsData.ListGroupsResponse?.ListGroupsResult?.IsTruncated
? groupsData.ListGroupsResponse?.ListGroupsResult?.Marker
: undefined;
allGroups = [...allGroups, ...groups];
} while (nextMarkerGroups);
if (allGroups.length === 0) {
return { results: [] };
}
const groupCheckPromises = allGroups.map(async (group) => {
const groupName = group.GroupName as string;
if (!groupName) {
return null;
}
try {
const options: IHttpRequestOptions = {
method: 'POST',
url: '',
body: {
Action: 'GetGroup',
Version: CURRENT_VERSION,
GroupName: groupName,
},
};
const getGroupResponse = (await awsApiRequest.call(this, options)) as GetGroupResponseBody;
const groupResult = getGroupResponse?.GetGroupResponse?.GetGroupResult;
const userExists = groupResult?.Users?.some((user) => user.UserName === userName);
if (userExists) {
return { UserName: userName, GroupName: groupName };
}
} catch (error) {
throw new NodeApiError(this.getNode(), error as JsonObject, {
message: `Failed to get group ${groupName}: ${error?.message ?? 'Unknown error'}`,
});
}
return null;
});
const validUserGroups = (await Promise.all(groupCheckPromises)).filter(Boolean) as IDataObject[];
return {
results: formatSearchResults(validUserGroups, 'GroupName', filter),
};
}