diff --git a/src/lists/extensions/Namespace.ts b/src/lists/extensions/Namespace.ts index 38aa87249..5739dbedb 100644 --- a/src/lists/extensions/Namespace.ts +++ b/src/lists/extensions/Namespace.ts @@ -8,10 +8,9 @@ import { } from '../../services/uma2'; import { lookupProductEnvironmentServicesBySlug, - lookupUserByUsername, + lookupUsersByUsernames, } from '../../services/keystone'; import { - getSuitableOwnerToken, getEnvironmentContext, getResourceSets, getNamespaceResourceSets, @@ -28,7 +27,6 @@ import { Logger } from '../../logger'; const logger = Logger('ext.Namespace'); import { strict as assert } from 'assert'; -import { User } from '@/services/keystone/types'; const typeUserContact = ` type UserContact { @@ -219,22 +217,11 @@ module.exports = { }); permissions = updatedPermissions; } - const listOfUsers: Array = []; - for (const perm of permissions) { - if (perm.granted) { - const user = await lookupUserByUsername( - noauthContext, - perm.requesterName - ); - listOfUsers.push({ - id: user[0].id, - name: user[0].name, - username: user[0].username, - email: user[0].email, - }); - } - } - return listOfUsers; + const usernameList = permissions + .filter((p) => p.granted) + .map((p) => p.requesterName); + + return await lookupUsersByUsernames(noauthContext, usernameList); }, access: EnforcementPoint, }, diff --git a/src/nextapp/components/controls/rate-limiting.tsx b/src/nextapp/components/controls/rate-limiting.tsx index 79913bff8..8a4d978a6 100644 --- a/src/nextapp/components/controls/rate-limiting.tsx +++ b/src/nextapp/components/controls/rate-limiting.tsx @@ -124,8 +124,8 @@ const RateLimiting: React.FC = ({ title="Rate Limiting" > diff --git a/src/nextapp/pages/manager/consumers/[id].tsx b/src/nextapp/pages/manager/consumers/[id].tsx index a5f501dce..c11e75c44 100644 --- a/src/nextapp/pages/manager/consumers/[id].tsx +++ b/src/nextapp/pages/manager/consumers/[id].tsx @@ -171,10 +171,12 @@ const query = gql` service { id name + extForeignKey } route { id name + extForeignKey } } tags diff --git a/src/services/keystone/index.ts b/src/services/keystone/index.ts index eec6edba3..2cef66072 100644 --- a/src/services/keystone/index.ts +++ b/src/services/keystone/index.ts @@ -44,6 +44,7 @@ export { updateUserLegalAccept, LegalAgreed, lookupUserByUsername, + lookupUsersByUsernames, lookupUser, lookupUsersByNamespace, } from './user'; diff --git a/src/services/keystone/user.ts b/src/services/keystone/user.ts index 8173c349c..f49d53b52 100644 --- a/src/services/keystone/user.ts +++ b/src/services/keystone/user.ts @@ -87,6 +87,25 @@ export async function lookupUserByUsername( return result.data.allUsers; } +export async function lookupUsersByUsernames( + context: any, + usernameList: string[] +): Promise<[User]> { + const result = await context.executeGraphQL({ + query: `query GetUsersWithUsernames($usernames: [String!]!) { + allUsers(where: {username_in: $usernames}) { + id + name + username + email + } + }`, + variables: { usernames: usernameList }, + }); + logger.debug('Query [lookupUsersByUsernames] result %j', result); + return result.data.allUsers; +} + export async function lookupUser(context: any, id: string): Promise<[User]> { const result = await context.executeGraphQL({ query: `query FetchUser($id: ID!) { diff --git a/src/test/mock-server/server.js b/src/test/mock-server/server.js index 3d8612ab5..f4d6de3ae 100644 --- a/src/test/mock-server/server.js +++ b/src/test/mock-server/server.js @@ -316,6 +316,7 @@ const server = mockServer(schemaWithMocks, { name: casual.route, namespace: casual.namespace, kongRouteId: casual.uuid, + extForeignKey: casual.uuid, methods: JSON.stringify([ casual.random_element(['GET', 'POST', 'PUT', 'DELETE']), ]),