Identify standard objects (#17091)

# Introduction
Followup https://github.com/twentyhq/twenty/pull/16981

1/ Migration, applicationId and universalIdentifier are required on
entity ( save point migration + upgrade command fallback pattern )
2/ Backfill using previous standard ids
This commit is contained in:
Paul Rastoin
2026-01-12 18:06:13 +00:00
committed by GitHub
parent 04a370e043
commit df108ea040
15 changed files with 427 additions and 12 deletions
@@ -18,6 +18,11 @@ export const fromFieldMetadataEntityToFlatFieldMetadata = <
return {
...fieldMetadataWithoutRelations,
// TODO remove once MakeFieldMetadataUniversalIdentifierAndApplicationIdNotNullableMigrationCommand has been run once
universalIdentifier:
fieldMetadataWithoutRelations.universalIdentifier ??
fieldMetadataWithoutRelations.standardId ??
fieldMetadataWithoutRelations.id,
createdAt: fieldMetadataWithoutRelations.createdAt.toISOString(),
updatedAt: fieldMetadataWithoutRelations.updatedAt.toISOString(),
kanbanAggregateOperationViewIds:
@@ -34,7 +34,7 @@ export const getFlatObjectMetadataMock = (
nameSingular: 'defaultflatObjectMetadataNameSingular',
shortcut: 'shortcut',
standardId: null,
applicationId: null,
applicationId: faker.string.uuid(),
standardOverrides: null,
targetTableName: '',
workspaceId: faker.string.uuid(),
@@ -14,6 +14,11 @@ export const fromObjectMetadataEntityToFlatObjectMetadata = (
return {
...objectMetadataEntityWithoutRelations,
// TODO remove once MakeObjectMetadataUniversalIdentifierAndApplicationIdNotNullableMigrationCommand has been run once
universalIdentifier:
objectMetadataEntityWithoutRelations.universalIdentifier ??
objectMetadataEntityWithoutRelations.standardId ??
objectMetadataEntityWithoutRelations.id,
createdAt: objectMetadataEntity.createdAt.toISOString(),
updatedAt: objectMetadataEntity.updatedAt.toISOString(),
viewIds: objectMetadataEntity.views.map((viewEntity) => viewEntity.id),
@@ -23,8 +28,5 @@ export const fromObjectMetadataEntityToFlatObjectMetadata = (
fieldMetadataIds: objectMetadataEntity.fields.map(
(fieldEntity) => fieldEntity.id,
),
universalIdentifier:
objectMetadataEntityWithoutRelations.standardId ??
objectMetadataEntityWithoutRelations.id,
};
};
@@ -18,7 +18,7 @@ import { type ObjectStandardOverridesDTO } from 'src/engine/metadata-modules/obj
import { FieldPermissionEntity } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.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 { SyncableEntity } from 'src/engine/workspace-manager/types/syncable-entity.interface';
import { SyncableEntityRequired } from 'src/engine/workspace-manager/types/syncable-entity-required.interface';
@Entity('objectMetadata')
@Unique('IDX_OBJECT_METADATA_NAME_SINGULAR_WORKSPACE_ID_UNIQUE', [
@@ -30,7 +30,7 @@ import { SyncableEntity } from 'src/engine/workspace-manager/types/syncable-enti
'workspaceId',
])
export class ObjectMetadataEntity
extends SyncableEntity
extends SyncableEntityRequired
implements Required<ObjectMetadataEntity>
{
@PrimaryGeneratedColumn('uuid')