[1/3] Rename permissionFlag to rolePermissionFlag + add permissionFlag catalog/backfill (#20481)
Split of #20377. ## Summary This PR separates available permission flags from per-role permission flag grants. Previously, `core.permissionFlag` stored the role assignment directly: `roleId + flag`. This PR renames that legacy grant table to `core.rolePermissionFlag`, then recreates `core.permissionFlag` as the catalog of available permission flags. ## What changed - Rename the existing `core.permissionFlag` grant table to `core.rolePermissionFlag`. - Add the new syncable `core.permissionFlag` catalog entity with key, label, description, icon, permission type, relevance flags, and custom/standard metadata. - Add stable `SystemPermissionFlag` universal identifiers for the built-in `PermissionFlagType` values. - Seed the standard permission flags for every workspace under the Twenty standard application. - Backfill existing role grants: - create missing catalog rows for existing grant keys, - add `rolePermissionFlag.permissionFlagId`, - migrate grants from the old string `flag` column to the new catalog FK, - replace the old `(flag, roleId)` uniqueness with `(permissionFlagId, roleId)`. - Rewire role permission flag caches, permission checks, role DTO mapping, and `upsertPermissionFlags` to resolve through the catalog. - Keep the existing public role permission API shape: product/app surfaces still talk about `permissionFlags` and return `{ id, roleId, flag }`. - Update metadata flat-entity machinery, migration builders, validators, action handlers, snapshots, generated schemas, docs, and app fixtures for the new `permissionFlag` / `rolePermissionFlag` split. ## Behavior after this PR - Existing permission flag grants keep working. - Existing GraphQL role permission flows keep the same public naming. - Standard permission flags are represented as catalog rows. - Permission checks now compare grants through catalog universal identifiers instead of the legacy `flag` column. - Workspace deletion cleanup now verifies both `permissionFlag` and `rolePermissionFlag`. ## What is not in this PR - Public GraphQL CRUD for custom permission flags. - App manifest support for declaring new custom permission flags. - Frontend UI for creating or assigning custom permission flags beyond the existing role permission flow. --------- Co-authored-by: Weiko <corentin@twenty.com>
This commit is contained in:
+2
-2
@@ -54,9 +54,9 @@ export const fromCreateRoleInputToFlatRoleToCreate = ({
|
||||
roleTargetIds: [],
|
||||
roleTargetUniversalIdentifiers: [],
|
||||
objectPermissionIds: [],
|
||||
permissionFlagIds: [],
|
||||
rolePermissionFlagIds: [],
|
||||
objectPermissionUniversalIdentifiers: [],
|
||||
permissionFlagUniversalIdentifiers: [],
|
||||
rolePermissionFlagUniversalIdentifiers: [],
|
||||
fieldPermissionIds: [],
|
||||
fieldPermissionUniversalIdentifiers: [],
|
||||
rowLevelPermissionPredicateIds: [],
|
||||
|
||||
+4
-4
@@ -13,10 +13,10 @@ import { type RegroupedEntity } from 'src/engine/workspace-cache/utils/regroup-e
|
||||
type FromRoleEntityToFlatRoleArgs = {
|
||||
entity: Omit<
|
||||
EntityWithRegroupedOneToManyRelations<MetadataEntity<'role'>>,
|
||||
'objectPermissions' | 'permissionFlags' | 'fieldPermissions'
|
||||
'objectPermissions' | 'rolePermissionFlags' | 'fieldPermissions'
|
||||
> & {
|
||||
objectPermissions: RegroupedEntity[];
|
||||
permissionFlags: RegroupedEntity[];
|
||||
rolePermissionFlags: RegroupedEntity[];
|
||||
fieldPermissions: RegroupedEntity[];
|
||||
};
|
||||
} & EntityManyToOneIdByUniversalIdentifierMaps<'role'>;
|
||||
@@ -57,7 +57,7 @@ export const fromRoleEntityToFlatRole = ({
|
||||
applicationId: roleEntity.applicationId,
|
||||
roleTargetIds: roleEntity.roleTargets.map(({ id }) => id),
|
||||
objectPermissionIds: roleEntity.objectPermissions.map(({ id }) => id),
|
||||
permissionFlagIds: roleEntity.permissionFlags.map(({ id }) => id),
|
||||
rolePermissionFlagIds: roleEntity.rolePermissionFlags.map(({ id }) => id),
|
||||
fieldPermissionIds: roleEntity.fieldPermissions.map(({ id }) => id),
|
||||
rowLevelPermissionPredicateIds: roleEntity.rowLevelPermissionPredicates.map(
|
||||
({ id }) => id,
|
||||
@@ -71,7 +71,7 @@ export const fromRoleEntityToFlatRole = ({
|
||||
objectPermissionUniversalIdentifiers: roleEntity.objectPermissions.map(
|
||||
({ universalIdentifier }) => universalIdentifier,
|
||||
),
|
||||
permissionFlagUniversalIdentifiers: roleEntity.permissionFlags.map(
|
||||
rolePermissionFlagUniversalIdentifiers: roleEntity.rolePermissionFlags.map(
|
||||
({ universalIdentifier }) => universalIdentifier,
|
||||
),
|
||||
fieldPermissionUniversalIdentifiers: roleEntity.fieldPermissions.map(
|
||||
|
||||
Reference in New Issue
Block a user