1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-23 00:22:19 +01:00

fix: remove user from project (#5383)

Removing a user from a project was impossible if you only had 1 owner.
It worked fine when having more than an owner. This should fix it and
we'll add tests later
This commit is contained in:
Gastón Fournier 2023-11-21 15:44:12 +01:00 committed by GitHub
parent 1429b54957
commit 7ddcceed8a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 6 deletions

View File

@ -430,7 +430,9 @@ export default class ProjectService {
return this.accessService.getProjectRoleAccess(projectId); return this.accessService.getProjectRoleAccess(projectId);
} }
// Deprecated: See addAccess instead. /**
* @deprecated see addAccess instead.
*/
async addUser( async addUser(
projectId: string, projectId: string,
roleId: number, roleId: number,
@ -470,6 +472,9 @@ export default class ProjectService {
); );
} }
/**
* @deprecated use removeUserAccess
*/
async removeUser( async removeUser(
projectId: string, projectId: string,
roleId: number, roleId: number,
@ -511,7 +516,10 @@ export default class ProjectService {
const ownerRole = await this.accessService.getRoleByName( const ownerRole = await this.accessService.getRoleByName(
RoleName.OWNER, RoleName.OWNER,
); );
if (existingRoles.includes(ownerRole.id)) {
await this.validateAtLeastOneOwner(projectId, ownerRole); await this.validateAtLeastOneOwner(projectId, ownerRole);
}
await this.accessService.removeUserAccess(projectId, userId); await this.accessService.removeUserAccess(projectId, userId);
@ -540,7 +548,10 @@ export default class ProjectService {
const ownerRole = await this.accessService.getRoleByName( const ownerRole = await this.accessService.getRoleByName(
RoleName.OWNER, RoleName.OWNER,
); );
if (existingRoles.includes(ownerRole.id)) {
await this.validateAtLeastOneOwner(projectId, ownerRole); await this.validateAtLeastOneOwner(projectId, ownerRole);
}
await this.accessService.removeGroupAccess(projectId, groupId); await this.accessService.removeGroupAccess(projectId, groupId);
@ -592,6 +603,9 @@ export default class ProjectService {
); );
} }
/**
* @deprecated use removeGroupAccess
*/
async removeGroup( async removeGroup(
projectId: string, projectId: string,
roleId: number, roleId: number,
@ -745,7 +759,6 @@ export default class ProjectService {
if (hasOwnerRole && isRemovingOwnerRole) { if (hasOwnerRole && isRemovingOwnerRole) {
await this.validateAtLeastOneOwner(projectId, ownerRole); await this.validateAtLeastOneOwner(projectId, ownerRole);
} }
await this.validateAtLeastOneOwner(projectId, ownerRole);
await this.accessService.setProjectRolesForGroup( await this.accessService.setProjectRolesForGroup(
projectId, projectId,
@ -871,7 +884,6 @@ export default class ProjectService {
// Nothing to do.... // Nothing to do....
return; return;
} }
await this.validateAtLeastOneOwner(projectId, currentRole); await this.validateAtLeastOneOwner(projectId, currentRole);
await this.accessService.updateUserProjectRole( await this.accessService.updateUserProjectRole(
@ -925,7 +937,6 @@ export default class ProjectService {
// Nothing to do.... // Nothing to do....
return; return;
} }
await this.validateAtLeastOneOwner(projectId, currentRole); await this.validateAtLeastOneOwner(projectId, currentRole);
await this.accessService.updateGroupProjectRole( await this.accessService.updateGroupProjectRole(

View File

@ -1048,6 +1048,44 @@ describe('ensure project has at least one owner', () => {
); );
}); });
test('should be able to remove member user from the project when another is owner', async () => {
const project = {
id: 'remove-users-members-allowed',
name: 'New project',
description: 'Blah',
mode: 'open' as const,
defaultStickiness: 'clientId',
};
await projectService.createProject(project, user);
const memberRole = await stores.roleStore.getRoleByName(
RoleName.MEMBER,
);
const memberUser = await stores.userStore.insert({
name: 'Some Name',
email: 'member@getunleash.io',
});
await projectService.addAccess(
project.id,
[memberRole.id],
[],
[memberUser.id],
'test',
);
const usersBefore = await projectService.getProjectUsers(project.id);
await projectService.removeUserAccess(
project.id,
memberUser.id,
'test',
);
const usersAfter = await projectService.getProjectUsers(project.id);
expect(usersBefore).toHaveLength(2);
expect(usersAfter).toHaveLength(1);
});
test('should not update role for user on project when she is the owner', async () => { test('should not update role for user on project when she is the owner', async () => {
const project = { const project = {
id: 'update-users-not-allowed', id: 'update-users-not-allowed',