1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-07-21 13:47:39 +02:00

feat: Add in support for updating roles

This commit is contained in:
sighphyre 2021-12-17 14:44:08 +02:00 committed by Ivar Conradi Østhus
parent f8550790c5
commit b953324428
No known key found for this signature in database
GPG Key ID: 31AC596886B0BD09
7 changed files with 74 additions and 6 deletions

View File

@ -379,9 +379,6 @@ export class AccessStore implements IAccessStore {
[environment, permission], [environment, permission],
); );
console.log('Gett results for ', environment, permission);
console.log('My result is', result);
const permissionId = result.first(); const permissionId = result.first();
return this.db(T.ROLE_PERMISSION) return this.db(T.ROLE_PERMISSION)
@ -392,6 +389,14 @@ export class AccessStore implements IAccessStore {
.delete(); .delete();
} }
async wipePermissionsFromRole(role_id: number): Promise<void> {
return this.db(T.ROLE_PERMISSION)
.where({
role_id,
})
.delete();
}
async getRootRoleForAllUsers(): Promise<IUserRole[]> { async getRootRoleForAllUsers(): Promise<IUserRole[]> {
const rows = await this.db const rows = await this.db
.select('id', 'user_id') .select('id', 'user_id')

View File

@ -3,7 +3,10 @@ import { Knex } from 'knex';
import { Logger, LogProvider } from '../logger'; import { Logger, LogProvider } from '../logger';
import NotFoundError from '../error/notfound-error'; import NotFoundError from '../error/notfound-error';
import { ICustomRole } from 'lib/types/model'; import { ICustomRole } from 'lib/types/model';
import { ICustomRoleInsert } from 'lib/types/stores/role-store'; import {
ICustomRoleInsert,
ICustomRoleUpdate,
} from 'lib/types/stores/role-store';
const TABLE = 'roles'; const TABLE = 'roles';
const COLUMNS = ['id', 'name', 'description', 'type']; const COLUMNS = ['id', 'name', 'description', 'type'];
@ -57,6 +60,20 @@ export default class RoleStore {
return this.mapRow(rows[0]); return this.mapRow(rows[0]);
} }
async update(role: ICustomRoleUpdate): Promise<ICustomRole> {
const rows = await this.db(TABLE)
.where({
id: role.id,
})
.update({
id: role.id,
name: role.name,
description: role.description,
})
.returning('*');
return this.mapRow(rows[0]);
}
async exists(id: number): Promise<boolean> { async exists(id: number): Promise<boolean> {
const result = await this.db.raw( const result = await this.db.raw(
`SELECT EXISTS (SELECT 1 FROM ${TABLE} WHERE id = ?) AS present`, `SELECT EXISTS (SELECT 1 FROM ${TABLE} WHERE id = ?) AS present`,
@ -72,7 +89,7 @@ export default class RoleStore {
mapRow(row: IRoleRow): ICustomRole { mapRow(row: IRoleRow): ICustomRole {
if (!row) { if (!row) {
throw new NotFoundError('No project found'); throw new NotFoundError('No row');
} }
return { return {

View File

@ -14,6 +14,12 @@ interface IRoleCreation {
permissions?: IPermission[]; permissions?: IPermission[];
} }
interface IRoleUpdate {
id: number;
name: string;
description: string;
permissions?: IPermission[];
}
export default class RoleService { export default class RoleService {
private logger: Logger; private logger: Logger;
@ -65,6 +71,25 @@ export default class RoleService {
return newRole; return newRole;
} }
async update(role: IRoleUpdate): Promise<ICustomRole> {
const baseRole = {
id: role.id,
name: role.name,
description: role.description,
roleType: 'custom',
};
const permissions = role.permissions;
const newRole = await this.store.update(baseRole);
if (permissions) {
this.accessStore.wipePermissionsFromRole(newRole.id);
this.accessStore.addEnvironmentPermissionsToRole(
newRole.id,
permissions,
);
}
return newRole;
}
async delete(id: number): Promise<void> { async delete(id: number): Promise<void> {
return this.store.delete(id); return this.store.delete(id);
} }

View File

@ -42,6 +42,7 @@ export interface IAccessStore extends Store<IRole, number> {
getRolesForUserId(userId: number): Promise<IRole[]>; getRolesForUserId(userId: number): Promise<IRole[]>;
getProjectUserIdsForRole(roleId: number, projectId?: string); getProjectUserIdsForRole(roleId: number, projectId?: string);
getUserIdsForRole(roleId: number, projectId?: string): Promise<number[]>; getUserIdsForRole(roleId: number, projectId?: string): Promise<number[]>;
wipePermissionsFromRole(role_id: number): Promise<void>;
addEnvironmentPermissionsToRole( addEnvironmentPermissionsToRole(
role_id: number, role_id: number,
permissions: IPermission[], permissions: IPermission[],

View File

@ -7,8 +7,16 @@ export interface ICustomRoleInsert {
roleType: string; roleType: string;
} }
export interface ICustomRoleUpdate {
id: number;
name: string;
description: string;
roleType: string;
}
export interface IRoleStore extends Store<ICustomRole, number> { export interface IRoleStore extends Store<ICustomRole, number> {
getAll(): Promise<ICustomRole[]>; getAll(): Promise<ICustomRole[]>;
create(role: ICustomRoleInsert): Promise<ICustomRole>; create(role: ICustomRoleInsert): Promise<ICustomRole>;
update(role: ICustomRoleUpdate): Promise<ICustomRole>;
delete(id: number): Promise<void>; delete(id: number): Promise<void>;
} }

View File

@ -9,6 +9,10 @@ import {
import { IAvailablePermissions, IPermission } from 'lib/types/model'; import { IAvailablePermissions, IPermission } from 'lib/types/model';
class AccessStoreMock implements IAccessStore { class AccessStoreMock implements IAccessStore {
wipePermissionsFromRole(role_id: number): Promise<void> {
throw new Error('Method not implemented.');
}
unlinkUserRoles(userId: number): Promise<void> { unlinkUserRoles(userId: number): Promise<void> {
throw new Error('Method not implemented.'); throw new Error('Method not implemented.');
} }

View File

@ -1,5 +1,9 @@
import { ICustomRole } from 'lib/types/model'; import { ICustomRole } from 'lib/types/model';
import { ICustomRoleInsert, IRoleStore } from 'lib/types/stores/role-store'; import {
ICustomRoleInsert,
ICustomRoleUpdate,
IRoleStore,
} from 'lib/types/stores/role-store';
import { import {
IUserFeedback, IUserFeedback,
IUserFeedbackKey, IUserFeedbackKey,
@ -7,6 +11,10 @@ import {
} from '../../lib/types/stores/user-feedback-store'; } from '../../lib/types/stores/user-feedback-store';
export default class FakeRoleStore implements IRoleStore { export default class FakeRoleStore implements IRoleStore {
async update(role: ICustomRoleUpdate): Promise<ICustomRole> {
throw new Error('Method not implemented.');
}
async get(key: number): Promise<ICustomRole> { async get(key: number): Promise<ICustomRole> {
return Promise.resolve({ return Promise.resolve({
id: 1, id: 1,