Files
calendar/packages/features/pbac/services/permission-diff.service.ts
T
sean-brydonGitHubcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
24ff3622fd fix: fixes PBAC roles creation and update when adding Attributes (#23443)
* wip

* restore lock

* remove debug

* add tests + extract util

* Update packages/features/pbac/services/permission.service.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix parse permission string

* use correct permission strings in tests

* use eventType instead of event

* fix import

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-09-01 08:08:13 +05:30

51 lines
1.6 KiB
TypeScript

import type { RolePermission } from "../domain/models/Role";
import {
parsePermissionString,
isValidPermissionString,
type PermissionString,
type ParsedPermission,
} from "../domain/types/permission-registry";
export class PermissionDiffService {
private filterInternalPermissions(permissions: PermissionString[]): PermissionString[] {
return permissions.filter((permission) => {
// Skip invalid permissions entirely
if (!isValidPermissionString(permission)) {
return false;
}
const { action } = parsePermissionString(permission);
return action !== "_resource";
});
}
private createPermissionKey(permission: ParsedPermission): string {
return `${permission.resource}:${permission.action}`;
}
calculateDiff(newPermissions: PermissionString[], existingPermissions: RolePermission[]) {
const filteredPermissions = this.filterInternalPermissions(newPermissions);
// Create sets for comparison
const existingSet = new Set(existingPermissions.map((p) => this.createPermissionKey(p)));
const newSet = new Set(
filteredPermissions.map((p) => {
const parsed = parsePermissionString(p);
return this.createPermissionKey(parsed);
})
);
// Calculate permissions to add and remove
const toAdd = filteredPermissions
.map((p) => parsePermissionString(p))
.filter((p) => !existingSet.has(this.createPermissionKey(p)));
const toRemove = existingPermissions.filter((p) => !newSet.has(this.createPermissionKey(p)));
return {
toAdd,
toRemove,
};
}
}