mirror of
https://github.com/Unleash/unleash.git
synced 2025-07-21 13:47:39 +02:00
fix: Make permissions actually work with new environments
This commit is contained in:
parent
ba40099b41
commit
0634758784
@ -20,6 +20,7 @@ const T = {
|
||||
ROLES: 'roles',
|
||||
ROLE_PERMISSION: 'role_permission',
|
||||
PERMISSIONS: 'permissions',
|
||||
PERMISSION_TYPES: 'permission_types',
|
||||
};
|
||||
|
||||
interface IPermissionRow {
|
||||
@ -60,6 +61,10 @@ export class AccessStore implements IAccessStore {
|
||||
await this.db.batchInsert(T.PERMISSIONS, rows);
|
||||
}
|
||||
|
||||
async getRoleByName(name: string): Promise<IRole> {
|
||||
return this.db(T.ROLES).where({ name }).first();
|
||||
}
|
||||
|
||||
async delete(key: number): Promise<void> {
|
||||
await this.db(T.ROLES).where({ id: key }).del();
|
||||
}
|
||||
@ -93,8 +98,20 @@ export class AccessStore implements IAccessStore {
|
||||
|
||||
async getAvailablePermissions(): Promise<IAvailablePermissions> {
|
||||
const rows = await this.db
|
||||
.select(['id', 'permission', 'environment', 'display_name'])
|
||||
.from(T.PERMISSIONS);
|
||||
.select([
|
||||
'p.id',
|
||||
'p.permission',
|
||||
'p.environment',
|
||||
'pt.display_name',
|
||||
])
|
||||
.join(
|
||||
`${T.PERMISSION_TYPES} AS pt`,
|
||||
'pt.permission',
|
||||
'p.permission',
|
||||
)
|
||||
.where('pt.type', 'project')
|
||||
.orWhere('pt.type', 'environment')
|
||||
.from(`${T.PERMISSIONS} as p`);
|
||||
|
||||
let projectPermissions: IPermission[] = [];
|
||||
let rawEnvironments = new Map<string, IPermissionRow[]>();
|
||||
@ -174,15 +191,24 @@ export class AccessStore implements IAccessStore {
|
||||
return this.db
|
||||
.select(['id', 'name', 'type', 'description'])
|
||||
.from<IRole>(T.ROLES)
|
||||
.andWhere('type', 'project');
|
||||
.where('type', 'custom')
|
||||
.orWhere('type', 'project');
|
||||
}
|
||||
|
||||
async getRolesForProject(projectId: string): Promise<IRole[]> {
|
||||
return this.db
|
||||
.select(['id', 'name', 'type', 'project', 'description'])
|
||||
.from<IRole>(T.ROLES)
|
||||
.where('project', projectId)
|
||||
.andWhere('type', 'project');
|
||||
.select(['r.id', 'r.name', 'r.type', 'ru.project', 'r.description'])
|
||||
.from<IRole>(`${T.ROLE_USER} as ru`)
|
||||
.innerJoin(`${T.ROLES} as r`, 'ru.role_id', 'r.id')
|
||||
.where('project', projectId);
|
||||
}
|
||||
|
||||
async unlinkUserRoles(userId: number): Promise<void> {
|
||||
return this.db(T.ROLE_USER)
|
||||
.where({
|
||||
user_id: userId,
|
||||
})
|
||||
.delete();
|
||||
}
|
||||
|
||||
async getRootRoles(): Promise<IRole[]> {
|
||||
@ -208,15 +234,25 @@ export class AccessStore implements IAccessStore {
|
||||
.where('ru.user_id', '=', userId);
|
||||
}
|
||||
|
||||
async getUserIdsForRole(
|
||||
roleId: number,
|
||||
projectId?: string,
|
||||
): Promise<number[]> {
|
||||
async getUserIdsForRole(roleId: number): Promise<number[]> {
|
||||
const rows = await this.db
|
||||
.select(['user_id'])
|
||||
.from<IRole>(T.ROLE_USER)
|
||||
.where('role_id', roleId)
|
||||
.andWhere('project', projectId);
|
||||
.where('role_id', roleId);
|
||||
return rows.map((r) => r.user_id);
|
||||
}
|
||||
|
||||
async getProjectUserIdsForRole(
|
||||
roleId: number,
|
||||
projectId?: string,
|
||||
): Promise<number[]> {
|
||||
console.log('Checking for', roleId, projectId);
|
||||
const rows = await this.db
|
||||
.select(['user_id'])
|
||||
.from<IRole>(`${T.ROLE_USER} AS ru`)
|
||||
.join(`${T.ROLES} as r`, 'ru.role_id', 'id')
|
||||
.where('r.id', roleId)
|
||||
.andWhere('ru.project', projectId);
|
||||
return rows.map((r) => r.user_id);
|
||||
}
|
||||
|
||||
@ -232,11 +268,16 @@ export class AccessStore implements IAccessStore {
|
||||
});
|
||||
}
|
||||
|
||||
async removeUserFromRole(userId: number, roleId: number): Promise<void> {
|
||||
async removeUserFromRole(
|
||||
userId: number,
|
||||
roleId: number,
|
||||
projectId: string,
|
||||
): Promise<void> {
|
||||
return this.db(T.ROLE_USER)
|
||||
.where({
|
||||
user_id: userId,
|
||||
role_id: roleId,
|
||||
project: projectId,
|
||||
})
|
||||
.delete();
|
||||
}
|
||||
|
@ -125,6 +125,7 @@ export class AccessService {
|
||||
permission: p,
|
||||
}));
|
||||
}
|
||||
console.log('Checking perms for user id', user.id);
|
||||
return this.store.getPermissionsForUser(user.id);
|
||||
}
|
||||
|
||||
@ -171,8 +172,12 @@ export class AccessService {
|
||||
return userRoles.filter((r) => r.type === RoleType.ROOT);
|
||||
}
|
||||
|
||||
async removeUserFromRole(userId: number, roleId: number): Promise<void> {
|
||||
return this.store.removeUserFromRole(userId, roleId);
|
||||
async removeUserFromRole(
|
||||
userId: number,
|
||||
roleId: number,
|
||||
projectId: string,
|
||||
): Promise<void> {
|
||||
return this.store.removeUserFromRole(userId, roleId, projectId);
|
||||
}
|
||||
|
||||
async addPermissionToRole(
|
||||
@ -230,11 +235,23 @@ export class AccessService {
|
||||
return this.store.getRolesForUserId(userId);
|
||||
}
|
||||
|
||||
async getUsersForRole(
|
||||
async unlinkUserRoles(userId: number): Promise<void> {
|
||||
return this.store.unlinkUserRoles(userId);
|
||||
}
|
||||
|
||||
async getUsersForRole(roleId: number): Promise<IUser[]> {
|
||||
const userIdList = await this.store.getUserIdsForRole(roleId);
|
||||
if (userIdList.length > 0) {
|
||||
return this.userStore.getAllWithId(userIdList);
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
async getProjectUsersForRole(
|
||||
roleId: number,
|
||||
projectId?: string,
|
||||
): Promise<IUser[]> {
|
||||
const userIdList = await this.store.getUserIdsForRole(
|
||||
const userIdList = await this.store.getProjectUserIdsForRole(
|
||||
roleId,
|
||||
projectId,
|
||||
);
|
||||
@ -250,9 +267,13 @@ export class AccessService {
|
||||
): Promise<[IRole[], IUserWithRole[]]> {
|
||||
const roles = await this.store.getProjectRoles();
|
||||
|
||||
console.log('GOt the following roles bacl', roles);
|
||||
const users = await Promise.all(
|
||||
roles.map(async (role) => {
|
||||
const usrs = await this.getUsersForRole(role.id, projectId);
|
||||
const usrs = await this.getProjectUsersForRole(
|
||||
role.id,
|
||||
projectId,
|
||||
);
|
||||
return usrs.map((u) => ({ ...u, roleId: role.id }));
|
||||
}),
|
||||
);
|
||||
@ -267,11 +288,8 @@ export class AccessService {
|
||||
throw new Error('ProjectId cannot be empty');
|
||||
}
|
||||
|
||||
const ownerRole = await this.store.createRole(
|
||||
RoleName.OWNER,
|
||||
RoleType.PROJECT,
|
||||
PROJECT_DESCRIPTION.OWNER,
|
||||
);
|
||||
const ownerRole = await this.store.getRoleByName(RoleName.OWNER);
|
||||
|
||||
await this.store.addPermissionsToRole(
|
||||
ownerRole.id,
|
||||
PROJECT_ADMIN,
|
||||
@ -285,12 +303,9 @@ export class AccessService {
|
||||
);
|
||||
await this.store.addUserToRole(owner.id, ownerRole.id, projectId);
|
||||
}
|
||||
const memberRole = await this.store.createRole(
|
||||
RoleName.MEMBER,
|
||||
RoleType.PROJECT,
|
||||
projectId,
|
||||
PROJECT_DESCRIPTION.MEMBER,
|
||||
);
|
||||
|
||||
const memberRole = await this.store.getRoleByName(RoleName.MEMBER);
|
||||
|
||||
await this.store.addPermissionsToRole(
|
||||
memberRole.id,
|
||||
PROJECT_REGULAR,
|
||||
|
@ -25,7 +25,7 @@ import { IFeatureTypeStore } from '../types/stores/feature-type-store';
|
||||
import { IFeatureToggleStore } from '../types/stores/feature-toggle-store';
|
||||
import { IFeatureEnvironmentStore } from '../types/stores/feature-environment-store';
|
||||
import { IProjectQuery, IProjectStore } from '../types/stores/project-store';
|
||||
import { IRole } from '../types/stores/access-store';
|
||||
import { IRoleDescriptor } from '../types/stores/access-store';
|
||||
import { IEventStore } from '../types/stores/event-store';
|
||||
import FeatureToggleService from './feature-toggle-service';
|
||||
import { CREATE_FEATURE, UPDATE_FEATURE } from '../types/permissions';
|
||||
@ -38,7 +38,7 @@ const DEFAULT_PROJECT = 'default';
|
||||
|
||||
export interface UsersWithRoles {
|
||||
users: IUserWithRole[];
|
||||
roles: IRole[];
|
||||
roles: IRoleDescriptor[];
|
||||
}
|
||||
|
||||
export default class ProjectService {
|
||||
@ -271,6 +271,7 @@ export default class ProjectService {
|
||||
const [roles, users] = await this.accessService.getProjectRoleUsers(
|
||||
projectId,
|
||||
);
|
||||
console.log('Got the following response', roles, users);
|
||||
|
||||
return {
|
||||
roles,
|
||||
@ -324,7 +325,7 @@ export default class ProjectService {
|
||||
}
|
||||
}
|
||||
|
||||
await this.accessService.removeUserFromRole(userId, role.id);
|
||||
await this.accessService.removeUserFromRole(userId, role.id, projectId);
|
||||
}
|
||||
|
||||
async getMembers(projectId: string): Promise<number> {
|
||||
|
@ -262,12 +262,7 @@ class UserService {
|
||||
|
||||
async deleteUser(userId: number, updatedBy?: User): Promise<void> {
|
||||
const user = await this.store.get(userId);
|
||||
const roles = await this.accessService.getRolesForUser(userId);
|
||||
await Promise.all(
|
||||
roles.map((role) =>
|
||||
this.accessService.removeUserFromRole(userId, role.id),
|
||||
),
|
||||
);
|
||||
await this.accessService.unlinkUserRoles(userId);
|
||||
await this.sessionService.deleteSessionsForUser(userId);
|
||||
|
||||
await this.store.delete(userId);
|
||||
|
@ -14,20 +14,29 @@ export interface IRole {
|
||||
type: string;
|
||||
}
|
||||
|
||||
export interface IRoleDescriptor {
|
||||
name: string;
|
||||
description?: string;
|
||||
type: string;
|
||||
}
|
||||
|
||||
export interface IUserRole {
|
||||
roleId: number;
|
||||
userId: number;
|
||||
}
|
||||
export interface IAccessStore extends Store<IRole, number> {
|
||||
getRoleByName(name: string): Promise<IRole>;
|
||||
getAvailablePermissions(): Promise<IAvailablePermissions>;
|
||||
getPermissionsForUser(userId: number): Promise<IUserPermission[]>;
|
||||
getPermissionsForRole(roleId: number): Promise<IUserPermission[]>;
|
||||
getRoles(): Promise<IRole[]>;
|
||||
getRolesForProject(projectId: string): Promise<IRole[]>;
|
||||
unlinkUserRoles(userId: number): Promise<void>;
|
||||
getProjectRoles(): Promise<IRole[]>;
|
||||
getRootRoles(): Promise<IRole[]>;
|
||||
removeRolesForProject(projectId: string): Promise<void>;
|
||||
getRolesForUserId(userId: number): Promise<IRole[]>;
|
||||
getProjectUserIdsForRole(roleId: number, projectId?: string);
|
||||
getUserIdsForRole(roleId: number, projectId?: string): Promise<number[]>;
|
||||
addEnvironmentPermissionsToRole(
|
||||
role_id: number,
|
||||
@ -42,7 +51,11 @@ export interface IAccessStore extends Store<IRole, number> {
|
||||
roleId: number,
|
||||
projectId: string,
|
||||
): Promise<void>;
|
||||
removeUserFromRole(userId: number, roleId: number): Promise<void>;
|
||||
removeUserFromRole(
|
||||
userId: number,
|
||||
roleId: number,
|
||||
projectId: string,
|
||||
): Promise<void>;
|
||||
removeRolesOfTypeForUser(userId: number, roleType: string): Promise<void>;
|
||||
createRole(
|
||||
name: string,
|
||||
|
@ -5,11 +5,16 @@ exports.up = function (db, cb) {
|
||||
( id SERIAL PRIMARY KEY,
|
||||
permission VARCHAR(255) NOT NULL,
|
||||
environment VARCHAR(255),
|
||||
display_name TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
|
||||
);
|
||||
|
||||
INSERT INTO permissions (permission, environment, display_name) (SELECT DISTINCT permission, environment, '' from role_permission);
|
||||
CREATE TABLE IF NOT EXISTS permission_types (
|
||||
permission VARCHAR(255),
|
||||
display_name TEXT,
|
||||
type VARCHAR(255)
|
||||
);
|
||||
|
||||
INSERT INTO permissions (permission, environment) (select distinct permission,environment from role_permission);
|
||||
|
||||
ALTER TABLE role_user ADD COLUMN
|
||||
project VARCHAR(255);
|
||||
@ -19,6 +24,9 @@ exports.up = function (db, cb) {
|
||||
FROM roles
|
||||
WHERE role_user.role_id = roles.id;
|
||||
|
||||
ALTER TABLE role_user DROP CONSTRAINT role_user_pkey;
|
||||
ALTER TABLE role_user ADD PRIMARY KEY (role_id, user_id, project);
|
||||
|
||||
ALTER TABLE roles DROP COLUMN project;
|
||||
|
||||
ALTER TABLE roles
|
||||
@ -29,7 +37,7 @@ exports.up = function (db, cb) {
|
||||
ADD COLUMN
|
||||
permission_id INTEGER;
|
||||
|
||||
UPDATE role_permission
|
||||
UPDATE role_permission
|
||||
SET permission_id = permissions.id
|
||||
FROM permissions
|
||||
WHERE
|
||||
@ -43,29 +51,30 @@ exports.up = function (db, cb) {
|
||||
DROP COLUMN permission,
|
||||
DROP COLUMN environment;
|
||||
|
||||
UPDATE permissions SET display_name = 'Admin' where permission = 'ADMIN';
|
||||
UPDATE permissions SET display_name = 'Create Strategies' where permission = 'CREATE_STRATEGY';
|
||||
UPDATE permissions SET display_name = 'Create Addons' where permission = 'CREATE_ADDON';
|
||||
UPDATE permissions SET display_name = 'Delete Addons' where permission = 'DELETE_ADDON';
|
||||
UPDATE permissions SET display_name = 'Update Addons' where permission = 'UPDATE_ADDON';
|
||||
UPDATE permissions SET display_name = 'Create Feature Toggles' where permission = 'CREATE_FEATURE';
|
||||
UPDATE permissions SET display_name = 'Update Feature Toggles' where permission = 'UPDATE_FEATURE';
|
||||
UPDATE permissions SET display_name = 'Delete Feature Toggles' where permission = 'DELETE_FEATURE';
|
||||
UPDATE permissions SET display_name = 'Update Applications' where permission = 'UPDATE_APPLICATION';
|
||||
UPDATE permissions SET display_name = 'Update Tag Types' where permission = 'UPDATE_TAG_TYPE';
|
||||
UPDATE permissions SET display_name = 'Delete Tag Types' where permission = 'DELETE_TAG_TYPE';
|
||||
UPDATE permissions SET display_name = 'Create Projects' where permission = 'CREATE_PROJECT';
|
||||
UPDATE permissions SET display_name = 'Update Projects' where permission = 'UPDATE_PROJECT';
|
||||
UPDATE permissions SET display_name = 'Delete Projects' where permission = 'DELETE_PROJECT';
|
||||
UPDATE permissions SET display_name = 'Update Strategies on Toggles' where permission = 'UPDATE_FEATURE_STRATEGY';
|
||||
UPDATE permissions SET display_name = 'Add Strategies to Toggles' where permission = 'CREATE_FEATURE_STRATEGY';
|
||||
UPDATE permissions SET display_name = 'Remove Strategies from Toggles' where permission = 'DELETE_FEATURE_STRATEGY';
|
||||
UPDATE permissions SET display_name = 'Update Strategies' where permission = 'UPDATE_STRATEGY';
|
||||
UPDATE permissions SET display_name = 'Delete Strategies' where permission = 'DELETE_STRATEGY';
|
||||
UPDATE permissions SET display_name = 'Enable/Disable Toggles for Environments' where permission = 'UPDATE_FEATURE_ENVIRONMENT';
|
||||
UPDATE permissions SET display_name = 'Update Context Fields' where permission = 'UPDATE_CONTEXT_FIELD';
|
||||
UPDATE permissions SET display_name = 'Create Context Fields' where permission = 'CREATE_CONTEXT_FIELD';
|
||||
UPDATE permissions SET display_name = 'Delete Context Fields' where permission = 'DELETE_CONTEXT_FIELD';
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('ADMIN', 'Admin', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('CLIENT', 'Client', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('CREATE_STRATEGY','Create Strategies', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('CREATE_ADDON', 'Create Addons', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('DELETE_ADDON', 'Delete Addons', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('UPDATE_ADDON', 'Update Addons', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('CREATE_FEATURE', 'Create Feature Toggles', 'project');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('UPDATE_FEATURE', 'Update Feature Toggles', 'project');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('DELETE_FEATURE', 'Delete Feature Toggles', 'project');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('UPDATE_APPLICATION', 'Update Applications', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('UPDATE_TAG_TYPE', 'Update Tag Types', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('DELETE_TAG_TYPE', 'Delete Tag Types', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('CREATE_PROJECT', 'Create Projects', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('UPDATE_PROJECT', 'Update Projects', 'project');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('DELETE_PROJECT', 'Delete Projects', 'project');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('UPDATE_FEATURE_STRATEGY', 'Update Strategies on Toggles', 'environment');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('CREATE_FEATURE_STRATEGY', 'Add Strategies to Toggles', 'environment');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('DELETE_FEATURE_STRATEGY', 'Remove Strategies from Toggles', 'environment');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('UPDATE_STRATEGY', 'Update Strategies', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('DELETE_STRATEGY', 'Delete Strategies', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('UPDATE_FEATURE_ENVIRONMENT', 'Enable/Disable Toggles for Environments', 'environment');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('UPDATE_CONTEXT_FIELD', 'Update Context Fields', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('CREATE_CONTEXT_FIELD', 'Create Context Fields', 'root');
|
||||
INSERT INTO permission_types (permission, display_name, type) VALUES ('DELETE_CONTEXT_FIELD', 'Delete Context Fields', 'root');
|
||||
`,
|
||||
cb,
|
||||
);
|
||||
|
@ -53,7 +53,12 @@ afterEach(async () => {
|
||||
.map(async (env) => {
|
||||
await stores.environmentStore.delete(env.name);
|
||||
});
|
||||
const users = await stores.userStore.getAll();
|
||||
const wipeUserPermissions = users.map(async (u) => {
|
||||
await stores.accessStore.unlinkUserRoles(u.id);
|
||||
});
|
||||
await Promise.allSettled(deleteEnvs);
|
||||
await Promise.allSettled(wipeUserPermissions);
|
||||
});
|
||||
|
||||
test('should have default project', async () => {
|
||||
@ -240,13 +245,10 @@ test('should get list of users with access to project', async () => {
|
||||
description: 'Blah',
|
||||
};
|
||||
await projectService.createProject(project, user);
|
||||
const { roles, users } = await projectService.getUsersWithAccess(
|
||||
project.id,
|
||||
user,
|
||||
);
|
||||
const { users } = await projectService.getUsersWithAccess(project.id, user);
|
||||
|
||||
const owner = roles.find((role) => role.name === RoleName.OWNER);
|
||||
const member = roles.find((role) => role.name === RoleName.MEMBER);
|
||||
const member = await stores.accessStore.getRoleByName(RoleName.MEMBER);
|
||||
const owner = await stores.accessStore.getRoleByName(RoleName.OWNER);
|
||||
|
||||
expect(users).toHaveLength(1);
|
||||
expect(users[0].id).toBe(user.id);
|
||||
@ -272,8 +274,7 @@ test('should add a member user to the project', async () => {
|
||||
email: 'member2@getunleash.io',
|
||||
});
|
||||
|
||||
const roles = await stores.accessStore.getRolesForProject(project.id);
|
||||
const memberRole = roles.find((r) => r.name === RoleName.MEMBER);
|
||||
const memberRole = await stores.accessStore.getRoleByName(RoleName.MEMBER);
|
||||
|
||||
await projectService.addUser(project.id, memberRole.id, projectMember1.id);
|
||||
await projectService.addUser(project.id, memberRole.id, projectMember2.id);
|
||||
@ -305,10 +306,7 @@ test('should add admin users to the project', async () => {
|
||||
email: 'admin2@getunleash.io',
|
||||
});
|
||||
|
||||
const projectRoles = await stores.accessStore.getRolesForProject(
|
||||
project.id,
|
||||
);
|
||||
const ownerRole = projectRoles.find((r) => r.name === RoleName.OWNER);
|
||||
const ownerRole = await stores.accessStore.getRoleByName(RoleName.OWNER);
|
||||
|
||||
await projectService.addUser(project.id, ownerRole.id, projectAdmin1.id);
|
||||
await projectService.addUser(project.id, ownerRole.id, projectAdmin2.id);
|
||||
@ -325,8 +323,7 @@ test('should add admin users to the project', async () => {
|
||||
});
|
||||
|
||||
test('add user only accept to add users to project roles', async () => {
|
||||
const roles = await accessService.getRoles();
|
||||
const memberRole = roles.find((r) => r.name === RoleName.MEMBER);
|
||||
const memberRole = await stores.accessStore.getRoleByName(RoleName.MEMBER);
|
||||
|
||||
await expect(async () => {
|
||||
await projectService.addUser('some-id', memberRole.id, user.id);
|
||||
@ -346,8 +343,7 @@ test('add user should fail if user already have access', async () => {
|
||||
email: 'member42@getunleash.io',
|
||||
});
|
||||
|
||||
const roles = await stores.accessStore.getRolesForProject(project.id);
|
||||
const memberRole = roles.find((r) => r.name === RoleName.MEMBER);
|
||||
const memberRole = await stores.accessStore.getRoleByName(RoleName.MEMBER);
|
||||
|
||||
await projectService.addUser(project.id, memberRole.id, projectMember1.id);
|
||||
|
||||
@ -371,8 +367,7 @@ test('should remove user from the project', async () => {
|
||||
email: 'member99@getunleash.io',
|
||||
});
|
||||
|
||||
const roles = await stores.accessStore.getRolesForProject(project.id);
|
||||
const memberRole = roles.find((r) => r.name === RoleName.MEMBER);
|
||||
const memberRole = await stores.accessStore.getRoleByName(RoleName.MEMBER);
|
||||
|
||||
await projectService.addUser(project.id, memberRole.id, projectMember1.id);
|
||||
await projectService.removeUser(
|
||||
|
15
src/test/fixtures/fake-access-store.ts
vendored
15
src/test/fixtures/fake-access-store.ts
vendored
@ -9,6 +9,21 @@ import {
|
||||
import { IAvailablePermissions, IPermission } from 'lib/types/model';
|
||||
|
||||
class AccessStoreMock implements IAccessStore {
|
||||
unlinkUserRoles(userId: number): Promise<void> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
|
||||
getRoleByName(name: string): Promise<IRole> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
|
||||
getProjectUserIdsForRole(
|
||||
roleId: number,
|
||||
projectId?: string,
|
||||
): Promise<number[]> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
|
||||
getProjectRoles(): Promise<IRole[]> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user