From 6c6a41c4d168d9e82e01fe99f29e86540995877c Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Tue, 3 Mar 2026 11:48:40 +0100 Subject: [PATCH] fix(scaffolder-backend-module-gitlab): update GroupMembers.add for gitbeaker v43 (#33091) @gitbeaker/core v43 changed ResourceMembers.add signature to accept accessLevel as the second arg and userId in an options object. Signed-off-by: benjdlambert --- .../package.json | 1 + .../gitlabGroupAccessAction.examples.test.ts | 18 ++- .../actions/gitlabGroupAccessAction.test.ts | 112 +++++++----------- .../src/actions/gitlabGroupAccessAction.ts | 18 ++- yarn.lock | 1 + 5 files changed, 65 insertions(+), 85 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index 558de71045..ac0cf1b9ad 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -50,6 +50,7 @@ "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", + "@gitbeaker/core": "^43.8.0", "@gitbeaker/requester-utils": "^43.8.0", "@gitbeaker/rest": "^43.8.0", "luxon": "^3.0.0", diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.examples.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.examples.test.ts index 3f15816e68..f49986a344 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.examples.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.examples.test.ts @@ -73,16 +73,12 @@ describe('gitlab:group:access examples', () => { }); expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledTimes(2); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 30, - ); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 789, - 30, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 456, + }); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 789, + }); expect(mockContext.output).toHaveBeenCalledWith('userIds', [456, 789]); expect(mockContext.output).toHaveBeenCalledWith('path', 123); @@ -99,8 +95,8 @@ describe('gitlab:group:access examples', () => { expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( 'group1', - 456, 30, + { userId: 456 }, ); expect(mockContext.output).toHaveBeenCalledWith('userIds', [456]); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.test.ts index 79edc8f457..04491c3c4e 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.test.ts @@ -88,11 +88,9 @@ describe('gitlab:group:access', () => { }, }); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 30, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 456, + }); expect(mockContext.output).toHaveBeenCalledWith('userIds', [456]); expect(mockContext.output).toHaveBeenCalledWith('path', 123); @@ -113,21 +111,15 @@ describe('gitlab:group:access', () => { }); expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledTimes(3); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 30, - ); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 789, - 30, - ); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 101, - 30, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 456, + }); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 789, + }); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 101, + }); expect(mockContext.output).toHaveBeenCalledWith('userIds', [456, 789, 101]); expect(mockContext.output).toHaveBeenCalledWith('path', 123); @@ -147,11 +139,9 @@ describe('gitlab:group:access', () => { }, }); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 30, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 456, + }); expect(mockGitlabClient.GroupMembers.remove).not.toHaveBeenCalled(); }); @@ -211,11 +201,9 @@ describe('gitlab:group:access', () => { }, }); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 30, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 456, + }); expect(mockContext.output).toHaveBeenCalledWith('accessLevel', 30); }); @@ -314,11 +302,9 @@ describe('gitlab:group:access', () => { }, }); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 10, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 10, { + userId: 456, + }); }); it('should add users as Maintainer (accessLevel 40)', async () => { @@ -334,11 +320,9 @@ describe('gitlab:group:access', () => { }, }); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 40, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 40, { + userId: 456, + }); }); it('should add users as Owner (accessLevel 50)', async () => { @@ -354,11 +338,9 @@ describe('gitlab:group:access', () => { }, }); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 50, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 50, { + userId: 456, + }); }); it('should accept string accessLevel "developer"', async () => { @@ -374,11 +356,9 @@ describe('gitlab:group:access', () => { }, }); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 30, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 456, + }); expect(mockContext.output).toHaveBeenCalledWith('accessLevel', 30); }); @@ -395,11 +375,9 @@ describe('gitlab:group:access', () => { }, }); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 40, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 40, { + userId: 456, + }); expect(mockContext.output).toHaveBeenCalledWith('accessLevel', 40); }); @@ -435,11 +413,9 @@ describe('gitlab:group:access', () => { }, }); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 30, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 456, + }); expect(mockGitlabClient.GroupMembers.edit).toHaveBeenCalledWith( 123, 456, @@ -585,16 +561,12 @@ describe('gitlab:group:access', () => { }); expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledTimes(2); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 456, - 30, - ); - expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith( - 123, - 789, - 30, - ); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 456, + }); + expect(mockGitlabClient.GroupMembers.add).toHaveBeenCalledWith(123, 30, { + userId: 789, + }); expect(mockGitlabClient.Groups.share).toHaveBeenCalledTimes(2); expect(mockGitlabClient.Groups.share).toHaveBeenCalledWith( diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.ts index f61b850667..7ad295880e 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupAccessAction.ts @@ -17,9 +17,12 @@ import { InputError } from '@backstage/errors'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { AccessLevel } from '@gitbeaker/core'; import { getClient, parseRepoHost } from '../util'; import { examples } from './gitlabGroupAccessAction.examples'; +type NonAdminAccessLevel = Exclude; + const accessLevelMapping: Record = { no_access: 0, minimal_access: 5, @@ -154,8 +157,7 @@ export const createGitlabGroupAccessAction = (options: { ); } - const accessLevel = - action === 'add' ? resolveAccessLevel(rawAccessLevel) : 0; + const accessLevel = resolveAccessLevel(rawAccessLevel); if (ctx.isDryRun) { if (userIds.length > 0) { @@ -187,11 +189,19 @@ export const createGitlabGroupAccessAction = (options: { fn: async () => { if (action === 'add') { try { - await api.GroupMembers.add(path, userId, accessLevel); + await api.GroupMembers.add( + path, + accessLevel as NonAdminAccessLevel, + { userId }, + ); } catch (error: any) { // If member already exists, try to edit instead if (error.cause?.response?.status === 409) { - await api.GroupMembers.edit(path, userId, accessLevel); + await api.GroupMembers.edit( + path, + userId, + accessLevel as NonAdminAccessLevel, + ); return; } throw error; diff --git a/yarn.lock b/yarn.lock index 3956198af0..634d7ade79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6881,6 +6881,7 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/plugin-scaffolder-node-test-utils": "workspace:^" + "@gitbeaker/core": "npm:^43.8.0" "@gitbeaker/requester-utils": "npm:^43.8.0" "@gitbeaker/rest": "npm:^43.8.0" luxon: "npm:^3.0.0"