Migrate object permission to syncable entity (#18609)

Closes [#2223](https://github.com/twentyhq/core-team-issues/issues/2223)
This commit is contained in:
Abdul Rahman
2026-03-18 22:02:18 +05:30
committed by GitHub
parent 8ccaf635bc
commit 6d4d1a97bc
86 changed files with 2475 additions and 424 deletions
@@ -19,6 +19,7 @@ export const getFlatObjectMetadataMock = (
return {
viewIds: [],
indexMetadataIds: [],
objectPermissionIds: [],
fieldIds: [],
description: 'default flat object metadata description',
icon: 'icon',
@@ -48,6 +49,7 @@ export const getFlatObjectMetadataMock = (
duplicateCriteria: null,
applicationUniversalIdentifier: applicationId,
fieldUniversalIdentifiers: [],
objectPermissionUniversalIdentifiers: [],
viewUniversalIdentifiers: [],
indexMetadataUniversalIdentifiers: [],
labelIdentifierFieldMetadataUniversalIdentifier:
@@ -13,6 +13,7 @@ import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-meta
import { fromObjectMetadataEntityToFlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-entity-to-flat-object-metadata.util';
import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { ObjectPermissionEntity } from 'src/engine/metadata-modules/object-permission/object-permission.entity';
import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity';
import { WorkspaceCache } from 'src/engine/workspace-cache/decorators/workspace-cache.decorator';
import { createIdToUniversalIdentifierMap } from 'src/engine/workspace-cache/utils/create-id-to-universal-identifier-map.util';
@@ -35,6 +36,8 @@ export class WorkspaceFlatObjectMetadataMapCacheService extends WorkspaceCachePr
private readonly indexMetadataRepository: Repository<IndexMetadataEntity>,
@InjectRepository(ViewEntity)
private readonly viewRepository: Repository<ViewEntity>,
@InjectRepository(ObjectPermissionEntity)
private readonly objectPermissionRepository: Repository<ObjectPermissionEntity>,
) {
super();
}
@@ -42,35 +45,51 @@ export class WorkspaceFlatObjectMetadataMapCacheService extends WorkspaceCachePr
async computeForCache(
workspaceId: string,
): Promise<FlatEntityMaps<FlatObjectMetadata>> {
const [objectMetadatas, applications, fields, indexMetadatas, views] =
await Promise.all([
this.objectMetadataRepository.find({
where: { workspaceId },
withDeleted: true,
}),
this.applicationRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier'],
withDeleted: true,
}),
this.fieldMetadataRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier', 'objectMetadataId'],
withDeleted: true,
}),
this.indexMetadataRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier', 'objectMetadataId'],
withDeleted: true,
}),
this.viewRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier', 'objectMetadataId'],
withDeleted: true,
}),
]);
const [
objectMetadatas,
applications,
fields,
indexMetadatas,
views,
objectPermissions,
] = await Promise.all([
this.objectMetadataRepository.find({
where: { workspaceId },
withDeleted: true,
}),
this.applicationRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier'],
withDeleted: true,
}),
this.fieldMetadataRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier', 'objectMetadataId'],
withDeleted: true,
}),
this.indexMetadataRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier', 'objectMetadataId'],
withDeleted: true,
}),
this.viewRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier', 'objectMetadataId'],
withDeleted: true,
}),
this.objectPermissionRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier', 'objectMetadataId'],
withDeleted: true,
}),
]);
const [fieldsByObjectId, indexesByObjectId, viewsByObjectId] = (
const [
fieldsByObjectId,
indexesByObjectId,
viewsByObjectId,
objectPermissionsByObjectId,
] = (
[
{
entities: fields,
@@ -84,6 +103,10 @@ export class WorkspaceFlatObjectMetadataMapCacheService extends WorkspaceCachePr
entities: views,
foreignKey: 'objectMetadataId',
},
{
entities: objectPermissions,
foreignKey: 'objectMetadataId',
},
] as const
).map(regroupEntitiesByRelatedEntityId);
@@ -101,6 +124,8 @@ export class WorkspaceFlatObjectMetadataMapCacheService extends WorkspaceCachePr
fields: fieldsByObjectId.get(objectMetadataEntity.id) || [],
indexMetadatas: indexesByObjectId.get(objectMetadataEntity.id) || [],
views: viewsByObjectId.get(objectMetadataEntity.id) || [],
objectPermissions:
objectPermissionsByObjectId.get(objectMetadataEntity.id) || [],
},
applicationIdToUniversalIdentifierMap,
fieldMetadataIdToUniversalIdentifierMap,
@@ -94,6 +94,7 @@ export const fromCreateObjectInputToFlatObjectMetadataAndFlatFieldMetadatasToCre
targetTableName: 'DEPRECATED',
applicationUniversalIdentifier: flatApplication.universalIdentifier,
fieldUniversalIdentifiers: [],
objectPermissionUniversalIdentifiers: [],
viewUniversalIdentifiers: [],
indexMetadataUniversalIdentifiers: [],
labelIdentifierFieldMetadataUniversalIdentifier,
@@ -78,6 +78,9 @@ export const fromObjectMetadataEntityToFlatObjectMetadata = ({
viewIds: objectMetadataEntity.views.map(({ id }) => id),
indexMetadataIds: objectMetadataEntity.indexMetadatas.map(({ id }) => id),
fieldIds: objectMetadataEntity.fields.map(({ id }) => id),
objectPermissionIds: objectMetadataEntity.objectPermissions.map(
({ id }) => id,
),
applicationUniversalIdentifier,
labelIdentifierFieldMetadataUniversalIdentifier,
imageIdentifierFieldMetadataUniversalIdentifier,
@@ -90,5 +93,9 @@ export const fromObjectMetadataEntityToFlatObjectMetadata = ({
viewUniversalIdentifiers: objectMetadataEntity.views.map(
({ universalIdentifier }) => universalIdentifier,
),
objectPermissionUniversalIdentifiers:
objectMetadataEntity.objectPermissions.map(
({ universalIdentifier }) => universalIdentifier,
),
};
};