From 4e3f7e53302f5fe4275b0c9b2b7515c8595c4304 Mon Sep 17 00:00:00 2001 From: sighphyre Date: Tue, 4 Jan 2022 13:10:45 +0200 Subject: [PATCH] feat: Validation now works when updating a role --- src/lib/db/role-store.ts | 12 +++++++++++- src/lib/services/access-service.ts | 16 +++++++++++----- src/lib/types/stores/role-store.ts | 2 +- src/test/fixtures/fake-role-store.ts | 2 +- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/lib/db/role-store.ts b/src/lib/db/role-store.ts index 08aede7ebc..01e2433bb9 100644 --- a/src/lib/db/role-store.ts +++ b/src/lib/db/role-store.ts @@ -6,6 +6,7 @@ import { ICustomRole } from 'lib/types/model'; import { ICustomRoleInsert, ICustomRoleUpdate, + IRoleStore, } from 'lib/types/stores/role-store'; import { IRole, IUserRole } from 'lib/types/stores/access-store'; @@ -23,7 +24,7 @@ interface IRoleRow { type: string; } -export default class RoleStore { +export default class RoleStore implements IRoleStore { private logger: Logger; private eventBus: EventEmitter; @@ -88,6 +89,15 @@ export default class RoleStore { return present; } + async nameInUse(name: string, existingId?: number): Promise { + let query = this.db(T.ROLES).where({ name }).returning('id'); + if (existingId) { + query = query.andWhereNot({ id: existingId }); + } + const result = await query; + return result.length > 0; + } + async roleExists(name: string): Promise { const result = await this.db.raw( `SELECT EXISTS (SELECT 1 FROM ${T.ROLES} WHERE name = ?) AS present`, diff --git a/src/lib/services/access-service.ts b/src/lib/services/access-service.ts index 049ae2c8ed..309de50be9 100644 --- a/src/lib/services/access-service.ts +++ b/src/lib/services/access-service.ts @@ -409,7 +409,7 @@ export class AccessService { } async updateRole(role: IRoleUpdate): Promise { - // await this.validateRole(role); + await this.validateRole(role, role.id); const baseRole = { id: role.id, name: role.name, @@ -432,8 +432,11 @@ export class AccessService { return this.roleStore.delete(id); } - async validateRoleIsUnique(roleName: string): Promise { - const exists = await this.roleStore.roleExists(roleName); + async validateRoleIsUnique( + roleName: string, + existingId?: number, + ): Promise { + const exists = await this.roleStore.nameInUse(roleName, existingId); if (exists) { throw new NameExistsError( `There already exists a role with the name ${roleName}`, @@ -442,8 +445,11 @@ export class AccessService { return Promise.resolve(); } - async validateRole(role: IRoleCreation): Promise { - await this.validateRoleIsUnique(role.name); + async validateRole( + role: IRoleCreation, + existingId?: number, + ): Promise { + await this.validateRoleIsUnique(role.name, existingId); //Handle schema validation here... } } diff --git a/src/lib/types/stores/role-store.ts b/src/lib/types/stores/role-store.ts index 38570d2a3b..ffa508269a 100644 --- a/src/lib/types/stores/role-store.ts +++ b/src/lib/types/stores/role-store.ts @@ -27,5 +27,5 @@ export interface IRoleStore extends Store { getProjectRoles(): Promise; getRootRoles(): Promise; getRootRoleForAllUsers(): Promise; - roleExists(name: string): Promise; + nameInUse(name: string, existingId: number): Promise; } diff --git a/src/test/fixtures/fake-role-store.ts b/src/test/fixtures/fake-role-store.ts index 71c6170643..0efc5881c3 100644 --- a/src/test/fixtures/fake-role-store.ts +++ b/src/test/fixtures/fake-role-store.ts @@ -8,7 +8,7 @@ import { } from 'lib/types/stores/role-store'; export default class FakeRoleStore implements IRoleStore { - roleExists(name: string): Promise { + nameInUse(name: string, existingId: number): Promise { throw new Error('Method not implemented.'); }