diff --git a/.changeset/cuddly-clocks-dance.md b/.changeset/cuddly-clocks-dance.md new file mode 100644 index 0000000000..9d33535a62 --- /dev/null +++ b/.changeset/cuddly-clocks-dance.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-msgraph': patch +--- + +Added $select attribute to user query diff --git a/plugins/catalog-backend-module-msgraph/README.md b/plugins/catalog-backend-module-msgraph/README.md index fe2e568b5a..9bf979f6a6 100644 --- a/plugins/catalog-backend-module-msgraph/README.md +++ b/plugins/catalog-backend-module-msgraph/README.md @@ -54,6 +54,8 @@ catalog: # and for the syntax https://docs.microsoft.com/en-us/graph/query-parameters#filter-parameter # This and userGroupMemberFilter are mutually exclusive, only one can be specified filter: accountEnabled eq true and userType eq 'member' + # See https://docs.microsoft.com/en-us/graph/api/resources/schemaextension?view=graph-rest-1.0 + select: ['id', 'displayName', 'description'] # Optional configuration block userGroupMember: # Optional filter for users, use group membership to get users. diff --git a/plugins/catalog-backend-module-msgraph/api-report.md b/plugins/catalog-backend-module-msgraph/api-report.md index 8f773e1b90..8b77ddf7c3 100644 --- a/plugins/catalog-backend-module-msgraph/api-report.md +++ b/plugins/catalog-backend-module-msgraph/api-report.md @@ -193,6 +193,7 @@ export type MicrosoftGraphProviderConfig = { clientId?: string; clientSecret?: string; userFilter?: string; + userSelect?: string[]; userExpand?: string; userGroupMemberFilter?: string; userGroupMemberSearch?: string; @@ -232,6 +233,7 @@ export function readMicrosoftGraphOrg( options: { userExpand?: string; userFilter?: string; + userSelect?: string[]; userGroupMemberSearch?: string; userGroupMemberFilter?: string; groupExpand?: string; diff --git a/plugins/catalog-backend-module-msgraph/config.d.ts b/plugins/catalog-backend-module-msgraph/config.d.ts index 8748df5974..df41b581f9 100644 --- a/plugins/catalog-backend-module-msgraph/config.d.ts +++ b/plugins/catalog-backend-module-msgraph/config.d.ts @@ -74,6 +74,12 @@ export interface Config { * E.g. "securityEnabled eq false and mailEnabled eq true" */ groupFilter?: string; + /** + * The fields to be fetched on query. + * + * E.g. ["id", "displayName", "description"] + */ + userSelect?: string[]; /** * The search criteria to apply to extract users by groups memberships. * diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/config.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/config.ts index f7675acf42..2429b67c89 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/config.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/config.ts @@ -62,6 +62,12 @@ export type MicrosoftGraphProviderConfig = { * E.g. "accountEnabled eq true and userType eq 'member'" */ userFilter?: string; + /** + * The fields to be fetched on query. + * + * E.g. ["id", "displayName", "description"] + */ + userSelect?: string[]; /** * The "expand" argument to apply to users. * @@ -144,6 +150,7 @@ export function readMicrosoftGraphConfig( const userExpand = providerConfig.getOptionalString('userExpand'); const userFilter = providerConfig.getOptionalString('userFilter'); + const userSelect = providerConfig.getOptionalStringArray('userSelect'); const userGroupMemberFilter = providerConfig.getOptionalString( 'userGroupMemberFilter', ); @@ -196,6 +203,7 @@ export function readMicrosoftGraphConfig( clientSecret, userExpand, userFilter, + userSelect, userGroupMemberFilter, userGroupMemberSearch, groupExpand, diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.test.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.test.ts index 3f43807809..a537526a9e 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.test.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.test.ts @@ -1002,6 +1002,12 @@ describe('read microsoft graph', () => { }; } + async function* getExampleUsersEmail() { + yield { + mail: 'user.name@example.com', + }; + } + async function getExampleUserProfile(userId: string) { return { id: userId, @@ -1109,6 +1115,34 @@ describe('read microsoft graph', () => { ); }); + it('should read users with userSelect', async () => { + client.getOrganization.mockResolvedValue({ + id: 'tenantid', + displayName: 'Organization Name', + }); + + client.getUsers.mockImplementation(getExampleUsersEmail); + client.getUserPhotoWithSizeLimit.mockResolvedValue( + 'data:image/jpeg;base64,...', + ); + + client.getGroups.mockImplementation(getExampleGroups); + client.getGroupMembers.mockImplementation(getExampleGroupMembers); + + await readMicrosoftGraphOrg(client, 'tenantid', { + logger: getVoidLogger(), + userSelect: ['mail'], + }); + + expect(client.getUsers).toHaveBeenCalledTimes(1); + expect(client.getUsers).toHaveBeenCalledWith( + { + select: ['mail'], + }, + undefined, + ); + }); + it('should read users using userExpand and userGroupMemberFilter', async () => { client.getOrganization.mockResolvedValue({ id: 'tenantid', diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts index ecf74b34d9..8e1d9a3776 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts @@ -89,6 +89,7 @@ export async function readMicrosoftGraphUsers( queryMode?: 'basic' | 'advanced'; userFilter?: string; userExpand?: string; + userSelect?: string[]; transformer?: UserTransformer; logger: Logger; }, @@ -105,6 +106,7 @@ export async function readMicrosoftGraphUsers( { filter: options.userFilter, expand: options.userExpand, + select: options.userSelect, }, options.queryMode, )) { @@ -145,6 +147,7 @@ export async function readMicrosoftGraphUsersInGroups( options: { queryMode?: 'basic' | 'advanced'; userExpand?: string; + userSelect?: string[]; userGroupMemberSearch?: string; userGroupMemberFilter?: string; groupExpand?: string; @@ -534,6 +537,7 @@ export async function readMicrosoftGraphOrg( options: { userExpand?: string; userFilter?: string; + userSelect?: string[]; userGroupMemberSearch?: string; userGroupMemberFilter?: string; groupExpand?: string; @@ -565,6 +569,7 @@ export async function readMicrosoftGraphOrg( const { users: usersWithFilter } = await readMicrosoftGraphUsers(client, { queryMode: options.queryMode, userFilter: options.userFilter, + userSelect: options.userSelect, userExpand: options.userExpand, transformer: options.userTransformer, logger: options.logger,