diff --git a/webapp/packages/core-authentication/src/RolesResource.ts b/webapp/packages/core-authentication/src/RolesResource.ts index 3030459f3c..3635f4a127 100644 --- a/webapp/packages/core-authentication/src/RolesResource.ts +++ b/webapp/packages/core-authentication/src/RolesResource.ts @@ -18,6 +18,7 @@ import { AdminConnectionGrantInfo, CachedMapAllKey } from '@cloudbeaver/core-sdk'; +import { isArraysEqual } from '@cloudbeaver/core-utils'; const NEW_ROLE_SYMBOL = Symbol('new-role'); @@ -60,6 +61,7 @@ export class RolesResource extends CachedMapResource { const { role } = await this.graphQLService.sdk.updateRole(roleInfo); this.updateRoles(role); + await this.setSubjectPermissions(role.roleId, roleInfo.rolePermissions); return this.get(roleInfo.roleId)!; @@ -87,20 +89,22 @@ export class RolesResource extends CachedMapResource { } async setSubjectPermissions(roleId: string, permissions: string[]): Promise { - await this.performUpdate(roleId, [], async () => { - const { - permissions: newPermissions, - } = await this.graphQLService.sdk.setSubjectPermissions({ roleId, permissions }); + const role = this.get(roleId); - const role = this.get(roleId); + if (role && isArraysEqual(role.rolePermissions, permissions)) { + return; + } - if (role) { - role.rolePermissions = newPermissions.map(permission => permission.id); - } else { + const { + permissions: newPermissions, + } = await this.graphQLService.sdk.setSubjectPermissions({ roleId, permissions }); + + if (role) { + role.rolePermissions = newPermissions.map(permission => permission.id); + } else { // TODO: update permissions for role instead - await this.loader(roleId); - } - }); + await this.loader(roleId); + } } protected async loader(key: ResourceKey): Promise> {