diff --git a/.changeset/flat-rules-rush.md b/.changeset/flat-rules-rush.md index f9f5354595..f57e800d91 100644 --- a/.changeset/flat-rules-rush.md +++ b/.changeset/flat-rules-rush.md @@ -2,6 +2,13 @@ '@backstage/plugin-catalog-backend-module-gitlab': patch --- -fix: use publicEmail in GitLab client +fix: use REST API to get root group memberships for GitLab SaaS users listing -client was using commitEmail that is visible only for self-managed GitLab admins. publicEmail is visible, but only if the user explicitly enable the corresponding setting on GitLab. +This API is the only one that shows `email` field for enterprise users and +allows to filter out bot users not using a license using the `is_using_seat` +field. + +ref: + +https://docs.gitlab.com/ee/user/enterprise_user/#get-users-email-addresses-through-the-api +https://docs.gitlab.com/ee/api/members.html#limitations diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index 0b69ded359..5fb7e59dda 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -91,6 +91,22 @@ export class GitLabClient { }); } + async listSaaSUsers( + groupPath: string, + options?: CommonListOptions, + ): Promise> { + return this.pagedRequest( + `/groups/${encodeURIComponent(groupPath)}/members`, + { + ...options, + show_seat_info: true, + }, + ).then(resp => { + resp.items = resp.items.filter(user => user.is_using_seat); + return resp; + }); + } + async listGroups( options?: CommonListOptions, ): Promise> { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts index 0ef0e2b23c..b98b8ab7c3 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -190,12 +190,14 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { }); } else { groups = (await client.listDescendantGroups(this.config.group)).items; - users = ( - await client.getGroupMembers(this.config.group.split('/')[0], [ - 'DIRECT', - 'DESCENDANTS', - ]) - ).items; + const rootGroup = this.config.group.split('/')[0]; + users = paginated( + options => client.listSaaSUsers(rootGroup, options), + { + page: 1, + per_page: 100, + }, + ); } const idMappedUser: { [userId: number]: GitLabUser } = {};