diff --git a/src/lib/db/access-store.ts b/src/lib/db/access-store.ts index fa9a1b7284..5efc573f05 100644 --- a/src/lib/db/access-store.ts +++ b/src/lib/db/access-store.ts @@ -170,6 +170,13 @@ export class AccessStore implements IAccessStore { .from(T.ROLES); } + async getProjectRoles(): Promise { + return this.db + .select(['id', 'name', 'type', 'description']) + .from(T.ROLES) + .andWhere('type', 'project'); + } + async getRolesForProject(projectId: string): Promise { return this.db .select(['id', 'name', 'type', 'project', 'description']) @@ -201,11 +208,15 @@ export class AccessStore implements IAccessStore { .where('ru.user_id', '=', userId); } - async getUserIdsForRole(roleId: number): Promise { + async getUserIdsForRole( + roleId: number, + projectId?: string, + ): Promise { const rows = await this.db .select(['user_id']) .from(T.ROLE_USER) - .where('role_id', roleId); + .where('role_id', roleId) + .andWhere('project', projectId); return rows.map((r) => r.user_id); } diff --git a/src/lib/services/access-service.ts b/src/lib/services/access-service.ts index 57711d7af5..7efff1cbf6 100644 --- a/src/lib/services/access-service.ts +++ b/src/lib/services/access-service.ts @@ -218,6 +218,10 @@ export class AccessService { return { role, permissions: rolePerms, users }; } + async getProjectRoles(): Promise { + return this.store.getProjectRoles(); + } + async getRolesForProject(projectId: string): Promise { return this.store.getRolesForProject(projectId); } @@ -226,8 +230,14 @@ export class AccessService { return this.store.getRolesForUserId(userId); } - async getUsersForRole(roleId: number): Promise { - const userIdList = await this.store.getUserIdsForRole(roleId); + async getUsersForRole( + roleId: number, + projectId?: string, + ): Promise { + const userIdList = await this.store.getUserIdsForRole( + roleId, + projectId, + ); if (userIdList.length > 0) { return this.userStore.getAllWithId(userIdList); } @@ -238,11 +248,11 @@ export class AccessService { async getProjectRoleUsers( projectId: string, ): Promise<[IRole[], IUserWithRole[]]> { - const roles = await this.store.getRolesForProject(projectId); + const roles = await this.store.getProjectRoles(); const users = await Promise.all( roles.map(async (role) => { - const usrs = await this.getUsersForRole(role.id); + const usrs = await this.getUsersForRole(role.id, projectId); return usrs.map((u) => ({ ...u, roleId: role.id })); }), ); diff --git a/src/lib/types/stores/access-store.ts b/src/lib/types/stores/access-store.ts index b9e0d099ee..eba9df7fa6 100644 --- a/src/lib/types/stores/access-store.ts +++ b/src/lib/types/stores/access-store.ts @@ -24,10 +24,11 @@ export interface IAccessStore extends Store { getPermissionsForRole(roleId: number): Promise; getRoles(): Promise; getRolesForProject(projectId: string): Promise; + getProjectRoles(): Promise; getRootRoles(): Promise; removeRolesForProject(projectId: string): Promise; getRolesForUserId(userId: number): Promise; - getUserIdsForRole(roleId: number): Promise; + getUserIdsForRole(roleId: number, projectId?: string): Promise; addEnvironmentPermissionsToRole( role_id: number, permissions: IPermission[], diff --git a/src/test/fixtures/fake-access-store.ts b/src/test/fixtures/fake-access-store.ts index 70b1b2c4d4..bba849130e 100644 --- a/src/test/fixtures/fake-access-store.ts +++ b/src/test/fixtures/fake-access-store.ts @@ -9,6 +9,10 @@ import { import { IAvailablePermissions, IPermission } from 'lib/types/model'; class AccessStoreMock implements IAccessStore { + getProjectRoles(): Promise { + throw new Error('Method not implemented.'); + } + addEnvironmentPermissionsToRole( role_id: number, permissions: IPermission[], @@ -59,7 +63,7 @@ class AccessStoreMock implements IAccessStore { return Promise.resolve([]); } - getUserIdsForRole(roleId: number): Promise { + getUserIdsForRole(roleId: number, projectId: string): Promise { throw new Error('Method not implemented.'); }