diff --git a/src/lib/db/access-store.ts b/src/lib/db/access-store.ts index 22c06773df..b9f6323732 100644 --- a/src/lib/db/access-store.ts +++ b/src/lib/db/access-store.ts @@ -379,9 +379,6 @@ export class AccessStore implements IAccessStore { [environment, permission], ); - console.log('Gett results for ', environment, permission); - console.log('My result is', result); - const permissionId = result.first(); return this.db(T.ROLE_PERMISSION) @@ -392,6 +389,14 @@ export class AccessStore implements IAccessStore { .delete(); } + async wipePermissionsFromRole(role_id: number): Promise { + return this.db(T.ROLE_PERMISSION) + .where({ + role_id, + }) + .delete(); + } + async getRootRoleForAllUsers(): Promise { const rows = await this.db .select('id', 'user_id') diff --git a/src/lib/db/role-store.ts b/src/lib/db/role-store.ts index e05e51c8d0..31cd87b5a6 100644 --- a/src/lib/db/role-store.ts +++ b/src/lib/db/role-store.ts @@ -3,7 +3,10 @@ import { Knex } from 'knex'; import { Logger, LogProvider } from '../logger'; import NotFoundError from '../error/notfound-error'; 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 COLUMNS = ['id', 'name', 'description', 'type']; @@ -57,6 +60,20 @@ export default class RoleStore { return this.mapRow(rows[0]); } + async update(role: ICustomRoleUpdate): Promise { + 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 { const result = await this.db.raw( `SELECT EXISTS (SELECT 1 FROM ${TABLE} WHERE id = ?) AS present`, @@ -72,7 +89,7 @@ export default class RoleStore { mapRow(row: IRoleRow): ICustomRole { if (!row) { - throw new NotFoundError('No project found'); + throw new NotFoundError('No row'); } return { diff --git a/src/lib/services/role-service.ts b/src/lib/services/role-service.ts index 60140acddc..bd264b6c86 100644 --- a/src/lib/services/role-service.ts +++ b/src/lib/services/role-service.ts @@ -14,6 +14,12 @@ interface IRoleCreation { permissions?: IPermission[]; } +interface IRoleUpdate { + id: number; + name: string; + description: string; + permissions?: IPermission[]; +} export default class RoleService { private logger: Logger; @@ -65,6 +71,25 @@ export default class RoleService { return newRole; } + async update(role: IRoleUpdate): Promise { + 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 { return this.store.delete(id); } diff --git a/src/lib/types/stores/access-store.ts b/src/lib/types/stores/access-store.ts index 29abf0d292..0c83328d28 100644 --- a/src/lib/types/stores/access-store.ts +++ b/src/lib/types/stores/access-store.ts @@ -42,6 +42,7 @@ export interface IAccessStore extends Store { getRolesForUserId(userId: number): Promise; getProjectUserIdsForRole(roleId: number, projectId?: string); getUserIdsForRole(roleId: number, projectId?: string): Promise; + wipePermissionsFromRole(role_id: number): Promise; addEnvironmentPermissionsToRole( role_id: number, permissions: IPermission[], diff --git a/src/lib/types/stores/role-store.ts b/src/lib/types/stores/role-store.ts index 9db994dd54..032d9ccc60 100644 --- a/src/lib/types/stores/role-store.ts +++ b/src/lib/types/stores/role-store.ts @@ -7,8 +7,16 @@ export interface ICustomRoleInsert { roleType: string; } +export interface ICustomRoleUpdate { + id: number; + name: string; + description: string; + roleType: string; +} + export interface IRoleStore extends Store { getAll(): Promise; create(role: ICustomRoleInsert): Promise; + update(role: ICustomRoleUpdate): Promise; delete(id: number): Promise; } diff --git a/src/test/fixtures/fake-access-store.ts b/src/test/fixtures/fake-access-store.ts index 581e735f9b..4d3cfc2411 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 { + wipePermissionsFromRole(role_id: number): Promise { + throw new Error('Method not implemented.'); + } + unlinkUserRoles(userId: number): Promise { throw new Error('Method not implemented.'); } diff --git a/src/test/fixtures/fake-role-store.ts b/src/test/fixtures/fake-role-store.ts index 22d158ad8b..01d208d9a1 100644 --- a/src/test/fixtures/fake-role-store.ts +++ b/src/test/fixtures/fake-role-store.ts @@ -1,5 +1,9 @@ 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 { IUserFeedback, IUserFeedbackKey, @@ -7,6 +11,10 @@ import { } from '../../lib/types/stores/user-feedback-store'; export default class FakeRoleStore implements IRoleStore { + async update(role: ICustomRoleUpdate): Promise { + throw new Error('Method not implemented.'); + } + async get(key: number): Promise { return Promise.resolve({ id: 1,